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:
parent
4b11859d04
commit
a3d220b631
5 changed files with 50 additions and 11 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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³
|
||||||
|
|
|
@ -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}}!
|
||||||
|
|
Loading…
Reference in a new issue