feat(gs/xanthous): Creatures use their weapons to attack

If a creature has a weapon wielded, then they now use that weapon to
attack the player *instead of* their natural attacks. This uses a new
`creatureAttackMessage` field on the Item raw for the message to use.

Change-Id: I73614f33dbf88dd4c68081f15710fa27b7b21ba2
This commit is contained in:
Griffin Smith 2021-11-25 09:53:56 -05:00 committed by grfn
parent 4b11859d04
commit a3d220b631
5 changed files with 50 additions and 11 deletions

View file

@ -26,8 +26,10 @@ import qualified Xanthous.Entities.Character as Character
import qualified Xanthous.Entities.RawTypes as Raw import qualified Xanthous.Entities.RawTypes as Raw
import Xanthous.Entities.RawTypes import Xanthous.Entities.RawTypes
( CreatureType, HasLanguage(language), getLanguage ( CreatureType, HasLanguage(language), getLanguage
, HasAttacks (attacks) , HasAttacks (attacks), creatureAttackMessage
) )
import Xanthous.Entities.Common
( wielded, Inventory, wieldedItems, WieldedItem (WieldedItem) )
import Xanthous.Game.State import Xanthous.Game.State
import Xanthous.Game.Lenses import Xanthous.Game.Lenses
( entitiesCollision, collisionAt ( entitiesCollision, collisionAt
@ -36,7 +38,7 @@ import Xanthous.Game.Lenses
) )
import Xanthous.Data.EntityMap.Graphics (linesOfSight, canSee) import Xanthous.Data.EntityMap.Graphics (linesOfSight, canSee)
import Xanthous.Random import Xanthous.Random
import Xanthous.Monad (say) import Xanthous.Monad (say, message)
import Xanthous.Generators.Speech (word) import Xanthous.Generators.Speech (word)
import qualified Linear.Metric as Metric import qualified Linear.Metric as Metric
import qualified Xanthous.Messages as Messages import qualified Xanthous.Messages as Messages
@ -50,6 +52,7 @@ type IsCreature entity =
( HasVisionRadius entity ( HasVisionRadius entity
, HasField "_hippocampus" entity entity Hippocampus Hippocampus , HasField "_hippocampus" entity entity Hippocampus Hippocampus
, HasField "_creatureType" entity entity CreatureType CreatureType , HasField "_creatureType" entity entity CreatureType CreatureType
, HasField "_inventory" entity entity Inventory Inventory
, A.ToJSON entity , A.ToJSON entity
) )
@ -113,14 +116,26 @@ stepGormlak ticks pe@(Positioned pos creature) = do
where where
vision = visionRadius creature vision = visionRadius creature
attackCharacter = do attackCharacter = do
attack <- choose $ creature ^. creatureType . attacks dmg <- case creature ^? inventory . wielded . wieldedItems of
attackDescription <- Messages.render (attack ^. Raw.description) Just (WieldedItem item wi) -> do
$ object [] let msg = fromMaybe
say ["combat", "creatureAttack"] (Messages.lookup ["combat", "creatureAttack", "genericWeapon"])
$ object [ "creature" A..= creature $ wi ^. creatureAttackMessage
, "attackDescription" A..= attackDescription message msg $ object [ "creature" A..= creature
] , "item" A..= item
character %= Character.damage (attack ^. Raw.damage) ]
pure $ wi ^. Raw.damage
Nothing -> do
attack <- choose $ creature ^. creatureType . attacks
attackDescription <- Messages.render (attack ^. Raw.description)
$ object []
say ["combat", "creatureAttack", "natural"]
$ object [ "creature" A..= creature
, "attackDescription" A..= attackDescription
]
pure $ attack ^. Raw.damage
character %= Character.damage dmg
yellAtCharacter = for_ (creature ^. creatureType . language) yellAtCharacter = for_ (creature ^. creatureType . language)
$ \lang -> do $ \lang -> do
@ -171,6 +186,9 @@ hippocampus = field @"_hippocampus"
creatureType :: HasField "_creatureType" s t a b => Lens s t a b creatureType :: HasField "_creatureType" s t a b => Lens s t a b
creatureType = field @"_creatureType" creatureType = field @"_creatureType"
inventory :: HasField "_inventory" s t a b => Lens s t a b
inventory = field @"_inventory"
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- instance Brain Creature where -- instance Brain Creature where

View file

@ -34,6 +34,7 @@ module Xanthous.Entities.RawTypes
, HasAttacks(..) , HasAttacks(..)
, HasChance(..) , HasChance(..)
, HasChar(..) , HasChar(..)
, HasCreatureAttackMessage(..)
, HasDamage(..) , HasDamage(..)
, HasDensity(..) , HasDensity(..)
, HasDescription(..) , HasDescription(..)
@ -200,6 +201,17 @@ makeFieldsNoPrefix ''EdibleItem
data WieldableItem = WieldableItem data WieldableItem = WieldableItem
{ _damage :: !Hitpoints { _damage :: !Hitpoints
, _attackMessage :: !(Maybe Message) , _attackMessage :: !(Maybe Message)
-- | Message to use when a creature is using this item to attack the
-- character.
--
-- Grammatically, should be of the form "The creature slashes you with its
-- dagger".
--
-- = Parameters
--
-- [@creature@ (type: 'Creature')] The creature doing the attacking
-- [@item@ (type: 'Item')] The item itself
, _creatureAttackMessage :: !(Maybe Message)
} }
deriving stock (Show, Eq, Ord, Generic) deriving stock (Show, Eq, Ord, Generic)
deriving anyclass (NFData, CoArbitrary, Function) deriving anyclass (NFData, CoArbitrary, Function)

View file

@ -11,6 +11,9 @@ Item:
attackMessage: attackMessage:
- You slash at the {{creature.creatureType.name}} with your dagger. - You slash at the {{creature.creatureType.name}} with your dagger.
- You stab the {{creature.creatureType.name}} with your dagger. - You 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.
# Just the steel, not the handle, for now # Just the steel, not the handle, for now
density: [7750 , 8050000] density: [7750 , 8050000]
# 15cm 45cm # 15cm 45cm

View file

@ -12,6 +12,10 @@ Item:
- You bonk the {{creature.creatureType.name}} over the head with your stick. - 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 bash the {{creature.creatureType.name}} on the noggin with your stick.
- You whack the {{creature.creatureType.name}} with your stick. - You 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.
- The {{creature.creatureType.name}} whacks you with its stick.
# https://www.sciencedirect.com/topics/agricultural-and-biological-sciences/wood-density # https://www.sciencedirect.com/topics/agricultural-and-biological-sciences/wood-density
# it's a hard stick. so it's dense wood. # it's a hard stick. so it's dense wood.
density: 890000 # g/m³ density: 890000 # g/m³

View file

@ -80,7 +80,9 @@ combat:
generic: generic:
- You hit the {{creature.creatureType.name}}. - You hit the {{creature.creatureType.name}}.
- You attack the {{creature.creatureType.name}}. - You attack the {{creature.creatureType.name}}.
creatureAttack: The {{creature.creatureType.name}} {{attackDescription}} creatureAttack:
natural: The {{creature.creatureType.name}} {{attackDescription}}.
genericWeapon: The {{creature.creatureType.name}} attacks you with its {{item.itemType.name}}.
killed: killed:
- You kill the {{creature.creatureType.name}}! - You kill the {{creature.creatureType.name}}!
- You've killed the {{creature.creatureType.name}}! - You've killed the {{creature.creatureType.name}}!