From 3630ac156ac5ecf320299dfb87e674aebb5ce785 Mon Sep 17 00:00:00 2001 From: Nim <128169402+Nimfar11@users.noreply.github.com> Date: Mon, 15 Sep 2025 19:01:13 +0300 Subject: [PATCH] Bone hound (#1718) * bone hound * fix * fix2 * fix3 * fix4 --- .../Locale/en-US/_CP14/ghostRoles/roles.ftl | 2 + .../Locale/ru-RU/_CP14/ghostRoles/roles.ftl | 3 + .../Actions/Spells/Skeleton/bone_hound.yml | 75 ++++++++++++++ .../_CP14/Entities/Mobs/NPC/bone_hound.yml | 95 ++++++++++++++++++ .../Player/DemiplaneAntag/Skeletons/T2.yml | 4 + .../_CP14/Entities/Mobs/Species/skeleton.yml | 2 +- .../Structures/Decorations/bone_remains.yml | 77 +++++++++++--- .../Spells/skeleton.rsi/bone_hound.png | Bin 0 -> 1116 bytes .../Actions/Spells/skeleton.rsi/meta.json | 14 +++ .../Mobs/Monster/bone_hound.rsi/dead.png | Bin 0 -> 1460 bytes .../Mobs/Monster/bone_hound.rsi/live.png | Bin 0 -> 4967 bytes .../Mobs/Monster/bone_hound.rsi/meta.json | 18 ++++ 12 files changed, 275 insertions(+), 15 deletions(-) create mode 100644 Resources/Prototypes/_CP14/Entities/Actions/Spells/Skeleton/bone_hound.yml create mode 100644 Resources/Prototypes/_CP14/Entities/Mobs/NPC/bone_hound.yml create mode 100644 Resources/Textures/_CP14/Actions/Spells/skeleton.rsi/bone_hound.png create mode 100644 Resources/Textures/_CP14/Actions/Spells/skeleton.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Mobs/Monster/bone_hound.rsi/dead.png create mode 100644 Resources/Textures/_CP14/Mobs/Monster/bone_hound.rsi/live.png create mode 100644 Resources/Textures/_CP14/Mobs/Monster/bone_hound.rsi/meta.json diff --git a/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl b/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl index ed715c208a..f1b8f50ba8 100644 --- a/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl +++ b/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl @@ -10,3 +10,5 @@ cp14-ghost-role-information-description-raid-undead = Lead the attack on the cit cp14-ghost-role-information-name-rat = Rat cp14-ghost-role-information-description-rat = An honorable rat. Relieve tavernkeep of their extra food or join the adventurers as an armored squire. +cp14-ghost-role-information-name-bone-hound = Bone hound +cp14-ghost-role-information-description-bone-hound = A bone hound created by necromantic magic, usually summoned by skeleton mages to form a pack of hunters. Obeys the skeleton that summoned it. diff --git a/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl b/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl index 8c7bbf90bd..8f6a42ebb7 100644 --- a/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl +++ b/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl @@ -9,3 +9,6 @@ cp14-ghost-role-information-description-raid-undead = Возглавьте ат cp14-ghost-role-information-name-rat = Крыса cp14-ghost-role-information-description-rat = Крыса чести. Избавьте тавернщиков от тяжести лишней еды или присоединитесь к группе авантюристов в роли бронированного оруженосца. + +cp14-ghost-role-information-name-bone-hound = Костяная гончая +cp14-ghost-role-information-description-bone-hound = Костяная гончая, созданная с помощью магии некромантии, обычно вызываемая магами скелетами для формирования стаи охотников. Подчиняется скелету, который его вызвал. diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Skeleton/bone_hound.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Skeleton/bone_hound.yml new file mode 100644 index 0000000000..a0cd1b7606 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Skeleton/bone_hound.yml @@ -0,0 +1,75 @@ +- type: entity + id: CP14ActionSpellCallBoneHound + parent: CP14ActionSpellBase + name: Call of the Bone hound + description: The spell creates a bloodthirsty bone hound from bones. With luck, it may even gain a mind as cunning as your own. + components: + - type: Sprite + sprite: _CP14/Actions/Spells/skeleton.rsi + state: bone_hound + - type: CP14MagicEffectCastSlowdown + speedMultiplier: 0.5 + - type: CP14ActionManaCost + manaCost: 50 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectCallBoneHound + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14MobMonsterBoneHound + - type: CP14ActionMaterialCost + requirement: !type:StackResource + stack: CP14Bone + count: 10 + - type: CP14ActionSpeaking + startSpeech: "Ossa mortuorum..." + endSpeech: "incipiunt mihi quasi canis canis servire" + - type: CP14MagicEffectCastingVisual + proto: CP14RuneCallBoneHound + - type: Action + icon: + sprite: _CP14/Actions/Spells/skeleton.rsi + state: bone_hound + - type: LimitedCharges + maxCharges: 3 + - type: TargetAction + range: 10 + - type: WorldTargetAction + event: !type:CP14DelayedWorldTargetActionEvent + cooldown: 20 + +- type: entity + id: CP14RuneCallBoneHound + parent: CP14BaseMagicRune + categories: [ HideSpawnMenu ] + save: false + components: + - type: PointLight + color: "#ae9c86" + - type: Sprite + layers: + - state: medium_line + color: "#ae9c86" + shader: unshaded + - state: medium_circle + color: "#ae9c86" + shader: unshaded + +- type: entity + id: CP14ImpactEffectCallBoneHound + parent: CP14BaseMagicImpact + categories: [ HideSpawnMenu ] + save: false + components: + - type: Sprite + layers: + - state: particles_up + color: "#ae9c86" + shader: unshaded + - sprite: _CP14/Effects/Magic/cast_rune.rsi + state: medium_circle + color: "#ae9c86" + shader: unshaded diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/bone_hound.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/bone_hound.yml new file mode 100644 index 0000000000..29c0ea017f --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/bone_hound.yml @@ -0,0 +1,95 @@ +- type: entity + id: CP14MobMonsterBoneHound + parent: CP14SimpleMobBase + name: bone hound + description: The skeleton of a hound, animated by dark magic, even more bloodthirsty and dangerous than when alive. + categories: [ ForkFiltered ] + components: + - type: GhostTakeoverAvailable + - type: GhostRole + name: cp14-ghost-role-information-name-bone-hound + allowMovement: true + description: cp14-ghost-role-information-description-bone-hound + rules: cp14-ghost-role-information-rules-demiplane + mindRoles: + - CP14MindRoleDemiplaneAntag + raffle: + settings: default + - type: HTN + rootTask: + task: SimpleHostileCompound + blackboard: + NavSmash: !type:Bool + true + VisionRadius: !type:Single + 10 + AggroVisionRadius: !type:Single + 10 + - type: NpcFactionMember + factions: + - CP14Monster + - type: NPCImprintingOnSpawnBehaviour + whitelist: + components: + - MobThresholds + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _CP14/Mobs/Monster/bone_hound.rsi + state: live + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.30 + density: 50 + mask: + - MobMask + layer: + - MobLayer + - type: Appearance + - type: CP14NightVision + - type: SlowOnDamage + speedModifierThresholds: + 40: 0.8 + - type: CombatMode + - type: MeleeWeapon + angle: 0 + animation: WeaponArcBite + damage: + types: + Slash: 4 + Piercing: 4 + - type: MovementSpeedModifier + baseWalkSpeed: 5 + baseSprintSpeed: 5 + - type: Damageable + damageContainer: CP14BiologicalAnaerobic + damageModifierSet: CP14Skeleton + - type: Bloodstream + bloodReagent: CP14BloodAnimal + bloodMaxVolume: 0 + - type: Grammar + attributes: + gender: epicene + - type: Tag + tags: + - FootstepSound + - CP14Mosquito + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + CP14BoneRemainsBoneHound: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + collection: CP14BoneCrack diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml index 3b893cde33..7de41c6a3b 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml @@ -135,6 +135,10 @@ - CP14ActionSpellManaConsumeElf - CP14ActionSpellManaGiftElf - CP14ActionSpellMagicSplitting + - type: CP14SpellStorage + grantAccessToSelf: true + spells: + - CP14ActionSpellCallBoneHound - type: entity id: CP14MobUndeadSkeletonBardT2 diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml index 0cfcf13986..9b6e1d0c18 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml @@ -91,7 +91,7 @@ - type: CP14AuraImprint imprintColor: "#a81b5d" - type: Damageable - damageContainer: CP14Biological + damageContainer: CP14BiologicalAnaerobic damageModifierSet: CP14Skeleton - type: Destructible thresholds: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/bone_remains.yml b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/bone_remains.yml index 30dde9edbc..c80baf0354 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/bone_remains.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/bone_remains.yml @@ -1,11 +1,21 @@ - type: entity parent: BaseStructure + id: CP14BaseBoneStructure + categories: [ ForkFiltered ] + abstract: true + components: + - type: Physics + bodyType: Static + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: CP14Skeleton + +- type: entity + parent: CP14BaseBoneStructure id: CP14BaseBoneRemains name: bone remains description: The remains of bones have grown into the ground. - categories: [ ForkFiltered ] components: - - type: Clickable - type: Sprite noRot: true sprite: _CP14/Structures/Decoration/bone_remains.rsi @@ -19,8 +29,6 @@ bone_remains_1: "" bone_remains_2: "" bone_remains_3: "" - - type: Physics - bodyType: Static - type: Fixtures fixtures: fix1: @@ -33,9 +41,6 @@ - SlipLayer layer: - ItemMask - - type: Damageable - damageContainer: StructuralInorganic - damageModifierSet: CP14Skeleton - type: FootstepModifier footstepSoundCollection: collection: CP14StepBones @@ -59,11 +64,59 @@ collection: CP14BoneCrack - type: entity + parent: CP14BaseBoneStructure + id: CP14BoneRemainsBoneHound + name: bone remains hound + description: The bones of a hound that died a long time ago... or very recently. + components: + - type: Sprite + noRot: true + sprite: _CP14/Mobs/Monster/bone_hound.rsi + drawdepth: BelowFloor + layers: + - state: dead + - type: FootstepModifier + footstepSoundCollection: + collection: CP14StepBones + params: + volume: 4 + - type: Fixtures + fixtures: + fix1: + hard: false + shape: + !type:PhysShapeCircle + radius: 0.2 + density: 50 + mask: + - SlipLayer + layer: + - ItemMask + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:SpawnEntitiesBehavior + spawn: + CP14Bone1: + min: 2 + max: 4 + CP14ClothingMaskBoneHornedMask: + min: 0 + max: 1 + - !type:PlaySoundBehavior + sound: + collection: CP14BoneCrack + +- type: entity + parent: CP14BaseBoneStructure id: CP14BoneSpine - parent: BaseStructure name: bone spine description: The large bony torso of an unknown creature, as if it had been torn to pieces. - categories: [ ForkFiltered ] components: - type: Sprite noRot: true @@ -82,9 +135,6 @@ - MachineMask layer: - MachineLayer - - type: Damageable - damageContainer: StructuralInorganic - damageModifierSet: CP14Skeleton - type: Destructible thresholds: - trigger: @@ -103,11 +153,10 @@ collection: CP14BoneCrack - type: entity + parent: CP14BaseBoneStructure id: CP14BoneDragon - parent: CP14BoneSpine name: bone dragon description: The large skeleton of a dragon, the possibility of encountering such a creature is both fascinating and terrifying. - categories: [ ForkFiltered ] components: - type: Sprite noRot: true diff --git a/Resources/Textures/_CP14/Actions/Spells/skeleton.rsi/bone_hound.png b/Resources/Textures/_CP14/Actions/Spells/skeleton.rsi/bone_hound.png new file mode 100644 index 0000000000000000000000000000000000000000..2a00fc3ec53a8960ffbc174ef10e4bd7341e36bf GIT binary patch literal 1116 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 O0000uw1d(h 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