From f320e99ed9f42211c76de2f72214ef150b086a5f Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 05:12:45 -0400 Subject: [PATCH 01/16] Some BULLSHIT --- .../Mobs/NPCs/mob_hostile_mercenaries.yml | 485 ++++++++++++++++++ .../NPCs/mob_hostile_mercenaries_loot.yml | 110 ++++ .../Clothing/NPC/pmc.rsi/bag-equipped.png | Bin 0 -> 875 bytes .../_Mono/Clothing/NPC/pmc.rsi/bag.png | Bin 0 -> 615 bytes .../_Mono/Clothing/NPC/pmc.rsi/meta.json | 70 +++ .../_Mono/Clothing/NPC/pmc.rsi/pmc-boots.png | Bin 0 -> 533 bytes .../Clothing/NPC/pmc.rsi/pmc-gasmask.png | Bin 0 -> 787 bytes .../_Mono/Clothing/NPC/pmc.rsi/pmc-gloves.png | Bin 0 -> 391 bytes .../NPC/pmc.rsi/pmc-hardsuit-head.png | Bin 0 -> 828 bytes .../pmc-hardsuit-heavy-head-unshaded.png | Bin 0 -> 889 bytes .../NPC/pmc.rsi/pmc-hardsuit-heavy-head.png | Bin 0 -> 889 bytes .../NPC/pmc.rsi/pmc-hardsuit-heavy.png | Bin 0 -> 2070 bytes .../Clothing/NPC/pmc.rsi/pmc-hardsuit.png | Bin 0 -> 2143 bytes .../_Mono/Clothing/NPC/pmc.rsi/pmc-helmet.png | Bin 0 -> 860 bytes .../Clothing/NPC/pmc.rsi/pmc-jumpsuit.png | Bin 0 -> 1160 bytes .../Clothing/NPC/pmc.rsi/pmc-uniform.png | Bin 0 -> 1221 bytes .../_Mono/Clothing/NPC/pmc.rsi/pmc-vest.png | Bin 0 -> 639 bytes .../Clothing/NPC/pmc.rsi/pmc-webbing.png | Bin 0 -> 664 bytes 18 files changed, 665 insertions(+) create mode 100644 Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml create mode 100644 Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/bag-equipped.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/bag.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/meta.json create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-boots.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-gasmask.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-gloves.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-head.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy-head-unshaded.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy-head.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-helmet.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-jumpsuit.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-uniform.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-vest.png create mode 100644 Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-webbing.png diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml new file mode 100644 index 00000000000..6d9806235b3 --- /dev/null +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml @@ -0,0 +1,485 @@ +# Base +- type: entity + name: contractor + abstract: true + parent: + - BaseC3MobHuman + - MobNonHumanHostileBase + - MobHumanoidInvetorySimplified + - MobHumanoidHostileAISimpleRanged + - NFMobRestrictions + id: MobMonoPMCBase + description: A private military contractor. Unreasonable filth. + suffix: PMC NPC + components: + - type: Damageable + damageModifierSet: MobMercenaryDamageModifierSet + - type: NpcFactionMember + factions: + - MercenariesExpeditionNF # Placeholder. Its really annoying adding more factions. + - type: MobThresholds + thresholds: + 0: Alive + 100: Critical + 110: Dead + - type: SlowOnDamage + speedModifierThresholds: + 60: 0.9 + 80: 0.6 + - type: Stamina + critThreshold: 100 + - type: DamageStateVisuals + rotate: true + - type: RotationVisuals + defaultRotation: 90 + horizontalRotation: 90 + - type: Butcherable + butcheringType: Spike + spawned: + - id: FoodMeatHuman + amount: 5 + - type: RechargeBasicEntityAmmo + rechargeCooldown: 1.5 + rechargeSound: + path: /Audio/_NF/Effects/silence.ogg + - type: Advertise + pack: mercenaryhumanoidchatter + minimumWait: 30 + maximumWait: 120 + nextAdvertisementTime: 10 + - type: AutoWakeUp + - type: MovementSpeedModifier + baseWalkSpeed : 4.5 + baseSprintSpeed : 4.5 + - type: FootstepModifier + footstepSoundCollection: + collection: FootstepTile + +# Variations +## Tier 1 + +- type: entity + parent: MobMonoPMCBase + id: MobMonoPMCT1Soldier + components: + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-uniform + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-helmet + - sprite: _Mono/Objects/Weapons/Guns/SMGs/ak220.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge9x19mmFMJ + capacity: 30 + count: 30 + - type: Gun + minAngle: 2 + maxAngle: 6 + fireRate: 6 + angleIncrease: 21 + angleDecay: 14 + selectedMode: FullAuto + soundGunshot: + path: /Audio/_Mono/Weapons/Guns/SmallArms/Gunshots/smg.ogg + availableModes: + - FullAuto + - type: MobThresholds + thresholds: + 0: Alive + 100: Critical + 110: Dead + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.9 + 80: 0.6 + +## Tier 2 + +- type: startingGear + id: MobHumanoidMonoPMCGearTier2 + equipment: + back: ClothingBackpackDuffelMonoTier2PMC + +- type: entity + name: contractor + parent: MobMonoPMCBase + id: MobMonoPMCSubmachineGunT2 + suffix: T2, 9mm Vector + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier2PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _Mono/Objects/Weapons/Guns/SMGs/vector.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge9x19mmFMJ + capacity: 25 + count: 25 + - type: Gun + minAngle: 2 + maxAngle: 16 + fireRate: 7.5 + angleIncrease: 3 + angleDecay: 16 + projectileSpeed: 50 # Mono + selectedMode: Burst + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/atreides.ogg + availableModes: + - Burst + burstCooldown: 0.5 + burstFireRate: 14 + shotsPerBurst: 3 + - type: MobThresholds + thresholds: + 0: Alive + 120: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 40: 0.9 + 80: 0.6 + +- type: entity + name: contractor + parent: MobMonoPMCBase + id: MobMonoPMCSniperT2 + suffix: T2, AK-410 + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier2PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _Mono/Objects/Weapons/Guns/Snipers/ak410_inhands_32x.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge762x54mmRFMJ + capacity: 10 + count: 10 + - type: Gun + minAngle: 0 + maxAngle: 3 + fireRate: 1.5 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg + - type: MobThresholds + thresholds: + 0: Alive + 120: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 40: 0.9 + 80: 0.6 + +- type: startingGear + id: MobHumanoidMonoPMCGearTier2Shotgun + equipment: + back: ClothingBackpackDuffelMonoTier2ShotgunPMC + +- type: entity + name: contractor + parent: MobMonoPMCBase + id: MobMonoPMCShotgunT2 + suffix: T2, Big Buddy + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier2PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _Mono/Objects/Weapons/Guns/Shotguns/BigBuddy_inhands_64x.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: ShellShotgun23x75mmBuckshot + capacity: 6 + count: 6 + - type: Gun + fireRate: 0.5 + projectileSpeed: 40 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/_Mono/Weapons/Guns/SmallArms/Gunshots/bigshotgun_fire.ogg + soundEmpty: + path: /Audio/Weapons/Guns/Empty/empty.ogg + - type: MobThresholds + thresholds: + 0: Alive + 120: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 40: 0.9 + 80: 0.6 + +## Tier 3 + +- type: startingGear + id: MobHumanoidMonoPMCGearTier3 + equipment: + back: ClothingBackpackDuffelMonoTier3PMC + +- type: entity + name: contractor assaulter + parent: MobMonoPMCBase + id: MobMonoPMCAssaultT3 + suffix: T3, LTR-556 + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier3PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit-head + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Objects/Weapons/Guns/Rifles/NTSF-LTR-556 # TODO - KILL AVTOMATA WITH LARGE HAMMERS AND SAWS FOR NOT .RSI-ING THIS!!!!!! + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge68x52mmCaseless + capacity: 30 + count: 30 + - type: Gun + minAngle: 13 + maxAngle: 10 + angleIncrease: 6 + angleDecay: 40 + fireRate: 9 + selectedMode: FullAuto + availableModes: + - FullAuto + soundGunshot: + path: /Audio/_Mono/Weapons/Guns/SmallArms/Gunshots/light_rifle_3.ogg + - type: MobThresholds + thresholds: + 0: Alive + 140: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.9 + 100: 0.6 + +- type: entity + name: contractor autorifleman + parent: MobMonoPMCBase + id: MobMonoPMCAutoriflemanT3 + suffix: T3, Grizzly + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier3PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit-head + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Objects/Weapons/Guns/LMGs/grizzly/Grizzly-inhands.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge68x52mmCaseless + capacity: 80 + count: 80 + - type: Gun + minAngle: 0 + maxAngle: 12 + angleIncrease: 1 + angleDecay: 12 + fireRate: 8 + selectedMode: FullAuto + availableModes: + - FullAuto + soundGunshot: + path: /Audio/_Mono/Weapons/Guns/SmallArms/Gunshots/heavy_rifle_1.ogg + - type: MobThresholds + thresholds: + 0: Alive + 140: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.9 + 100: 0.6 + +## Tier 4 - Boss + +- type: startingGear + id: MobHumanoidMonoPMCGearTier4 + equipment: + back: ClothingBackpackDuffelMonoTier4PMC + +- type: entity + name: contractor field commander + parent: [ MobMonoPMCBase, NFMobBossRestrictions ] + id: MobMonoPMCBoss + suffix: T4, MR-8B + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier4PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit-heavy + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit-heavy-head + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit-heavy-head-unshaded + shader: unshaded + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Objects/Weapons/Guns/LMGs/mr8b.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge8x65mmSKR + capacity: 200 + count: 200 + - type: Gun + minAngle: 4 + maxAngle: 16 + angleIncrease: 3 + angleDecay: 34 + fireRate: 6 # 360 rpm + selectedMode: FullAuto + availableModes: + - FullAuto + soundGunshot: + path: /Audio/_Mono/Weapons/Guns/SmallArms/Gunshots/heavy_rifle_1.ogg + - type: MobThresholds + thresholds: + 0: Alive + 200: Critical + 250: Dead + - type: SlowOnDamage + speedModifierThresholds: + 60: 0.9 + 120: 0.6 diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml new file mode 100644 index 00000000000..46934d7c377 --- /dev/null +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml @@ -0,0 +1,110 @@ +# BASE +## BACK - for gear and cash +- type: entity + parent: BaseItem + id: MonoPMCDuffelGiftBox + name: PMC gear bundle + description: Loot boxes? Here? + abstract: true + suffix: NPC Loot + components: + - type: Sprite + sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag + - type: Item + size: Normal + - type: Clothing + sprite: _Mono/Clothing/NPC/pmc.rsi + clothingVisuals: + back: + - state: bag-equipped + quickEquip: false + slots: + - back + +- type: entity + parent: MonoPMCDuffelGiftBox + id: ClothingBackpackDuffelMonoTier2PMC + components: + - type: SpawnItemsOnUse + items: + - id: Magazine9x19mmSubMachineGunFMJ + prob: 0.6 + - id: Magazine9x19mmSubMachineGunFMJ + prob: 0.6 + - id: Tourniquet + prob: 0.4 + sound: + path: /Audio/Items/jumpsuit_equip.ogg + +- type: entity + parent: MonoPMCDuffelGiftBox + id: ClothingBackpackDuffelMonoTier2PMCShotgun + components: + - type: SpawnItemsOnUse + items: + - id: AmmoBox12_gaugeBuckshot + prob: 0.9 + - id: AmmoBox12_gaugeBuckshot + prob: 0.2 + sound: + path: /Audio/Items/jumpsuit_equip.ogg + +- type: entity + parent: MonoPMCDuffelGiftBox + id: ClothingBackpackDuffelMonoTier3PMC + components: + - type: SpawnItemsOnUse + items: + - id: Magazine68x52mmCaseless + prob: 0.6 + - id: Magazine68x52mmCaseless + prob: 0.6 + - id: AmmoBox68x52mmCaseless + prob: 0.7 + - id: Tourniquet + prob: 0.4 + sound: + path: /Audio/Items/jumpsuit_equip.ogg + +- type: entity + parent: MonoPMCDuffelGiftBox + id: ClothingBackpackDuffelMonoTier4PMC + components: + - type: SpawnItemsOnUse + items: + # Cash + - id: SpaceCash2500 + prob: 0.9 + - id: SpaceCash500 + prob: 0.65 + - id: SpaceCash500 + prob: 0.45 + - id: SpaceCash2500 + prob: 0.1 + # Weapons + - id: WeaponRifleMR8C # mono + prob: 0.5 + # Items + - id: Magazine8x65mmSKR + prob: 0.9 + - id: AmmoBox8x65mmSKR + prob: 0.4 + - id: AmmoTechFabCircuitboard + prob: 0.1 + # Bonus Loot T4 + - id: SpaceCash2500 + prob: 0.9 + - id: SpawnDungeonLootFlatpacks + prob: 0.9 + - id: SpaceCash1000 + prob: 0.7 + - id: SpawnDungeonLootMaterialsValuableFull + prob: 0.7 + - id: SpawnDungeonLootPartsEngi + amount: 3 + prob: 0.7 + - id: SpawnDungeonLootVaultGuns + prob: 0.4 + sound: + path: /Audio/Items/jumpsuit_equip.ogg diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/bag-equipped.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/bag-equipped.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb1faae7baa7ca0ab7ff4cb7e6504f2aa2979a7 GIT binary patch literal 875 zcmV-x1C;!UP)oteIQ@4K_J+q`!YilYU9;%EV&I9dQGjurrlqXm!|JT^8Vc6UGYHQV1Rw14q- z3Yo11+?{=bmz&Qqv#^Mr?RDIEu!;RQ3CPaxTL4ZTIeV^QkY4?*Lc5iNBSa5hVLu$f z<45<=KYj~~6a9Gi_65!x?OCH=c7ERi(CE~i>4wI=`dfu|2M345-uEAl{cIPZvN0~# znHA6rgpDiz?duneT)l=uv4YQ;5(*cNz?H{#_UH3CDVu>3fG~IlJAZG=JfGkC(_Z@Z zQ`(-C0A3R`<3KYoSTgx=4e4jgE!mRV1ikKW_IGj<P6<}wLXKc(#U zj&6eO94AY;T>9$>Bj~v#?BM_F_eo&(0Aq8bu%hoU489BSnO`zKgy)rwxEXwHoNodn z067lM*yT6k;>^GayFF_JpDTWBYUKq=01E~yLPNqj&lht|-*$l%fXFWOMg&%XcA*7; z;%EV&I9dQGjurrlqXmHCXaS%&S^y}H766K)1%Tpc0sIb}U3o9~TfCKcXxERD?Sh$O z9+@Czo?v@5>dQZ00x;dg3=H%0BcsR3No&Gx3t{;|m^0kV77#If^_wE|6o7`JH>2iv zrl1&neb98ETOv5jEy4p4T)8}Ket7OBf~x?WfC)zyA29e%mcO(EiczZ%F#YDo>jHVM z0ABH+!F|ealGIgzrS;c#{+%m8w)&!5a3kc^C#)ez&Rl9Z)>VM|{JWE)-Ms$^=XUae zzSh?eBwcK{3J{B}A#^Hjes`+B$@jpc(8&k-N_gR7v9#;oy9!XP?jSOmGSknjzzPan z0eobSE|zQJ ze7_0@A$SWJU-dsjP#i4)6h{jH#nA#lakKzXoZqU?j=>3n=br!o002ovPDHLkV1j}a Bj^Y3S literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/bag.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/bag.png new file mode 100644 index 0000000000000000000000000000000000000000..6d32ef3331b4edad77e9ab811842dee213e427a8 GIT binary patch literal 615 zcmV-t0+{`YP)K^Vp#vEV^(L9_{YXj-bJ6%kT|rdlk5?WG=i z>LFA=fEUqIq?CFqz4X+RE%^d!52;X)iYb%|JycCi$Sx=^+>i4$YoB(rfr z3j18%$-D2&^P4}Jxq)kz58wm%0RIm_SKA}2rQ-w#2POi6Ry^z-#?t(E42}%p_n*aL zKEK_Ff5y)SPXTEDY;qFTUJ48IbBI2UVmdyKraL`|kM-l-Oum?J2u6YTuv8&x0?_>K z^O!KFI7=tVJnLAGq#8s`fTQMp9Gl;eF#*%q7qfH{^Qn~-THD&~UpdiFMM_(+nO+k! zs7=K8vxitPq2C-g_Y0 zTotxulsUOlXCT(<>aVKjpymq5Wo49YN}4j3=VZOi*A2iK%h{9yIYCzHen#bRM6tR0?>O!3x zRRz#>jVIVDA3S7VdNiMTGcMxSrJYO0oc&q<`TofBVz)Sf6KESmDoB~3r`P|qTbh!Wk002ovPDHLkV1n>B B7wiB4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/meta.json b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/meta.json new file mode 100644 index 00000000000..c3e96c96dd2 --- /dev/null +++ b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/meta.json @@ -0,0 +1,70 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from SS13 Shiptest.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "pmc-hardsuit-heavy", + "directions": 4 + }, + { + "name": "pmc-hardsuit-heavy-head", + "directions": 4 + }, + { + "name": "pmc-hardsuit-heavy-head-unshaded", + "directions": 4 + }, + { + "name": "pmc-hardsuit", + "directions": 4 + }, + { + "name": "pmc-hardsuit-head", + "directions": 4 + }, + { + "name": "pmc-webbing", + "directions": 4 + }, + { + "name": "pmc-gasmask", + "directions": 4 + }, + { + "name": "pmc-helmet", + "directions": 4 + }, + { + "name": "pmc-jumpsuit", + "directions": 4 + }, + { + "name": "pmc-uniform", + "directions": 4 + }, + { + "name": "pmc-vest", + "directions": 4 + }, + { + "name": "pmc-boots", + "directions": 4 + }, + { + "name": "pmc-gloves", + "directions": 4 + }, + { + "name": "bag-equipped", + "directions": 4 + }, + { + "name": "bag" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-boots.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-boots.png new file mode 100644 index 0000000000000000000000000000000000000000..143bf2f751e3911f6a886851e6c30fde9d420848 GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|Vo6 zPZ!6KiaBp*?e{($Akyl8@NAg?SJ#3o7f&AbWl8`4c1^5^%3@bX5hhuw=d&hPskW#* zdwRX-Jp0m@-nT!0+B^OFq22BUeJlqog&3ZDFw9YA#LH>fQ(3p?#_hsiduRW>Zf7zr zc|YUslTHyp3cx5EEamy(d5J;2D#-pp9&lkMs5jxPF!Y&cf_V$f~8f$W*q)6y@`PigRC-iM@r%#_zXGv4wl;E7Z0opJEQ(p3z$z8{@~?J*M59D- g(pIio_xXPqHv4}_VqAYB4j9i2p00i_>zopr03zw;_y7O^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-gasmask.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-gasmask.png new file mode 100644 index 0000000000000000000000000000000000000000..0908dffaf85c04b620e43a09efcc2523d9fea3a6 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V1h zPZ!6KiaBp*ozE6_6gj?M@St;02#3qjYhNUEK0aE=5x3{dgM-Nn{~!Ek?ex)J-=u`*%5eoQaa%IoEpM$dkI<6d2|nS9#+x7jMsA1|nG zkWHx*{&v>xIgdn*tgqeYclIx8`Q&U4JN|n2t8$NAf6iLbwt^6bmc>j8GNKF*S1@q6vpRr+B#=>{kE;PDmCsm~y6nWN4~w2ZP(85j zNRVe2pWfuwX$KvHL%XtDe_HN*a8*8`{+zh0^Yjxx>#j_8xKYd58rpu-#JBC#rPI;= z|Gsf=5fs@ib3Qa{l3(#A@$|4gQYxF2pPu8fu9y`tt!tvc*14w4z8f!n-esO+UoKeQ zEwE1Vg-!$0bEB=9VGK&U&h>J;bS%@1i=A8=R?l>Iy28tYznOD9oF?_0B$kmCyC(XuR9& z))=nk9kFixC4;U11!F#(Vz@jn$yDRYyIBADw{lXPC43jvUG_(6>d)+1e6OYGD_7g! z)1N;iD&{v`F`gj%;$6Lq$D5GzlkyZ_tTw4?P^ckaT9_ueyJ+&y^Q zlxMH%iHQsolo=J=nH>698e}*bEQJ_~R2ZIkFr1j!aO3RZe?L~eHof(&bKm>I-SOfp zTW+6y7aA(+bmwQ0*RemF_pN5unK?b6#_QP{dC?1{ZwuCjef_{{(^4uH-u3jyy9UFr zy5~Og1Tyw7i;R%2x_y2_>9sbswM+gw|Mj1@=9i+~R=b_7MRA9IZ;*SoZvB3sl{npk zA|W9?!D{pN-%HyUZM?OAr}uNgP1XsoBpYJ9o(sBhdz|H|IRCM@9PX|MMWF*m_1JFIO?<-%Z{+HTAIEQeen3c)I$ztaD0e0sy7tpF98n literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-head.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-head.png new file mode 100644 index 0000000000000000000000000000000000000000..d25d1432b90617d303b9a246bb116cae2795081f GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|V1L zPZ!6KiaBp*8D@w$inP@qblW3x%CSeFbIAmO3(p)JTT7a5-CpLOt{&!e!=xzCFua_SSM#P07ddmOgy=bMjLZVH@pZj^kvX|s^P zt$tpIDGYi?|1hPk*ZEytUphbTyQiUFg-7n*ns@6j%k-7RJ@YO-ag6grdVT8sUEep{ zW7R8J_vq|5?Kxi-=Su2dD!%1v{Hf^C?wtpm`+mIfg`HATYBv6}{w!VjSMA4sSChT* z!TVBft~QvG%;aFH#(zwGEukmkgKbP9MtSBtxW}h&tKx(b0m3~KCR<}ZR<@p1u zS$Bq;hJ}cDsQ{Pk)ud&Q6jT@REt_m{ z#qo+$;RK#pJW-B?23jpmjXa(rx0=c(ig9nf=yY`1uAh6}Z~gx1Q^wKVPwo|cZ@#dn z`pdreb(Tf_HTU^4`UDj|`~UsBeXVV6?YXbtofw0IuSY!)KHHc9Z8J4MtMSoi|9#fC;>!Dv?S7VY z=woa7fj8Z!b575Fel54?`~2je(X;m6=Dd2L?7XO%*c-XYt{w*x3VHg~?Um+KxBD2q z?P<4Gw)p;QUM+v8Qi$WnZgKC@ZuJ+lRQ~L;v~J4v~3G8!y&B zQKV_!(mWx)`)*&F+}3A-60?$79Ey7wfC0&H){tp| zr5l6EagK&(5{wsQlo{ZXTNr-j&J$O!SbMJDjHAd-P9+Q{S6w2m@>L|vj%w1nSNqr%)QSE68Tp199T`hmzd;# zXYAP=-f{HXGqtWSnhx74JLgm}cZ6Q~#Tw#J+-~zxgZ~UCsDBnmXFqa3t*W#fBu}7kZI@4pO^JH zb=^H-%y99-FVdQ&MBb@ E0ERP@K>z>% literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy-head.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy-head.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7df9e735408c7609d105c2f04af2fbe5a3737 GIT binary patch literal 889 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|T?R zr;B4q#hkaZ3^RfqC652+S$Bq;hJ}cDsQ{Pk)ud&Q6jT@REt_m{ z#qo+$;RK#pJW-B?23jpmjXa(rx0=c(ig9nf=yY`1uAh6}Z~gx1Q^wKVPwo|cZ@#dn z`pdreb(Tf_HTU^4`UDj|`~UsBeXVV6?YXbtofw0IuSY!)KHHc9Z8J4MtMSoi|9#fC;>!Dv?S7VY z=woa7fj8Z!b575Fel54?`~2je(X;m6=Dd2L?7XO%*c-XYt{w*x3VHg~?Um+KxBD2q z?P<4Gw)p;QUM+v8Qi$WnZgKC@ZuJ+lRQ~L;v~J4v~3G8!y&B zQKV_!(mWx)`)*&F+}3A-60?$79Ey7wfC0&H){tp| zr5l6EagK&(5{wsQlo{ZXTNr-j&J$O!SbMJDjHAd-P9+Q{S6w2m@>L|vj%w1nSNqr%)QSE68Tp199T`hmzd;# zXYAP=-f{HXGqtWSnhx74JLgm}cZ6Q~#Tw#J+-~zxgZ~UCsDBnmXFqa3t*W#fBu}7kZI@4pO^JH zb=^H-%y99-FVdQ&MBb@ E0ERP@K>z>% literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-hardsuit-heavy.png new file mode 100644 index 0000000000000000000000000000000000000000..779e186d7057861c3e81bc1362ad37b285856499 GIT binary patch literal 2070 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 aQ{n#}mJyTE= z2g~f-`SG3m&6#uW+;fgm#*qs^8AmPvWgNKxlyT$&P{xr9pgDQCcf`TAXP`hID=)gZ zeRO2f`MF#5{%_YSU6c|e|B1nKe*3}BCyL4+S^#wN{IwEou9iLWQJQoh0@~Ra9Pe2z zI8vOXfX)}Er)jTR_x90g2Ke#oFZ2@4kfRYHlmJ(6%{$)BsnJO(0=6&)?R?yAb6zh_ zB_;xk55SHGH%Hum*IUk+U9Narh@^Q49R*leT64C4{PvXRj3xfFhmE%~zKs#*E^0yV><@}mY{`AS6E(9Wu!0hfYhJzpszh)9djKXHJS!w>%nAAnC2xKZ^mLL$8vH5&Bsq`$JSS+hkJI*Ix-o!Z z^83fri~(>ts11M|(RSD!bBRj+@wCAYz~o2!!H)iZ>h%E3z?v@D+HMOb*HJcwL8Ju{ zIrrv$`F)-?Oiz=ZsYUEzP#Tf;Fo^qat_B~I-y<5RJs^n0#`vEWze<3hm6kM@z-;j6 zi=vcqM=k(m9Jv6LapVF}#t}&XSq~s<1(3N(`{PJ*9A$?FY5|(5>Sjh5 z>2svRZLA722RN|?fo!pWx;8;2fGmdK3@xX~*&rKWE}51;tV{3+<2NLN3e zd*9M7>jYeKN)u*H0t4%UkM3Ti&tLjfHmC$Z=aF^>(L}LXE5L@?g5=`5gxR@=heZ>E zs(Yyf;9UL6$~$k1LB>qor~r3{(OCMOdf=*!ZwTyY+7OU$Kg`V#1Pl)4~^NCG5P j3L6JW*^tKo$~gW20z)K{2>`!^00000NkvXXu0mjf{<|c( literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-vest.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-vest.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc115c88bc268369cac7e5bb729a313acb3e8dc GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$x zr;B4q#hkaZHu^C+3beH!@ze0}Fj14z>Five_>lQWk6lBn>DpeECte+DZo)!b8|-FY zRy@43+xqm~fHQx1jadHOd|x*G@ZbIeJ7gFnrZY1jwALr9#XRXP!q3 zWPFIYF7RuDdhpEG`fMAbbhQ~+8l?{IYP-O`-c0=42ea8}wevU_)@{z)E?)O``Mj-s z#eaT^x-;zj7g>GaX#&Uk%}K$BpEI=H(pg|PYk~xWpXoOKkg7_#m3oc8<~5%${(F?6 zVAa)^+3%RQu)MNOust5n@}RsncVFEO#ea97{o?ok)=re@9c36mH< zTu#ulT4U3al-{^8&e@AiV9{P}{RImn)Ep*>-TWQh@QJDW=ZdN`CtrFT**oimiVAaw zWMCXat7YRhSGnCroI)Da=NV3MUr1ZAk@HhS+dZC$^_#22`sG8jRb2``%vS#CpyoJB z{0yf@OIDUZ8SlKWlh?TAwVHlr@~!@v&xr0lBmM`{2cAZV@gLh<4op!Dp00i_>zopr E084QX0{{R3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-webbing.png b/Resources/Textures/_Mono/Clothing/NPC/pmc.rsi/pmc-webbing.png new file mode 100644 index 0000000000000000000000000000000000000000..374d11a1faa78324b71e67de8ceccd2516c322f6 GIT binary patch literal 664 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$n zr;B4q#hkaZHhM8T3OJ}gkY^FJckq~cO6x{Tf&2tD`GlEDOM9C*mTlbP@sfSXM`kAv z<&{B8xqdJ@9?7>bRu{f@HuuiW-Lc&>!|&#ONPBNsz1^so=};h}f{Z8wj7sFrn4kW$ z$~ybUx$C}nKQ|MGcu!?zgUAEtM~Anqd(U{?VWacY&8#NTGpp;Yn?-J9 zuMo1#OdD z^SO$7Lz6eNO!#>I>G@@cSudFG>)5qcCtfFSQ7xC|K1uO|`cB0&MfVpz-psP#<-wFq z^8W3In+tua7Vk6G>n&%B_@0u_=wrFXKl*^&@sxjmUiEk<>*X+(JXlzp-k;oL7*puX zpQOX6*|%%uQzP_OsqQuXlt4qT^xF`c?r!848F zdhgr1Mv)!Am=;}Si%lzBXa4GW|N8eoWB)6iG&>L>vinWBpV*a8LPuuFis|iqDb5ty zVVEXc!EF)t`}bAj4Gk-Pd|@egH6@PeLX}`e&5uJ1Ur#ud!%=3>6n8t){V$W<%@?W+ zmv^uE)*tjCIOW=_a+lj|8gr^x1Y(5k*32#4qBcK{QJ--}QR;*3`!fPevc4LgezN82 znSBh`e;(eNCaup{fAwDQH;y02KD`zHaJoTx`PwPA%= Date: Thu, 21 May 2026 05:19:17 -0400 Subject: [PATCH 02/16] Ugh --- .../Random/mobs_hostile_mercenaries.yml | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml diff --git a/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml new file mode 100644 index 00000000000..0707535f35b --- /dev/null +++ b/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml @@ -0,0 +1,58 @@ +- type: entity + name: PMC spawner + id: SpawnMobMonoPMCT1 + parent: MarkerBase + suffix: AI, Hostile, T1 + components: + - type: Sprite + layers: + - state: red + - state: ai + - type: RandomSpawner + prototypes: + - MobMonoPMCT1Soldier + chance: 1 + offset: 0.0 + rarePrototypes: + - SpawnMobMonoPMCT2 + rareChance: 0.3 + +- type: entity + name: PMC spawner + id: SpawnMobMonoPMCT2 + parent: MarkerBase + suffix: AI, Hostile, T2 + components: + - type: Sprite + layers: + - state: red + - state: ai + - type: RandomSpawner + prototypes: + - MobMonoPMCSubmachineGunT2 + - MobMonoPMCShotgunT2 + chance: 1 + offset: 0.0 + rarePrototypes: + - SpawnMobMonoPMCT3 + - MobMonoPMCSniperT2 + rareChance: 0.2 + +- type: entity + name: PMC spawner + id: SpawnMobMonoPMCT3 + parent: MarkerBase + suffix: AI, Hostile, T3 + components: + - type: Sprite + layers: + - state: red + - state: ai + - type: RandomSpawner + prototypes: + - MobMonoPMCAssaultT3 + chance: 1 + offset: 0.0 + rarePrototypes: + - MobMonoPMCAutoriflemanT3 + rareChance: 0.2 From ffc45890b82477428076798e95d8b6be5191a598 Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 05:35:03 -0400 Subject: [PATCH 03/16] Very fun variety --- ...aries.yml => mobs_hostile_contractors.yml} | 6 +- .../Mobs/NPCs/mob_hostile_mercenaries.yml | 249 +++++++++++++++++- 2 files changed, 247 insertions(+), 8 deletions(-) rename Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/{mobs_hostile_mercenaries.yml => mobs_hostile_contractors.yml} (89%) diff --git a/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_contractors.yml similarity index 89% rename from Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml rename to Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_contractors.yml index 0707535f35b..2ff4d1c34af 100644 --- a/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_mercenaries.yml +++ b/Resources/Prototypes/_Mono/Entities/Markers/Spawners/Random/mobs_hostile_contractors.yml @@ -11,10 +11,12 @@ - type: RandomSpawner prototypes: - MobMonoPMCT1Soldier + - MobMonoPMCT1Handguns chance: 1 offset: 0.0 rarePrototypes: - SpawnMobMonoPMCT2 + - MobMonoPMCT1Rifleman rareChance: 0.3 - type: entity @@ -36,6 +38,7 @@ rarePrototypes: - SpawnMobMonoPMCT3 - MobMonoPMCSniperT2 + - MobMonoPMCJackdawT2 rareChance: 0.2 - type: entity @@ -55,4 +58,5 @@ offset: 0.0 rarePrototypes: - MobMonoPMCAutoriflemanT3 - rareChance: 0.2 + - MobMonoPMCGrenadierT3 + rareChance: 0.1 diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml index 6d9806235b3..7229975f618 100644 --- a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml @@ -1,6 +1,6 @@ # Base - type: entity - name: contractor + name: PMC abstract: true parent: - BaseC3MobHuman @@ -61,6 +61,7 @@ - type: entity parent: MobMonoPMCBase id: MobMonoPMCT1Soldier + suffix: T1, AK-220 components: - type: Sprite drawdepth: Mobs @@ -115,6 +116,120 @@ 70: 0.9 80: 0.6 +- type: entity + parent: MobMonoPMCBase + id: MobMonoPMCT1Rifleman + suffix: T1, AKM + components: + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-uniform + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-helmet + - sprite: _Mono/Objects/Weapons/Guns/Rifles/akm_inhands_32x.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge762x39mmFMJ + capacity: 30 + count: 30 + - type: Gun + minAngle: 1 + maxAngle: 2 + fireRate: 5 + projectileSpeed: 55 + selectedMode: FullAuto + availableModes: + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg + - type: MobThresholds + thresholds: + 0: Alive + 100: Critical + 110: Dead + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.9 + 80: 0.6 + +- type: entity + parent: MobMonoPMCBase + id: MobMonoPMCT1Handguns + suffix: T1, Pollock + components: + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-uniform + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-helmet + - sprite: _DV/Objects/Weapons/Guns/Pistols/pollock.rsi + state: inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge9x19mmFMJ + capacity: 17 + count: 17 + - type: Gun + minAngle: 1 + maxAngle: 2 + fireRate: 5 + projectileSpeed: 40 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/pistol.ogg + - type: MobThresholds + thresholds: + 0: Alive + 100: Critical + 110: Dead + - type: SlowOnDamage + speedModifierThresholds: + 80: 0.9 + 90: 0.75 + ## Tier 2 - type: startingGear @@ -123,7 +238,7 @@ back: ClothingBackpackDuffelMonoTier2PMC - type: entity - name: contractor + name: PMC operator parent: MobMonoPMCBase id: MobMonoPMCSubmachineGunT2 suffix: T2, 9mm Vector @@ -187,7 +302,70 @@ 80: 0.6 - type: entity - name: contractor + name: PMC operator + parent: MobMonoPMCBase + id: MobMonoPMCJackdawT2 + suffix: T2, CAWS-25 Jackdaw + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier2PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gloves + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-boots + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-vest + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Clothing/Balaclavas/balaclava_ski_mask.rsi + state: equipped-BALACLAVA + color: "#1F1F1F" + - sprite: _Mono/Clothing/Eyes/Glasses/ballistic_goggles_red.rsi + state: equipped-EYES + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-gasmask + - sprite: _DV/Objects/Weapons/Guns/Rifles/jackdaw.rsi + state: inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge635x40mmCaseless + capacity: 30 + count: 30 + - type: Gun + minAngle: 2 + maxAngle: 4 + angleIncrease: 2 + angleDecay: 8 + fireRate: 8 + projectileSpeed: 35 + selectedMode: FullAuto + availableModes: + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/silenced.ogg + params: + volume: -1 + - type: MobThresholds + thresholds: + 0: Alive + 120: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 40: 0.9 + 80: 0.6 + +- type: entity + name: PMC marksman parent: MobMonoPMCBase id: MobMonoPMCSniperT2 suffix: T2, AK-410 @@ -250,7 +428,7 @@ back: ClothingBackpackDuffelMonoTier2ShotgunPMC - type: entity - name: contractor + name: PMC breacher parent: MobMonoPMCBase id: MobMonoPMCShotgunT2 suffix: T2, Big Buddy @@ -316,7 +494,7 @@ back: ClothingBackpackDuffelMonoTier3PMC - type: entity - name: contractor assaulter + name: PMC assaulter parent: MobMonoPMCBase id: MobMonoPMCAssaultT3 suffix: T3, LTR-556 @@ -369,7 +547,7 @@ 100: 0.6 - type: entity - name: contractor autorifleman + name: PMC autorifleman parent: MobMonoPMCBase id: MobMonoPMCAutoriflemanT3 suffix: T3, Grizzly @@ -421,6 +599,63 @@ 70: 0.9 100: 0.6 +- type: entity + name: PMC grenadier + parent: MobMonoPMCBase + id: MobMonoPMCGrenadierT3 + suffix: T3, Anubis + components: + - type: Loadout + prototypes: + - ClothingBackpackDuffelMonoTier3PMC + - type: Sprite + drawdepth: Mobs + layers: + - sprite: _NF/Mobs/Species/Templates/human.rsi + state: human + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-jumpsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-webbing + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: pmc-hardsuit-head + - sprite: Objects/Tanks/oxygen.rsi + state: equipped-BACKPACK + - sprite: _Mono/Clothing/NPC/pmc.rsi + state: bag-equipped + - sprite: _Mono/Objects/Weapons/Guns/Launchers/mk6-tpgl_inhands_32x.rsi + state: wielded-inhand-right + - type: BasicEntityAmmoProvider + proto: Cartridge35mmGrenadeSAPHE + capacity: 6 + count: 6 + - type: Gun + minAngle: 0 + maxAngle: 3 + projectileSpeed: 70 + fireRate: 0.2 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/_Harmony/Weapons/Guns/Gunshots/hristov_fire_alt.ogg + soundEmpty: + path: /Audio/Weapons/Guns/Empty/empty.ogg + - type: LaserPointer + targetedColor: "#ff0037" + defaultColor: "#03c2fc" + - type: MobThresholds + thresholds: + 0: Alive + 140: Critical + 150: Dead + - type: SlowOnDamage + speedModifierThresholds: + 70: 0.9 + 100: 0.6 + ## Tier 4 - Boss - type: startingGear @@ -429,7 +664,7 @@ back: ClothingBackpackDuffelMonoTier4PMC - type: entity - name: contractor field commander + name: PMC field commander parent: [ MobMonoPMCBase, NFMobBossRestrictions ] id: MobMonoPMCBoss suffix: T4, MR-8B From 4e5dd7642a8df8ccc553f2e050500b920751a06c Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 07:22:29 -0400 Subject: [PATCH 04/16] Loot --- .../Mobs/NPCs/mob_hostile_mercenaries.yml | 16 ++-- .../NPCs/mob_hostile_mercenaries_loot.yml | 85 ++++++++++++++++++- 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml index 7229975f618..53ac517c0b7 100644 --- a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml @@ -245,7 +245,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier2PMC + - MobHumanoidMonoPMCGearTier2 - type: Sprite drawdepth: Mobs layers: @@ -309,7 +309,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier2PMC + - MobHumanoidMonoPMCGearTier2 - type: Sprite drawdepth: Mobs layers: @@ -372,7 +372,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier2PMC + - MobHumanoidMonoPMCGearTier2 - type: Sprite drawdepth: Mobs layers: @@ -435,7 +435,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier2PMC + - MobHumanoidMonoPMCGearTier2Shotgun - type: Sprite drawdepth: Mobs layers: @@ -501,7 +501,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier3PMC + - MobHumanoidMonoPMCGearTier3 - type: Sprite drawdepth: Mobs layers: @@ -554,7 +554,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier3PMC + - MobHumanoidMonoPMCGearTier3 - type: Sprite drawdepth: Mobs layers: @@ -607,7 +607,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier3PMC + - MobHumanoidMonoPMCGearTier3 - type: Sprite drawdepth: Mobs layers: @@ -671,7 +671,7 @@ components: - type: Loadout prototypes: - - ClothingBackpackDuffelMonoTier4PMC + - MobHumanoidMonoPMCGearTier4 - type: Sprite drawdepth: Mobs layers: diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml index 46934d7c377..3116e12f63b 100644 --- a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml @@ -32,8 +32,24 @@ prob: 0.6 - id: Magazine9x19mmSubMachineGunFMJ prob: 0.6 + - id: Magazine762x39mmFMJ + prob: 0.6 + - id: Magazine762x39mmFMJ + prob: 0.6 + - id: Magazine762x54mmRFMJ + prob: 0.4 + - id: AmmoBox762x39mmFMJ + prob: 0.2 + - id: Magazine635x40mmCaseless + prob: 0.2 - id: Tourniquet prob: 0.4 + - id: SpawnDungeonLootMaterialsValuableFull + prob: 0.05 + - id: SpaceCash500 + prob: 0.2 + - id: SpawnLootMonoPMCMisc + prob: 0.4 sound: path: /Audio/Items/jumpsuit_equip.ogg @@ -43,10 +59,20 @@ components: - type: SpawnItemsOnUse items: - - id: AmmoBox12_gaugeBuckshot + - id: AmmoBox23x75mmBuckshot prob: 0.9 - - id: AmmoBox12_gaugeBuckshot + - id: AmmoBox23x75mmDozd + prob: 0.2 + - id: AmmoBox23x75mmSlug prob: 0.2 + - id: AmmoBox23x75mmFlashbang + prob: 0.1 + - id: SpawnDungeonLootMaterialsValuableFull + prob: 0.05 + - id: SpaceCash500 + prob: 0.2 + - id: SpawnLootMonoPMCMisc + prob: 0.4 sound: path: /Audio/Items/jumpsuit_equip.ogg @@ -64,6 +90,14 @@ prob: 0.7 - id: Tourniquet prob: 0.4 + - id: SpawnDungeonLootMaterialsValuableFull + prob: 0.2 + - id: SpaceCash500 + prob: 0.65 + - id: SpaceCash500 + prob: 0.45 + - id: SpawnLootMonoPMCMisc + prob: 0.4 sound: path: /Audio/Items/jumpsuit_equip.ogg @@ -82,9 +116,11 @@ prob: 0.45 - id: SpaceCash2500 prob: 0.1 + - id: SpaceCash2500 + prob: 0.1 # Weapons - id: WeaponRifleMR8C # mono - prob: 0.5 + prob: 0.3 # Items - id: Magazine8x65mmSKR prob: 0.9 @@ -102,9 +138,50 @@ - id: SpawnDungeonLootMaterialsValuableFull prob: 0.7 - id: SpawnDungeonLootPartsEngi - amount: 3 + amount: 2 prob: 0.7 - id: SpawnDungeonLootVaultGuns prob: 0.4 + - id: BlueprintWeaponRifleNtsfLtr + prob: 0.05 + - id: SpawnLootMonoPMCMisc + prob: 0.4 sound: path: /Audio/Items/jumpsuit_equip.ogg + +- type: entity + name: random MonoPMC misc loot drop + id: SpawnLootMonoPMCMisc + parent: MarkerBasePlaceFree + components: + - type: Sprite + layers: + - state: green + - sprite: _NF/Markers/general.rsi + state: questionmark + color: white + - type: RandomSpawner + prototypes: + - MedkitFilled + - GunAttachmentGripErebusVFG + - GunAttachmentGripErebusLAM + - GunAttachmentOpticErebus2x + - GunAttachmentOpticErebus4x + - GunAttachmentOpticErebus8x + - GunAttachmentSuppressorMulticalPistol + - GunAttachmentSuppressorMulticalRifle + - POILootWeaponsAmmoMarker + - FentanylSolidified + - SpaceCash2500 + - SpaceCash2000 + - SpaceCash1000 + - SpaceCash500 + - SpawnDungeonLootPartsEngi + chance: 0.4 + offset: 0.0 + rarePrototypes: + - StimkitFilled + - BlueprintWeaponRifleNtsfLtr + - BlueprintWeaponSubMachineGunVectorNtsfHclm + - BlueprintLauncherRocket # Its hilarious, and it has a really low chance to actually happen. + rareChance: 0.01 From fc277bde5d26910ea48d7c1c741f451014772bd8 Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 15:52:32 -0400 Subject: [PATCH 05/16] ok --- .../_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml | 4 ++-- .../_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml | 4 ++++ Resources/Prototypes/_Mono/ai_factions.yml | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml index 53ac517c0b7..4b0a3e2b2a9 100644 --- a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml @@ -16,7 +16,7 @@ damageModifierSet: MobMercenaryDamageModifierSet - type: NpcFactionMember factions: - - MercenariesExpeditionNF # Placeholder. Its really annoying adding more factions. + - PMCExpeditionMono - type: MobThresholds thresholds: 0: Alive @@ -49,7 +49,7 @@ nextAdvertisementTime: 10 - type: AutoWakeUp - type: MovementSpeedModifier - baseWalkSpeed : 4.5 + baseWalkSpeed : 2.5 baseSprintSpeed : 4.5 - type: FootstepModifier footstepSoundCollection: diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml index 3116e12f63b..fe66082f056 100644 --- a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries_loot.yml @@ -25,6 +25,7 @@ - type: entity parent: MonoPMCDuffelGiftBox id: ClothingBackpackDuffelMonoTier2PMC + suffix: NPC Loot, T2 components: - type: SpawnItemsOnUse items: @@ -56,6 +57,7 @@ - type: entity parent: MonoPMCDuffelGiftBox id: ClothingBackpackDuffelMonoTier2PMCShotgun + suffix: NPC Loot, T2 Shotgun components: - type: SpawnItemsOnUse items: @@ -79,6 +81,7 @@ - type: entity parent: MonoPMCDuffelGiftBox id: ClothingBackpackDuffelMonoTier3PMC + suffix: NPC Loot, T3 components: - type: SpawnItemsOnUse items: @@ -104,6 +107,7 @@ - type: entity parent: MonoPMCDuffelGiftBox id: ClothingBackpackDuffelMonoTier4PMC + suffix: NPC Loot, T4 components: - type: SpawnItemsOnUse items: diff --git a/Resources/Prototypes/_Mono/ai_factions.yml b/Resources/Prototypes/_Mono/ai_factions.yml index 37f3308888f..125aa78eae4 100644 --- a/Resources/Prototypes/_Mono/ai_factions.yml +++ b/Resources/Prototypes/_Mono/ai_factions.yml @@ -70,3 +70,7 @@ friendly: - AberrantFleshExpeditionNF defaultHostile: true + +- type: npcFaction + id: PMCExpeditionMono + defaultHostile: true From 83fc08a80f7ba0a7da0d60dc33a51a8dac8409de Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 15:57:23 -0400 Subject: [PATCH 06/16] ez 4 ence ence ence --- .../Spawners/Random/dungeon_items_general.yml | 8 ++-- .../Spawners/Random/dungeon_items_weapons.yml | 40 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_general.yml b/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_general.yml index 16d1d71c439..2d6e8d0e22c 100644 --- a/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_general.yml +++ b/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_general.yml @@ -53,7 +53,7 @@ - type: entity name: random pen id: SpawnDungeonLootBureaucracyPen - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] parent: MarkerBasePlaceFree suffix: Dungeon components: @@ -585,7 +585,7 @@ id: SpawnDungeonMachineFrame parent: MarkerBase suffix: Dungeon - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -608,7 +608,7 @@ id: SpawnDungeonComputerFrame parent: MarkerBase suffix: Dungeon - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -631,7 +631,7 @@ id: SpawnDungeonCanisterBroken parent: MarkerBase suffix: Dungeon - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: diff --git a/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_weapons.yml b/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_weapons.yml index 18b05abaa7e..82be650872f 100644 --- a/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_weapons.yml +++ b/Resources/Prototypes/_NF/Entities/Markers/Spawners/Random/dungeon_items_weapons.yml @@ -4,7 +4,7 @@ id: SpawnDungeonLootMeleeT1 parent: MarkerBasePlaceFree suffix: "Dungeon, Melee, T1" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -39,7 +39,7 @@ id: SpawnDungeonLootGunT1 parent: MarkerBasePlaceFree suffix: "Dungeon, Gun, T1" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -76,7 +76,7 @@ id: SpawnDungeonLootExplosivesT1 parent: MarkerBasePlaceFree suffix: "Dungeon, Explosives, T1" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -102,7 +102,7 @@ id: SpawnDungeonLootMeleeT2 parent: MarkerBasePlaceFree suffix: "Dungeon, Melee, T2" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -133,7 +133,7 @@ id: SpawnDungeonLootGunT2 parent: MarkerBasePlaceFree suffix: "Dungeon, Gun, T2" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -168,7 +168,7 @@ id: SpawnDungeonLootExplosivesT2 parent: MarkerBasePlaceFree suffix: "Dungeon, Explosives, T2" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -194,7 +194,7 @@ id: SpawnDungeonLootMeleeT3 parent: MarkerBasePlaceFree suffix: "Dungeon, Melee, T3" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -223,7 +223,7 @@ id: SpawnDungeonLootGunT3 parent: MarkerBasePlaceFree suffix: "Dungeon, Gun, T3" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -264,7 +264,7 @@ id: SpawnDungeonLootExplosivesT3 parent: MarkerBasePlaceFree suffix: "Dungeon, Explosives, T3" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -291,7 +291,7 @@ id: SpawnDungeonLootMeleeT4 parent: MarkerBasePlaceFree suffix: "Dungeon, Melee, T4" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -320,7 +320,7 @@ id: SpawnDungeonLootGunT4 parent: MarkerBasePlaceFree suffix: "Dungeon, Gun, T4" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -354,7 +354,7 @@ id: SpawnDungeonLootExplosivesT4 parent: MarkerBasePlaceFree suffix: "Dungeon, Explosives, T4" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -380,7 +380,7 @@ id: SpawnDungeonLootMeleeT5 parent: MarkerBasePlaceFree suffix: "Dungeon, Melee, T5" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -402,7 +402,7 @@ id: SpawnDungeonLootGunT5 parent: MarkerBasePlaceFree suffix: "Dungeon, Gun, T5" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -434,7 +434,7 @@ id: SpawnDungeonLootExplosivesT5 parent: MarkerBasePlaceFree suffix: "Dungeon, Explosives, T5" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -457,7 +457,7 @@ id: SpawnDungeonLootAmmoLethal parent: MarkerBasePlaceFree suffix: "Dungeon, Ammo, Lethal" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -493,7 +493,7 @@ id: SpawnDungeonLootAmmoRubber parent: MarkerBasePlaceFree suffix: "Dungeon, Ammo, Rubber" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -521,7 +521,7 @@ id: SpawnDungeonLootAmmoPractice parent: MarkerBasePlaceFree suffix: "Dungeon, Ammo, Practice" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -545,7 +545,7 @@ id: SpawnDungeonLootAmmoIncendiary parent: MarkerBasePlaceFree suffix: "Dungeon, Ammo, Incendiary" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: @@ -571,7 +571,7 @@ id: SpawnDungeonLootAmmoUranium parent: MarkerBasePlaceFree suffix: "Dungeon, Ammo, Uranium" - categories: [ HideSpawnMenu ] + #categories: [ HideSpawnMenu ] components: - type: Sprite layers: From ae9c20e225e77b1eafe3220eaa2a18220844ecd8 Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 20:19:07 -0400 Subject: [PATCH 07/16] It works loser --- .../Rules/Components/LoadMapRuleComponent.cs | 9 +++++ .../GameTicking/Rules/LoadMapRuleSystem.cs | 35 ++++++++++++++++++ .../Locale/en-US/_Mono/events/planets.ftl | 3 ++ .../Prototypes/_Mono/GameRules/planets.yml | 37 +++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 Resources/Locale/en-US/_Mono/events/planets.ftl create mode 100644 Resources/Prototypes/_Mono/GameRules/planets.yml diff --git a/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs index f09fff5eafa..bb44b2073a5 100644 --- a/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs @@ -1,5 +1,6 @@ using Content.Server.GameTicking.Rules; using Content.Server.Maps; +using Content.Shared._DV.Planet; using Content.Shared.GridPreloader.Prototypes; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -19,6 +20,14 @@ public sealed partial class LoadMapRuleComponent : Component [DataField] public ProtoId? GameMap; + // Mono start + /// + /// A planet prototype to load on a new map. + /// + [DataField] + public ProtoId? PlanetMap; + // Mono end + /// /// A map to load. /// diff --git a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs index 003a74ef4bf..2a3ba83ee8e 100644 --- a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs @@ -1,8 +1,12 @@ using System.Linq; +using Content.Server._DV.Planet; +using Content.Server.Atmos.EntitySystems; using Content.Server.GameTicking.Rules.Components; using Content.Server.GridPreloader; +using Content.Server.Parallax; using Content.Server.StationEvents.Events; using Content.Shared.GameTicking.Components; +using Content.Shared.Parallax.Biomes; using Robust.Server.GameObjects; using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; @@ -19,6 +23,9 @@ public sealed class LoadMapRuleSystem : StationEventSystem [Dependency] private readonly MapLoaderSystem _mapLoader = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly GridPreloaderSystem _gridPreloader = default!; + [Dependency] private readonly BiomeSystem _biome = default!; + [Dependency] private readonly MetaDataSystem _meta = default!; + [Dependency] private readonly AtmosphereSystem _atmos = default!; protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRuleComponent rule, GameRuleAddedEvent args) { @@ -43,6 +50,34 @@ protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRule grids = GameTicker.LoadGameMap(gameMap, out mapId, null); Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); } + if (comp.PlanetMap != null) + { + var planet = _prototypeManager.Index(comp.PlanetMap); + var map = _map.CreateMap(out mapId, runMapInit: true); + var opts = DeserializationOptions.Default with {InitializeMaps = true}; + _biome.EnsurePlanet(map, _prototypeManager.Index(planet.Biome), mapLight: planet.MapLight); + // add each marker layer + var biome = Comp(map); + foreach (var layer in planet.BiomeMarkerLayers) + { + _biome.AddMarkerLayer(map, biome, layer); + } + if (planet.AddedComponents is {} added) + EntityManager.AddComponents(map, added); + _atmos.SetMapAtmosphere(map, false, planet.Atmosphere); + _meta.SetEntityName(map, Loc.GetString(planet.MapName)); + + if (comp.GridPath is { } gPath) + if (!_mapLoader.TryLoadGrid(mapId, gPath, out var grid, opts)) + { + Log.Error($"Failed to load grid from {gPath}!"); + ForceEndSelf(uid, rule); + return; + } + + grids = new List {map}; + Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); + } else if (comp.MapPath is {} path) { DebugTools.AssertNull(comp.GridPath); diff --git a/Resources/Locale/en-US/_Mono/events/planets.ftl b/Resources/Locale/en-US/_Mono/events/planets.ftl new file mode 100644 index 00000000000..ff82add8282 --- /dev/null +++ b/Resources/Locale/en-US/_Mono/events/planets.ftl @@ -0,0 +1,3 @@ +mono-planet-event-start-announcement = New planetary landing zone temporarily available for resource extraction. Estimated 30 minutes before intense weather blocks landing. +mono-planet-event-warning-announcement = Estimated 5 minutes before intense weather blocks landing. +mono-planet-event-end-announcement = Planetary landing zone blocked fully by weather. Await further notice. diff --git a/Resources/Prototypes/_Mono/GameRules/planets.yml b/Resources/Prototypes/_Mono/GameRules/planets.yml new file mode 100644 index 00000000000..c958c2fa7c6 --- /dev/null +++ b/Resources/Prototypes/_Mono/GameRules/planets.yml @@ -0,0 +1,37 @@ +- type: entity + id: MonoPlanetmapSpawnerScheduler + parent: BaseGameRule + components: + - type: BasicStationEventScheduler + scheduledGameRules: !type:NestedSelector + tableId: PlanetMapsTable + minimumTimeUntilFirstEvent: 1800 # 30 minutes + minMaxEventTiming: + min: 3900 # 65 minutes between events - 5 min buffer between + max: 3900 # 65 minutes between events - 5 min buffer between + +- type: entityTable + id: MonoPlanetmapSpawnerScheduler + table: !type:AllSelector # we need to pass a list of rules, since rules have further restrictions to consider via StationEventComp + children: + - id: PlanetZoneDesertA + +- type: entity + parent: BaseRandomShuttleRule + id: PlanetZoneDesertA + components: + - type: StationEvent + startAnnouncement: mono-planet-event-start-announcement + startAudio: + path: /Audio/Announcements/attention.ogg + warningAnnouncement: mono-planet-event-warning-announcement + endAnnouncement: mono-planet-event-end-announcement + duration: 3600 + maxDuration: 3600 + weight: 2 + maxOccurrences: 1 + - type: GameRule + minPlayers: 15 + - type: LoadMapRule + planetMap: DesertWorld + gridPath: /Maps/_Mono/ShuttleEvent/zenith.yml From fcebeaad645ac7a547c72f94fac7c9ce9917aedf Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 21:21:23 -0400 Subject: [PATCH 08/16] Framework for planetmap gamerules --- .../GameTicking/Rules/LoadMapRuleSystem.cs | 25 ++++++++++----- Resources/Locale/en-US/_Mono/biomes.ftl | 2 ++ .../Prototypes/_Mono/GameRules/planets.yml | 8 ++--- Resources/Prototypes/_Mono/Planets/events.yml | 31 +++++++++++++++++++ 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 Resources/Prototypes/_Mono/Planets/events.yml diff --git a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs index 2a3ba83ee8e..f54321e1a12 100644 --- a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs @@ -11,6 +11,7 @@ using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -23,9 +24,11 @@ public sealed class LoadMapRuleSystem : StationEventSystem [Dependency] private readonly MapLoaderSystem _mapLoader = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly GridPreloaderSystem _gridPreloader = default!; - [Dependency] private readonly BiomeSystem _biome = default!; - [Dependency] private readonly MetaDataSystem _meta = default!; - [Dependency] private readonly AtmosphereSystem _atmos = default!; + [Dependency] private readonly BiomeSystem _biome = default!; // Mono + [Dependency] private readonly MetaDataSystem _meta = default!; // Mono + [Dependency] private readonly AtmosphereSystem _atmos = default!; // Mono + + private readonly List<(Vector2i, Tile)> _setTiles = new(); // Mono protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRuleComponent rule, GameRuleAddedEvent args) { @@ -50,6 +53,7 @@ protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRule grids = GameTicker.LoadGameMap(gameMap, out mapId, null); Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); } + // Mono start if (comp.PlanetMap != null) { var planet = _prototypeManager.Index(comp.PlanetMap); @@ -68,16 +72,23 @@ protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRule _meta.SetEntityName(map, Loc.GetString(planet.MapName)); if (comp.GridPath is { } gPath) - if (!_mapLoader.TryLoadGrid(mapId, gPath, out var grid, opts)) + { + _mapLoader.TryLoadGrid(mapId, gPath, out var grid, opts); + if (grid != null) { - Log.Error($"Failed to load grid from {gPath}!"); - ForceEndSelf(uid, rule); - return; + // clears area of the grid thing whatever its stolen from DV planet slop + _setTiles.Clear(); + var aabb = Comp(grid.Value).LocalAABB; + _biome.ReserveTiles(map, aabb.Enlarged(0.2f), _setTiles); } + } + + _map.InitializeMap(map); grids = new List {map}; Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); } + // Mono end else if (comp.MapPath is {} path) { DebugTools.AssertNull(comp.GridPath); diff --git a/Resources/Locale/en-US/_Mono/biomes.ftl b/Resources/Locale/en-US/_Mono/biomes.ftl index 80029677110..e9d52781149 100644 --- a/Resources/Locale/en-US/_Mono/biomes.ftl +++ b/Resources/Locale/en-US/_Mono/biomes.ftl @@ -2,3 +2,5 @@ salvage-biome-mod-mono-desert = Desert # todo - get a better name than "desert planet" lmao shuttle-destination-desert-planet = Desert Planet + +shuttle-destination-planet-zone = Landing Zone diff --git a/Resources/Prototypes/_Mono/GameRules/planets.yml b/Resources/Prototypes/_Mono/GameRules/planets.yml index c958c2fa7c6..a6773bc7c9b 100644 --- a/Resources/Prototypes/_Mono/GameRules/planets.yml +++ b/Resources/Prototypes/_Mono/GameRules/planets.yml @@ -26,12 +26,12 @@ path: /Audio/Announcements/attention.ogg warningAnnouncement: mono-planet-event-warning-announcement endAnnouncement: mono-planet-event-end-announcement - duration: 3600 - maxDuration: 3600 + duration: 3600 # This means nothing outside of announcements if you're trying to change this, it uses a TimedDespawn comp added to the planet prototype. + maxDuration: 3600 # Same as above. weight: 2 maxOccurrences: 1 - type: GameRule minPlayers: 15 - type: LoadMapRule - planetMap: DesertWorld - gridPath: /Maps/_Mono/ShuttleEvent/zenith.yml + planetMap: GameruleDesertWorld60Minutes + #gridPath: /Maps/_Mono/ShuttleEvent/zenith.yml # WHATEVER diff --git a/Resources/Prototypes/_Mono/Planets/events.yml b/Resources/Prototypes/_Mono/Planets/events.yml new file mode 100644 index 00000000000..712764394f6 --- /dev/null +++ b/Resources/Prototypes/_Mono/Planets/events.yml @@ -0,0 +1,31 @@ +- type: planet + id: GameruleDesertWorld60Minutes + biome: MonoDesertPermanentPlanet + mapName: shuttle-destination-planet-zone + mapLight: "#FEFEFE" + addedComponents: + - type: FTLDestination + - type: TimedDespawn + lifetime: 3600 + atmosphere: + volume: 2500 + temperature: 303.6 # 30.45 celsius + moles: + - 32.458 + - 68.213 + +- type: planet + id: GameruleOcean60Minutes + biome: MonoContinentalDesertOcean + mapName: shuttle-destination-planet-zone + mapLight: "#FEFEFE" + addedComponents: + - type: FTLDestination + - type: TimedDespawn + lifetime: 3600 + atmosphere: + volume: 2500 + temperature: 283.9 # 10.75 celsius + moles: + - 32.458 + - 68.213 From e478283968c0d3e3c9c9da766551205accc6445b Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 21:25:12 -0400 Subject: [PATCH 09/16] Pointless. --- Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs index f54321e1a12..1c4999f13f6 100644 --- a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs @@ -83,8 +83,6 @@ protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRule } } - _map.InitializeMap(map); - grids = new List {map}; Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); } From 70c8755b359fe5840417f155ee26b4a8d46ff359 Mon Sep 17 00:00:00 2001 From: starch Date: Thu, 21 May 2026 21:33:21 -0400 Subject: [PATCH 10/16] Fix --- .../_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml | 2 +- Resources/Prototypes/_Mono/GameRules/planets.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml index 4b0a3e2b2a9..a2ef53fa36b 100644 --- a/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml +++ b/Resources/Prototypes/_Mono/Entities/Mobs/NPCs/mob_hostile_mercenaries.yml @@ -425,7 +425,7 @@ - type: startingGear id: MobHumanoidMonoPMCGearTier2Shotgun equipment: - back: ClothingBackpackDuffelMonoTier2ShotgunPMC + back: ClothingBackpackDuffelMonoTier2PMCShotgun - type: entity name: PMC breacher diff --git a/Resources/Prototypes/_Mono/GameRules/planets.yml b/Resources/Prototypes/_Mono/GameRules/planets.yml index a6773bc7c9b..b1c94083a50 100644 --- a/Resources/Prototypes/_Mono/GameRules/planets.yml +++ b/Resources/Prototypes/_Mono/GameRules/planets.yml @@ -11,7 +11,7 @@ max: 3900 # 65 minutes between events - 5 min buffer between - type: entityTable - id: MonoPlanetmapSpawnerScheduler + id: PlanetMapsTable table: !type:AllSelector # we need to pass a list of rules, since rules have further restrictions to consider via StationEventComp children: - id: PlanetZoneDesertA From e3999b97916d19918fe181615530edc05db69581 Mon Sep 17 00:00:00 2001 From: starch Date: Fri, 22 May 2026 16:38:16 -0400 Subject: [PATCH 11/16] Move weather mods from _NF to _Mono like I should've done --- .../Prototypes/_Mono/Planets/salvage_mods.yml | 118 ++++++++++++++++++ .../_NF/Procedural/salvage_mods.yml | 118 ------------------ 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/Resources/Prototypes/_Mono/Planets/salvage_mods.yml b/Resources/Prototypes/_Mono/Planets/salvage_mods.yml index 09da0548d17..1ca3201cdb7 100644 --- a/Resources/Prototypes/_Mono/Planets/salvage_mods.yml +++ b/Resources/Prototypes/_Mono/Planets/salvage_mods.yml @@ -9,3 +9,121 @@ color: "#FFFFFF" # Genius! biomes: - Desert + +# Weather mods + +- type: salvageWeatherMod + id: Hail + desc: salvage-weather-mod-hail + weather: Hail + cost: 2 + biomes: + - Snow + +- type: salvageWeatherMod + id: SnowfallHeavy + desc: salvage-weather-mod-heavy-snowfall + weather: MonoBlizzard + cost: 1 + biomes: + - Snow + +- type: salvageWeatherMod + id: SnowfallMedium + desc: salvage-weather-mod-medium-snowfall + weather: MonoSnow + cost: 1 + biomes: + - Grasslands + - Snow + +- type: salvageWeatherMod + id: SnowfallLight + desc: salvage-weather-mod-light-snowfall + weather: MonoSnowLight + cost: 1 + biomes: + - Grasslands + - Snow + +- type: salvageWeatherMod + id: AshfallHeavy + desc: salvage-weather-mod-heavy-ashfall + weather: AshfallHeavy + cost: 5 + biomes: + - Lava + +- type: salvageWeatherMod + id: Ashfall + desc: salvage-weather-mod-medium-ashfall + weather: Ashfall + cost: 2 + biomes: + - Lava + - Shadow + +- type: salvageWeatherMod + id: AshfallLight + desc: salvage-weather-mod-light-ashfall + weather: AshfallLight + cost: 1 + biomes: + - Lava + - Shadow + - Caves + - Desert + +- type: salvageWeatherMod + id: Fallout + desc: salvage-weather-mod-fallout + weather: Fallout + cost: 1 + biomes: + - Lava + - Shadow + +- type: salvageWeatherMod + id: SandstormHeavy + desc: salvage-weather-mod-heavy-sandstorm + weather: SandstormHeavy + cost: 1 + biomes: + - Caves + - Desert + +- type: salvageWeatherMod + id: Sandstorm + desc: salvage-weather-mod-sandstorm + weather: Sandstorm + biomes: + - Caves + - Lava + - Desert + +- type: salvageWeatherMod + id: LightRain + desc: salvage-weather-mod-rain-light + weather: MonoLightRain + biomes: + - Grasslands + - Lava # primordial planet or something idk + +- type: salvageWeatherMod + id: Rain + desc: salvage-weather-mod-rain + weather: MonoRain + biomes: + - Grasslands + +- type: salvageWeatherMod + id: Storm + desc: salvage-weather-mod-storm + weather: MonoStorm + biomes: + - Grasslands + +- type: salvageWeatherMod + id: ClearWeather + desc: salvage-weather-mod-none + weather: ClearWeather diff --git a/Resources/Prototypes/_NF/Procedural/salvage_mods.yml b/Resources/Prototypes/_NF/Procedural/salvage_mods.yml index 5f7fe419699..7a7312bf6ea 100644 --- a/Resources/Prototypes/_NF/Procedural/salvage_mods.yml +++ b/Resources/Prototypes/_NF/Procedural/salvage_mods.yml @@ -120,124 +120,6 @@ maxDuration: 840 # Frontier cost: 1 -# Weather mods - -- type: salvageWeatherMod - id: Hail - desc: salvage-weather-mod-hail - weather: Hail - cost: 2 - biomes: - - Snow - -- type: salvageWeatherMod - id: SnowfallHeavy - desc: salvage-weather-mod-heavy-snowfall - weather: MonoBlizzard - cost: 1 - biomes: - - Snow - -- type: salvageWeatherMod - id: SnowfallMedium - desc: salvage-weather-mod-medium-snowfall - weather: MonoSnow - cost: 1 - biomes: - - Grasslands - - Snow - -- type: salvageWeatherMod - id: SnowfallLight - desc: salvage-weather-mod-light-snowfall - weather: MonoSnowLight - cost: 1 - biomes: - - Grasslands - - Snow - -- type: salvageWeatherMod - id: AshfallHeavy - desc: salvage-weather-mod-heavy-ashfall - weather: AshfallHeavy - cost: 5 - biomes: - - Lava - -- type: salvageWeatherMod - id: Ashfall - desc: salvage-weather-mod-medium-ashfall - weather: Ashfall - cost: 2 - biomes: - - Lava - - Shadow - -- type: salvageWeatherMod - id: AshfallLight - desc: salvage-weather-mod-light-ashfall - weather: AshfallLight - cost: 1 - biomes: - - Lava - - Shadow - - Caves - - Desert - -- type: salvageWeatherMod - id: Fallout - desc: salvage-weather-mod-fallout - weather: Fallout - cost: 1 - biomes: - - Lava - - Shadow - -- type: salvageWeatherMod - id: SandstormHeavy - desc: salvage-weather-mod-heavy-sandstorm - weather: SandstormHeavy - cost: 1 - biomes: - - Caves - - Desert - -- type: salvageWeatherMod - id: Sandstorm - desc: salvage-weather-mod-sandstorm - weather: Sandstorm - biomes: - - Caves - - Lava - - Desert - -- type: salvageWeatherMod - id: LightRain - desc: salvage-weather-mod-rain-light - weather: MonoLightRain - biomes: - - Grasslands - - Lava # primordial planet or something idk - -- type: salvageWeatherMod - id: Rain - desc: salvage-weather-mod-rain - weather: MonoRain - biomes: - - Grasslands - -- type: salvageWeatherMod - id: Storm - desc: salvage-weather-mod-storm - weather: MonoStorm - biomes: - - Grasslands - -- type: salvageWeatherMod - id: ClearWeather - desc: salvage-weather-mod-none - weather: ClearWeather - # Air mixtures - type: salvageAirMod id: Space From 6ebbb5f5ce31bf0c98cd3d3f0794bdfe61ff1767 Mon Sep 17 00:00:00 2001 From: starch Date: Fri, 22 May 2026 17:06:35 -0400 Subject: [PATCH 12/16] Weather support --- .../Rules/Components/LoadMapRuleComponent.cs | 13 +++++++++++++ .../GameTicking/Rules/LoadMapRuleSystem.cs | 3 +++ Resources/Prototypes/_Mono/GameRules/planets.yml | 2 ++ 3 files changed, 18 insertions(+) diff --git a/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs index bb44b2073a5..20bc01895fb 100644 --- a/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs @@ -2,6 +2,7 @@ using Content.Server.Maps; using Content.Shared._DV.Planet; using Content.Shared.GridPreloader.Prototypes; +using Content.Shared.Weather; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -26,6 +27,18 @@ public sealed partial class LoadMapRuleComponent : Component /// [DataField] public ProtoId? PlanetMap; + + /// + /// If theres a planet prototype set, loads this weather onto it. + /// + [DataField] + public ProtoId? PlanetWeather; + + /// + /// How much time until the thing ends or whatever who cares. + /// + [DataField] + public double PlanetWeatherEndTime; // Mono end /// diff --git a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs index 1c4999f13f6..50339d49244 100644 --- a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs @@ -5,6 +5,7 @@ using Content.Server.GridPreloader; using Content.Server.Parallax; using Content.Server.StationEvents.Events; +using Content.Server.Weather; using Content.Shared.GameTicking.Components; using Content.Shared.Parallax.Biomes; using Robust.Server.GameObjects; @@ -68,6 +69,8 @@ protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRule } if (planet.AddedComponents is {} added) EntityManager.AddComponents(map, added); + if (comp.PlanetWeather != null) + EntityManager.System().SetWeather(mapId, _prototypeManager.Index(comp.PlanetWeather), TimeSpan.FromSeconds(comp.PlanetWeatherEndTime)); _atmos.SetMapAtmosphere(map, false, planet.Atmosphere); _meta.SetEntityName(map, Loc.GetString(planet.MapName)); diff --git a/Resources/Prototypes/_Mono/GameRules/planets.yml b/Resources/Prototypes/_Mono/GameRules/planets.yml index b1c94083a50..92f7ab05af3 100644 --- a/Resources/Prototypes/_Mono/GameRules/planets.yml +++ b/Resources/Prototypes/_Mono/GameRules/planets.yml @@ -34,4 +34,6 @@ minPlayers: 15 - type: LoadMapRule planetMap: GameruleDesertWorld60Minutes + planetWeather: SandstormHeavy + planetWeatherEndTime: 600 #gridPath: /Maps/_Mono/ShuttleEvent/zenith.yml # WHATEVER From b75618fdb2896746d4833848ced1f5660f956b9d Mon Sep 17 00:00:00 2001 From: starch Date: Fri, 22 May 2026 18:28:30 -0400 Subject: [PATCH 13/16] Uh huh --- Resources/Prototypes/Tiles/planet.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Tiles/planet.yml b/Resources/Prototypes/Tiles/planet.yml index 2694a4dbff9..598ec69c9c8 100644 --- a/Resources/Prototypes/Tiles/planet.yml +++ b/Resources/Prototypes/Tiles/planet.yml @@ -94,6 +94,7 @@ - type: tile id: FloorDesertPlanet + suffix: Planet name: tiles-desert-floor sprite: /Textures/_Mono/Tiles/planet/auto_sand/sand_1_var.png variants: 16 @@ -164,6 +165,7 @@ - type: tile id: FloorRiverbed + suffix: Riverbed name: tiles-low-desert-floor sprite: /Textures/_RMC14/Tiles/planet/desert/desert.png variants: 6 @@ -185,6 +187,7 @@ - type: tile id: FloorAsteroidSandUnvariantizedPlanet + suffix: Planet name: tiles-asteroid-sand sprite: /Textures/Tiles/Asteroid/asteroid0.png isSubfloor: true @@ -212,6 +215,7 @@ - type: tile id: FloorAsteroidSandPlanet + suffix: Planet name: tiles-asteroid-sand sprite: /Textures/Tiles/Asteroid/asteroid.png variants: 13 From 5a38fcbbddb14fd3a6be1e32a97d1acec0123275 Mon Sep 17 00:00:00 2001 From: starch Date: Sat, 23 May 2026 19:47:27 -0400 Subject: [PATCH 14/16] Snow planet biome using conifers and basalt and dug snow instead of the wizden/exped one --- .../Prototypes/_Mono/GameRules/planets.yml | 28 +- Resources/Prototypes/_Mono/Planets/events.yml | 284 +++++++++++++++++- 2 files changed, 306 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/_Mono/GameRules/planets.yml b/Resources/Prototypes/_Mono/GameRules/planets.yml index 92f7ab05af3..550e503ce92 100644 --- a/Resources/Prototypes/_Mono/GameRules/planets.yml +++ b/Resources/Prototypes/_Mono/GameRules/planets.yml @@ -23,8 +23,33 @@ - type: StationEvent startAnnouncement: mono-planet-event-start-announcement startAudio: - path: /Audio/Announcements/attention.ogg + path: /Audio/Misc/notice2.ogg warningAnnouncement: mono-planet-event-warning-announcement + warningAudio: + path: /Audio/Misc/notice1.ogg + endAnnouncement: mono-planet-event-end-announcement + duration: 3600 # This means nothing outside of announcements if you're trying to change this, it uses a TimedDespawn comp added to the planet prototype. + maxDuration: 3600 # Same as above. + weight: 2 + maxOccurrences: 1 + - type: GameRule + minPlayers: 15 + - type: LoadMapRule + planetMap: GameruleDesertWorld60Minutes + planetWeather: SandstormHeavy + planetWeatherEndTime: 600 + +- type: entity + parent: BaseRandomShuttleRule + id: PlanetZoneSnowA + components: + - type: StationEvent + startAnnouncement: mono-planet-event-start-announcement + startAudio: + path: /Audio/Misc/notice2.ogg + warningAnnouncement: mono-planet-event-warning-announcement + warningAudio: + path: /Audio/Misc/notice1.ogg endAnnouncement: mono-planet-event-end-announcement duration: 3600 # This means nothing outside of announcements if you're trying to change this, it uses a TimedDespawn comp added to the planet prototype. maxDuration: 3600 # Same as above. @@ -36,4 +61,3 @@ planetMap: GameruleDesertWorld60Minutes planetWeather: SandstormHeavy planetWeatherEndTime: 600 - #gridPath: /Maps/_Mono/ShuttleEvent/zenith.yml # WHATEVER diff --git a/Resources/Prototypes/_Mono/Planets/events.yml b/Resources/Prototypes/_Mono/Planets/events.yml index 712764394f6..32643020335 100644 --- a/Resources/Prototypes/_Mono/Planets/events.yml +++ b/Resources/Prototypes/_Mono/Planets/events.yml @@ -1,6 +1,6 @@ - type: planet id: GameruleDesertWorld60Minutes - biome: MonoDesertPermanentPlanet + biome: MonoDesertEventPlanet mapName: shuttle-destination-planet-zone mapLight: "#FEFEFE" addedComponents: @@ -14,9 +14,139 @@ - 32.458 - 68.213 +- type: biomeTemplate + id: MonoDesertEventPlanet + layers: + # Boulder Placement + - !type:BiomeEntityLayer + threshold: 0.975 + noise: + seed: 0 + frequency: 5 + noiseType: OpenSimplex2 + allowedTiles: + - FloorDesert + - FloorDesertRocky + - FloorDesertPlanet + - FloorAsteroidSandUnvariantizedPlanet + entities: + - FloraRockSolidPlanet + # Flora Placement + # Piluma + - !type:BiomeEntityLayer + threshold: 0.915 + noise: + seed: 0 + frequency: 2 + noiseType: OpenSimplex2 + allowedTiles: + - FloorDesert + - FloorDesertPlanet + - FloorAsteroidSandUnvariantizedPlanet + entities: + - FloraPilumaPlant + # Orakim + - !type:BiomeEntityLayer + threshold: 0.925 + noise: + seed: 0 + frequency: 2 + noiseType: OpenSimplex2 + allowedTiles: + - FloorDesert + - FloorDesertPlanet + entities: + - FloraOrakimPlant + # Rock decals + - !type:BiomeDecalLayer + allowedTiles: + - FloorDesert + - FloorDesertRocky + - FloorDesertPlanet + - FloorAsteroidSandUnvariantizedPlanet + - FloorAsteroidSandPlanet + threshold: 0.9 + divisions: 1 + noise: + seed: 1 + frequency: 5 + decals: + - Basalt1 + - Basalt2 + - Basalt3 + - Basalt4 + - Basalt5 + - Basalt6 + - Basalt7 + - Basalt8 + - Basalt9 + # Bush decals + - !type:BiomeDecalLayer + allowedTiles: + - FloorDesert + - FloorDesertPlanet + threshold: 0.9 + divisions: 1 + noise: + seed: 1 + frequency: 0.9 + decals: + - Bushj1 + - Bushj2 + - Bushj3 + # Large rock areas + - !type:BiomeEntityLayer + allowedTiles: + - FloorAsteroidSandUnvariantizedPlanet + threshold: -0.05 + noise: + seed: 0 + noiseType: Cellular + frequency: 0.05 + lacunarity: 5 + fractalType: FBm + octaves: 2 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + entities: + - WallRockSand + - !type:BiomeDummyLayer + id: Loot + # Fill layer + # Base tiles + - !type:BiomeTileLayer + threshold: -1 + tile: FloorAsteroidSandPlanet + # Apply planet desert tile as noise so it doesnt look flat and boring + - !type:BiomeTileLayer + threshold: -0.40 + tile: FloorDesertPlanet + noise: + seed: 0 + noiseType: Cellular + frequency: 0.2 + lacunarity: 2 + fractalType: FBm + octaves: 2 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + # Unvariantized tile for rock walls to be placed on + - !type:BiomeTileLayer + tile: FloorAsteroidSandUnvariantizedPlanet + threshold: -0.30 + noise: + seed: 0 + noiseType: Cellular + frequency: 0.05 + lacunarity: 2 + fractalType: FBm + octaves: 5 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + - type: planet - id: GameruleOcean60Minutes - biome: MonoContinentalDesertOcean + id: GameruleSnowWorld60Minutes + biome: MonoSnowEventPlanet mapName: shuttle-destination-planet-zone mapLight: "#FEFEFE" addedComponents: @@ -25,7 +155,153 @@ lifetime: 3600 atmosphere: volume: 2500 - temperature: 283.9 # 10.75 celsius + temperature: 237.55 # -35.6 celsius moles: - 32.458 - 68.213 + +- type: biomeTemplate + id: MonoSnowEventPlanet + layers: + # Sparse vegetation + - !type:BiomeDecalLayer + allowedTiles: + - FloorSnow + divisions: 2 + threshold: -0.50 + noise: + seed: 0 + noiseType: Cellular + frequency: 1 + decals: + - grasssnowa1 + - grasssnowa2 + - grasssnowa3 + - grasssnowb1 + - grasssnowb2 + - grasssnowb3 + - grasssnowc1 + - grasssnowc2 + - grasssnowc3 + # Dense, bland grass + - !type:BiomeDecalLayer + allowedTiles: + - FloorSnow + divisions: 1 + threshold: -0.35 + noise: + seed: 0 + noiseType: Cellular + frequency: 0.2 + fractalType: FBm + octaves: 5 + lacunarity: 2 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + decals: + - grasssnow + - grasssnow01 + - grasssnow02 + - grasssnow03 + - grasssnow04 + - grasssnow05 + - grasssnow06 + - grasssnow07 + - grasssnow08 + - grasssnow09 + - grasssnow10 + - grasssnow11 + - grasssnow12 + - grasssnow13 + # Little bit of coloured grass + - !type:BiomeDecalLayer + allowedTiles: + - FloorSnow + divisions: 1 + threshold: -0.0 + noise: + seed: 0 + noiseType: Cellular + frequency: 1 + fractalType: None + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + decals: + - bushsnowa1 + - bushsnowa2 + - bushsnowa3 + - bushsnowb3 + - bushsnowb2 + - bushsnowb3 + - !type:BiomeEntityLayer + threshold: 0.3 + noise: + seed: 0 + noiseType: OpenSimplex2 + fractalType: FBm + frequency: 2 + allowedTiles: + - FloorSnow + entities: + - FloraTreeConifer + # Boulder Placement + - !type:BiomeEntityLayer + threshold: 0.975 + noise: + seed: 0 + frequency: 5 + noiseType: OpenSimplex2 + allowedTiles: + - FloorSnow + - FloorSnowDug + entities: + - FloraRockSolidPlanet + # Large rock areas + - !type:BiomeEntityLayer + allowedTiles: + - FloorBasalt + threshold: -1 + noise: + seed: 0 + noiseType: Cellular + frequency: 0.05 + lacunarity: 5 + fractalType: FBm + octaves: 2 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + entities: + - WallRockBasalt + - !type:BiomeDummyLayer + id: Loot + # Fill layer + # Base tiles + - !type:BiomeTileLayer + threshold: -1 + tile: FloorSnowDug + # Apply planet desert tile as noise so it doesnt look flat and boring + - !type:BiomeTileLayer + threshold: -0.40 + tile: FloorSnow + noise: + seed: 0 + noiseType: Cellular + frequency: 0.4 + lacunarity: 2 + fractalType: FBm + octaves: 4 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 + # Unvariantized tile for rock walls to be placed on + - !type:BiomeTileLayer + tile: FloorBasalt + threshold: -0.2 + noise: + seed: 0 + noiseType: Cellular + frequency: 0.03 + lacunarity: 2 + fractalType: FBm + octaves: 5 + cellularDistanceFunction: Euclidean + cellularReturnType: Distance2 From 63e2dfb38563c53c33bc22b41574e45be24aec7e Mon Sep 17 00:00:00 2001 From: starch Date: Sun, 24 May 2026 00:39:23 -0400 Subject: [PATCH 15/16] These look better --- Resources/Prototypes/_Mono/Planets/events.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/_Mono/Planets/events.yml b/Resources/Prototypes/_Mono/Planets/events.yml index 32643020335..7923b2fb312 100644 --- a/Resources/Prototypes/_Mono/Planets/events.yml +++ b/Resources/Prototypes/_Mono/Planets/events.yml @@ -259,7 +259,7 @@ # Large rock areas - !type:BiomeEntityLayer allowedTiles: - - FloorBasalt + - FloorCave threshold: -1 noise: seed: 0 @@ -294,7 +294,7 @@ cellularReturnType: Distance2 # Unvariantized tile for rock walls to be placed on - !type:BiomeTileLayer - tile: FloorBasalt + tile: FloorCave threshold: -0.2 noise: seed: 0 From be90989eb1116f81fe349c1c4bee3445f04cd532 Mon Sep 17 00:00:00 2001 From: starch Date: Sun, 24 May 2026 22:41:48 -0400 Subject: [PATCH 16/16] Change --- .../Rules/Components/LoadMapRuleComponent.cs | 20 -------- .../GameTicking/Rules/LoadMapRuleSystem.cs | 47 ------------------- .../_Mono/Planets/PlanetMapComponent.cs | 14 ++++++ .../Prototypes/_Mono/GameRules/planets.yml | 31 ++---------- .../_Mono/Planets/Maps/Snow/zone_a.yml | 19 ++++++++ 5 files changed, 36 insertions(+), 95 deletions(-) create mode 100644 Resources/Prototypes/_Mono/Planets/Maps/Snow/zone_a.yml diff --git a/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs index 20bc01895fb..54c76481ca5 100644 --- a/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/LoadMapRuleComponent.cs @@ -21,26 +21,6 @@ public sealed partial class LoadMapRuleComponent : Component [DataField] public ProtoId? GameMap; - // Mono start - /// - /// A planet prototype to load on a new map. - /// - [DataField] - public ProtoId? PlanetMap; - - /// - /// If theres a planet prototype set, loads this weather onto it. - /// - [DataField] - public ProtoId? PlanetWeather; - - /// - /// How much time until the thing ends or whatever who cares. - /// - [DataField] - public double PlanetWeatherEndTime; - // Mono end - /// /// A map to load. /// diff --git a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs index 50339d49244..003a74ef4bf 100644 --- a/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/LoadMapRuleSystem.cs @@ -1,18 +1,12 @@ using System.Linq; -using Content.Server._DV.Planet; -using Content.Server.Atmos.EntitySystems; using Content.Server.GameTicking.Rules.Components; using Content.Server.GridPreloader; -using Content.Server.Parallax; using Content.Server.StationEvents.Events; -using Content.Server.Weather; using Content.Shared.GameTicking.Components; -using Content.Shared.Parallax.Biomes; using Robust.Server.GameObjects; using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.Map; -using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -25,11 +19,6 @@ public sealed class LoadMapRuleSystem : StationEventSystem [Dependency] private readonly MapLoaderSystem _mapLoader = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly GridPreloaderSystem _gridPreloader = default!; - [Dependency] private readonly BiomeSystem _biome = default!; // Mono - [Dependency] private readonly MetaDataSystem _meta = default!; // Mono - [Dependency] private readonly AtmosphereSystem _atmos = default!; // Mono - - private readonly List<(Vector2i, Tile)> _setTiles = new(); // Mono protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRuleComponent rule, GameRuleAddedEvent args) { @@ -54,42 +43,6 @@ protected override void Added(EntityUid uid, LoadMapRuleComponent comp, GameRule grids = GameTicker.LoadGameMap(gameMap, out mapId, null); Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); } - // Mono start - if (comp.PlanetMap != null) - { - var planet = _prototypeManager.Index(comp.PlanetMap); - var map = _map.CreateMap(out mapId, runMapInit: true); - var opts = DeserializationOptions.Default with {InitializeMaps = true}; - _biome.EnsurePlanet(map, _prototypeManager.Index(planet.Biome), mapLight: planet.MapLight); - // add each marker layer - var biome = Comp(map); - foreach (var layer in planet.BiomeMarkerLayers) - { - _biome.AddMarkerLayer(map, biome, layer); - } - if (planet.AddedComponents is {} added) - EntityManager.AddComponents(map, added); - if (comp.PlanetWeather != null) - EntityManager.System().SetWeather(mapId, _prototypeManager.Index(comp.PlanetWeather), TimeSpan.FromSeconds(comp.PlanetWeatherEndTime)); - _atmos.SetMapAtmosphere(map, false, planet.Atmosphere); - _meta.SetEntityName(map, Loc.GetString(planet.MapName)); - - if (comp.GridPath is { } gPath) - { - _mapLoader.TryLoadGrid(mapId, gPath, out var grid, opts); - if (grid != null) - { - // clears area of the grid thing whatever its stolen from DV planet slop - _setTiles.Clear(); - var aabb = Comp(grid.Value).LocalAABB; - _biome.ReserveTiles(map, aabb.Enlarged(0.2f), _setTiles); - } - } - - grids = new List {map}; - Log.Info($"Created map {mapId} for {ToPrettyString(uid):rule}"); - } - // Mono end else if (comp.MapPath is {} path) { DebugTools.AssertNull(comp.GridPath); diff --git a/Content.Server/_Mono/Planets/PlanetMapComponent.cs b/Content.Server/_Mono/Planets/PlanetMapComponent.cs index 229409a8295..a11a6913c1b 100644 --- a/Content.Server/_Mono/Planets/PlanetMapComponent.cs +++ b/Content.Server/_Mono/Planets/PlanetMapComponent.cs @@ -1,3 +1,5 @@ +using Content.Shared.Weather; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server._Mono.Planets; @@ -7,5 +9,17 @@ public sealed partial class PlanetMapComponent : Component { [DataField] public string Parallax = "bedrock"; + + /// + /// If theres a planet prototype set, loads this weather onto it. + /// + [DataField] + public ProtoId? PlanetWeather; + + /// + /// How much time until the thing ends or whatever who cares. + /// + [DataField] + public double PlanetWeatherEndTime; } // Only excludes a grid from garbage clean really. diff --git a/Resources/Prototypes/_Mono/GameRules/planets.yml b/Resources/Prototypes/_Mono/GameRules/planets.yml index 550e503ce92..979f2ed5566 100644 --- a/Resources/Prototypes/_Mono/GameRules/planets.yml +++ b/Resources/Prototypes/_Mono/GameRules/planets.yml @@ -14,30 +14,7 @@ id: PlanetMapsTable table: !type:AllSelector # we need to pass a list of rules, since rules have further restrictions to consider via StationEventComp children: - - id: PlanetZoneDesertA - -- type: entity - parent: BaseRandomShuttleRule - id: PlanetZoneDesertA - components: - - type: StationEvent - startAnnouncement: mono-planet-event-start-announcement - startAudio: - path: /Audio/Misc/notice2.ogg - warningAnnouncement: mono-planet-event-warning-announcement - warningAudio: - path: /Audio/Misc/notice1.ogg - endAnnouncement: mono-planet-event-end-announcement - duration: 3600 # This means nothing outside of announcements if you're trying to change this, it uses a TimedDespawn comp added to the planet prototype. - maxDuration: 3600 # Same as above. - weight: 2 - maxOccurrences: 1 - - type: GameRule - minPlayers: 15 - - type: LoadMapRule - planetMap: GameruleDesertWorld60Minutes - planetWeather: SandstormHeavy - planetWeatherEndTime: 600 + - id: PlanetZoneSnowA - type: entity parent: BaseRandomShuttleRule @@ -51,13 +28,11 @@ warningAudio: path: /Audio/Misc/notice1.ogg endAnnouncement: mono-planet-event-end-announcement - duration: 3600 # This means nothing outside of announcements if you're trying to change this, it uses a TimedDespawn comp added to the planet prototype. + duration: 3600 # This means nothing outside of announcements if you're trying to change this, it uses a TimedDespawn comp added to the map prototype. maxDuration: 3600 # Same as above. weight: 2 maxOccurrences: 1 - type: GameRule minPlayers: 15 - type: LoadMapRule - planetMap: GameruleDesertWorld60Minutes - planetWeather: SandstormHeavy - planetWeatherEndTime: 600 + gameMap: SnowZoneA diff --git a/Resources/Prototypes/_Mono/Planets/Maps/Snow/zone_a.yml b/Resources/Prototypes/_Mono/Planets/Maps/Snow/zone_a.yml new file mode 100644 index 00000000000..72564f067c2 --- /dev/null +++ b/Resources/Prototypes/_Mono/Planets/Maps/Snow/zone_a.yml @@ -0,0 +1,19 @@ +- type: gameMap + id: SnowZoneA + mapName: 'Landing Zone' + mapPath: /Maps/_Mono/Planet/Snow/ # Nothing to use yet lol im ignoring fail + maxRandomOffset: 0 + randomRotation: false + minPlayers: 0 + maxPlayers: 100 + stations: + Planet: + stationProto: StandardNanotrasenStation + gridComponents: + - type: TimedDespawn + lifetime: 3600 + components: + - type: StationNameSetup + mapNameTemplate: 'Landing Zone' + - type: StationBiome + biome: MonoSnowEventPlanet