Skip to content

Commit 4b717ae

Browse files
committed
multiple RPR bugfixes
Gluttony into Sacrificium should now work correctly. All combos that turn things into Communio should follow up with Perfectio when available. All Shadow of Death / Whorl of Death combos removed, it was too complicated to maintain parity with other combos.
1 parent c0ee559 commit 4b717ae

File tree

4 files changed

+86
-114
lines changed

4 files changed

+86
-114
lines changed

XIVComboVX/Combos/RPR.cs

Lines changed: 78 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public const uint
2929
ExecutionersGibbet = 36970,
3030
ExecutionersGallows = 36971,
3131
ExecutionersGuillotine = 36972,
32+
Sacrificium = 36969,
3233
// Generators
3334
SoulSlice = 24380,
3435
SoulScythe = 24381,
@@ -48,7 +49,8 @@ public const uint
4849
HarvestMoon = 24388,
4950
HellsIngress = 24401,
5051
HellsEgress = 24402,
51-
Regress = 24403;
52+
Regress = 24403,
53+
Perfectio = 36973;
5254

5355
public static class Buffs {
5456
public const ushort
@@ -124,9 +126,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
124126
if (gauge.Soul >= 50) {
125127
if (InCombat && CanWeave(actionID)) {
126128

127-
if (IsEnabled(CustomComboPreset.ReaperBloodStalkGluttonyFeature)) {
128-
if (level >= RPR.Levels.Gluttony && CanUse(RPR.Gluttony))
129-
return OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
129+
if (IsEnabled(CustomComboPreset.ReaperBloodStalkGluttonyFeature) && level >= RPR.Levels.Gluttony) {
130+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
131+
if (CanUse(sacrificiumGluttony))
132+
return sacrificiumGluttony;
130133
}
131134

132135
return OriginalHook(RPR.BloodStalk);
@@ -149,8 +152,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
149152
}
150153

151154
if (IsEnabled(CustomComboPreset.ReaperSliceCommunioFeature)) {
152-
if (level >= RPR.Levels.Communio && gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
153-
return RPR.Communio;
155+
if (level >= RPR.Levels.Communio) {
156+
if (gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
157+
return RPR.Communio;
158+
if (level >= RPR.Levels.Perfectio && SelfHasEffect(RPR.Buffs.PerfectioParata))
159+
return RPR.Perfectio;
160+
}
154161
}
155162

156163
}
@@ -238,9 +245,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
238245
if (gauge.Soul >= 50) {
239246
if (InCombat && CanWeave(actionID)) {
240247

241-
if (IsEnabled(CustomComboPreset.ReaperGrimSwatheGluttonyFeature)) {
242-
if (level >= RPR.Levels.Gluttony && IsOffCooldown(RPR.Gluttony))
243-
return RPR.Gluttony;
248+
if (IsEnabled(CustomComboPreset.ReaperGrimSwatheGluttonyFeature) && level >= RPR.Levels.Gluttony) {
249+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
250+
if (CanUse(sacrificiumGluttony))
251+
return sacrificiumGluttony;
244252
}
245253

246254
return OriginalHook(RPR.GrimSwathe);
@@ -258,14 +266,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
258266
}
259267

260268
if (IsEnabled(CustomComboPreset.ReaperScytheCommunioFeature)) {
261-
if (level >= RPR.Levels.Communio && gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
262-
return RPR.Communio;
269+
if (level >= RPR.Levels.Communio) {
270+
if (gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
271+
return RPR.Communio;
272+
if (level >= RPR.Levels.Perfectio && SelfHasEffect(RPR.Buffs.PerfectioParata))
273+
return RPR.Perfectio;
274+
}
263275
}
264276

265277
}
266278

267279
if (IsEnabled(CustomComboPreset.ReaperScytheGuillotineFeature)) {
268-
if (reaving || enshrouded || executing) // Grim Reaping
280+
if (reaving || enshrouded || executing) // Grim Reaping
269281
return OriginalHook(RPR.Guillotine);
270282
}
271283

@@ -309,52 +321,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
309321
}
310322
}
311323

312-
internal class ReaperShadowOfDeath: CustomCombo {
313-
public override CustomComboPreset Preset { get; } = CustomComboPreset.RprAny;
314-
public override uint[] ActionIDs => [RPR.ShadowOfDeath];
315-
316-
protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) {
317-
318-
if (IsEnabled(CustomComboPreset.ReaperShadowSoulsowFeature)) {
319-
if (level >= RPR.Levels.Soulsow && !InCombat && !HasTarget && !SelfHasEffect(RPR.Buffs.Soulsow))
320-
return RPR.Soulsow;
321-
}
322-
323-
RPRGauge gauge = GetJobGauge<RPRGauge>();
324-
bool reaving = level >= RPR.Levels.SoulReaver && SelfHasEffect(RPR.Buffs.SoulReaver);
325-
bool enshrouded = level >= RPR.Levels.Enshroud && gauge.EnshroudedTimeRemaining > 0;
326-
bool executing = level >= RPR.Levels.Executions && SelfHasEffect(RPR.Buffs.Executioner);
327-
328-
if (enshrouded) {
329-
330-
if (IsEnabled(CustomComboPreset.ReaperShadowLemuresFeature)) {
331-
if (level >= RPR.Levels.EnhancedShroud && gauge.VoidShroud >= 2)
332-
return RPR.LemuresSlice;
333-
}
334-
335-
if (IsEnabled(CustomComboPreset.ReaperShadowCommunioFeature)) {
336-
if (level >= RPR.Levels.Communio && gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
337-
return RPR.Communio;
338-
}
339-
340-
}
341-
342-
if (reaving || enshrouded || executing) {
343-
344-
if (IsEnabled(CustomComboPreset.ReaperShadowGallowsFeature))
345-
// Cross Reaping
346-
return OriginalHook(RPR.Gallows);
347-
348-
if (IsEnabled(CustomComboPreset.ReaperShadowGibbetFeature))
349-
// Void Reaping
350-
return OriginalHook(RPR.Gibbet);
351-
352-
}
353-
354-
return actionID;
355-
}
356-
}
357-
358324
internal class ReaperSoulSlice: CustomCombo {
359325
public override CustomComboPreset Preset { get; } = CustomComboPreset.RprAny;
360326
public override uint[] ActionIDs => [RPR.SoulSlice];
@@ -367,9 +333,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
367333
if (gauge.Soul >= 50 && gauge.EnshroudedTimeRemaining == 0) {
368334
if (InCombat && CanWeave(actionID)) {
369335

370-
if (IsEnabled(CustomComboPreset.ReaperBloodStalkGluttonyFeature)) {
371-
if (level >= RPR.Levels.Gluttony && IsOffCooldown(RPR.Gluttony))
372-
return RPR.Gluttony;
336+
if (IsEnabled(CustomComboPreset.ReaperBloodStalkGluttonyFeature) && level >= RPR.Levels.Gluttony) {
337+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
338+
if (CanUse(sacrificiumGluttony))
339+
return sacrificiumGluttony;
373340
}
374341

375342
return OriginalHook(RPR.BloodStalk);
@@ -390,8 +357,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
390357
}
391358

392359
if (IsEnabled(CustomComboPreset.ReaperSoulCommunioFeature)) {
393-
if (level >= RPR.Levels.Communio && gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
394-
return RPR.Communio;
360+
if (level >= RPR.Levels.Communio) {
361+
if (gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
362+
return RPR.Communio;
363+
if (level >= RPR.Levels.Perfectio && SelfHasEffect(RPR.Buffs.PerfectioParata))
364+
return RPR.Perfectio;
365+
}
395366
}
396367

397368
}
@@ -411,8 +382,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
411382
if (IsEnabled(CustomComboPreset.ReaperSoulOvercapFeature)) {
412383

413384
if (IsEnabled(CustomComboPreset.ReaperBloodStalkGluttonyFeature)) {
414-
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50 && gauge.EnshroudedTimeRemaining == 0 && IsOffCooldown(RPR.Gluttony))
415-
return RPR.Gluttony;
385+
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50 && gauge.EnshroudedTimeRemaining == 0) {
386+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
387+
if (CanUse(sacrificiumGluttony))
388+
return sacrificiumGluttony;
389+
}
416390
}
417391

418392
if (level >= RPR.Levels.BloodStalk && gauge.Soul > 50 && gauge.EnshroudedTimeRemaining == 0)
@@ -437,9 +411,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
437411
if (gauge.Soul >= 50) {
438412
if (InCombat && CanWeave(actionID)) {
439413

440-
if (IsEnabled(CustomComboPreset.ReaperGrimSwatheGluttonyFeature)) {
441-
if (level >= RPR.Levels.Gluttony && IsOffCooldown(RPR.Gluttony))
442-
return RPR.Gluttony;
414+
if (IsEnabled(CustomComboPreset.ReaperGrimSwatheGluttonyFeature) && level >= RPR.Levels.Gluttony) {
415+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
416+
if (CanUse(sacrificiumGluttony))
417+
return sacrificiumGluttony;
443418
}
444419

445420
return OriginalHook(RPR.GrimSwathe);
@@ -449,8 +424,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
449424
}
450425

451426
if (IsEnabled(CustomComboPreset.ReaperGrimSwatheGluttonyFeature)) {
452-
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50 && gauge.EnshroudedTimeRemaining == 0 && IsOffCooldown(RPR.Gluttony))
453-
return RPR.Gluttony;
427+
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50 && gauge.EnshroudedTimeRemaining == 0) {
428+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
429+
if (CanUse(sacrificiumGluttony))
430+
return sacrificiumGluttony;
431+
}
454432
}
455433

456434
if (level >= RPR.Levels.GrimSwathe && gauge.Soul > 50 && gauge.EnshroudedTimeRemaining == 0)
@@ -467,8 +445,11 @@ internal class ReaperBloodStalk: CustomCombo {
467445
protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) {
468446
RPRGauge gauge = GetJobGauge<RPRGauge>();
469447

470-
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50 && IsOffCooldown(RPR.Gluttony))
471-
return RPR.Gluttony;
448+
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50) {
449+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
450+
if (CanUse(sacrificiumGluttony))
451+
return sacrificiumGluttony;
452+
}
472453

473454
return actionID;
474455
}
@@ -481,8 +462,11 @@ internal class ReaperGrimSwathe: CustomCombo {
481462
protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) {
482463
RPRGauge gauge = GetJobGauge<RPRGauge>();
483464

484-
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50 && IsOffCooldown(RPR.Gluttony))
485-
return RPR.Gluttony;
465+
if (level >= RPR.Levels.Gluttony && gauge.Soul >= 50) {
466+
uint sacrificiumGluttony = OriginalHook(RPR.Gluttony); // TODO need a Sacrificium check specifically, somewhere
467+
if (CanUse(sacrificiumGluttony))
468+
return sacrificiumGluttony;
469+
}
486470

487471
return actionID;
488472
}
@@ -506,8 +490,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
506490
}
507491

508492
if (IsEnabled(CustomComboPreset.ReaperCommunioSoulReaverFeature)) {
509-
if (level >= RPR.Levels.Communio && gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
510-
return RPR.Communio;
493+
if (level >= RPR.Levels.Communio) {
494+
if (gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
495+
return RPR.Communio;
496+
if (level >= RPR.Levels.Perfectio && SelfHasEffect(RPR.Buffs.PerfectioParata))
497+
return RPR.Perfectio;
498+
}
511499
}
512500

513501
if (IsEnabled(CustomComboPreset.ReaperEnhancedSoulReaverFeature)) {
@@ -537,8 +525,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim
537525
if (level >= RPR.Levels.Enshroud && gauge.EnshroudedTimeRemaining > 0) {
538526

539527
if (IsEnabled(CustomComboPreset.ReaperCommunioSoulReaverFeature)) {
540-
if (level >= RPR.Levels.Communio && gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
541-
return RPR.Communio;
528+
if (level >= RPR.Levels.Communio) {
529+
if (gauge.LemureShroud == 1 && gauge.VoidShroud == 0)
530+
return RPR.Communio;
531+
if (level >= RPR.Levels.Perfectio && SelfHasEffect(RPR.Buffs.PerfectioParata))
532+
return RPR.Perfectio;
533+
}
542534
}
543535

544536
if (IsEnabled(CustomComboPreset.ReaperLemuresSoulReaverFeature)) {
@@ -557,11 +549,17 @@ internal class ReaperEnshroud: CustomCombo {
557549
public override uint[] ActionIDs => [RPR.Enshroud];
558550

559551
protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) {
552+
if (level < RPR.Levels.Communio)
553+
return actionID;
554+
560555
RPRGauge gauge = GetJobGauge<RPRGauge>();
561556

562-
if (level >= RPR.Levels.Communio && gauge.EnshroudedTimeRemaining > 0)
557+
if (gauge.EnshroudedTimeRemaining > 0)
563558
return RPR.Communio;
564559

560+
if (level >= RPR.Levels.Perfectio && SelfHasEffect(RPR.Buffs.PerfectioParata))
561+
return RPR.Perfectio;
562+
565563
return actionID;
566564
}
567565
}
@@ -572,7 +570,7 @@ internal class ReaperArcaneCircle: CustomCombo {
572570

573571
protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) {
574572

575-
if (level >= RPR.Levels.PlentifulHarvest && SelfEffectStacks(RPR.Buffs.ImmortalSacrifice) >= Service.Configuration.ReaperArcaneHarvestStackThreshold)
573+
if (level >= RPR.Levels.PlentifulHarvest && SelfHasEffect(RPR.Buffs.ImmortalSacrifice))
576574
return RPR.PlentifulHarvest;
577575

578576
return actionID;

XIVComboVX/Config/PluginConfiguration.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -312,15 +312,6 @@ public PluginConfiguration() { }
312312
)]
313313
public float ReaperScytheDeathDebuffTime { get; set; } = 5F;
314314

315-
[ComboDetailSetting(
316-
CustomComboPreset.ReaperHarvestFeature,
317-
"Minimum stacks of Immortal Sacrifice",
318-
"When you have at least this many stacks of Immortal Sacrifice, Arcane Circle will become Plentiful Harvest",
319-
1,
320-
8
321-
)]
322-
public uint ReaperArcaneHarvestStackThreshold { get; set; } = 1;
323-
324315
#endregion
325316

326317
#region SAM settings

XIVComboVX/CustomCombo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ protected CustomCombo() {
3838
CustomComboInfoAttribute presetInfo = this.Preset.GetAttribute<CustomComboInfoAttribute>()!;
3939
this.JobID = presetInfo.JobID;
4040
this.ModuleName = this.GetType().Name;
41-
this.AffectedIDs = new(this.ActionIDs);
41+
this.AffectedIDs = [.. this.ActionIDs];
4242
}
4343

4444
public bool TryInvoke(uint actionID, uint lastComboActionId, float comboTime, byte level, uint classJobID, out uint newActionID) {

XIVComboVX/CustomComboPreset.cs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,29 +1053,12 @@ public enum CustomComboPreset {
10531053
[CustomComboInfo("Slice Lemure's Feature", "Replace Infernal Slice with Lemure's Slice when two or more stacks of Void Shroud are active.", RPR.JobID)]
10541054
ReaperSliceLemuresFeature = 39019,
10551055

1056-
[CustomComboInfo("Slice Communio Feature", "Replace Infernal Slice with Communio when one stack of Shroud is left.", RPR.JobID)]
1056+
[CustomComboInfo("Slice Communio Feature", "Replace Infernal Slice with Communio when one stack of Shroud is left, and with Perfectio when Perfectio Parata is active.", RPR.JobID)]
10571057
ReaperSliceCommunioFeature = 39020,
10581058

10591059
[CustomComboInfo("Slice Soulsow Feature", "Replace Infernal Slice with Soulsow when out of combat and not active.", RPR.JobID)]
10601060
ReaperSliceSoulsowFeature = 39030,
10611061

1062-
[Conflicts(ReaperShadowGibbetFeature)]
1063-
[CustomComboInfo("Shadow Gallows Feature", "Replace Shadow of Death with Gallows while Reaving, Enshrouded, or an Executioner.", RPR.JobID)]
1064-
ReaperShadowGallowsFeature = 39005,
1065-
1066-
[Conflicts(ReaperShadowGallowsFeature)]
1067-
[CustomComboInfo("Shadow Gibbet Feature", "Replace Shadow of Death with Gibbet while Reaving, Enshrouded, or an Executioner.", RPR.JobID)]
1068-
ReaperShadowGibbetFeature = 39006,
1069-
1070-
[CustomComboInfo("Shadow Lemure's Feature", "Replace Shadow of Death with Lemure's Slice when two or more stacks of Void Shroud are active.", RPR.JobID)]
1071-
ReaperShadowLemuresFeature = 39023,
1072-
1073-
[CustomComboInfo("Shadow Communio Feature", "Replace Shadow of Death with Communio when one stack of Shroud is left.", RPR.JobID)]
1074-
ReaperShadowCommunioFeature = 39024,
1075-
1076-
[CustomComboInfo("Shadow Soulsow Feature", "Replace Shadow of Death with Soulsow when out of combat, not active, and you have no target.", RPR.JobID)]
1077-
ReaperShadowSoulsowFeature = 39029,
1078-
10791062
[Conflicts(ReaperSoulGibbetFeature)]
10801063
[CustomComboInfo("Soul Gallows Feature", "Replace Soul Slice with Gallows while Reaving, Enshrouded, or an Executioner.", RPR.JobID)]
10811064
ReaperSoulGallowsFeature = 39025,
@@ -1087,7 +1070,7 @@ public enum CustomComboPreset {
10871070
[CustomComboInfo("Soul Lemure's Feature", "Replace Soul Slice with Lemure's Slice when two or more stacks of Void Shroud are active.", RPR.JobID)]
10881071
ReaperSoulLemuresFeature = 39027,
10891072

1090-
[CustomComboInfo("Soul Communio Feature", "Replace Soul Slice with Communio when one stack of Shroud is left.", RPR.JobID)]
1073+
[CustomComboInfo("Soul Communio Feature", "Replace Soul Slice with Communio when one stack of Shroud is left, and with Perfectio when Perfectio Parata is active.", RPR.JobID)]
10911074
ReaperSoulCommunioFeature = 39028,
10921075

10931076
[CustomComboInfo("Soul Slice Overcap Feature", "Replace Soul Slice with Blood Stalk when not Enshrouded and Soul Gauge is over 50.", RPR.JobID)]
@@ -1124,7 +1107,7 @@ public enum CustomComboPreset {
11241107
[CustomComboInfo("Scythe Lemure's Feature", "Replace Nightmare Scythe with Lemure's Scythe when two or more stacks of Void Shroud are active.", RPR.JobID)]
11251108
ReaperScytheLemuresFeature = 39021,
11261109

1127-
[CustomComboInfo("Scythe Communio Feature", "Replace Nightmare Scythe with Communio when one stack is left of Shroud.", RPR.JobID)]
1110+
[CustomComboInfo("Scythe Communio Feature", "Replace Nightmare Scythe with Communio when one stack is left of Shroud, and with Perfectio when Perfectio Parata is active.", RPR.JobID)]
11281111
ReaperScytheCommunioFeature = 39022,
11291112

11301113
[CustomComboInfo("Scythe Soulsow Feature", "Replace Nightmare Scythe with Soulsow when out of combat and not active.", RPR.JobID)]
@@ -1139,10 +1122,10 @@ public enum CustomComboPreset {
11391122
[CustomComboInfo("Lemure's Soul Reaver Feature", "Replace Gibbet, Gallows, and Guillotine with Lemure's Slice or Scythe when two or more stacks of Void Shroud are active.", RPR.JobID)]
11401123
ReaperLemuresSoulReaverFeature = 39011,
11411124

1142-
[CustomComboInfo("Communio Soul Reaver Feature", "Replace Gibbet, Gallows, and Guillotine with Communio when one stack is left of Shroud.", RPR.JobID)]
1125+
[CustomComboInfo("Communio Soul Reaver Feature", "Replace Gibbet, Gallows, and Guillotine with Communio when one stack is left of Shroud, and with Perfectio when Perfectio Parata is active.", RPR.JobID)]
11431126
ReaperCommunioSoulReaverFeature = 39012,
11441127

1145-
[CustomComboInfo("Enshroud Communio Feature", "Replace Enshroud with Communio when Enshrouded.", RPR.JobID)]
1128+
[CustomComboInfo("Enshroud Communio Feature", "Replace Enshroud with Communio when Enshrouded, and with Perfectio when Perfectio Parata is active.", RPR.JobID)]
11461129
ReaperEnshroudCommunioFeature = 39009,
11471130

11481131
[CustomComboInfo("Blood Stalk Gluttony Feature", "Replace Blood Stalk with Gluttony when available and Soul Gauge is at least 50.", RPR.JobID)]
@@ -1151,10 +1134,10 @@ public enum CustomComboPreset {
11511134
[CustomComboInfo("Grim Swathe Gluttony Feature", "Replace Grim Swathe with Gluttony when available and Soul Gauge is at least 50.", RPR.JobID)]
11521135
ReaperGrimSwatheGluttonyFeature = 39016,
11531136

1154-
[CustomComboInfo("Arcane Harvest Feature", "Replace Arcane Circle with Plentiful Harvest when you have enough stacks of Immortal Sacrifice.", RPR.JobID)]
1137+
[CustomComboInfo("Arcane Harvest Feature", "Replace Arcane Circle with Plentiful Harvest when you have any stacks of Immortal Sacrifice.", RPR.JobID)]
11551138
ReaperHarvestFeature = 39008,
11561139

1157-
[CustomComboInfo("Regress Feature", "Replace Hell's Ingress and Egress turn with Regress when Threshold is active, instead of just the opposite of the one used.", RPR.JobID)]
1140+
[CustomComboInfo("Regress Feature", "Replace Hell's Ingress and Egress with Regress when Threshold is active, instead of just the opposite of the one used.", RPR.JobID)]
11581141
ReaperRegressFeature = 39010,
11591142

11601143
[ParentPreset(ReaperRegressFeature)]

0 commit comments

Comments
 (0)