From e6695858cbbca16ce9ae49140a494b1e53835a50 Mon Sep 17 00:00:00 2001 From: 4g10w <4g10w@protonmail.com> Date: Wed, 10 Sep 2025 11:31:44 +0300 Subject: [PATCH] Armorattus Valoricus (#1675) * Rat and armor Added rat mob and rat armor. Slightly changed interaction popup system to allow for both picking up and hugging interaction. This adds an "Interact" item to context menu of interactable (huggable) objects. Trying to make it in a way that allows for more pets to be added later. * Rat ghost role Rat: - added ghost role with descriptions and rules - added hand Rat armor: - added crafting recipe * Ghost role, armor and adjustments Added: - Ghost role spawner for rat Changed: - AI-controlled rat will now retaliate if attacked - Rat is now a bit slower - Playable humanoid races can no longer wear rat armor Removed: - Rat's hand because it leads to unwanted interactions - Rat will no longer stabilize the demiplane, so it will collapse if rat is the only player-controlled entity left. This is done because without a hand rat cannot leave the demiplane on it's own * Armor cost, Rat hunger, Rat ghostrole Tweaks and Fix Added: - Rat's hunger level is now visible when examining it Changed: - Rat gets hungry slower than before. When starving it takes less damage and slows down by less amount - Rat ghostrole prototype moved to it's own directory Fixed: - Rat armor physical composition now makes sense and costs exactly like it's ingredients * fixing the rat armor composition... again * Armor and HP tweaks Changed: - Lowered protection values given by rat armor to lower the price - Increased crafting price for rat armor from 2 iron ingots to 6. A lot of wasted material for such delicate work I suppose. - Increased rat's HP by 10 to counter armor changes * Removed interaction Reverted InteractionPopupSystem and deleted interaction texts for rat * Updated licenses and authorships of sprites * fixed license and removed interaction from rat prototype * Fixed armor looking wrong in rat's dead state * Removed unnecessary images from rat.rsi * Removed IronSmelting skill requirment since currently smith is removed * Rat's size changed from Tiny to Normal to reflect how bigass this rat really is --------- Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com> --- .../Locale/en-US/_CP14/ghostRoles/roles.ftl | 4 + .../Locale/en-US/_CP14/ghostRoles/rules.ftl | 4 +- .../Locale/ru-RU/_CP14/ghostRoles/roles.ftl | 3 + .../Locale/ru-RU/_CP14/ghostRoles/rules.ftl | 4 +- .../Entities/Markers/Spawners/ghost_roles.yml | 23 ++++ .../_CP14/Entities/Mobs/NPC/rat.yml | 116 ++++++++++++++++++ .../Entities/Objects/PetArmor/rat_armor.yml | 29 +++++ .../carcat_inventory_template.yml | 3 + .../human_inventory_template.yml | 3 + .../partial_inventory_template.yml | 3 + .../rat_inventory_template.yml | 20 +++ .../_CP14/Recipes/Workbench/Anvil/misc.yml | 13 +- Resources/Prototypes/_CP14/Tags/misc.yml | 6 + .../rat_armor.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 950 bytes .../Clothing/PetArmor/rat_armor.rsi/icon.png | Bin 0 -> 369 bytes .../Clothing/PetArmor/rat_armor.rsi/meta.json | 21 ++++ .../_CP14/Mobs/Pets/rat.rsi/meta.json | 21 ++++ .../Textures/_CP14/Mobs/Pets/rat.rsi/rat.png | Bin 0 -> 1378 bytes .../_CP14/Mobs/Pets/rat.rsi/rat_dead.png | Bin 0 -> 1287 bytes 19 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 Resources/Prototypes/_CP14/Entities/Markers/Spawners/ghost_roles.yml create mode 100644 Resources/Prototypes/_CP14/Entities/Mobs/NPC/rat.yml create mode 100644 Resources/Prototypes/_CP14/Entities/Objects/PetArmor/rat_armor.yml create mode 100644 Resources/Prototypes/_CP14/InventoryTemplates/rat_inventory_template.yml create mode 100644 Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/icon.png create mode 100644 Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Mobs/Pets/rat.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Mobs/Pets/rat.rsi/rat.png create mode 100644 Resources/Textures/_CP14/Mobs/Pets/rat.rsi/rat_dead.png diff --git a/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl b/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl index 86f20be2c6..ed715c208a 100644 --- a/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl +++ b/Resources/Locale/en-US/_CP14/ghostRoles/roles.ftl @@ -6,3 +6,7 @@ cp14-ghost-role-information-description-lurker = A spirit of night and hunger th cp14-ghost-role-information-name-raid-undead = Undead raid cp14-ghost-role-information-description-raid-undead = Lead the attack on the city by the forces of the dead. Destroy the demiplane communication crystal at any cost. + +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. + diff --git a/Resources/Locale/en-US/_CP14/ghostRoles/rules.ftl b/Resources/Locale/en-US/_CP14/ghostRoles/rules.ftl index 180c6c95c9..47050d16ff 100644 --- a/Resources/Locale/en-US/_CP14/ghostRoles/rules.ftl +++ b/Resources/Locale/en-US/_CP14/ghostRoles/rules.ftl @@ -2,4 +2,6 @@ cp14-ghost-role-information-rules-demiplane = You are the [color=red]demiplane a cp14-ghost-role-information-rules-free = You are a [color=yellow]free antagonist[/color]. You can do whatever you want, as long as it doesn't result in widespread destruction and mass deaths. You do not remember your past life, and you are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -cp14-ghost-role-information-rules-raid = You are a [color=red]member of the raid[/color]. Your task is to sneak into the heart of the city and destroy the demiplane communication crystal. You can fulfill your goal by any means necessary. You do not remember your past life, and you are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. \ No newline at end of file +cp14-ghost-role-information-rules-raid = You are a [color=red]member of the raid[/color]. Your task is to sneak into the heart of the city and destroy the demiplane communication crystal. You can fulfill your goal by any means necessary. You do not remember your past life, and you are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. + +cp14-ghost-role-information-rules-pet = You are a [color=yellow]free neutral agent[/color]. Being a smart creature, you can do whatever you want, as long as it fits your animal behavior. Befriend the people or get in a pack with other animals. While you're not an antagonist per se, you can still do minor crimes like theft and can defend yourself if attacked. diff --git a/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl b/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl index 0d620ada43..8c7bbf90bd 100644 --- a/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl +++ b/Resources/Locale/ru-RU/_CP14/ghostRoles/roles.ftl @@ -6,3 +6,6 @@ cp14-ghost-role-information-description-lurker = Дух ночи и голода cp14-ghost-role-information-name-raid-undead = Рейд нежити cp14-ghost-role-information-description-raid-undead = Возглавьте атаку на город силами мертвых. Уничтожьте кристалл связи с демипланами любой ценой. + +cp14-ghost-role-information-name-rat = Крыса +cp14-ghost-role-information-description-rat = Крыса чести. Избавьте тавернщиков от тяжести лишней еды или присоединитесь к группе авантюристов в роли бронированного оруженосца. diff --git a/Resources/Locale/ru-RU/_CP14/ghostRoles/rules.ftl b/Resources/Locale/ru-RU/_CP14/ghostRoles/rules.ftl index 81f65cdf80..e33f3dac3f 100644 --- a/Resources/Locale/ru-RU/_CP14/ghostRoles/rules.ftl +++ b/Resources/Locale/ru-RU/_CP14/ghostRoles/rules.ftl @@ -2,4 +2,6 @@ cp14-ghost-role-information-rules-demiplane = Вы - [color=red]антагони cp14-ghost-role-information-rules-free = Вы - [color=yellow]свободный антагонист[/color]. Вы можете делать все что хотите, если это не приводит к масштабным разрушениям и массовым смертям. Вы не помните вашу прошлую жизнь, и вам абсолютно [color=red]НЕ[/color] разрешается помнить, скажем, имя, внешность и т.д. вашего предыдущего персонажа. -cp14-ghost-role-information-rules-raid = Вы - [color=red]участник рейда[/color]. Ваша задача - пробраться в сердце города и уничтожить кристалл связи с демипланом. Вы можете выполнять свою цель любыми способами. Вы не помните вашу прошлую жизнь, и вам абсолютно [color=red]НЕ[/color] разрешается помнить, скажем, имя, внешность и т.д. вашего предыдущего персонажа. \ No newline at end of file +cp14-ghost-role-information-rules-raid = Вы - [color=red]участник рейда[/color]. Ваша задача - пробраться в сердце города и уничтожить кристалл связи с демипланом. Вы можете выполнять свою цель любыми способами. Вы не помните вашу прошлую жизнь, и вам абсолютно [color=red]НЕ[/color] разрешается помнить, скажем, имя, внешность и т.д. вашего предыдущего персонажа. + +cp14-ghost-role-information-rules-pet = Вы - [color=yellow]свободный нейтральный агент[/color]. Являясь умным существом, вы вольны действовать как хотите, если это вписывается в поведение животного. Подружитесь с людьми или сбейтесь в стаю с другими животными. Хоть вы и не являетесь антагонистом, вы всё ещё можете совершать мелкие преступления типа краж и защищаться, если потребуется. diff --git a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/ghost_roles.yml new file mode 100644 index 0000000000..f6547e1411 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/ghost_roles.yml @@ -0,0 +1,23 @@ +- type: entity + id: SpawnPointGhostRat + name: ghost role spawn point + description: A ghost role for a rat + suffix: Rat + categories: [ ForkFiltered ] + parent: MarkerBase + components: + - type: GhostRole + name: cp14-ghost-role-information-name-rat + description: cp14-ghost-role-information-description-rat + rules: cp14-ghost-role-information-rules-pet + allowMovement: true + raffle: + settings: default + - type: GhostRoleMobSpawner + prototype: CP14MobRat + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: _CP14/Mobs/Pets/rat.rsi + state: rat diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/rat.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/rat.yml new file mode 100644 index 0000000000..7dbe6a4ab5 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/rat.yml @@ -0,0 +1,116 @@ +- type: entity + id: CP14MobRat + parent: CP14SimpleMobBase + name: rat + description: An adorable rat. You see valor in it's eyes fit for a squire. + categories: [ ForkFiltered ] + components: + - type: HTN + rootTask: + task: RuminantHostileCompound + - type: NpcFactionMember + factions: + - CP14PeacefulAnimals + - type: NPCRetaliation + attackMemoryLength: 30 + - type: Sprite + drawdepth: SmallMobs + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + sprite: _CP14/Mobs/Pets/rat.rsi + state: rat + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.2 + density: 8 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: Tag + tags: + - CP14Rat + - type: Item + size: Normal + - type: CanEscapeInventory + baseResistTime: 1 + - type: Speech + speechSounds: Squeak + speechVerb: SmallMob + allowedEmotes: ['Squeak'] + - type: Vocal + sounds: + Male: Mouse + Female: Mouse + Unsexed: Mouse + - type: ReplacementAccent + accent: mouse + - type: Appearance + - type: MobThresholds + thresholds: + 0: Alive + 40: Critical + 50: Dead + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Mouse_burning + - type: CombatMode + - type: MeleeWeapon + angle: 0 + animation: WeaponArcBite + damage: + types: + Piercing: 8 + - type: MovementSpeedModifier + baseWalkSpeed : 3 + baseSprintSpeed : 6 + - type: DamageStateVisuals + states: + Alive: + Base: rat + Critical: + Base: rat_dead + Dead: + Base: rat_dead + - type: Bloodstream + bloodMaxVolume: 50 + bloodReagent: CP14BloodAnimal + - type: Thirst + thresholds: + OverHydrated: 150 + Okay: 100 + Thirsty: 50 + Parched: 25 + Dead: 0 + baseDecayRate: 0.04 + - type: Hunger + thresholds: + Overfed: 50 + Okay: 25 + Peckish: 10 + Starving: 5 + Dead: 0 + baseDecayRate: 0.03 # hungry hungry rats + starvationDamage: + types: + Cold: 0.1 + Bloodloss: 0.1 + starvingSlowdownModifier: 0.9 + - type: ExaminableHunger + - type: Strippable + - type: UserInterface + interfaces: + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface + - type: InventorySlots + - type: Inventory + speciesId: CP14Rat + templateId: CP14Rat + - type: Puller + needsHands: false + - type: CP14NightVision + - type: Climbing + diff --git a/Resources/Prototypes/_CP14/Entities/Objects/PetArmor/rat_armor.yml b/Resources/Prototypes/_CP14/Entities/Objects/PetArmor/rat_armor.yml new file mode 100644 index 0000000000..3fd60c8610 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/PetArmor/rat_armor.yml @@ -0,0 +1,29 @@ +- type: entity + parent: CP14ClothingOuterClothingBase + id: CP14RatArmor + name: rat armor + description: A sturdy armor, suit for a noble rat squire + components: + - type: Sprite + sprite: _CP14/Clothing/PetArmor/rat_armor.rsi + - type: Clothing + sprite: _CP14/Clothing/PetArmor/rat_armor.rsi + unequipDelay: 1 + - type: Tag + tags: + - CP14RatWearable + - PetOnly + - type: Armor + modifiers: + coefficients: + Blunt: 0.7 + Slash: 0.55 + Piercing: 0.7 + Heat: 0.9 + - type: ClothingSpeedModifier + walkModifier: 0.9 + sprintModifier: 0.9 + - type: PhysicalComposition + materialComposition: + CP14Iron: 60 + diff --git a/Resources/Prototypes/_CP14/InventoryTemplates/carcat_inventory_template.yml b/Resources/Prototypes/_CP14/InventoryTemplates/carcat_inventory_template.yml index d6fb4945f0..1884e5e060 100644 --- a/Resources/Prototypes/_CP14/InventoryTemplates/carcat_inventory_template.yml +++ b/Resources/Prototypes/_CP14/InventoryTemplates/carcat_inventory_template.yml @@ -53,6 +53,9 @@ uiWindowPos: 2,2 strippingWindowPos: 2,1 displayName: Armor + blacklist: + tags: + - PetOnly - name: cloak slotTexture: cloak slotFlags: CLOAK diff --git a/Resources/Prototypes/_CP14/InventoryTemplates/human_inventory_template.yml b/Resources/Prototypes/_CP14/InventoryTemplates/human_inventory_template.yml index 70eb7c8169..3d61d7011a 100644 --- a/Resources/Prototypes/_CP14/InventoryTemplates/human_inventory_template.yml +++ b/Resources/Prototypes/_CP14/InventoryTemplates/human_inventory_template.yml @@ -53,6 +53,9 @@ uiWindowPos: 2,2 strippingWindowPos: 2,1 displayName: Armor + blacklist: + tags: + - PetOnly - name: cloak slotTexture: cloak slotFlags: CLOAK diff --git a/Resources/Prototypes/_CP14/InventoryTemplates/partial_inventory_template.yml b/Resources/Prototypes/_CP14/InventoryTemplates/partial_inventory_template.yml index c5274ea95e..1a348bb7e9 100644 --- a/Resources/Prototypes/_CP14/InventoryTemplates/partial_inventory_template.yml +++ b/Resources/Prototypes/_CP14/InventoryTemplates/partial_inventory_template.yml @@ -59,6 +59,9 @@ uiWindowPos: 2,1 strippingWindowPos: 2,3 displayName: Armor + blacklist: + tags: + - PetOnly - name: cloak slotTexture: cloak slotFlags: CLOAK diff --git a/Resources/Prototypes/_CP14/InventoryTemplates/rat_inventory_template.yml b/Resources/Prototypes/_CP14/InventoryTemplates/rat_inventory_template.yml new file mode 100644 index 0000000000..39e7db9cb2 --- /dev/null +++ b/Resources/Prototypes/_CP14/InventoryTemplates/rat_inventory_template.yml @@ -0,0 +1,20 @@ +- type: inventoryTemplate + id: CP14Rat + slots: + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + uiWindowPos: 0,1 + strippingWindowPos: 1,1 + displayName: Armor + whitelist: + tags: + - CP14RatWearable + + # Little rat cloak might be cute idk + # - name: cloak + # slotTexture: cloak + # slotFlags: CLOAK + # uiWindowPos: 0,2 + # strippingWindowPos: 1,2 + # displayName: Cloak diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/Anvil/misc.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/Anvil/misc.yml index e021a8ff75..88de669592 100644 --- a/Resources/Prototypes/_CP14/Recipes/Workbench/Anvil/misc.yml +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/Anvil/misc.yml @@ -440,4 +440,15 @@ stack: CP14IronBar count: 1 result: CP14IronBuckle - resultCount: 5 \ No newline at end of file + resultCount: 5 + +- type: CP14Recipe + id: CP14RatArmor + tag: CP14RecipeAnvil + category: Armor + craftTime: 4 + requirements: + - !type:StackResource + stack: CP14IronBar + count: 6 + result: CP14RatArmor diff --git a/Resources/Prototypes/_CP14/Tags/misc.yml b/Resources/Prototypes/_CP14/Tags/misc.yml index ed6dda587c..8bcb073559 100644 --- a/Resources/Prototypes/_CP14/Tags/misc.yml +++ b/Resources/Prototypes/_CP14/Tags/misc.yml @@ -40,6 +40,12 @@ - type: Tag id: CP14Rabbit +- type: Tag + id: CP14Rat + +- type: Tag + id: CP14RatWearable + - type: Tag id: CP14Pig diff --git a/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..408a420e1068060e2c15a94056bd2a6802952a94 GIT binary patch literal 950 zcmV;n14;aeP)Px&a7jc#RCt{2nm=nIK^Vp#kNXUQ5?wjLKw3f8z*?l(DwTzIAWI-gV-XPY0YV5@ z2GXTT(nvrpQXL0psYS%YR=5RaR*wYy5_5&l-n#M6?!@(S;r%u0tjs(!^UNQ8Uw|M8 zf>_S?A3yoO)({jQy?p8B_AY20QsfII4gePGquXhOWa{uV02b>bUnud1`t?jBLI41` zp9M`iqw}1m0svSn3;)V~*B*F!z*+XS&f4@l0RQdFbi$O>vK7p};Jt$X~=Np-Q zP0M098rx;@SXjz^uW~@WR<+9tpTBIx0jriEd>)4%WJDN75%pRX>h2!Y-91F23hK2g z#K{me&dvjqlgKcNQWGFG0OgZ|P$a4#r>V$kDl{#NNK`@j~S$l3Xvrb5^EXS4vY8J)*tVK6oTFo^(JtdBb2_JR5`&i z%}!R@A-c8ABT)rF@L}(DA)N92WJyJg31Z5kqvJiXG)2biM)Iy%$8C-v2!bF8f_Q`c Y0f=4YRg=;|xc~qF07*qoM6N<$f{vc8r2qf` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/icon.png b/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cedbc77b253997792af6a39c93770cfac6892769 GIT binary patch literal 369 zcmV-%0gnEOP)Px$D@jB_R9J=Wkg;mQP!xv0ls$C(^Zk|!=bU@~|NLMu7z_r(5!~HBtFrePtYd_q z9v>JCM-Am}3Higdlx z9-vF2G=ZXcvDR$Vka7h;W=IGxHv^ER)M{Pj`=V&6O`_C*&h4QKvwxGYPrKtEjJ?Q7 zl_7vc#@e3kxP)JyRafm%$z}cgQk~UpZGXE-*!=!j*<97@4F-e3U;y|71UG!fWU0bg P00000NkvXXu0mjf@&TnV literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/meta.json b/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/meta.json new file mode 100644 index 0000000000..3d4cf13285 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/PetArmor/rat_armor.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (Discord)", + "size": + { + "x": 32, + "y": 32 + }, + "states": + [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} + diff --git a/Resources/Textures/_CP14/Mobs/Pets/rat.rsi/meta.json b/Resources/Textures/_CP14/Mobs/Pets/rat.rsi/meta.json new file mode 100644 index 0000000000..c29768559d --- /dev/null +++ b/Resources/Textures/_CP14/Mobs/Pets/rat.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Created by infrared_baron", + "size": + { + "x": 32, + "y": 32 + }, + "states": + [ + { + "name": "rat", + "directions": 4 + }, + { + "name": "rat_dead", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Mobs/Pets/rat.rsi/rat.png b/Resources/Textures/_CP14/Mobs/Pets/rat.rsi/rat.png new file mode 100644 index 0000000000000000000000000000000000000000..1b2325e85e1660a9b1b5c897bcc45955e12814e1 GIT binary patch literal 1378 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 literal 0 HcmV?d00001