From af31da8cfc9caee8c2cd44df5ee5c1ed3a9b3ed7 Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Sat, 14 May 2022 11:49:15 -0400 Subject: feat(grfn/xanthous): Use dual-wielding to calculate damage When dual-wielding weapons, do damage from both weapons and use both weapons' attack messages. Change-Id: I3c404946d0167c9b5c2bcf58ab5c3429cc5269fc Reviewed-on: https://cl.tvl.fyi/c/depot/+/5605 Autosubmit: grfn Tested-by: BuildkiteCI Reviewed-by: grfn --- users/grfn/xanthous/src/Xanthous/App.hs | 25 +++++++++++++--------- .../xanthous/src/Xanthous/Entities/Character.hs | 4 +++- .../xanthous/src/Xanthous/Entities/RawTypes.hs | 9 ++++++++ .../src/Xanthous/Entities/Raws/broken-dagger.yaml | 4 ++-- .../xanthous/src/Xanthous/Entities/Raws/rock.yaml | 2 +- .../xanthous/src/Xanthous/Entities/Raws/stick.yaml | 6 +++--- 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/users/grfn/xanthous/src/Xanthous/App.hs b/users/grfn/xanthous/src/Xanthous/App.hs index 4ae549d15983..426230cdc2fc 100644 --- a/users/grfn/xanthous/src/Xanthous/App.hs +++ b/users/grfn/xanthous/src/Xanthous/App.hs @@ -467,19 +467,24 @@ attackAt pos = attackCreature creature = do charDamage <- uses character characterDamage creature' <- damageCreature creature charDamage - msg <- uses character getAttackMessage - unless (Creature.isDead creature') - . message msg $ object ["creature" A..= creature'] + unless (Creature.isDead creature') $ writeAttackMessage creature' whenM (uses character $ isNothing . weapon) handleFists stepGame weapon chr = chr ^? inventory . wielded . wieldedItems . wieldableItem - getAttackMessage chr = - case weapon chr of - Just wi -> - fromMaybe (Messages.lookup ["combat", "hit", "generic"]) - $ wi ^. attackMessage - Nothing -> - Messages.lookup ["combat", "hit", "fists"] + writeAttackMessage creature = do + let params = object ["creature" A..= creature] + attackMessages <- uses character getAttackMessages + msg <- intercalate " and " <$> for attackMessages (`Messages.render` params) + writeMessage $ "You " <> msg + getAttackMessages chr = + case chr ^.. inventory . wielded . wieldedItems . wieldableItem of + [] -> [Messages.lookup ["combat", "hit", "fists"]] + is -> + is + <&> \wi -> + fromMaybe (Messages.lookup ["combat", "hit", "generic"]) + $ wi ^. attackMessage + handleFists = do damageChance <- use $ character . body . knuckles . to fistDamageChance diff --git a/users/grfn/xanthous/src/Xanthous/Entities/Character.hs b/users/grfn/xanthous/src/Xanthous/Entities/Character.hs index 0a993a2f479c..c8153086f1ac 100644 --- a/users/grfn/xanthous/src/Xanthous/Entities/Character.hs +++ b/users/grfn/xanthous/src/Xanthous/Entities/Character.hs @@ -218,7 +218,9 @@ defaultCharacterDamage = 1 characterDamage :: Character -> Hitpoints characterDamage = fromMaybe defaultCharacterDamage - . preview (inventory . wielded . wieldedItems . wieldableItem . Raw.damage) + . filter (/= 0) + . Just + . sumOf (inventory . wielded . wieldedItems . wieldableItem . Raw.damage) -- | Is the character fully healed up to or past their initial hitpoints? isFullyHealed :: Character -> Bool diff --git a/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs b/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs index 9f5cabecdca7..a7021d76cf65 100644 --- a/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs +++ b/users/grfn/xanthous/src/Xanthous/Entities/RawTypes.hs @@ -200,6 +200,15 @@ makeFieldsNoPrefix ''EdibleItem data WieldableItem = WieldableItem { _damage :: !Hitpoints + -- | Message to use when the character is using this item to attack a + -- creature. + -- + -- Grammatically, this should be of the form "slash at the + -- {{creature.creatureType.name}} with your dagger" + -- + -- = Parameters + -- + -- [@creature@ (type: 'Creature')] The creature being attacked , _attackMessage :: !(Maybe Message) -- | Message to use when a creature is using this item to attack the -- character. diff --git a/users/grfn/xanthous/src/Xanthous/Entities/Raws/broken-dagger.yaml b/users/grfn/xanthous/src/Xanthous/Entities/Raws/broken-dagger.yaml index 2d30e6986b6e..12c76fc14b2e 100644 --- a/users/grfn/xanthous/src/Xanthous/Entities/Raws/broken-dagger.yaml +++ b/users/grfn/xanthous/src/Xanthous/Entities/Raws/broken-dagger.yaml @@ -9,8 +9,8 @@ Item: wieldable: damage: 3 attackMessage: - - You slash at the {{creature.creatureType.name}} with your dagger. - - You stab the {{creature.creatureType.name}} with your dagger. + - slash at the {{creature.creatureType.name}} with your dagger + - stab the {{creature.creatureType.name}} with your dagger creatureAttackMessage: - The {{creature.creatureType.name}} slashes at you with its dagger. - The {{creature.creatureType.name}} stabs you with its dagger. diff --git a/users/grfn/xanthous/src/Xanthous/Entities/Raws/rock.yaml b/users/grfn/xanthous/src/Xanthous/Entities/Raws/rock.yaml index e7492bf5fb6f..3f4e133fe286 100644 --- a/users/grfn/xanthous/src/Xanthous/Entities/Raws/rock.yaml +++ b/users/grfn/xanthous/src/Xanthous/Entities/Raws/rock.yaml @@ -5,6 +5,6 @@ Item: char: . wieldable: damage: 1 - attackMessage: you hit the {{creature.creatureType.name}} in the head with your rock. + attackMessage: hit the {{creature.creatureType.name}} in the head with your rock density: [ 1500000, 2500000 ] volume: [ 0.000125, 0.001 ] diff --git a/users/grfn/xanthous/src/Xanthous/Entities/Raws/stick.yaml b/users/grfn/xanthous/src/Xanthous/Entities/Raws/stick.yaml index a7eae9c36666..7f9e1faffedb 100644 --- a/users/grfn/xanthous/src/Xanthous/Entities/Raws/stick.yaml +++ b/users/grfn/xanthous/src/Xanthous/Entities/Raws/stick.yaml @@ -9,9 +9,9 @@ Item: wieldable: damage: 2 attackMessage: - - You bonk the {{creature.creatureType.name}} over the head with your stick. - - You bash the {{creature.creatureType.name}} on the noggin with your stick. - - You whack the {{creature.creatureType.name}} with your stick. + - bonk the {{creature.creatureType.name}} over the head with your stick + - bash the {{creature.creatureType.name}} on the noggin with your stick + - whack the {{creature.creatureType.name}} with your stick creatureAttackMessage: - The {{creature.creatureType.name}} bonks you over the head with its stick. - The {{creature.creatureType.name}} bashes you on the noggin with its stick. -- cgit 1.4.1