diff --git a/proto/common.proto b/proto/common.proto index 70657cb57..26125f589 100644 --- a/proto/common.proto +++ b/proto/common.proto @@ -464,6 +464,13 @@ enum ZanzaBuff { CerebralCortexCompound = 6; GizzardGum = 7; LungJuiceCocktail = 8; + DarnassusGiftCollection = 9; +} + +enum HitConsumable { + HitConsumableUnknown = 0; + FireToastedBun = 1; + DarkDesire = 2; } message MiscConsumes { @@ -679,6 +686,7 @@ message Consumes { int32 pet_attack_power_consumable = 25; PetMiscConsumes pet_misc_consumes = 27; SapperExplosive sapper_explosive = 28; + HitConsumable hit_consumable = 29; } // NextIndex: 26 diff --git a/sim/core/consumes.go b/sim/core/consumes.go index 74a930006..723d2cfb5 100644 --- a/sim/core/consumes.go +++ b/sim/core/consumes.go @@ -24,6 +24,7 @@ func applyConsumeEffects(agent Agent) { applyPhysicalBuffConsumes(character, consumes) applySpellBuffConsumes(character, consumes) applyZanzaBuffConsumes(character, consumes) + applyHitConsumableConsumes(character, consumes) applyMiscConsumes(character, consumes.MiscConsumes) registerPotionCD(agent, consumes) @@ -615,6 +616,31 @@ func applyZanzaBuffConsumes(character *Character, consumes *proto.Consumes) { character.AddStats(stats.Stats{ stats.Stamina: 25, }) + case proto.ZanzaBuff_DarnassusGiftCollection: + character.AddStats(stats.Stats{ + stats.Agility: 30, + }) + } +} + +/////////////////////////////////////////////////////////////////////////// +// Hit Consumables +/////////////////////////////////////////////////////////////////////////// + +func applyHitConsumableConsumes(character *Character, consumes *proto.Consumes) { + if consumes.HitConsumable == proto.HitConsumable_HitConsumableUnknown { + return + } + + switch consumes.HitConsumable { + case proto.HitConsumable_FireToastedBun: + character.AddStats(stats.Stats{ + stats.MeleeHit: 2 * MeleeHitRatingPerHitChance, + }) + case proto.HitConsumable_DarkDesire: + character.AddStats(stats.Stats{ + stats.MeleeHit: 2 * MeleeHitRatingPerHitChance, + }) } } diff --git a/ui/core/components/individual_sim_ui/consumes_picker.ts b/ui/core/components/individual_sim_ui/consumes_picker.ts index a88e555f3..855c81d3d 100644 --- a/ui/core/components/individual_sim_ui/consumes_picker.ts +++ b/ui/core/components/individual_sim_ui/consumes_picker.ts @@ -123,8 +123,9 @@ export class ConsumesPicker extends Component { private buildPhysicalBuffPickers() { const includeAgi = this.simUI.individualConfig.epStats.includes(Stat.StatAgility); const includeStr = this.simUI.individualConfig.epStats.includes(Stat.StatStrength); + const includeHit = this.simUI.individualConfig.epStats.includes(Stat.StatMeleeHit); - if (!includeAgi && !includeStr) return; + if (!includeAgi && !includeStr && !includeHit) return; const fragment = document.createElement('fragment'); fragment.innerHTML = ` @@ -146,11 +147,16 @@ export class ConsumesPicker extends Component { relevantStatOptions(ConsumablesInputs.STRENGTH_CONSUMES_CONFIG, this.simUI), 'Strength', ); + const hitConsumableOptions = ConsumablesInputs.makeHitConsumableInput( + relevantStatOptions(ConsumablesInputs.HIT_CONSUMABLE_CONFIG, this.simUI), + 'Hit', + ); const pickers = [ buildIconInput(physicalConsumesElem, this.simUI.player, apBuffOptions), buildIconInput(physicalConsumesElem, this.simUI.player, agiBuffOptions), buildIconInput(physicalConsumesElem, this.simUI.player, strBuffOptions), + buildIconInput(physicalConsumesElem, this.simUI.player, hitConsumableOptions), ]; this.updateRow(row, pickers); diff --git a/ui/core/components/inputs/consumables.ts b/ui/core/components/inputs/consumables.ts index fce53bbce..6013fda43 100644 --- a/ui/core/components/inputs/consumables.ts +++ b/ui/core/components/inputs/consumables.ts @@ -15,6 +15,7 @@ import { Food, FrostPowerBuff, HealthElixir, + HitConsumable, ItemSlot, ManaRegenElixir, Potions, @@ -503,6 +504,10 @@ export const GizzardGum: ConsumableInputConfig = { actionId: () => ActionId.fromItemId(8424), value: ZanzaBuff.GizzardGum, }; +export const DarnassusGiftCollection: ConsumableInputConfig = { + actionId: () => ActionId.fromItemId(22133), + value: ZanzaBuff.DarnassusGiftCollection, +}; // Zanza Potions export const SpiritOfZanza: ConsumableInputConfig = { @@ -517,9 +522,25 @@ export const ZANZA_BUFF_CONSUMES_CONFIG: ConsumableStatOption[] = [ { config: LungJuiceCocktail, stats: [Stat.StatStamina] }, { config: CerebralCortexCompound, stats: [Stat.StatIntellect] }, { config: GizzardGum, stats: [Stat.StatSpirit] }, + { config: DarnassusGiftCollection, stats: [Stat.StatAgility] }, ]; export const makeZanzaBuffConsumesInput = makeConsumeInputFactory({ consumesFieldName: 'zanzaBuff' }); +// Hit Consumables +export const FireToastedBun: ConsumableInputConfig = { + actionId: () => ActionId.fromItemId(23327), + value: HitConsumable.FireToastedBun, +}; +export const DarkDesire: ConsumableInputConfig = { + actionId: () => ActionId.fromItemId(22237), + value: HitConsumable.DarkDesire, +}; +export const HIT_CONSUMABLE_CONFIG: ConsumableStatOption[] = [ + { config: FireToastedBun, stats: [Stat.StatMeleeHit] }, + { config: DarkDesire, stats: [Stat.StatMeleeHit] }, +]; +export const makeHitConsumableInput = makeConsumeInputFactory({ consumesFieldName: 'hitConsumable' }); + export const JujuFlurry = makeBooleanMiscConsumeInput({ actionId: () => ActionId.fromItemId(12450), fieldName: 'jujuFlurry',