From a32d8cd8f9586ad625a29ce2ccdafacc6151aae9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 13 Oct 2023 01:09:56 +0000 Subject: [PATCH 001/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4636.yml | 4 ---- html/changelogs/archive/2023-10.yml | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4636.yml diff --git a/html/changelogs/AutoChangeLog-pr-4636.yml b/html/changelogs/AutoChangeLog-pr-4636.yml deleted file mode 100644 index 2f26402bc864..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4636.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - refactor: "Refactored camera code to be less blocking, use typechecks less often, and provide somewhat more fluid descriptions to photos." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index a511276351e7..88a569e7c326 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -153,3 +153,7 @@ - rscadd: origin descriptions are now displayed when selecting an origin mullenpaul: - ui: tweaked flyby controls to make them in line with other destinations +2023-10-13: + Drathek: + - refactor: Refactored camera code to be less blocking, use typechecks less often, + and provide somewhat more fluid descriptions to photos. From df98ce26308c5c41bb55e83f18470c9784192fde Mon Sep 17 00:00:00 2001 From: Paul Mullen <101871009+mullenpaul@users.noreply.github.com> Date: Fri, 13 Oct 2023 20:46:33 +0100 Subject: [PATCH 002/199] added faction weapon spawns for uscm upp clf and pmc (#4635) # About the pull request Adds a bunch of faction specific weapon spawners in to the game to help mappers. # Explain why it's good for the game This makes mappers happy by letting them place more specific faction based spawners. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: adds weapon spawners for USCM, CLF, PMC and UPP /:cl: --- .../effects/spawners/faction_spawners.dm | 197 ++++++++++++++++++ colonialmarines.dme | 1 + 2 files changed, 198 insertions(+) create mode 100644 code/game/objects/effects/spawners/faction_spawners.dm diff --git a/code/game/objects/effects/spawners/faction_spawners.dm b/code/game/objects/effects/spawners/faction_spawners.dm new file mode 100644 index 000000000000..2daf6392e5e7 --- /dev/null +++ b/code/game/objects/effects/spawners/faction_spawners.dm @@ -0,0 +1,197 @@ +/* + * USCM weapons + */ +/obj/effect/spawner/random/gun/uscm_primary + name = "USCM primary weapon spawner" + desc = "spawns USCM primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/rifle/m41a = /obj/item/ammo_magazine/rifle, + /obj/item/weapon/gun/rifle/m41a/tactical = /obj/item/ammo_magazine/rifle, + /obj/item/weapon/gun/smg/m39 = /obj/item/ammo_magazine/smg/m39, + /obj/item/weapon/gun/smg/m39 = /obj/item/ammo_magazine/smg/m39, + /obj/item/weapon/gun/shotgun/pump = /datum/ammo/bullet/shotgun/buckshot + ) + +/obj/effect/spawner/random/gun/uscm_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/uscm_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/uscm_primary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/uscm_secondary + name = "USCM secondary weapon spawner" + desc = "spawns USCM secondary weapons" + spawn_nothing_percentage = 0 + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/m4a3 = /obj/item/ammo_magazine/pistol, + /obj/item/weapon/gun/revolver/m44 = /obj/item/ammo_magazine/handful/revolver/marksman + ) + +/obj/effect/spawner/random/gun/uscm_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/uscm_secondary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/uscm_secondary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_80" + + +/* + * UPP weapons + */ +/obj/effect/spawner/random/gun/upp_primary + name = "UPP primary weapon spawner" + desc = "spawns UPP primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/smg/bizon/upp = /obj/item/ammo_magazine/smg/bizon, + /obj/item/weapon/gun/rifle/type71 = /obj/item/ammo_magazine/rifle/type71, + /obj/item/weapon/gun/rifle/type71/carbine = /obj/item/ammo_magazine/rifle/type71 + ) + +/obj/effect/spawner/random/gun/upp_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/upp_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/upp_primary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/upp_secondary + name = "UPP secondary weapon spawner" + desc = "spawns UPP secondary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/t73 = /obj/item/ammo_magazine/pistol/t73, + /obj/item/weapon/gun/pistol/np92 = /obj/item/ammo_magazine/pistol/np92, + /obj/item/weapon/gun/revolver/upp = /obj/item/ammo_magazine/revolver/upp + ) + +/obj/effect/spawner/random/gun/upp_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/upp_secondary/medchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/upp_secondary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_pistol_80" +/* + * PMC weapons + */ +/obj/effect/spawner/random/gun/pmc_primary + name = "PMC primary weapon spawner" + desc = "spawns PMC primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/rifle/m41a/elite = /obj/item/ammo_magazine/rifle/ap, + /obj/item/weapon/gun/rifle/m41a/elite = /obj/item/ammo_magazine/rifle/extended, + /obj/item/weapon/gun/smg/m39/elite = /obj/item/ammo_magazine/smg/m39/ap, + /obj/item/weapon/gun/smg/m39/elite = /obj/item/ammo_magazine/smg/m39/extended, + /obj/item/weapon/gun/rifle/nsg23 = /obj/item/ammo_magazine/rifle/nsg23/ap, + /obj/item/weapon/gun/rifle/nsg23 = /obj/item/ammo_magazine/rifle/nsg23/extended + ) + +/obj/effect/spawner/random/gun/pmc_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/pmc_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/pmc_primary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/pmc_secondary + name = "PMC secondary weapon spawner" + desc = "spawns PMC secondary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/vp78 = /obj/item/ammo_magazine/pistol/vp78, + /obj/item/weapon/gun/pistol/mod88 = /obj/item/ammo_magazine/pistol/mod88 + ) + +/obj/effect/spawner/random/gun/pmc_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/pmc_secondary/medchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/pmc_secondary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_pistol_80" + +/* + * CLF weapons + */ +/obj/effect/spawner/random/gun/clf_primary + name = "CLF primary weapon spawner" + desc = "spawns CLF primary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/rifle/m16 = /obj/item/ammo_magazine/rifle/m16, + /obj/item/weapon/gun/rifle/mar40/carbine = /obj/item/ammo_magazine/rifle/mar40 + ) + +/obj/effect/spawner/random/gun/clf_primary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_20" + +/obj/effect/spawner/random/gun/clf_primary/midchance + spawn_nothing_percentage = 50 + icon_state = "loot_rifle_50" + +/obj/effect/spawner/random/gun/clf_primary/highchance + spawn_nothing_percentage = 80 + icon_state = "loot_rifle_80" + +/obj/effect/spawner/random/gun/clf_secondary + name = "CLF secondary weapon spawner" + desc = "spawns CLF secondary weapons" + mags_max = 2 + mags_min = 1 + guns = list( + /obj/item/weapon/gun/pistol/kt42 = /obj/item/ammo_magazine/pistol/kt42, + /obj/item/weapon/gun/pistol/b92fs = /obj/item/ammo_magazine/pistol/b92fs + ) + +/obj/effect/spawner/random/gun/clf_secondary/lowchance + spawn_nothing_percentage = 80 + icon_state = "loot_pistol_20" + +/obj/effect/spawner/random/gun/clf_secondary/medchance + spawn_nothing_percentage = 50 + icon_state = "loot_pistol_50" + +/obj/effect/spawner/random/gun/clf_secondary/highchance + spawn_nothing_percentage = 20 + icon_state = "loot_pistol_80" diff --git a/colonialmarines.dme b/colonialmarines.dme index 63140be5e458..e79c6c0585cb 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -970,6 +970,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\game\objects\effects\landmarks\structure_spawners\setup_distress.dm" #include "code\game\objects\effects\landmarks\structure_spawners\structure_spawner.dm" #include "code\game\objects\effects\landmarks\structure_spawners\xvx_hive.dm" +#include "code\game\objects\effects\spawners\faction_spawners.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\prop_gun_spawner.dm" #include "code\game\objects\effects\spawners\random.dm" From 19985def29671805f94f7a438d4e99b8ad759eff Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 13 Oct 2023 20:59:25 +0100 Subject: [PATCH 003/199] Automatic changelog for PR #4635 [ci skip] --- html/changelogs/AutoChangeLog-pr-4635.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4635.yml diff --git a/html/changelogs/AutoChangeLog-pr-4635.yml b/html/changelogs/AutoChangeLog-pr-4635.yml new file mode 100644 index 000000000000..b74bf73dfea1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4635.yml @@ -0,0 +1,4 @@ +author: "mullenpaul" +delete-after: True +changes: + - rscadd: "adds weapon spawners for USCM, CLF, PMC and UPP" \ No newline at end of file From 20be6b24b1cee7201daa549240a83c8c089452e6 Mon Sep 17 00:00:00 2001 From: QuickLode <63271983+QuickLode@users.noreply.github.com> Date: Fri, 13 Oct 2023 12:51:13 -0700 Subject: [PATCH 004/199] Solaris Ridge PMC Nightmare small changes (#4622) # About the pull request Small changes to solaris ridge pmc nightmare - access stuff - removes some pmc synth equipment , replaced with lesser equipment or nothing - colony supervisor has a guaranteed research grant # Explain why it's good for the game PMC Survivor Synthetic has gear unequivical to a Survivor despite being a nightmare, toning it down reduces the ceiling they can operate in. Colony Supervisor should have an impact on research if they can survive, because the role is extremely difficult to survive in and lacks any means to defend themselves - relying on others to hopefully survive in classic WY fashion. They're also the colony supervisor and asst mngr of research meaning that they would have incentives for researchers. Colony supervisor can now access his colony. LMFAO # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Colony Supervisor now has a guaranteed grant. balance: nerfs PMC Synthetic's gear fix: PMC Synthetic has corrected access(thx forest) fix: Colony Supervisor can now have access to his own colony(LOL). /:cl: --- .../crashlanding-offices_insert_bigred.dm | 59 +++++++++++++++---- code/modules/gear_presets/synths.dm | 4 ++ 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm index c5c85a0a7441..35a9b8e5eaba 100644 --- a/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm +++ b/code/modules/gear_presets/survivors/solaris/crashlanding-offices_insert_bigred.dm @@ -6,12 +6,26 @@ flags = EQUIPMENT_PRESET_START_OF_ROUND assignment = "Weyland-Yutani PMC" faction = FACTION_SURVIVOR - faction_group = list(FACTION_SURVIVOR) + faction_group = list(FACTION_WY, FACTION_SURVIVOR) paygrade = "PMC-OP" idtype = /obj/item/card/id/pmc skills = /datum/skills/civilian/survivor/pmc languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) - access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND) + access = list( + ACCESS_WY_GENERAL, + ACCESS_WY_COLONIAL, + ACCESS_WY_MEDICAL, + ACCESS_WY_SECURITY, + ACCESS_WY_RESEARCH, + ACCESS_WY_ARMORY, + ACCESS_CIVILIAN_PUBLIC, + ACCESS_CIVILIAN_RESEARCH, + ACCESS_CIVILIAN_ENGINEERING, + ACCESS_CIVILIAN_LOGISTICS, + ACCESS_CIVILIAN_BRIG, + ACCESS_CIVILIAN_MEDBAY, + ACCESS_CIVILIAN_COMMAND, + ) /datum/equipment_preset/survivor/pmc/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/hvh, WEAR_L_EAR) @@ -77,12 +91,17 @@ access = list( ACCESS_WY_GENERAL, ACCESS_WY_COLONIAL, - ACCESS_WY_LEADERSHIP, + ACCESS_WY_MEDICAL, ACCESS_WY_SECURITY, - ACCESS_WY_EXEC, ACCESS_WY_RESEARCH, - ACCESS_WY_ENGINEERING, - ACCESS_WY_MEDICAL, + ACCESS_WY_ARMORY, + ACCESS_CIVILIAN_PUBLIC, + ACCESS_CIVILIAN_RESEARCH, + ACCESS_CIVILIAN_ENGINEERING, + ACCESS_CIVILIAN_LOGISTICS, + ACCESS_CIVILIAN_BRIG, + ACCESS_CIVILIAN_MEDBAY, + ACCESS_CIVILIAN_COMMAND, ACCESS_ILLEGAL_PIRATE, ) languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE) @@ -95,11 +114,12 @@ if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) add_ice_colony_survivor_equipment(new_human) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/lockable/liaison, WEAR_BACK) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/beaker/vial/random/good(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/paper/research_notes/grant, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/manager(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY, WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/dress, WEAR_FEET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/manager(new_human), WEAR_HEAD) - new_human.equip_to_slot_or_del(new /obj/item/paper/research_notes/good(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/beaker/vial/random/good(new_human), WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_R_STORE) add_pmc_survivor_weapon(new_human) @@ -110,8 +130,22 @@ /datum/equipment_preset/synth/survivor/pmc name = "Survivor - Synthetic - PMC Support Synth" faction = FACTION_SURVIVOR - faction_group = list(FACTION_SURVIVOR) - access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND) + faction_group = list(FACTION_WY, FACTION_SURVIVOR) + access = list( + ACCESS_WY_GENERAL, + ACCESS_WY_COLONIAL, + ACCESS_WY_MEDICAL, + ACCESS_WY_SECURITY, + ACCESS_WY_RESEARCH, + ACCESS_WY_ARMORY, + ACCESS_CIVILIAN_PUBLIC, + ACCESS_CIVILIAN_RESEARCH, + ACCESS_CIVILIAN_ENGINEERING, + ACCESS_CIVILIAN_LOGISTICS, + ACCESS_CIVILIAN_BRIG, + ACCESS_CIVILIAN_MEDBAY, + ACCESS_CIVILIAN_COMMAND, + ) idtype = /obj/item/card/id/pmc assignment = JOB_PMC_SYNTH rank = JOB_PMC_SYNTH @@ -122,15 +156,16 @@ /datum/equipment_preset/synth/survivor/pmc/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/pmc, WEAR_BODY) - new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/surg_vest/equipped, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch, WEAR_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/scalpel/manager, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/weylandyutani, WEAR_IN_ACCESSORY) + new_human.equip_to_slot_or_del(new /obj/item/handcuffs/zip, WEAR_IN_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth, WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) - new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc, WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/command/hvh, WEAR_L_EAR) - new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/experimental_mesons, WEAR_EYES) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc, WEAR_FACE) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS) diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index dc5d3b7217c8..c686ae91bb78 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -143,6 +143,10 @@ . = ..() access = get_access(ACCESS_LIST_COLONIAL_ALL) + get_region_accesses(2) + get_region_accesses(4) + ACCESS_MARINE_RESEARCH //Access to civillians stuff + medbay stuff + engineering stuff + research +/datum/equipment_preset/synth/survivor/pmc/New() + . = ..() + access = get_access(ACCESS_LIST_WY_PMC) + /datum/equipment_preset/synth/survivor/load_gear(mob/living/carbon/human/new_human) for(var/equipment in equipment_to_spawn) var/equipment_path = islist(equipment_to_spawn[equipment]) ? pick(equipment_to_spawn[equipment]) : equipment_to_spawn[equipment] From 5c2b9cd49c752df7d009c64879308d11eda1371f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 13 Oct 2023 21:16:00 +0100 Subject: [PATCH 005/199] Automatic changelog for PR #4622 [ci skip] --- html/changelogs/AutoChangeLog-pr-4622.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4622.yml diff --git a/html/changelogs/AutoChangeLog-pr-4622.yml b/html/changelogs/AutoChangeLog-pr-4622.yml new file mode 100644 index 000000000000..8cadcfa7742a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4622.yml @@ -0,0 +1,7 @@ +author: "QuickLode" +delete-after: True +changes: + - rscadd: "Colony Supervisor now has a guaranteed grant." + - balance: "nerfs PMC Synthetic's gear" + - bugfix: "PMC Synthetic has corrected access(thx forest)" + - bugfix: "Colony Supervisor can now have access to his own colony(LOL)." \ No newline at end of file From 2a14790fc99a06b815da1eda40e71a7656fc2142 Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Fri, 13 Oct 2023 14:57:31 -0500 Subject: [PATCH 006/199] fixes upp medic/sapper survivor paygrade (#4646) # About the pull request fixes the paygrade for UPP medic/sapper survivor because i forgot they existed in the pr i made simplifying ranks # Explain why it's good for the game Korporal Medic "SURVIVOR FRAGGER" Guy says, "I wanna frag xenos" > UE3M Medic "SURVIVOR FRAGGER" Guy says, "I wanna frag xenos" # Testing Photographs and Procedure Probably works I did not test this. # Changelog :cl: fix: UPP Sapper/Medic survivor use their correct paygrade instead of UE3M/UE3S /:cl: --- .../survivors/trijent/crashlanding_upp_bar_insert_trijent.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm index 147e40a24314..5c662f50d8c7 100644 --- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm +++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm @@ -64,7 +64,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/sapper name = "Survivor - UPP Sapper" - paygrade = "UE3S" + paygrade = "UE3" assignment = JOB_UPP_ENGI rank = JOB_UPP_ENGI skills = /datum/skills/military/survivor/upp_sapper @@ -92,7 +92,7 @@ //crashlanding-upp-bar.dmm /datum/equipment_preset/survivor/upp/medic name = "Survivor - UPP Medic" - paygrade = "UE3M" + paygrade = "UE3" assignment = JOB_UPP_MEDIC rank = JOB_UPP_MEDIC skills = /datum/skills/military/survivor/upp_medic From dfb1f5bb2067929531bf3af8f365614a73411c92 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 13 Oct 2023 21:49:50 +0100 Subject: [PATCH 007/199] Automatic changelog for PR #4646 [ci skip] --- html/changelogs/AutoChangeLog-pr-4646.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4646.yml diff --git a/html/changelogs/AutoChangeLog-pr-4646.yml b/html/changelogs/AutoChangeLog-pr-4646.yml new file mode 100644 index 000000000000..a546eb654cae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4646.yml @@ -0,0 +1,4 @@ +author: "CapCamIII" +delete-after: True +changes: + - bugfix: "UPP Sapper/Medic survivor use their correct paygrade instead of UE3M/UE3S" \ No newline at end of file From 1c62c62ea615a68093a5083d3d38e399f8886851 Mon Sep 17 00:00:00 2001 From: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:32:06 -0400 Subject: [PATCH 008/199] M39 arm brace stock disables when dropped (#4655) # About the pull request If you got delimbed while the brace was locked, the next person to equip it gets it stuck on their hand # Explain why it's good for the game It should fix the gun accidentally getting stuck to peoples hands # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: M39 arm brace disables when dropped /:cl: --- code/modules/projectiles/gun.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index e9ab9aecc3c2..9d16574aa9da 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -524,6 +524,10 @@ As sniper rifles have both and weapon mods can change them as well. ..() deals w if(fire_delay_group && delay_left > 0) LAZYSET(user.fire_delay_next_fire, src, world.time + delay_left) + for(var/obj/item/attachable/stock/smg/collapsible/brace/current_stock in contents) //SMG armbrace folds to stop it getting stuck on people + if(current_stock.stock_activated) + current_stock.activate_attachment(src, user, turn_off = TRUE) + unwield(user) set_gun_user(null) From 9dfb4bb3fb08b1c2c02908b5d7121931b6ee3be9 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 13 Oct 2023 22:13:50 +0100 Subject: [PATCH 009/199] Automatic changelog for PR #4655 [ci skip] --- html/changelogs/AutoChangeLog-pr-4655.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4655.yml diff --git a/html/changelogs/AutoChangeLog-pr-4655.yml b/html/changelogs/AutoChangeLog-pr-4655.yml new file mode 100644 index 000000000000..3653446a6734 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4655.yml @@ -0,0 +1,4 @@ +author: "BeagleGaming1" +delete-after: True +changes: + - bugfix: "M39 arm brace disables when dropped" \ No newline at end of file From 555a0a1d726e34b447596640e22176ff6f93caf9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 14 Oct 2023 01:06:20 +0000 Subject: [PATCH 010/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4622.yml | 7 ------- html/changelogs/AutoChangeLog-pr-4635.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4646.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4655.yml | 4 ---- html/changelogs/archive/2023-10.yml | 12 ++++++++++++ 5 files changed, 12 insertions(+), 19 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4622.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4635.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4646.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4655.yml diff --git a/html/changelogs/AutoChangeLog-pr-4622.yml b/html/changelogs/AutoChangeLog-pr-4622.yml deleted file mode 100644 index 8cadcfa7742a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4622.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "QuickLode" -delete-after: True -changes: - - rscadd: "Colony Supervisor now has a guaranteed grant." - - balance: "nerfs PMC Synthetic's gear" - - bugfix: "PMC Synthetic has corrected access(thx forest)" - - bugfix: "Colony Supervisor can now have access to his own colony(LOL)." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4635.yml b/html/changelogs/AutoChangeLog-pr-4635.yml deleted file mode 100644 index b74bf73dfea1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4635.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mullenpaul" -delete-after: True -changes: - - rscadd: "adds weapon spawners for USCM, CLF, PMC and UPP" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4646.yml b/html/changelogs/AutoChangeLog-pr-4646.yml deleted file mode 100644 index a546eb654cae..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4646.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - bugfix: "UPP Sapper/Medic survivor use their correct paygrade instead of UE3M/UE3S" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4655.yml b/html/changelogs/AutoChangeLog-pr-4655.yml deleted file mode 100644 index 3653446a6734..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4655.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BeagleGaming1" -delete-after: True -changes: - - bugfix: "M39 arm brace disables when dropped" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 88a569e7c326..aba66c07af8d 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -157,3 +157,15 @@ Drathek: - refactor: Refactored camera code to be less blocking, use typechecks less often, and provide somewhat more fluid descriptions to photos. +2023-10-14: + BeagleGaming1: + - bugfix: M39 arm brace disables when dropped + CapCamIII: + - bugfix: UPP Sapper/Medic survivor use their correct paygrade instead of UE3M/UE3S + QuickLode: + - rscadd: Colony Supervisor now has a guaranteed grant. + - balance: nerfs PMC Synthetic's gear + - bugfix: PMC Synthetic has corrected access(thx forest) + - bugfix: Colony Supervisor can now have access to his own colony(LOL). + mullenpaul: + - rscadd: adds weapon spawners for USCM, CLF, PMC and UPP From 62e3eec3e7d9eab9c377179bed1d848f1f482d93 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 14 Oct 2023 10:40:25 -0700 Subject: [PATCH 011/199] Fix double options button (#4658) # About the pull request This PR simply prevents adding another Options button on your stat panel if there already is one. Occurs if you open multiple clients, or I guess now enter from lobby. # Explain why it's good for the game We only need one options button, it just looks funny. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Drathek ui: Fixed a duplicate Options button /:cl: --- html/statbrowser.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/html/statbrowser.js b/html/statbrowser.js index 78eb7d4e5716..83709e9e92f0 100644 --- a/html/statbrowser.js +++ b/html/statbrowser.js @@ -1036,6 +1036,9 @@ Byond.subscribeTo("remove_mc", remove_mc); Byond.subscribeTo("add_verb_list", add_verb_list); function createOptionsButton() { + if (document.getElementById("options")) { + return; + } var button = document.createElement("BUTTON"); button.onclick = function () { openOptionsMenu(); From d269f7c30183093221bb3a28326bb88739d21bc5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 18:48:45 +0100 Subject: [PATCH 012/199] Automatic changelog for PR #4658 [ci skip] --- html/changelogs/AutoChangeLog-pr-4658.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4658.yml diff --git a/html/changelogs/AutoChangeLog-pr-4658.yml b/html/changelogs/AutoChangeLog-pr-4658.yml new file mode 100644 index 000000000000..572143c1d17c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4658.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - ui: "Fixed a duplicate Options button" \ No newline at end of file From b4c26fb2d7bc139a6252820ea5d205a67c33cda2 Mon Sep 17 00:00:00 2001 From: Lalipar <22782815+Lalipar@users.noreply.github.com> Date: Sun, 15 Oct 2023 04:42:07 +1100 Subject: [PATCH 013/199] Better functionality for fax panel (#4656) # About the pull request Better functionality for fax panel # Explain why it's good for the game Easier to keep track of faxes and fax replies # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: Readable time for when a fax was sent in fax panel qol: Adds ckey/character name for faxes in fax panel qol: Adds fax subject to fax panel fix: Added CMB faxes to Fax Panel /:cl: --- code/game/machinery/fax_machine.dm | 12 ++++++------ code/modules/admin/tabs/event_tab.dm | 2 +- code/modules/admin/topic/topic.dm | 17 ++++++++--------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/fax_machine.dm b/code/game/machinery/fax_machine.dm index ff26ce802b08..7bbc86681eb1 100644 --- a/code/game/machinery/fax_machine.dm +++ b/code/game/machinery/fax_machine.dm @@ -324,22 +324,22 @@ var/list/alldepartments = list() switch(target_department) if(DEPARTMENT_HC) - GLOB.USCMFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.USCMFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_PROVOST) - GLOB.ProvostFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.ProvostFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_CMB) - GLOB.CMBFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.CMBFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_WY) - GLOB.WYFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.WYFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " if(DEPARTMENT_PRESS) - GLOB.PressFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.PressFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " else - GLOB.GeneralFaxes.Add("\[view message at [world.timeofday]\] REPLY") + GLOB.GeneralFaxes.Add("\['[original_fax.name]' from [key_name(usr)], [scan] at [time2text(world.timeofday, "hh:mm:ss")]\] REPLY") msg_admin += "(RPLY): " msg_admin += SPAN_STAFF_IC("Receiving fax via secure connection ... view message") diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index a5975bb02274..6ba329109902 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -322,7 +322,7 @@ if(!admin_holder) return - var/list/options = list("Weyland-Yutani", "High Command", "Provost", "Press", "Other", "Cancel") + var/list/options = list("Weyland-Yutani", "High Command", "Provost", "Press", "CMB", "Other", "Cancel") var/answer = tgui_input_list(src, "Which kind of faxes would you like to see?", "Faxes", options) switch(answer) if("Weyland-Yutani") diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 31f99870fe43..191b292ab95b 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -1310,11 +1310,10 @@ if(send_choice != "Send") return GLOB.fax_contents += fax_message // save a copy - - GLOB.USCMFaxes.Add("\[view reply at [world.timeofday]\]") - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null + GLOB.USCMFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") + var/msg_ghost = SPAN_NOTICE("PRESS REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1393,10 +1392,10 @@ return GLOB.fax_contents += fax_message // save a copy - GLOB.USCMFaxes.Add("\[view reply at [world.timeofday]\]") - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null + GLOB.USCMFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") + var/msg_ghost = SPAN_NOTICE("USCM FAX REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1472,12 +1471,12 @@ return GLOB.fax_contents += fax_message // save a copy - GLOB.WYFaxes.Add("\[view reply at [world.timeofday]\]") //Add replies so that mods know what the hell is goin on with the RP - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null if(!customname) return + GLOB.WYFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") //Add replies so that mods know what the hell is goin on with the RP + var/msg_ghost = SPAN_NOTICE("WEYLAND-YUTANI FAX REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" @@ -1554,12 +1553,12 @@ return GLOB.fax_contents += fax_message // save a copy - GLOB.CMBFaxes.Add("\[view reply at [world.timeofday]\]") //Add replies so that mods know what the hell is goin on with the RP - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null if(!customname) return + GLOB.CMBFaxes.Add("\[view '[customname]' from [key_name(usr)] at [time2text(world.timeofday, "hh:mm:ss")]\]") //Add replies so that mods know what the hell is goin on with the RP + var/msg_ghost = SPAN_NOTICE("COLONIAL MARSHAL BUREAU FAX REPLY: ") msg_ghost += "Transmitting '[customname]' via secure connection ... " msg_ghost += "view message" From cb8caaecf81488f329b2b5c805fc01c4ede0503f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:03:18 +0100 Subject: [PATCH 014/199] Automatic changelog for PR #4656 [ci skip] --- html/changelogs/AutoChangeLog-pr-4656.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4656.yml diff --git a/html/changelogs/AutoChangeLog-pr-4656.yml b/html/changelogs/AutoChangeLog-pr-4656.yml new file mode 100644 index 000000000000..cae7537b5585 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4656.yml @@ -0,0 +1,7 @@ +author: "Lalipar" +delete-after: True +changes: + - qol: "Readable time for when a fax was sent in fax panel" + - qol: "Adds ckey/character name for faxes in fax panel" + - qol: "Adds fax subject to fax panel" + - bugfix: "Added CMB faxes to Fax Panel" \ No newline at end of file From e358e62c8df0c52bed23f59b5348122b9e0f0fd6 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 14 Oct 2023 18:43:51 +0100 Subject: [PATCH 015/199] Fixes nuke explosion runtiming if a living mob was in a nullspaced container (#4659) # About the pull request As per title. I have no idea what causes this condition to begin with, live inspection didn't yield any results. # Explain why it's good for the game This might sound like an improbable case, and it is, but it actually happened last week. This caused the nuke explosion to stop and left everyone confused for the next 45 minutes the round lasted to end normally. # Testing Photographs and Procedure Untested. # Changelog :cl: fix: Fix nuke explosion getting canceled in some very rare cases. /:cl: --- code/game/gamemodes/cm_self_destruct.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/cm_self_destruct.dm b/code/game/gamemodes/cm_self_destruct.dm index b86de24eed74..07c9c43a4768 100644 --- a/code/game/gamemodes/cm_self_destruct.dm +++ b/code/game/gamemodes/cm_self_destruct.dm @@ -259,12 +259,12 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi var/list/alive_mobs = list() //Everyone who will be destroyed on the zlevel(s). var/list/dead_mobs = list() //Everyone who only needs to see the cinematic. for(var/mob/current_mob as anything in GLOB.mob_list) //This only does something cool for the people about to die, but should prove pretty interesting. - if(!current_mob || !current_mob.loc) + var/turf/current_turf = get_turf(current_mob) + if(!current_mob || !current_mob.loc || !current_turf) continue //In case something changes when we sleep(). if(current_mob.stat == DEAD) dead_mobs |= current_mob continue - var/turf/current_turf = get_turf(current_mob) if(current_turf.z in z_levels) alive_mobs |= current_mob shake_camera(current_mob, 110, 4) @@ -286,6 +286,8 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi for(var/mob/current_mob in alive_mobs) if(current_mob && current_mob.loc) //Who knows, maybe they escaped, or don't exist anymore. var/turf/current_mob_turf = get_turf(current_mob) + if(!current_mob_turf) + continue if(current_mob_turf.z in z_levels) if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) continue From c083797921cd5cc74f3eb5fdec6b1253f0516466 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:18:25 +0100 Subject: [PATCH 016/199] Automatic changelog for PR #4659 [ci skip] --- html/changelogs/AutoChangeLog-pr-4659.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4659.yml diff --git a/html/changelogs/AutoChangeLog-pr-4659.yml b/html/changelogs/AutoChangeLog-pr-4659.yml new file mode 100644 index 000000000000..87750986cc0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4659.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fix nuke explosion getting canceled in some very rare cases." \ No newline at end of file From d2e43812453e534b800bc044e15e086173b9cd27 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 14 Oct 2023 18:45:24 +0100 Subject: [PATCH 017/199] Fixes Xeno Name preference requring a reconnect to apply (#4660) # About the pull request See #4436 for an indepth description of the issue - basically Xeno name is cached on client and updating preferences won't update it without a reconnect (and the lobby screen even baits you thinking it does by displaying pref not client's) # Explain why it's good for the game Less confusion Fixes #4436 # Testing Photographs and Procedure Basic testing performed in the form of: Changing Xeno Name Launching game, observing Spawning a Xeno and possessing it And observing which xeno name is present. # Changelog :cl: fix: Xeno Name preference does not require a reconnection to apply anymore. It still won't change your current Xenomorph's name however. /:cl: --- code/modules/client/client_procs.dm | 18 +++++++++++------- code/modules/client/preferences.dm | 4 ++++ code/modules/mob/new_player/new_player.dm | 4 ++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 3cfb08b8dac0..82540d6cbf5e 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -330,13 +330,8 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( prefs.last_ip = address //these are gonna be used for banning prefs.last_id = computer_id //these are gonna be used for banning fps = prefs.fps - xeno_prefix = prefs.xeno_prefix - xeno_postfix = prefs.xeno_postfix - xeno_name_ban = prefs.xeno_name_ban - if(!xeno_prefix || xeno_name_ban) - xeno_prefix = "XX" - if(!xeno_postfix || xeno_name_ban) - xeno_postfix = "" + + load_xeno_name() human_name_ban = prefs.human_name_ban @@ -790,3 +785,12 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( if(admin_holder) admin_holder.particle_test = new /datum/particle_editor(in_atom) admin_holder.particle_test.tgui_interact(mob) + +/client/proc/load_xeno_name() + xeno_prefix = prefs.xeno_prefix + xeno_postfix = prefs.xeno_postfix + xeno_name_ban = prefs.xeno_name_ban + if(!xeno_prefix || xeno_name_ban) + xeno_prefix = "XX" + if(!xeno_postfix || xeno_name_ban) + xeno_postfix = "" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 554ba28e417f..8ca177ddf66c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1409,6 +1409,7 @@ var/const/MAX_SAVE_SLOTS = 10 if(length(new_xeno_prefix)==0) xeno_prefix = "XX" + owner.load_xeno_name() else var/all_ok = TRUE for(var/i=1, i<=length(new_xeno_prefix), i++) @@ -1420,6 +1421,7 @@ var/const/MAX_SAVE_SLOTS = 10 all_ok = FALSE //everything else - won't if(all_ok) xeno_prefix = new_xeno_prefix + owner.load_xeno_name() else to_chat(user, "Invalid Xeno Prefix. Your Prefix can contain either single letter or two letters.") @@ -1444,6 +1446,7 @@ var/const/MAX_SAVE_SLOTS = 10 return else if(length(new_xeno_postfix)==0) xeno_postfix = "" + owner.load_xeno_name() else var/all_ok = TRUE var/first_char = TRUE @@ -1469,6 +1472,7 @@ var/const/MAX_SAVE_SLOTS = 10 first_char = FALSE if(all_ok) xeno_postfix = new_xeno_postfix + owner.load_xeno_name() else to_chat(user, "Invalid Xeno Postfix. Your Postfix can contain single letter and an optional digit after it.") diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 5da499dabc52..dda2487c24d9 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -34,8 +34,8 @@ return var/tempnumber = rand(1, 999) - var/postfix_text = (client.prefs && client.prefs.xeno_postfix) ? ("-"+client.prefs.xeno_postfix) : "" - var/prefix_text = (client.prefs && client.prefs.xeno_prefix) ? client.prefs.xeno_prefix : "XX" + var/postfix_text = (client.xeno_postfix) ? ("-"+client.xeno_postfix) : "" + var/prefix_text = (client.xeno_prefix) ? client.xeno_prefix : "XX" var/xeno_text = "[prefix_text]-[tempnumber][postfix_text]" var/round_start = !SSticker || !SSticker.mode || SSticker.current_state <= GAME_STATE_PREGAME From 4c382f8024644dfff51ca98baa818678b65275e0 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:32:08 +0100 Subject: [PATCH 018/199] Automatic changelog for PR #4660 [ci skip] --- html/changelogs/AutoChangeLog-pr-4660.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4660.yml diff --git a/html/changelogs/AutoChangeLog-pr-4660.yml b/html/changelogs/AutoChangeLog-pr-4660.yml new file mode 100644 index 000000000000..71377e2d73f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4660.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Xeno Name preference does not require a reconnection to apply anymore. It still won't change your current Xenomorph's name however." \ No newline at end of file From d06f53777af06143d6caefde98e41cb98f0e42df Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Sat, 14 Oct 2023 10:46:08 -0700 Subject: [PATCH 019/199] Adjusts CODEOWNERS (#4634) # About the pull request Removes Morrow from codeowners, moves the survivor file codeowner to me # Explain why it's good for the game Morrow has retired. --- .github/CODEOWNERS | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7a79b28b09aa..4dfa55a79231 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -24,9 +24,8 @@ /tools/docker/ @Fira /Dockerfile @Fira -# MorrowWolf +# Zonespace -/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @morrowwolf -/code/modules/gear_presets/survivors.dm @morrowwolf +/code/modules/gear_presets/survivors.dm @zonespace27 # MULTIPLE OWNERS From a198920436553987bd87560762519455563ca581 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 14 Oct 2023 18:46:54 +0100 Subject: [PATCH 020/199] Fixes Tape Recorder failing to record when no language is given (#4663) # About the pull request The very same proc has a check on the language existing two line further up, because it's a potential use cases -- but fails to check it again and runtimes further below. # Explain why it's good for the game Bugfix # Testing Photographs and Procedure Untested # Changelog :cl: fix: Fixed Tape Recorder failing to record when no language information is present. /:cl: --- code/game/objects/items/devices/taperecorder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 01567084d5c7..a4247c90a5b3 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -168,7 +168,7 @@ mytape.timestamp += mytape.used_capacity var/language_known = (M.universal_speak || (speaking && (speaking.name in known_languages))) var/mob_name = language_known ? M.GetVoice() : "Unknown" - var/message = language_known ? msg : speaking.scramble(msg) + var/message = (!speaking || language_known) ? msg : speaking.scramble(msg) mytape.storedinfo += "\[[time2text(mytape.used_capacity,"mm:ss")]\] [mob_name] [verb], \"[italics ? "" : null][message][italics ? "" : null]\"" From 8b326c1dddafeb65653b74e6d0268f0362f76475 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 19:54:39 +0100 Subject: [PATCH 021/199] Automatic changelog for PR #4663 [ci skip] --- html/changelogs/AutoChangeLog-pr-4663.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4663.yml diff --git a/html/changelogs/AutoChangeLog-pr-4663.yml b/html/changelogs/AutoChangeLog-pr-4663.yml new file mode 100644 index 000000000000..0f441fcdccf2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4663.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed Tape Recorder failing to record when no language information is present." \ No newline at end of file From 61cb689b153ce530ba55f0a964a7f939d82a6309 Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 14 Oct 2023 18:47:22 +0100 Subject: [PATCH 022/199] mods can restart the server without starting the round (#4665) with the weird issues we've been accumulating lately which require a lobby restart this check is just annoying our mods and tadmins :cl: admin: administrators without R_DEBUG can now restart the server without starting the round /:cl: --- code/modules/admin/tabs/server_tab.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/admin/tabs/server_tab.dm b/code/modules/admin/tabs/server_tab.dm index 6e5ded23206a..84c9426dfa3f 100644 --- a/code/modules/admin/tabs/server_tab.dm +++ b/code/modules/admin/tabs/server_tab.dm @@ -6,10 +6,6 @@ if (!usr.client.admin_holder || !(usr.client.admin_holder.rights & R_MOD)) return - if(!check_rights(R_DEBUG, FALSE) && SSticker.current_state != GAME_STATE_FINISHED) - to_chat(usr, "You can't restart the world until the round has ended!") - return - var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel") if(confirm == "Cancel") return From c002a9439466c2b490f4891ddbd186b28c919eb2 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 20:15:33 +0100 Subject: [PATCH 023/199] Automatic changelog for PR #4665 [ci skip] --- html/changelogs/AutoChangeLog-pr-4665.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4665.yml diff --git a/html/changelogs/AutoChangeLog-pr-4665.yml b/html/changelogs/AutoChangeLog-pr-4665.yml new file mode 100644 index 000000000000..894b91f62cda --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4665.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - admin: "administrators without R_DEBUG can now restart the server without starting the round" \ No newline at end of file From 242a782dce2974516caa56bf638a03f04a4261fc Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sat, 14 Oct 2023 18:48:06 +0100 Subject: [PATCH 024/199] Adds safety check to bioprinter for resources and already printing (#4669) # About the pull request Fixes #4338 Also adds check to see if we actually have enough metal, all safety checks were done inside the tgui, better to have them here. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Limb printer can no longer double print or print without metal. /:cl: --- code/game/machinery/bioprinter.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index 81d498ba02e2..65f6fe1842f4 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -113,6 +113,10 @@ switch(action) if("print") + if(working) + //If we're already printing something then we're too busy to multi task. + to_chat(usr, SPAN_NOTICE("[src] is busy at the moment.")) + return FALSE var/recipe = params["recipe_id"] var/valid_recipe = FALSE for(var/datum/bioprinter_recipe/product_recipes in products) @@ -124,6 +128,10 @@ message_admins("[key_name(usr)] attempted to print an invalid recipe on \the [src].") return FALSE var/datum/bioprinter_recipe/recipe_datum = new recipe + if(stored_metal < recipe_datum.metal) + to_chat(usr, SPAN_NOTICE("[src] does not have enough stored metal.")) + QDEL_NULL(recipe_datum) + return FALSE stored_metal -= recipe_datum.metal to_chat(usr, SPAN_NOTICE("\The [src] is now printing the selected organ. Please hold.")) working = TRUE @@ -146,6 +154,8 @@ /obj/structure/machinery/bioprinter/proc/print_limb(limb_path) if(inoperable()) + //In case we lose power or anything between the print and the callback we don't want to permenantly break the printer + working = FALSE return new limb_path(get_turf(src)) working = FALSE From cf037cc34df2eb6812de4ced3a46158f46652b2e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 14 Oct 2023 20:30:16 +0100 Subject: [PATCH 025/199] Automatic changelog for PR #4669 [ci skip] --- html/changelogs/AutoChangeLog-pr-4669.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4669.yml diff --git a/html/changelogs/AutoChangeLog-pr-4669.yml b/html/changelogs/AutoChangeLog-pr-4669.yml new file mode 100644 index 000000000000..008ed56b3b86 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4669.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Limb printer can no longer double print or print without metal." \ No newline at end of file From 8100348430793121b90a8be369233d063d2f30ef Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 14 Oct 2023 18:48:31 +0100 Subject: [PATCH 026/199] Fixes Disconnected Observers runtiming HUD (#4667) # About the pull request A simple runtime job... Login() to an observed mob with a disconnected observer will crash the inventory HUD proc because it has no client. # Explain why it's good for the game Less runtimes # Testing Photographs and Procedure Tested with dual client and breakpoints # Changelog Internal change only --- code/_onclick/hud/human.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index d514bdedfcdf..37a858d76699 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -116,6 +116,10 @@ return var/mob/living/carbon/human/H = mymob var/mob/screenmob = viewer || H + + if(!screenmob?.client) + return + if(!gear.len) inventory_shown = FALSE return //species without inv slots don't show items. @@ -181,6 +185,9 @@ var/mob/living/carbon/human/H = mymob var/mob/screenmob = viewer || H + if(!screenmob?.client) + return + if(H.hud_used) if(H.hud_used.hud_shown) if(H.s_store) From 5f9c4d97f8742565bbf227e269563bf7f3ec3ea9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 15 Oct 2023 01:12:49 +0000 Subject: [PATCH 027/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4656.yml | 7 ------- html/changelogs/AutoChangeLog-pr-4658.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4659.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4660.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4663.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4665.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4669.yml | 4 ---- html/changelogs/archive/2023-10.yml | 19 +++++++++++++++++++ 8 files changed, 19 insertions(+), 31 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4656.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4658.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4659.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4660.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4663.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4665.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4669.yml diff --git a/html/changelogs/AutoChangeLog-pr-4656.yml b/html/changelogs/AutoChangeLog-pr-4656.yml deleted file mode 100644 index cae7537b5585..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4656.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Lalipar" -delete-after: True -changes: - - qol: "Readable time for when a fax was sent in fax panel" - - qol: "Adds ckey/character name for faxes in fax panel" - - qol: "Adds fax subject to fax panel" - - bugfix: "Added CMB faxes to Fax Panel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4658.yml b/html/changelogs/AutoChangeLog-pr-4658.yml deleted file mode 100644 index 572143c1d17c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4658.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - ui: "Fixed a duplicate Options button" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4659.yml b/html/changelogs/AutoChangeLog-pr-4659.yml deleted file mode 100644 index 87750986cc0a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4659.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fix nuke explosion getting canceled in some very rare cases." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4660.yml b/html/changelogs/AutoChangeLog-pr-4660.yml deleted file mode 100644 index 71377e2d73f6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4660.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Xeno Name preference does not require a reconnection to apply anymore. It still won't change your current Xenomorph's name however." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4663.yml b/html/changelogs/AutoChangeLog-pr-4663.yml deleted file mode 100644 index 0f441fcdccf2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4663.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed Tape Recorder failing to record when no language information is present." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4665.yml b/html/changelogs/AutoChangeLog-pr-4665.yml deleted file mode 100644 index 894b91f62cda..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4665.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - admin: "administrators without R_DEBUG can now restart the server without starting the round" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4669.yml b/html/changelogs/AutoChangeLog-pr-4669.yml deleted file mode 100644 index 008ed56b3b86..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4669.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Limb printer can no longer double print or print without metal." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index aba66c07af8d..05fc1ddd7ea2 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -169,3 +169,22 @@ - bugfix: Colony Supervisor can now have access to his own colony(LOL). mullenpaul: - rscadd: adds weapon spawners for USCM, CLF, PMC and UPP +2023-10-15: + Birdtalon: + - bugfix: Limb printer can no longer double print or print without metal. + Drathek: + - ui: Fixed a duplicate Options button + Lalipar: + - qol: Readable time for when a fax was sent in fax panel + - qol: Adds ckey/character name for faxes in fax panel + - qol: Adds fax subject to fax panel + - bugfix: Added CMB faxes to Fax Panel + fira: + - bugfix: Fix nuke explosion getting canceled in some very rare cases. + - bugfix: Xeno Name preference does not require a reconnection to apply anymore. + It still won't change your current Xenomorph's name however. + - bugfix: Fixed Tape Recorder failing to record when no language information is + present. + harryob: + - admin: administrators without R_DEBUG can now restart the server without starting + the round From d2d38b27acbc7afaedb6d7068d4039eb120abbcc Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Sun, 15 Oct 2023 10:03:28 -0500 Subject: [PATCH 028/199] Gives ERTs a variant of the regular medkit that isn't locked to skills in packs. (#4670) # About the pull request A bunch of ERTs are designed with having their meds in medkits, which was obviously not noticed or cared about when making !4443 so I made a variant of the regular kit that has no lock, only ERT roles(and 2 HG roles on WO) have it so its not a real balance concern. # Explain why it's good for the game Storage nesting is not an issue with normal preset loadouts like ERTs(or at all :D) as they are designed around and only have access to specific loadouts. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: ERTs now have a variant of the standard medkit that has no storage lock. fix: Lots of ERTs now correctly have a medkit spawning in their gear /:cl: --- code/game/objects/items/storage/firstaid.dm | 5 +++++ code/modules/gear_presets/clf.dm | 10 +++++----- code/modules/gear_presets/contractor.dm | 16 ++++++++-------- code/modules/gear_presets/corpses.dm | 2 +- code/modules/gear_presets/dutch.dm | 2 +- code/modules/gear_presets/other.dm | 14 +++++++------- code/modules/gear_presets/pmc.dm | 10 +++++----- code/modules/gear_presets/royal_marines.dm | 12 ++++++------ code/modules/gear_presets/upp.dm | 8 ++++---- code/modules/gear_presets/uscm_event.dm | 4 ++-- code/modules/gear_presets/wo.dm | 4 ++-- 11 files changed, 46 insertions(+), 41 deletions(-) diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 509690a8dc2a..2514e2e5f10c 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -98,6 +98,11 @@ /obj/item/storage/firstaid/regular/empty/fill_preset_inventory() return +/obj/item/storage/firstaid/regular/response + desc = "It's an emergency medical kit containing basic medication and equipment. No training required to use. This one is simpler and requires no training to store." + required_skill_for_nest_opening = SKILL_MEDICAL + required_skill_level_for_nest_opening = SKILL_MEDICAL_DEFAULT + /obj/item/storage/firstaid/robust icon_state = "firstaid" diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm index 39a7b648b999..9afc89ab65c6 100644 --- a/code/modules/gear_presets/clf.dm +++ b/code/modules/gear_presets/clf.dm @@ -181,7 +181,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary/molotov, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/low_grade_full, WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert, WEAR_R_STORE) @@ -377,7 +377,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -462,7 +462,7 @@ //standard backpack stuff new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar(new_human), WEAR_IN_BACK) //specialist backpack stuff new_human.equip_to_slot_or_del(new /obj/item/prop/folded_anti_tank_sadar(new_human), WEAR_IN_BACK) @@ -591,7 +591,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/pistol/m1911(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_R_STORE) @@ -843,7 +843,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/contractor.dm b/code/modules/gear_presets/contractor.dm index 9a4497e071ed..0436772a0590 100644 --- a/code/modules/gear_presets/contractor.dm +++ b/code/modules/gear_presets/contractor.dm @@ -87,7 +87,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -192,7 +192,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE) //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -244,7 +244,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) @@ -339,7 +339,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/m717/hacked/contractor, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -468,7 +468,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -574,7 +574,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_R_STORE) //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE,WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) @@ -627,7 +627,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/metal/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) @@ -724,7 +724,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic/breaching_charge, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/m717/hacked/contractor, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_BACK) diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm index f0ad6f85a8b4..b66f3b236e3b 100644 --- a/code/modules/gear_presets/corpses.dm +++ b/code/modules/gear_presets/corpses.dm @@ -891,7 +891,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/dutch(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/dutch(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot(new_human), WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran(new_human), WEAR_HANDS) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/full(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/firstaid/ert(new_human), WEAR_L_STORE) diff --git a/code/modules/gear_presets/dutch.dm b/code/modules/gear_presets/dutch.dm index a88d282b1e91..c83e8384f57a 100644 --- a/code/modules/gear_presets/dutch.dm +++ b/code/modules/gear_presets/dutch.dm @@ -47,7 +47,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/empgrenade/dutch(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/empgrenade/dutch(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/empgrenade/dutch(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked/dutch(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/holster(new_human), WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/m1911(new_human), WEAR_IN_ACCESSORY) diff --git a/code/modules/gear_presets/other.dm b/code/modules/gear_presets/other.dm index 837af5ac6677..b60e3f0314e2 100644 --- a/code/modules/gear_presets/other.dm +++ b/code/modules/gear_presets/other.dm @@ -112,7 +112,7 @@ new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/stick, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/ied_incendiary, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/ied_incendiary, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/smokebomb, WEAR_IN_BACK) @@ -122,11 +122,11 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/explosive/upp, WEAR_R_STORE) spawn_merc_weapon(new_human) //backpack stuff - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/stick, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/stick, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) //*****************************************************************************************************/ @@ -295,7 +295,7 @@ //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/plastic, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/hefa, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) @@ -332,7 +332,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/autoinjector/full, WEAR_R_STORE) //backpack and stuff in it new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/m15, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/phosphorus, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/minigun(new_human), WEAR_IN_BACK) @@ -391,7 +391,7 @@ new_human.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/large_stack, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/defenses/handheld/sentry/mini, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/attachments(new_human), WEAR_IN_BACK) //gun spawn_merc_elite_weapon(new_human, 9, 100, 0) //only shotguns @@ -475,7 +475,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/smoke, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/packet/phosphorus/upp, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked/elite_merc, WEAR_IN_BACK) //gun spawn_merc_elite_weapon(new_human, 7, 25, 1) //lower shotgun chance, but not zero diff --git a/code/modules/gear_presets/pmc.dm b/code/modules/gear_presets/pmc.dm index 1e8baa9182cf..127731656220 100644 --- a/code/modules/gear_presets/pmc.dm +++ b/code/modules/gear_presets/pmc.dm @@ -441,7 +441,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -619,7 +619,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -1119,7 +1119,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/sniper/elite, WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/sniper/elite, WEAR_IN_JACKET) new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/sniper/elite, WEAR_IN_JACKET) @@ -1593,7 +1593,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -1992,7 +1992,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null), list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/royal_marines.dm b/code/modules/gear_presets/royal_marines.dm index 373c41df49d8..c990f19fdb27 100644 --- a/code/modules/gear_presets/royal_marines.dm +++ b/code/modules/gear_presets/royal_marines.dm @@ -89,7 +89,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/rmc/rmc_f90_ammo, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -143,7 +143,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine/rmc/rmc_f90_ammo/marksman, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -187,7 +187,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/rmc_f90/shotgun, WEAR_J_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/general_belt/rmc, WEAR_WAIST) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BELT) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BELT) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BELT) @@ -229,7 +229,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/l905/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -277,7 +277,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/l905/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) @@ -326,7 +326,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/gun/l905/full, WEAR_WAIST) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/rmc/light, WEAR_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/surgical, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/compact, WEAR_IN_BACK) diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm index 1322cd79c4f3..2d5876fe9af8 100644 --- a/code/modules/gear_presets/upp.dm +++ b/code/modules/gear_presets/upp.dm @@ -331,7 +331,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -2743,7 +2743,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -3139,7 +3139,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), @@ -3568,7 +3568,7 @@ list("FIRSTAID KITS", 0, null, null, null), list("Advanced Firstaid Kit", 12, /obj/item/storage/firstaid/adv, null, VENDOR_ITEM_RECOMMENDED), - list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular, null, VENDOR_ITEM_REGULAR), + list("Firstaid Kit", 5, /obj/item/storage/firstaid/regular/response, null, VENDOR_ITEM_REGULAR), list("Fire Firstaid Kit", 6, /obj/item/storage/firstaid/fire, null, VENDOR_ITEM_REGULAR), list("Toxin Firstaid Kit", 6, /obj/item/storage/firstaid/toxin, null, VENDOR_ITEM_REGULAR), list("Oxygen Firstaid Kit", 6, /obj/item/storage/firstaid/o2, null, VENDOR_ITEM_REGULAR), diff --git a/code/modules/gear_presets/uscm_event.dm b/code/modules/gear_presets/uscm_event.dm index 80520eb05e9a..8bd2468c78dc 100644 --- a/code/modules/gear_presets/uscm_event.dm +++ b/code/modules/gear_presets/uscm_event.dm @@ -221,7 +221,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/shotgun/large/slug(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/weapon/shield/riot(new_human), WEAR_L_HAND) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/flashbangs(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/taser(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) @@ -264,7 +264,7 @@ new_human.equip_to_slot_or_del(new /obj/item/weapon/shield/riot(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/storage/box/nade_box/tear_gas(new_human), WEAR_R_HAND) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/flashbangs(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/taser(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/custom/teargas(new_human), WEAR_IN_BACK) diff --git a/code/modules/gear_presets/wo.dm b/code/modules/gear_presets/wo.dm index c330bbc76502..3b4671a6517f 100644 --- a/code/modules/gear_presets/wo.dm +++ b/code/modules/gear_presets/wo.dm @@ -281,7 +281,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/bayonet(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/medium(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/combat(new_human), WEAR_J_STORE) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) //*****************************************************************************************************/ @@ -766,7 +766,7 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/medic(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/medium(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(new_human), WEAR_FACE) - new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular/response(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST) From 92ac9a6c10cc29e79e9ad0800bdc320765d50340 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 16:12:53 +0100 Subject: [PATCH 029/199] Automatic changelog for PR #4670 [ci skip] --- html/changelogs/AutoChangeLog-pr-4670.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4670.yml diff --git a/html/changelogs/AutoChangeLog-pr-4670.yml b/html/changelogs/AutoChangeLog-pr-4670.yml new file mode 100644 index 000000000000..2acabfacff2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4670.yml @@ -0,0 +1,5 @@ +author: "CapCamIII" +delete-after: True +changes: + - balance: "ERTs now have a variant of the standard medkit that has no storage lock." + - bugfix: "Lots of ERTs now correctly have a medkit spawning in their gear" \ No newline at end of file From d5608cf89287a43d8b9c37455e0d24488e6b6868 Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 17:57:18 +0200 Subject: [PATCH 030/199] Fixes stacks/sheets building turfs not calling ChangeTurf (#4661) # About the pull request This is not only generally bad, it also breaks lighting and area gizmos. Fixes #4417 # Explain why it's good for the game Consistency, Integrity, etc # Testing Photographs and Procedure Testing protocol: building "temple floor" from runed sandstone sheets near a wall light on the almayer. Without the patch the turf goes full black. # Changelog :cl: fix: Fixed issues with turfs, notably lighting, arising when building it from a sheets stack. /:cl: --- code/game/objects/items/stacks/stack.dm | 48 ++++++++++++++----------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index ac778c0569ed..d85e615bc1c8 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -202,13 +202,21 @@ Also change the icon to reflect the amount of sheets, if possible.*/ if(check_one_per_turf(R,usr)) return - var/atom/O = new R.result_type(usr.loc, usr) - usr.visible_message(SPAN_NOTICE("[usr] assembles \a [O]."), - SPAN_NOTICE("You assemble \a [O].")) - O.setDir(usr.dir) + var/atom/new_item + if(ispath(R.result_type, /turf)) + var/turf/current_turf = get_turf(usr) + if(!current_turf) + return + new_item = current_turf.ChangeTurf(R.result_type) + else + new_item = new R.result_type(usr.loc, usr) + + usr.visible_message(SPAN_NOTICE("[usr] assembles \a [new_item]."), + SPAN_NOTICE("You assemble \a [new_item].")) + new_item.setDir(usr.dir) if(R.max_res_amount > 1) - var/obj/item/stack/new_item = O - new_item.amount = R.res_amount * multiplier + var/obj/item/stack/new_stack = new_item + new_stack.amount = R.res_amount * multiplier amount -= R.req_amount * multiplier update_icon() @@ -218,25 +226,25 @@ Also change the icon to reflect the amount of sheets, if possible.*/ usr.drop_inv_item_on_ground(oldsrc) qdel(oldsrc) - if(istype(O,/obj/item/stack)) //floor stacking convenience - var/obj/item/stack/S = O - for(var/obj/item/stack/F in usr.loc) - if(S.stack_id == F.stack_id && S != F) - var/diff = F.max_amount - F.amount - if (S.amount < diff) - F.amount += S.amount - qdel(S) + if(istype(new_item,/obj/item/stack)) //floor stacking convenience + var/obj/item/stack/stack_item = new_item + for(var/obj/item/stack/found_item in usr.loc) + if(stack_item.stack_id == found_item.stack_id && stack_item != found_item) + var/diff = found_item.max_amount - found_item.amount + if (stack_item.amount < diff) + found_item.amount += stack_item.amount + qdel(stack_item) else - S.amount -= diff - F.amount += diff + stack_item.amount -= diff + found_item.amount += diff break - O?.add_fingerprint(usr) + new_item?.add_fingerprint(usr) //BubbleWrap - so newly formed boxes are empty - if(isstorage(O)) - for (var/obj/item/I in O) - qdel(I) + if(isstorage(new_item)) + for (var/obj/item/found_item in new_item) + qdel(found_item) //BubbleWrap END if(src && usr.interactee == src) //do not reopen closed window INVOKE_ASYNC(src, PROC_REF(interact), usr) From 89d9d6987d1729099905f78f3c676bc4dc33c152 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:05:20 +0100 Subject: [PATCH 031/199] Automatic changelog for PR #4661 [ci skip] --- html/changelogs/AutoChangeLog-pr-4661.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4661.yml diff --git a/html/changelogs/AutoChangeLog-pr-4661.yml b/html/changelogs/AutoChangeLog-pr-4661.yml new file mode 100644 index 000000000000..9f0d81051a27 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4661.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed issues with turfs, notably lighting, arising when building it from a sheets stack." \ No newline at end of file From 955ce71aa7a600ac44a7ee7f2b9e41a017927731 Mon Sep 17 00:00:00 2001 From: Twomoon <45800756+Twomoon-Github@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:44:39 +0200 Subject: [PATCH 032/199] adds a new haircut (#4643) # About the pull request Adds a new haircut to the game called "Aviator" # Explain why it's good for the game Adds a new marine short hair haircut ![aviator](https://github.com/cmss13-devs/cmss13/assets/45800756/f84df43a-ee3d-4260-b822-58d5d9531013) # Changelog :cl:Twomoon add: Added new haircut /:cl: --- .../mob/new_player/sprite_accessories/hair.dm | 4 ++++ icons/mob/humans/human_hair.dmi | Bin 55672 -> 49242 bytes 2 files changed, 4 insertions(+) diff --git a/code/modules/mob/new_player/sprite_accessories/hair.dm b/code/modules/mob/new_player/sprite_accessories/hair.dm index 0a112cadb11b..3f624b8d3b15 100644 --- a/code/modules/mob/new_player/sprite_accessories/hair.dm +++ b/code/modules/mob/new_player/sprite_accessories/hair.dm @@ -734,3 +734,7 @@ /datum/sprite_accessory/hair/croft name = "Croft" icon_state = "hair_croft" + +/datum/sprite_accessory/hair/aviator + name = "Aviator" + icon_state = "hair_aviator" diff --git a/icons/mob/humans/human_hair.dmi b/icons/mob/humans/human_hair.dmi index bfe0e072f19d57e4a36f7f030b1fa9be5f58bf0a..ca4a20bcafbdfa02a53cfac18801df9dc668f62b 100644 GIT binary patch literal 49242 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 z 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 VJcpL@r=rKcXl8Y;#Pr6){{!?c|62e6 literal 55672 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

Qjvn8`L7jax|f#(Zi_I?vu{ z(hBztZYr0&I%SU2qon`v?3Ckry zE8E%++Jg)dVrnW06ug{s@5Q`kSft|R^WPq-!zHO#cL!fAcnO@xBi~?=a^J-|rz_Im z>(Vh2&z*fp^*D)hNMIk5;7!zH1)L&N% zvQ;AP-oZ3a25ZfA*o3oU!_%{7TU%fyKXVKsvMQ1No3k@^*#{`biHV6~6u#JmMcr*S zn>}0VMf(RmL5&ekXQ``vYw|RthBMfe=$kS(dQ;9jwhq(~pm~***wV_{@?%5ZSm)3Ib)4-Yw2!F4CI4k$4E@%O9w zU*L-isiA*5SG~@KrP_g>v6_ZE7uxLL_k!Rr2C*tj#7Y;65oasVm}gL#h~^kvdG-U? zg>ZhO{5Wn%@ArM^oza|(rZ4e-18ahX(Vg1BpJvC(9DRkgeroQ(1eKGY$cagJ<}Q>> z2rYZEV&9C~JS^Pj=H})>;p^9QkC+UTcVunlz3$Xxz<9Wv!{w`m1H%7FnHe6HVy84} z7o-YJ92KI~UzN#XJ~ihA{*y9?N?)=3$A-u}Oknld)PFLUg#3S3YW@G0!;@l!AmBCZ z1?%hU-yNp4o6ELTfr+GZEeBZ9URxMU!aMD)&GxK0Bw1n_jj$mswl;iiP|sEe$g@Wo+#DN&l8Ffi}dl zb$xAZ4}n8Z3sl^$*~Gd$9=vyqrXb4g^Ec?tlYB27jb13`Io{b316zl)b8=$8la&eR zs!!{6+ZP*lz6o2$ft}G1#nmbrhc$1|41#b1wXS!Z28{K4fkt;}r?@kV-e_iY-Qv~F zcoSGf?L&KxVCzFJzII0<*6%Xv? z&fCo#KC|OPCKtS}&J-QNvpCS;2z0la<-^)4BKc!GiN($m8izxs)tV0k5bpjeRD*_& zwG_PJcd&0cLn6iM?C|vfh=Rth{I_{UY#F$xsRcy@KCIuZ#P0K1<{Us?!zjL|kRZwMr{AwLL=pbXy7i&C6xsSINq7)3v zzTQTGr3BmGMmICXW>jO(d*e>r3f{`W${Gul_s`0*Ow7#A@>hEt)~(9Cms9^rfKsNB z`z-G(oGYf?JjIY|e%uUO|98J?TrH@R{t`^y+<+pWR3T$5^Ur$Wvhm3VvJ3`I($rlH zbxS(WxLtr4q;Y4*6%wSqx0SeFOSIWZI}dw+z&Bh7;-xqg{A;Omqavy==x$4TmfB%V z-=)NrBe|pi+h!D_b1VAq8LRP4y3}r(E3-kc;FMtTxX{ehsF7VEG}!6hGymanp+cWZ zPN^R~2*Y=9yUckY^K^T0WCG(CiZ#au3%3V#R#j;7UIvRRNMRM6z@6UX4bIh4ebAY@ zP~J^;rj=WT-dviy728hzoU8va|Bc*Jq^dmE!`35`J|;54>*Jye;{t_D;Ka0BKB=)L z?S1^SE&8VsJU9Ytn8>?zQaHqc$t)!`ATy*@Um@S*uz2RCD!gP<81qR4YoVw~nQ+Cn zdHyW~{4XKi)?MXGQ(re|Mu~NN^`s9AU6A(WjeQA}#}(sXnPUTtFhVL8SiGB52t55aG6_UCOr9%cdc8d+smQZ&YK+=X*Ar_m~f zP&QneR5Aij$gixF{4UmIb+Y{oS&p3bVu?GV77F*6zi{!QS4(n_BgBOJHgE=7V82O_ zCJ+3j7We)y=H5IW%K!fx9jWxGkdkCi^--3TM6zaIDpB?|`!0l-v6QkiA!IL-vSc@e zp=94e_N}ayWg0Rwwwd#~KHu;6ocsRgew=fk-}ybxKbg$9=DObR_iKN?p0BT<#@f^^ zAd?DtU*-Cw)~DRlfd`%h@UoU*grT1$C~qR{gyhi*9zE@k`K@#Gi0}M3E-vn-Ja0mH z{43c#iF+e5J|_%!^l`)`AHq!7Bb$@J9N|uWGDZ~V4M}^jMkj1RC_*c0`G==qZi}?< zx;Fm0^V?~Xf^88cPnJ!n?8L>f^k#Y{w%a%j^_UM&gDuNW>)42{iDr0yOQS#1L^MOj z$0+j7x?4359i9FZ*-~4(pPfzvS$*R2v{|!>lAp}PPTEDr=4n0J#ZxRry#HzbZ_3<* zWcmI#;l}@C7u$c!Rc_wt--o0njfJ4n{7-BGUZ|&wXriXb{JJ0N0INuVCi8Ei{N817Vm|F zYuA)#O8TxxK#mlm1y#8$wM&29PVQZd)69LQnJY6*c4xQdsI-DJ%xZ1z?{6&RQg~Nz zAL`e5up6_U0H6MB6B~SBKLZ0j>LZ+>fkQ}3Mu~MR(+zEHuw$G^1r4eh#;3u*M*Z7D zwnZ40pLh#rb9onxoGSDMK(fZk`m@_ZXUX6MmmTOI8@!O9%aT-hs8{zAer(^lv2VAs zsR_}%2BCYOcw^_+8=PjXA#!@A`VGF*f6t2tJDwVgU@X67%fM*^X8{h7=o`kDsnKJ@ zb!TFsM*_YY6!h!{iL@WIW&W_7h8z;}f$Oc@Ltn;-yq+n2=||mV3tlWz5s0~D@g=$e zOKZ2{h)xz-0UAcfaIEMsa@> z9{BpgN?k*J^Y-p3hAtrsLd4O(eozAaqqBpA;>+rSxZKUxoXsT-nH01MDye9|<@I&K3JvjSvRmC+hY+AB{@v*P)|7TuKiz4zcmM#Q}8d zv}02NCl>Ma8a>~D){$wiCK0Bw+|oW@ui1=J;J}HBMnxS z_*_+i1H$H6XeBw;Li>{^&xjgn2nq@*m^*e(c2mnmde$dkPi$b&AO4pt(|C%CsH(B7 zWeYo$X;p?B9-i`_|frcUJaRB*J7EsIgTa&sUwX!H<)*m^)iCl zt@l`W9W6|F#iwEN@AoUQehPdY=rCln{v6xLD({PDZixw0 z!-Z+JyZ~EW5AG!U%Hgl<`{c~qqUas_31Es`2*T6SyG+fF1h<`_qK>&;;B{gnKPv#k*(A> z$0rxY+O^{&d|%6Gp*SM9L)Ke*?*a zrcrlqEjA6^VSXFH(tmZc_4FHG?!zpF6I<%B_M``Tf^sqe`ua8ODFCi;yw*Juhoc6sdvuuFEo7gc%755ZAisao{7vGE5s%14 z%i0LdvMMbCH&Dz($ zT7UoDjHe^&Q@e{=aHBEqX-kx~T@49^s2FYL#+aFiYPw+AwZ8kc5~{PLeKG#(*S?2a zn+0o;!d`c(DC6?3Rj-N|4O7VF(wTPO{P}O^B;Qhgw_`q`q>!^tJ9TE(XXzAO#kHA+V5_6L-Q7R_&kte4tGT%2 zboS*?aB}%)ZGl+sU#Ww$|4tIvf{{o!ozE&HZ5G|%oV?-<-OtO$G?9NfQrTi1H-qBQ z@}{@2`HSxibS$V430N#O)X&Q+t0RqL57MM-zR8wR#kOkGdbV$LGSVw-EYFb zGQC9|)*^>*^2yH@0Qvn$V0I`<<0YDucU$m9(0uct9 zAk^<4IoNCGv7dp~2KNs)ii5NB9TRen8g{>X!v-6V-yfZw*&wM93(lRZQyHnBpr`ut zFN+zP&73`DLwm*n`^x_mV159_k8QPd;QaamaEhIi}71dzyAzqqkT*iF3Xja zG1=5=jheP3v6s>2J*A?t*kWnYhoeWP$uuu*?cU^hXmR~YbBo^0DxhY2=Z8^HpD4ia zl5hKLBRR@EuAG9feq=M6pJKc}o+*oV@>eWmm47d+(d?@S8Q5eYZ9wVVz=(@B_HUnN zJc9Za^AeT`K%$9ff`JuA(Dth5oVsP}&Ab7pB~fpA`;{=+j+ig-kw!Ukr4S*+lNgg8 zq*MutzFqA(v_=on1`RA2rvkTK0jnuP{Cw=;=J<5%t}h4UMf5aImMq;6B02St{^tV@ ztjt>Yz%4!vJl(eys|<$>h83@3ZeQqgX!lo>=A28%;qnAzXjMSzbEPqtDAJz%T&XAI zz4Td|ZKUso;`}ZIxC%eeatD5vaK#@kTHG@5-g8uTb3FPJli>yYkV=UzrZGTCox@^m z{N==tko%MLqQvP7UM%~A)wnj~_7n)*#U3TS#?i_0VR6DaHgHlc1>Kv#9?Qb6g2T}-L`hz*O8{~6~K zKutF6Kfv~r736wX36dh-?{mkf!P z&hBn0*C*hLb-}Ce6_=(clh#iJpF4K<}3og zif~i;n^ZC)0*G+%_|3&#+~( z^`#iesr$MNp7n9po~>Mv{RYf0QW>#Q(B!GHcFM!`JtxhR@N|-bD{kOu*REh%7E@;k z?nLV>$H`0Mp9`$658h1-9vR3yLxdItl1*N@yzf6~3ErWK0(H~Yd+xw>)52b?c*A~N zfuqXvnTmxOIrzPgPG2g6Th^bIW3eqqD!7|&DR!K-tAq+WE1+Oeo!%k?a${p-Kw8<< zCzT9fndML%P-iybDWmn7#*9ZIY$aQOoJ4R5A^9Q_J+yn2TG-v8Gv1`g7q8#Z-1lQA zV!&L6p{)vOt~3?@1RAj3A-(#{=cfQXsM}d_4~u{$LVJv{6XMi(n;oq`#lC{gVHFM9 z9=BEd>2@V>qUJ(!=hK*b22j~q!A-Y-@<3KIz-#Lc(R5^JC=|f!9H)bkExN@ytI;oD z+t%IvRO8FIdxP0}wdYg{PCS|%lMWA*Fvaf| zA7w)5r#iiU1Caq=Mg~CPUavD&ryKwcE$z(E-P@}a>*t78_p>oJtsL556)yUznm99l zf~$M)OWhkW=N)Ef_5`Z+?6qE{UU@ZE6{GAxF5}nBBdcyULf4f~L`{;WHWEuD)#zNv z9c6>B7_Su_N!?!J$!;8_M7o{4e7wZU8 z50dK_c4`gG%pB|KJ8!P-&ABp{mubT!r~Mcn)6>r8b=k_OAw50)$CNl0g2DIJ)>fhM z>8j5X4FRo8iRLKICfB_+ogeL4T#8j|FHM??qputHH8v_h^lUP?{cQeHW6b2hz-c7w zP6`@tyc+Q9IdmfHRe5ka!-jr@HMDf!<4$_Y&MEKu<0oaraQtURw_fzJO5|vBk*=x;T9A5odFG^H$6Td(Eq}3`bsCna*Hul z_ecBK;azk8R{;1o_51O3lG?xE3xo+;EH+{HJ}irQc#TziYxh(y)OQ=(ol4*;<7iD}U*gTL(vArg4? zjXSgn-%d3QZg^nDqlB?vIJ42t+6`E*%&|Ah(R&acTJnyrdtd<5N46R%tcK6lmoLwf zGtZ6F^YiOHz3mwoKo0)f>u8M;CL(;8=SbWFu7PcmK3o)vH$xPsYwK47ngmu4;pHp*mxn^Fi7qs*I@OMrstmdb{;HT%N5ZXI9VBR=$)M zj()$-Kd8O$kDvUlB*-F#xYpO}?Rz^!f7Qh$4wFf{lB85Fsvw$=YF~SqHfT6)!=%I7 zY{aCp4YXnF@)2FfxpY_uF=C^h*0tL>!pJGoJkz1yE3YqIXJhPn3Uo-Va)j$Axw(r> ziQ4AgzIodp4%P;2llF0r!5$yCP(lf#bBm_nxmv0wXDZ(_T@cXmo0j(e^*miJ;KQ23 znEJh}=Xto!<=)GON<*vKS1qq z?rw05%gqY#UQgMmzvzgaa~+&IPr+S|w36OGF5=^Kll*FEn(oV%G#ANEeVpBEaa`gP zrUiGY-^zYN?R&-O`i(WS%T=m{s`FAfy8%j$vr$Vex7K-simJ04$zPUs84q{*((&uc z&YfR67RclEY3(kdcyg@a#J6qpm;UwI#z7H7Wt~lOf%i*;qTjIqS3v2?UuC70w1byX zD4eqf8y|mV)Deq)ZMu#VqKPu4;)5SLiajF$Kw~a;1puUyQsdToq7VR%+omoC3$D*=MXsp(j zqeEG~Gt!miOBz2WcJ=DpYx~(1s+KRF*;Yec357R<7mVWf9RN=L;9N%y#*cg8RY`?T zF#JH>R-!}xtHAir`=~3de8_LV-VR27{MWsS(+fsADctn={i1Q~TBp?D>U=^%oV(0n z%)GI%{hY{|gM5)E^c_3|HiVLafHRI6QeLW{$4*3rL$YcAHkp8B*uTH7#WcM8<3gp! ztSaFW(#Dh}<@IK5bEY{8dGso-<+=~zv%K(S$m#pL)NJ+Ibd_rwWr`{Sxd$~hTa3$% zTO2uZG?3cW)t_;|9-7}%+cqI5dF`4YqQHQl21r1$PMEl~rEhT6GWepwfG=(|(4%GE zOZx3I?A4HKpuk)F{AB^#K7;cF9$E#iUS_WJa^wPc&=oA5QLDRm`+5UO?wL0Ry*!E! zsI6|bESh~OOC4Ls?@BFI{m^BF?C%yc92eqHk;(j@cX#?H2TsERI0<|LL2I^GRTcDD z=`~7!;(FQvZW&ZU2Zi!*9=dGeGIUtor%RPUQRhOzQ&|~$%aIqkbQPe!MkK1?|0>FY zONz5+Y?5mySCy4P6ASWZS204OPM(bg5$hXE00fmfP_r(|55`RyuAa}0TKPELa-3x_ zv?PY$7UDDNoPJ<(MpR>o-2r=LsA|f*lD|O_hl_ePp1a&Ro?&=Lh&+H4fYjJltFa)h#v&7O%r3QF-2xG^GS#sVT z+rLkv`#E_z6Np4&O(<>T1#pPGF;67g+Oy`e@w&z0ACUjFHAkHgV!V%|TR?9jhvAmQ zj`9M>$8q1~-zPsDofeUE*+K4$n>!Jxct;k+kd~f0WcgakiLP?cUis$(Q~bKcC@-tk zIK}PzPq!dws-K!27L42)1!`lFcRYP<>N$4R!^vD}_pU(ZWj z7USplYBe7}F!aoO2f4RQ=d6I$nvTHY(iI~_1R4T2orcURX6x&_j^-YCX!r`2KqhTO7w+mR2_WkCR?s`Uu;+SQI49)wS>=L3U`wwiH@bH0kHY!cy^&M3Y1->dnn z)@r+H{sQxK>4a@&WlBm)$Ctcwkya+*4o0O`D!CM3e9PaN_(E`);{^@Auux6-+=45@ z4KE!ZK}IN$FtEu*fAG};RxA4vwlvGu?6L2b?FmYk2S0ppE)J&fggDKHtLxE!k@#?> z1%<`N=uHMadkTIm!Zi5>PxJ&c^49kmxt_X0@YVK7d~Aa;-HHZNZo5TxS#a;tsvmryx)I z8<7Il*-aLwyzgi zN4Jy;h!TN^t1Xgq+&r9EG(^0$boIsjmTzz6DmrP|PjYiLWM!q=V>Xma+NV(PmhttO z&aYpeL$0z7Ou)iT_q$5_{^7Qp9JpLuJ17^UIeV~f^5=@4Ll)7k8QDhdV0>0^B12W5 zZ4ES-wDNFq6@Kn%`q)}lGeUf8v^bj}yWen9R#tEu-`4Hg%M{SnB=L>u(RvLpY{Fs^ z&&HCo@Q2;{D`6JT(QhWr|Kg30!NhFK{i*@2H&&13uSAbxNcj2lfoIJ(*`R^m{j=kHQ?sb<$GYM17ahuv7fR67O9M18`$@^Im-2O9DPkj2>E3FWG z>6dCCtbnL0Dj7XHpt-t}$`F#!vKOBvQN|8-+ar@HQm$tE!wMbni3$g=fAVF)`x2%s z;Sa8aT}9++(fZuV5yRwK9yn#+cXb-wUWxKMVR?$};o2qIXDb#Jr->XX_=y<-LQtnC zWfbDY!HW|zrbh;!ZERYsN95u18ye(E_0*-wxuU`Cdr{Af$!Kx^)Ba6C40}F{EaniySUAI^Bxp?Omy2Q_-1do8J2h1rFk0Z}n^{bcu8o z{M$H*3V&&F@xbwG;NvB4+-yUYLH;wz``}Hrf4srDuU0%>X}+EAvEZf!+n(9{F`gT{ z2fh;3_HJ&PYRGg>0eORKfP&^teRvR>a8Rf#e}a)8|8*|o|I!l`D!*mStsg0ot zM+O(pj&mu$K5C&{e56gRs%?VQ;4~=6!eWGTGy6NnEUoF!p9&dh>@$yg2E31Az~i3u z?%lht1+u=(=3D|XQOMwRPL7g(k#XX?scD!K{0SGIO`st~!q^4w{^hEG!i{?G96LgW);V{>8hJFhf%@-qDeGcz(0IVIh~ z!`lE+@T=6qX0`f6=&R?NxgD3(b6A#J0Mn7^TSSovyO}1@4)<;2)$OYn zrKC1L0b=nyFXs27LbF=^D|j?<059ru5=o83G?bU$(JwX^LE4s`g57RA>?Mqr3slMS zRC*F?PJO6nc06A#}3bj4-Y;@G9#(yI}yz4l?S%eIxxIX%|a{Gq2nVz~2 z%;BOnNCvf3j8b#98khM3V=C9?ekj6Huf1)uk2cV9h-f?>jX z4$PZ-0Rg+#X+hOp*7LJiK9U2N_3&}}J8;mSYLt%_IIl+d0G~eeD_qRyq?&?d7V{- zn1hw$i0Zl$397y_QZ%l{YYH|A9=<4_^2IW_0Zj!5?{XM)&x-qa-S=952b(hlCSkER ztC-8aB8)b&D-z}9ZcIGIzqYkh%wX`|G_E^M5*=0Vw{BPCIp0yY#~wroR04mRgzFmH zcxrljp`aYdKe?W;4?3qsA2OTA0vEPWfqqduC`sh70xfBz>dv`H!RFSHkrx;^#$pl@ zeK0Pd(C--qcYYq&{*n#M{c^<)x3M2{ zNZ)}L^^p8eO=YrT_%MaRRBg0{I;%=)Zvqi$_XRJxT=FT9l2EGm8*q3svWth9PRzAA zvc_2*5mv^doC7TbE|}WRQIbq04rk!mAHK5iO(GQIPQO}};gdPwbUh>{)8}KT@T?v%x9R2D|`P zCQoeo_7Pg9K-1R+Htnw|yd7)?dc(6sLxMDoCdd+qE7e*Bz!4|L^={N)XQ^~nd-9b% z2O}S66B{t5&Wj4w2>bd>O$GpwfHgu9_Vs<^_$$d~t4m8wW`iolim#qs6Lzj?-?CdT zoE@H(mXw}*r=M=q`x>fVlvq)*hF4jpY;pv8P3mf4e!fxqc%OS^qb{WbUAu*^ zI#ne~>JK^|3Kj;Uo)?X5r`jL4C4;+E$x(x7yoAhTr6FQMnV?*ujcBxcaXrbn+b;k* z+kXX4A6^Yym)YzwK@O~nEJQ2BH}$#= zXKxp|hRAmc@w;8O$tyCiA2X?gOv*?{l4z$he@A;jG4m;EDDgYl^bJcWd11Da(C6Y&FY6<{7NWJYIAwd1Kxnz7XCwtdJMj}ym{d4?V2OFBDl3jCQquR zMnZ@ki9(lGUeT58yq*ks2So}O2OglC3eQ$|J@Xiym9?#Kz}2m5u8nKM=J|*p3_H@y zP|I3hUGf#pXFyzw>qC;JXSrql#edfmMIOw{V`b^_n-@N;u|eC@o6!T)a8O-}11Yg- zn28dhf|(}&`9y=q0QV|iAa8gw1lu7ogwyE>_G2T-yM-sER~8HBM0myR`jkpsdXDJG&*6naqyG= zw`~n=AcXA);J^xb8`$TQHp@5Zgn3(D@D&lq^P3<^#ytH?mg%HctLt$-;~>mMQ8uUL zDl6;i!Bx8U1nJf4rX@my&x&zwTlf+!K3KB#*IQfJHl@5wsb<6EWnKN zV^z_?0Nr&5$j6Tjg2G5korurc{b@DXs@r8!i?S9#P1NVg{Ok<{>IL7!c=cr&CX;h@ zG2s(keZGVvD3qbh>X*Gqd_`&($M)~)o|7xgeF5p|qPeOtOFHn{8;i1$hyoSNaS%R? zLOK28;G^CmfddNlGV~wc|G(f(eY=cCE2LshtaKhmTwyTKHqaNg1}r$|91N%Y z-*EEqx(Zz3#+bAaX&S7@onE>kp~&nJs!O!a^lDiwc4)yZC~3&&Mc9a2U4>&2t2}eX zddC(eEsrwhCw|$-GTMMcI^)UJ8gR+(_1y+1j#L(d=5rH}kJb54-Hx)aK}sXvW0Kq>$R>1h!+f z-%lAnRs7yKH#c_(Se$S!6V*BsWN>qArXD-KK?b~Jrl&uTjb%E|7WEPA)nlttcEnu; zE=6R~re?>@8B89Gke!F$w*!g9>J|LTW=Usb_p6+ortO`mE|HLm5mGt96%ODX_btz; zEN>>G-k^fk-fLlni}Ir==BE2o4`L|ea#W8|5)qrXklXBvaW22)d?hqMLr6}1{q1qJ z%lKOSp=$zkr5k<4+;A|Wap!PRuG2xU7KF=#-* zw^($r++b?pebs0tOP0a6C9}=pA9QaAw+H(AP60S3|JU&mgysfZBHfjUeBb%Oz{PdV zAq7ddnB@H`|tDuurAS8}G~XKUB< zuS{2ZB6r`3wzh`o z^dXc5>^lP2Oev%lhR$9&ojm>lm@hN9gUr3?1I7}BHpml-k{ ziIRnLH^jd#9shj~_+k>d%1jv~s?xM`Qc0|Zh-(Urw_>uglZ6&iy^4&k(~Lyqc1oIx zhTfZ*_zizxnXLc5qb9$l^GuI;Z)9hK>}9|0BE;S)tG8@04UdoQW`8k1&a8^K$Ec9(M0y z8`F|J=OM=O-?E3BxIK^j6TkVgoT(NesP0$o>hc$h^S_IDal=_N3q;f zg88S(^$giVvcVi=USaWN)$Q|ljk4_5lX^Xq7pwG;5BhB?J#l%03bxZ)@_s8>pR)Wc z$A22F&ENFUulrTvoS)yKl;qq%{EiZQW=MCbU3!(wAw`Mx5F(a8Ty~c=5$P4xVo~qdYGR5&fzgg~CO1tzg75G=Y?mj z6eCeuA@a(02eJ(>?+VsGOXmswemy2s0b*BU^lsGMp^w%iFZR%4#}hA&T28P;WdGou z=uMS6vuL6GnSI?|+)A1#G;YZrdVT+rd^v@mUx!tXJ4D<|y{92O{L;cpNatfRgUVxz zQxF$$@!Pl*Swd!SXHVUwze_}YKe$)U*l^1;i+ft{;z(OKhRnGwZJ~phmWIKf-TF&& zd478ek84}+=3NQY%I&vytk>p|0Xfa& zwCj%do==HRPSS>efq*fj4I0vlN~r@jqZ?Vxo{(k0=9;;RN(M7Kd@jB`iQchMvM67? z{#tC}yMnQt4(o0R0i&6#o9F8!rk9oZ? zL#aqL(?>~$dF>)(#lAYZI7@y~nH%oWy5i<%9<;KP9`Rfzu;_@FIZ?-bOOef+S$(LC zi~g<0Q@_%+bd$^Q=txQ2YB#SF5n_o6^@3CH`#MVu{d$U0`u$BRIA$UZ#yFD}CsNOM zZeSOT2PG7h8mX$$wzTvMPP}lGLDFuA=kjeYgu-oEK@5eVt{V;v3b5CYfCh z)Vwe>3Gt6to#Da))MhIdr6aSi9#%RJ<9r7KdVR&hDt;PE3Ew?H={Q|b?N}y9wc~CW z{Ex44@i4PpCAB;{YvRNea(!L%aBM~x#gKx1EN&7irXp zEKzZ+MnNv@!kN6Vdn38tM!c-5k3gz zi(GyqfW*$H;lundZxQeLi7Li3G$^z9bhCSfEmC+R+kQPC$#2GTcCH*JrYI%F&}2UQ zdfj(qJ5_lh(BaA+uOsr6sFJb|s8iYcDDHEKnlyc7YEQ}z`W`z~K5~gRog`0XVA(VQ zatzA+JPp_Wv*m>u-dbSoYNptxyiLt+<)?k;;x?Prg!v^(2#Sqtd~P?Q_+NVheh6)TuP?8#R$u2LUwSDam z{XwGqXxjs3VnRZG(o^?{jUZiR{%s>`Y2=ZVG_AKebyx$2(Z6dbrQthwm8ohhe(z*9 zha|ZoZ}5WS^|%1Y+aRWDC+G^7kqOn;cyG&Hy)uEszP4t1t1=(@^^=lk|?v3L%aX3GxHUbX#Ei$2bU^|p&)0kuy1x!tS3et7O2|HfN)Xh z8T@5C{42nhfUal`Td04596(Wv56`2%8@z`&uvlA$>%gH|W)=Xw%$W|6p=akYu*$YW zsQ4AB#iK8*>tn*ZCJ)7jp>>lv{1p(r_4d_&OK|l6T#cnB8VP`+?S?|YEacf8-QAM` z1-!3_70LHPnlTNsOm<=fzwUiS)&OiH0s=TZ9J=f}zkPc-R+Vh)QULWOA9-d*#&-*V zR1sIRjBdZifHD;03Ha0Z5K@*-sh3n&_P(%15_ww8s*@Ad%}mG)4Xg z3xMS8fp|8NAP&LKVewhx)g2Qf)>n|;OYDU(IUgM35d`f5^~k!P0FBT)_~_p_mxY^z z)t@?!PyUVBsdznqU)Pa$B&Cezy0ntGGLGwn!s;M4By~G*2xPD6;&TX#WMD=g5eko{ zc#KgjmsHtXTLrqZ14dcFE=({k#uJ!ZH%5T;HF2}y{&z)Nf3}#H@87@g_yc_4Nm57n zI2~hxSmGeiLaMR#?m)zPmYqyT4i;84Fc_AE;d|yD=F?xJr(u@Xc&IN7G}XKQl4bie zaOIB-Bc!B0QV#Q$v$Bv6omt4PiCP&+NtTlaRiz z|21ik>@p(^H@r1k;dn=n{;th?$xk?&XqyYLiBm}-yYkF)%ilt1gWvX2PJ&kzuj>oHRh&JOjMv-N33_S=Y`2c!kU}9aC@;hGJLf zVn(VV;wtPoTjZN<1Sp#29zxaBRK96XbaWd`NW*3TBw_dcXd6U8A=$jnF^4ZQEX~%%+_-sDFOc-^|Eeb) z!}0wOwGF+dAQyty$!e0?NJn&~)()2)I51t#pq5 zlaU$tn3D2>zd6hw`MknH{K$R`PP1&HcOVqiI*?s)Z`iFugq4Z=8tYp`?=nsG(A+~0 zdp^W{{MqfJsXP?`y*yOWZNXM*qUvuPOsr0Gn*e#09|})Tk#v!XC?|R?Ayk69^ z{Kx%+SaRabv|b?1fQ7}n%R;a@qcy@c>RGMR?zmk^Ju}RV>mMDJa&Ln+s_5R|dc^VZ z@x^A7(oaEQBq-a=L-lX{y&SK!kMI}vJN=u20)8rvhPh>S^EfW9= zad=tG*NcTXe(29kl<0nBXiD8H)yg-L;{)3A+)?5G$b;8M(0j-$z3FW+Ik^jPni4L=2f`&1~`JfpuM8@PB_Jhz-ns-m2wQ3>l|D6eEF@oaW|~Jlo9Hq+vNH z7yem8bH{1PJD$6NZD5P3f*t-)73Fq z5_>h~>@rP-{){9OSL37Vs8@(C#9bn!O}{!XFBDxnLq zd`OK7dM(vpoVyS(y2KV5S8ASJg~2tCL0=dg#9{-Mt#JW_za(GLYuy+t5h!}h7nv>J zafkT5zfA<3-xVhUQg3sfc(OcY50ko2t;(K~D^?V6$4j*AC3QU1*M3wg1zk46_uZpO zDR;)UkU7UQHuNLONCg4_orwjz{9es%V0&?U&iJ`UWzdkKc9rZ=BXzf+$~6}@^54sI z-9sem-lDWGD~!XdH@|ZrW77brTKH?houyvDvc`qQ%Bxhec^m(itk!Bh`w-+apKG2? zoc(QpUrVHbvPuSqc`f|bVDXfX45V-k6~R!#iMMTzJf65m*?Fga#r8;Fz>cFxJNlSQ zZ0Ba*i!tqcH`sikz!xuk2rI5FyKxso-SN|4Yd@Jc-wYi6GYF6hx@C!gO0kr8Zk|4= zLe#JpBv#H0b)4Q@_q2~XqE$dCf$uN=+Pt(x_pM~1x-%9ghy{K7P;B zm!u?G-kNuHj8lg-rRMHYAL%DeFqF$tg(U+2Ntw$cPSrn7;t0PD24e~}?q**WD|?y4 zN&o=S%#DXb$D$)m*D65*h;#wI^Vi;Q3$xNlo>s)9>aK{dmIqb-MCfXyzm(emStopeQqlx(R-%=1{SPC^EAKF)05=KLe=d>^=4& zS@mfqGI@;t;vs7MK*qo^G((`jD zq&;2J{SzIKsF`bT?6JG(NEj`CVZ)di2q?=1fdQag`y2 zh&@pM_zPIqh2)(V?%}S~GF}yU)H}E(-yLmc-kRlQQB+M`ucA2@(#q^#w``H?x#H`Y z{+hx?!31oha=RE90B;TyeUoOX_H$ zMT0pskgjN+5(B&7KMNG^$djqJ}52J@_9%~YQBJ)B_?Pa zV?4wqb!P%D;xppI@pn*D9J(N~;we^L{mgx*1b^_GIxsQ3d6hKXM~h zH-xJ1P);r$7g_L~9Eu4+b`J(nVIxG8kxf*K<(4n$>S9sFXfmO zEH*`xU%U`9w?*#0;BKE%kV%;!zZNFbE*`F5MXy3;XLjWZmUf|eSAKoHA<>67K2%tg zYMZWRlg@)xzTn=$&-pRtbMl`SpQ4|5uW-*2>gk%8&4v|$WXwi^1>@?6r3*$7TVR&0 zd21&v43ggsbpP;S+=>p8o|cR<+wb>w$CZg=61%}+f-epS>^fQV7%Uh&8x)%i;T7X3_B_(fT5fei6>+cMiu zwhe(C2VqW50nwO7;rW2HKPqS%ZD&!Q*M8%3vq^3xZE;>^c8dAarhJyvCL0Ln`t7~K zwl{?og7p>Y#m)3%`t@b#?1~bTYe>|FyOH&|@%H5o1p1=7-g}$>u7av=6b~c4G7hf) zb87zo2ekr#Ln4U^Ej8c}l97?&vdK^zI{5U{lkgq0BYU;C%y}Rb_TXwQ4sRnIk7~Y^ zRVscvSXdX*+}oq>hd^?bYOC)HZ4 zhYAn>nmTo3!|KGreMK8VrpnYId`H&cnOVmcQFrH{v^6nfspr<+o!32RG;RJh0g@iI z@b4vxo6DlN!X@e>4ylLsxJx+7{XFMpC|MX2SJr+P=@U<7mmhW^_Q6f_!w4QA{`s2J z5ObbCkzd()_r$@c5f={&Ksm!0M**(;eBonR@g6Qb_t5{Dj|qlr4Pv< z;%B4UwA%mTSkDN@-LY{?5y1Pm`!1i0lyi*URE_!Rz7;FVZxy{6ivFk}^j>{laajKB znog8OtnZihTt#Q@*W8Ph9Kn?w-#B7u#^S~J1}GA)5-m19WrcrTcKrfv5bNLZ&Lt{g zm;Y!gD;F`ewP={T+#r2^_~){97vXOKh`o1btpZ20fmv<>W%8REqMkm*02$iU&PMiQ z&$Y!{{8aqE7jRC@_o@m7W+dO*MbJY9csYsjB4s&cEion9G5aDQ@ry z>`~U_Y0wW(8Efo*$wGY-;Mj6Jj=U_CLpgqHhnzlKmNYbQyV#&H4A2Pro^53-*4DL~ zl)HcleRA)Gf1Ch-L7`k9OrUsh@!nXXi(Z+Vs0xlIWYxP#S;_u#W90u1zq5m ze^1=Nc1}yaeuY+G`|xRI```^Liq4vu@|m>&#d8+kx>2|zi-IrWxaM+RVUE{D_7A$x zp_X_Z%p48IuMmPtOOY89BP(%jkJCb0&OJdYafZS?h+Ub93g3JEwiLtvQQTWVMcsez zqJ#K?N+S(|jtEGDgh&d5f(j^-Qj$`Ff^=G>NJvNv(kV#Spma$}hqScB(9E1Y@B4et zS@*7c?^@@q^S@^;V;CmC-_Q56_kQ-XpQrITyf5miw=D^IzMJ929%yxW{Texx*`YrQ#8*E59`viD!X;rTner{Tf3n0 zIKOYd%Tz#t)e-hI9rCU5`ff+NQjud9xmA@OT^i=H{pXHK@fqQFb7}P8Roudy6eL&n zt+qb)=UZkGH;PsDGfmkE{koff3vIEPB9x4WZSi|hxFYt__q@tlwjC7y$Ga`5tPSy^ zLF91zvDKpp>5KS#qcg6I5aRdJ$5yHTn<*y$OS$!d8dw+eN8Raz%N1xY}U_O}yWTVII6mUby8=k47(log9ozUC0*G9j$IBfUapp0BJf;@iMrR(*5))~%B ztNH049@HyF0^SZxE6JGd!=Z5h{Wh!o6717i7c(=IySw{9Fr}X7yO0oN(DVitG6FU@ zJk^AdDtvO%kdcuQ2HV7G)a}ZB&9sBt|u59uT& zZD@lZ2l-^Gs;bg*b334c$`XH@!S4h7^1F+t-a$37k4x39V_@!+DwOW;o_=f;-PKS& z*VfW?Wvy}8){4_7d{7_9AMfAobU%0V+hMmIu6*ofZXT{=7OiE=EGw`w71ea8X6OIt z2nR(B$XqJHgiZRHo^jkn1q^QjR#HIcgU7+aUx^0}pq)7*d?Dnc6VxL zF?u9)9^2@~_Xye#@JYR$r@z0QQr`7_;pB9(>P%g!S@!!(!yjdrLjV!K+&Tt;N)D9< z$RgXs60Ds43nBYRhaLvUixNfmxjN$)c)Slz-bPwYN^sV`-u)V&RHP#XZ6ZeZ`?Q77 zY5$~wxWF5AM*wg^SUF>aVS|Ti)mt%QT`?%aPsI}us|nY){(Li7Sl@!xDKI?l=~%c^ zj9uLQOLAgQFhDBL=lOe_82y-FUsyTDKGS9mhZOh!G`1bKdk7+?9)QBZ=yf+Zq%*x# zTo`l$=~5afsT=A`@Txpp;h~<5bOgjtg+K&R8hiV}i~45#yX@@lYWbO#f|i+h+@=T9 zGQrZy%8?`0!ShN`I(i-)$`*s(E6B}VdD3L^{Q8+!K5VDIp#|uIxtsiLTwV8F6z5uy zTeEOnrhanO(^;GC+r6nkqdot~{!Tg_$#j#rK~U;99m}I8e;&pueu`wFwXIU(5wq8K zO;7xdb#xc)6fWX9_$yP=y~9o^LgYiu&xX)K9FI?)lw%clnjbG3pKv<%a?5X5VMX_F zCD(P=aL%ov55rgi#@7GMLX$ad#4kf0)Os^SK1+l90t+K!b{^y>JllnC$KuT_U;fGz z;s60U2_5dJ0scmQdNSIJ0Egiu-p>ZB^UJT^MR~KdY&OBi$E|X9#p73imfdl%R_CLH z`AabF_z&wQZ#J{3Ep@+@J2Wo_eRTBn^JO>Mz9+{e*ZC^2Hc4|(L_WEG`jY(-?wgiA zPInz=r5L6*PhyZg73G1b1x9g|c>!mJ`isi9zV>48o27`|&Kj5%^pU@M z{P_evgU+h!0VQb$R=tnd#GF}&&`Q{?t(O>CBg5_g+kYu|Cdedl z+hO+;L$~tZXhLdur6X$#d6G6qLfP(0K6V^!KJLllv&_v@VxyZ4nGYr-%h(Bk;aF^ z&kO_{9;3OC-D56Y=f8xY-L@ANyAvg2bdMX&N?9CeWcxA6ulEb0b#QhK<+-_c!2s>k z=$Y;tb$n8`wrebX3sYS;KT`tLCRuTg?@8ZD^T(;(3qyf8BgHxTA8Bd~rrt(8-V*+@ z=fl+^WwG*jB2H#dQBz1EZ8eK*Kgp;0ec71Gr+>Vu+yq~fAaI(fbqW+~Nxv#T(!YuP z+u?`Ep_hu-f~M>DFB2D9)3O0KU*)83#CFqoc7#RDev%gu|7}(yGdtGV>jjO@!4yZe z-NWmE>7dx(o8}+jf^TIAH0;~W4tdpPm7bWh$ga%e=p7ufigrIFSEd~QK9qD+fK+A0 z*~yM=#MnS{X~t~Tj2zOXNrx}!YD4n6a)QM@+;^{`;oZdRdmUZPdz`2_Z)oMS*ls@e zIVjab$xPD_F%`K;Zfcsu%x3aGna9`%hZ;pr`6PWiETmzBE}|mJY!T_8GeF4;yA|Cw zF0P5eQE+zur5@>UbGbdt2V@7)wiKQIrr&GDJX2RG^pwABQNe~&i67d37tg>~aog?^ zuWfQFtYI>(<3bwos`*TMZ*1Rb1iU@bdA@wv!>Hj`dl8?<{6xCLU!x;G7MkcQV>3fR zVDwN;q)su1c}4)A6+29M?X}r^Z^!Ew;9zU*wpnd!Ya2WC&ITcX`L*?|$ij--4|bl+ zyHJIfNACJiE#`cUEc6}QpmqP0Q{dTxlr687g~83WHT((haFb%_rZqP7cs0HoB28Yo zmIS*9d|7jt8>Ecok;99UHyPm$hwLSY*9mmffCE@+eaS}a6VmZ*{UK)MXD}sm$GYqK z7oHGgW3xNvr}k?+_0l;w`QjNfA%%1FkbdZ{oGY0|^*0%OjH>9XH zBaX&{ky|xg{kMfIh8*)Tg#%>kV%QI|9+;7CZ!v6_z4zsaehe;t>UiM*{NTQBc7VO8 zxirMEN9d_1Ks})fhkUv{PSnN>t|1cuCCi0i^cqf;tE-Or{%zqO^mTvUR)Aswpiz%> z$?F`SGgmkdhk6ZJ6239!N>>N4|MJea#urmLeiIc6-6DQBD}~+(p`R935j!ddxU36J zKHUo_fo?1$8S9jJ(VDs8DNdMfEFK$$`IVq?ry&ER@DNFg(|OnYgg%+0cTv2jXlr!p zwxreE+`A?NEkKZNJUCw5-rEpmw!P5h0FqcEFuWEiJ9c!l=F9W6!^zk5r7cNS?L|iS z=H?cbFI&`NHsbYcHP&%q%dAxP)J?bfhkPV%+gpond5L5BJi@aFt8X307HwCQ-yu=M}bM88QV3C6$F2hnpipHqIlkp zIoy*b<*}JM94vojR-|ohTTeO98TK}4b|g-?r2!=DNyH+%YK|M$l-XTNu=+j)h zI}9t^@)_YdyZIbk{!Rohr(4CeB!vV5!PN3kbu-ZOcWv`ut*P?=87BWmgqWxlAFO&q zpDI66VRAt>c)uRc6oC%3dD)uc1DYpAYal))sTyBU$_u3W`OAXMW{HG7UqE#t=k+g8 zO&a|s&@rsL7%^YN$vmmd6!MbSQHQH+W1nO`#o&#TlT#a*trr7{bLdAeC!=&vCF> zHEBt~nK8dV@Zq_Wy+o_}E1GV@u;O9VpTGI$oQkMB0L)3CDponY=*d3sYZWl1grr4Xz$MN!3)RSX~N*bt1ZZz&# ztAJcg2+OCocPW3LGQ3=5@TNqw-uy>V$E~KP`(xd^>9n$Z(ORD2J5N{bm+eHTpNr8$Syt4C5R zh8K}d!@&+rZMAIdy6YKUIY~qX_)${PisA|~?EDHNmD|^Z;5eX0WbIY{HPeE0sQ0o; zVvb`(r?7?zcrD#6YVFFMfI0TyZm6LyZatQY8RqodeG~a)D=XmmJ0u#wc8&FlsU&jE z(3TS|IQ4Vopoja^+6~p+H>)7+l)^bD&>`XZO*J6(w_cKI6*k@^&n=bf#@fQ;cOwOi zvXx#j+u6sfJjw1MQ+i8`Ju@o|_wBLcu5~dD^4kkX3_1Y7q@7^@gMs{^9SS+`H~kGD z$Qs~;kiIo`z0Xs}cjLRDlx3z>qZ1TKa%OhA*WI#3fV_E_&|33!67^t5!nE`5qs{&d zn@0Lr9vKb}j>&-lCm#I&tE;QWX}2iu0U;My2v8~P>CE2SV?`g&5-g@OPKjX^QH_Ca zJ$pq%&1$P2QS(I~_sKB6o+m3t6yrn-AeKJ=WbAxj>xLdFpjOPL*pg$%d6;PY=z&?( z$~ameuLe0N#~N8DZ!N~HsE7voWv^Y^ydQTPWXEEhH^Va$8e}B}jGoige9sg*ZJn~= zHUA4c>Hgf)h@en(!h5lLzanuXo>3NxAXpkxAuE!qpGCHXn^72<^01gUw3ZcPx$rPI=4S5R zrImeTRHjO8+6D2pz!UY{aZkhCo?c$xcS6M1xGU5rRAtIfXn0+QL;5HaI=$9xj64oG zWe?i+02_u-P9eS1lZl@_Wa|w`ET2y-_Y_GZJLt3agU%)FHi-|T5rbEbJPW!FqY`)u(Kz_xm9b?Gj) zhUVeO&wd%$bdiG!1(9Vn`p+i(h4R04l<9vSXZm-x3WlKIgWi4MV zH&2vUeSneq8Qd{;4~-Me-v^G}lmTQxxI>^cbqBS+M&hS<-K{Jwe>3Lq10e&ae=ys< zQMFP~21F^G29L}Nx^&3r+TT+F{r~LKf$fW;HiNC3vn@Zx>hUxN7_u$&G^}(;2hopv zeE0$J(HExg?vU%Y2+*9fJH{32@M61}o}ZUEcA+|W6QIP>!t?s#zI&0*u`JCj+K4+! z%-`5m73Iy3EQHIokf#Y75g^5Zq!?uhYML=%D*DWIXoQ-3vbznQ;UG-_ok6tey8|Cl zhkbktCpbVK-dcDKj2B;yV(p<5n;`8mc(OdjV2bU10x`kc1#IPUzf`|USgzrc4?3UB zfJ0IHVoJ)TQgeIE-k$aa!cxcI8ylh8&?H78VT2G*s*6oZ!h$wn4{luol$4gJs31B; zE-hKX{aW$3%w+Eyb-=BLE+b^Bcy^;bcEP@8F-(60KL#2QFz&XP$ldV^oaZQJL3F51 z&%X8wlzovv!U+y&O^0D~3yWqCh2w|GhZ^IPll;tLwv<%ic#;}CVjfOT3_RM^h&T^7 zXo$0V+6^7_R%m9@J7IxoT@-?YAuml8BN!q+1}W~uJ+fbW-Wz)}aIZ2nN!W`agfOvA86GS{zD&&hG=ZeaOYrK01ms@ z6j0glsI#ksgZg*DNcAP0{l>cK*!6A6mp)I}AEYX+yrsH&wG4TsY&Q658p#g1|HQGe zx@Gy~@R%IYJ>pk?4a+!{>)3n6(D*+sst~KLKvd&IT%0GwzC@f0o3=A!m$w${_o^)in{oY(x`0Cwgl_2*Ni9OXfgU@L7Zwqdq@9p2Q=%3l_omdWTD|unxM@lKlb^+_-S1xuSW) zLV8G>8(>5-%a+aT&c=sz3fbfP?TJ|m{^TbZ$mHBE4jslAx+@=oMi+W2Au-Y5OI}S4 z3(QR4iKxfF3_?&w#*QyHH}`dh6+O%qpA^p$W_t}yK?Wk*IxHNuGl$|6&EK~ z>1PcVs3sVkoU~KDcki*Y^Wcps0y$k>Mv%1tqjRoO0vaWwqZ%1D_?ar?)&m0rGJ~P% zXV=4&*wfZuKNhrvXCYi)U}=@JI_AH_n?H`rD6x^VvB}N0VzRcjrVMUE)ZaOc@^Y18 zwL0>};B1F*CQrM6a$MqxBP@1YRK3O&BF~PnD`%#qrA7Dx`xmdG-rKzSVYJdQ6N619 zM%Dc2?BvxEXfUC@|KI^Z`550dDFpBE;s|flC#k@)vNE5<*jP73b_8&^NW5WzV>PvG z5ob=HT2!>X_;a7=V*A#eiTC3pCBA?DAmJH`nl8AhXK+xAZ8t{D#2U@LcYVjf{Q`vy|4SNK%p2}0r?quyQm?U%LwjUPnVl^pB*fCzmQ-9! z3_CizSwn`fuf+_Cn>W*K$jZo&_lx8w?@URe9FPwM8AKKr7U)E<7s!cO$Zz97Et`L2 zlVH{1I?G9H8*$hjRWqVG$3^mm#l@7B8_O#zQw4>EI41xXba<=1^wuo}&&xSEiE?mq zP=?$h=x^-oBwbfgH4&Z=jJz7IR6o0^6QTx34S>+L{f9t03ulGUI}tvL9{N5NJQ3-#`nb>jzI5$0Yg& zRLkTV2n4rx`+DIzCZ}Rigy^E8O(URM9mX@RV0oznkEIb-M>C)+=#$JxAgXdcT8I4yu>y_r%v*UAkNiuS`T6-4 z%F2NQ`{1@7aO-mx#`W3Wx`EU^j&S(nx=-n@eAZzip*1EbC};)B=@BmM`&*waEiLhe z%5?+?0K=~n2PWenZPVG178Lvw0yGpy+tps_%xag7)VexsRo;Fc?nyQF<*^Y?JF+0K zdLwpQy0Is-X}xptwe$#OLw#ee(j5)Td4&2{o&z?pXKJc&q~nw2SfTk{83fPON{(x; zDk@zn2(7K>^UIpUIJy<{3I_~#fqrdJzFt{?Bvr9|{>Kcf9;XX><+erbR~yvH*5uhu z-y+LO!^ZRjgd<~OE?+yK?6~G{Asw<;b^a1glIl$LS{hgDCnz!G-D%5Gx_}?(MvY#j(c%Y%uPk=fuW)DMdiW8 zOIQ~h8=HKh-9bJ*L|Vk_(a}dcz+~3evJHQxU+GQ@DhlU(XDpuu3*!|42EDIl%yA`y zu6-ux;PJ2Ah@$w;sXwiBQ}O-ykZ{Wie-H2Kf66?GQ`=m zcrB4GEZlHPM!YQ|E;SyNJP1zT}B^ zf#KVNl{*~uHgQBM{b_0<1|hR8p*E?WYF~qb&JFzh`E7RdQ&klcgo@YwOB!@&hKTq2 zW-(7+yr8LE&|RIV9^w@ch+(Yz1<}^q{#zOSSdo~x_?`~qwqm~ssIe_1Jkd2Yv=b2* z?>O^xQ)-W8roaDLy1g8ji!?mY@_Tmu9q1o@tF=okF?NL#Sx}|l+9fU7droghHhcQK znu$a8grLfK_>CI{a@i;Rw3_t^8W0Irz^)>rqQ0#;e=aVjj?4Hq?_dna2M+AI(@NU- zyUB9zAOnws-ZTS4G zz4`XjR_yGnr{gw*XcFbf^pEZA!R;+;eX|Z%7~?XeF$!N)6RxL>EE;^w2!tRRTbwKv zeRtuqGHkl=i%aRe0FgB>Ci^5go~*9&+D+C3HaFj5oZbY`2zIT{IaN&Cj*fp^rC@vL z5g`lor+A>P?e8k}-c^eK3U+`0x`>K`qT*km;2Z#A=b)1QskHPbZzJZ65~dyRN)F#o zHS;{gFL=KC`m5kWqg9UAorlD}Aj3+480U{EVHkl>B1`Z`=Y&3Ia!obyMtW&kS)A@N zP7PtUme0+>1KX|3u!D+ov=_0el*5n=RS&j&)l6>ZI)h&dqhCtkIqgJWg6uQ}DQ}&~ z7Q&!%2-UOZ2wiuECw3lIq>;B&Ij=Fb zcXT+Ce}!(Bf`LI|$tA&LAFPDkMAh5MN{PnV=O`rA%7UqZ!3Ee0reEAh$M^*q;&t8e zVmQoR##g^-ajZI53rR}aTwxV}d8QH-Fg8#zd#XK47I+Mwm0)cXU}DF}8- z?9{INe=c$J@Jw&IK91vHVw&@0vw^-a2h&KKnYz@QX6@GMUrWPvaHX+-Q06%sxhYNg z`t|Ekle17*xI9o--?}aAF|Cjirj@$F)$7!mX>Dta zROuujxGz$Bt)nQ%US6QYcJ{ueiZ3TJ^*b0_1h|2c2bt1D0Gzm+FbQH|#NPqQw|P*e z;RPAbVczJ<$GgSD9s4D4s#_C{j4Ef2n%{tTuaZMJavr>n^Q2$*V#)Ll6Lz@@Z4T*7F#Cy4*(%#invx_O|R1v;=av zy#*PLSNi(;d}PJMb}8$f5n0e4USC_2&fFGLvQLZTKB;N;}e5NkAgs>mgnSGd1>j1J)#idYZaFsmr*-3G_;pY+w4P9 z&yN@bL68-Qs~ZqYMY)2cIZRINlh%&_y1A#(2s?7J1o$|>R$vo5w4$i2d=|e!r4d*| z2WX-i;k%gRLC(#j2jX1|pf~pngu)`Dqf>Ko&LIThY2Y%m6sQ9MUsp@ZZ+Y1oQ4dP~ z;Y#dZU`|ZR^^ctUh10KZUZW>iLr#Aw*@p=rj$gcl6nIut;8hI@X@IIE(^ppFp=8^O|;n@|@E^W2f6QMOg{v z2_+;XVx1CKDNM>5i4oQ|HYv!nAYpdxiG_vWwQGcktgI|wrCS=!p)Iq6!kPVnkQy58 zVK7glfL{pef9B05MSpd?kQR-*uSiIPh-jO8HP0VI0yY3qOx3lu6A2$b)`O^9X)WSD z923yu5D^o*^Ar&rTrjlQ00Ahqmn$bX7xI0`DyReB4BUDKONo<%10gkvgFq=~jhm`= zp~$ehb3|GKVInRgB_o4qW}B1x<^wj?(A%Rjt zvOn@odq*c3wJG+Q4r~Ey-R}h2Gg4U~BQ6_Ffn;ylUhecMzkO+%a|hZ-GCYZd#X4I> z2^cloqPfpuK>Y@pP7bG4dy6ds#LNbSjipV(m-PpoU?w`Vc^#%849`OSX5LJ!PVDo3 zZWie)8+}3c!fdKEXu#|6MqiWYijj0#f9&neT2=5FQt&lMn~Y$^`!^MXbyf!{#s72F zl*rH;sl@(k(=~6dVa++X3bzC5GlL>3V^O*S2Wcxe;1*`Hh0O*b^V8`9l%#Upm$qD` zAX@az1UC!(aW&(Nip}tbQHyr^4>Yz)(|q@)6?K2Q``A)wY)W zY2$GwR{ZJwl9IhtWO$bGls6iGLiEa?ew_(Mp@u}3+F+!{|7`u8{l;7!e!a4}&)M0^ z$|uZ_Bg~n)x-v8@H5O)O-hQa**O{V~$^v?UcRqwd^o)yRTCpDyTI*}OUA|w$d6}nl zfg>e&?sHk$;3EqLKMrrR=G~(cCiSCx#P`*qi%@D?41};QtRoZ~1)pcn{&2!gZ!=|Qhe$qqC}5$g+Qf?vf{DU_N2Y4xsQdCj_95OL zEY2#9>+02TCUj*b_QR*nx4yOg9n1N__Ak>LRY`;bKqHH8Tv@ReG2_P6@_ zdU3?B?{7&Kfmd*GO{e17^ea4*$q^xlFU3HYPy-q54E3CbhK7C&)mV~#z?{PPT1*te zEC_|vqGpc>%^xefL`|+2;uxMbrvTr~`6O6?uEvMss4TaF&@MFG1|7U*h?@znA^!#% zx`J>W!UBO^`Ey_raqoF#HPtA@Q!!CdT{5|F&j537rfE=xvOG~})*<=d>8*fJ{I(zok)2$_RYLAfp(Qor_XK!TfPCB!*v!i5>Bgpo88fqoW zD(s**am1IVioG)UW3pw(%YB~{`|QX$vCyK z=R%O}haDbfxYy4+Y*zB3c>6q5DfsiY8c{{|*HF#!6y&PSv$B;~L(4ex6AUPJyMKDcjSQ2UAarihrP z+I7SCw&p9#%YBUv=eCTqi85A+vRrYtE@;h0Vs&ZCOAYt?#)|a0J0f}7)Wbc^bGL1k z1Mj5{DKrJd%u~)&)?QMp)<65h`g}5NIfH{{)pv^5#fH&vKhn>bo#5E@y3$e{(T0 zG38AXH3*V-1eNRi8MFN0jd>>-E|a_w3MIK?fq;O3xEUMlEw3MmFe!Ef3(PEZ#aFm( zbJ&qld``b2x^A#bh`85ZvY-!`#q>b-LyYh&UkhM1%T4D)$L+-LJ^V3^9=Ok=sZfME z6$uNCmF$97ZrHs0%QCd0-(}eLk_Cz^M4yBP~D&0RGhOUyWb(*1mQf8Sf9kkwZ9)X2* zK|*We{?8*SSW?$~w2lmUyh#OUIm16@xw8~XQ$<|p-`K;6BXCqoiKorU9Nno?@0HEX zqM7|RleZW@L-N4F%>3{$k*yM+H32l*FS4YDE8gR(n6Sg+=LX-(W#gy7)KYZKQGUxn z4O~aW=xu&=c$2QFZ^k@I7KojCtDa?;VsiENrDJfTo!A?Bl6+!||3cVb(05QWUxiGH zPESBbC^|4n=A~Rc>09{`zsKeV{Fmy&*Rr)MqXpicZGDJR6gU&+&ZKR%^m$3)9CcVc zLJU!1$#6@~B9C)^??^#uBE7<#p_$~s)4rEd!0&Wp5>1x-&T}D7wpY?;ull(ok*S#q zb?1HM^&Hi{rH*T0yoWzf0DJ3Z>y5OC`BYUI#6^Q!WZA-tDu5mJ-CoOo(yNWfAQRiXvXC{uZPd5t?eBC1JJ+1c-Xe)n90b@YABdA5NSd{ zP9?<0e>FMf3;2V!xE?dDI`X$B0kx2o<2pO(0ICs43Tm_ zOHa`j@#pA7+t7U}UHkjApr;I59l%&d%zj0hnx4-IAdC3pUfV7pH^MIi-?nGG4=K%f z!*l=3!Osw8txkD^H_jWAPYvE29vzWH_!?GvGD5EQFxr>s_05N?vnJBmHS7-b8`>g%(doEBQ@2v#=Yi3H z4>H`h0vi(@&7F_i+S&2Tf(uns-4|>LWxmPACr@{quK?0q2`xH4UvwK#|`x7+c2CY0;v4UVZy?7V)FKJ=woun!=>NpBPk+$#0n! zQTPs=y`yEjIoYeT`Wk}e>!PKl*VE7T37?qHcdwa$cnZ2K7QA!{Dk>qE@}LU&`i=64 zP@WipyHo3+>j9mv{?qD5*SD_=M9fZ69(^;M^gR6GQupA*KkvC^j9G ze_WO|jVeB*U;OoAONcz}Jn(W~2NB^lcmT!qpbvt}Z?!Hu3CN*L#L1Irh4 z1A*6BI5T0l?mDU1dy@|z;9$tII3g6jp9?g2d<>TyrlFsi_3Xw2UEM%4;Sm7F;Aj`* z<)Pm82f{h})HnbA`1rUR4$@>`%dDlH)i>x7rv1EG#DcqAZuiamBso4Fkj3ujC*2(f zK22wpqR)F}Wn?s4zscJ<(K7b$n5Paw_fVUExN;gX{Y=Lbp%9GQK329j6-Ph-DXP$G zD#QKpmler06@s4u62XOJSm6+9>oUxKy>16v^AvG=drM`fRM6&)BfJx-ZMj>h81Dd%@t46q>h7B7CuvZL z-GQn;Q#I4EdT3>WKq|*)WYNdt?+pa*lk`>VH;-_~3iusDvg~D#Z?e+_qJBA7Qw5^F zn0G|`#J2dnU-2>gfm6G2wpN1X+{u~x(4;?J(R?)L z_$+l!pL!|#*Pp1M;U$vsmoK!3LWKtzU&_fX-TwkFgYoU&0i70WSUJM@WuPoTjiErm zi8wEpnYSN1afIKq25`{smlUYmpOM7R&(utdFCBJ^E#5Xix&7T3_1zdzAJq|)-dw!L zjz8wmR3>7*VBhrO*e8l#kK|9*_`y9C7_DPT<96dA4c>WDKyvz2GkkVjyLO%}2x$8h z-70Ipq@$YoHHFeN^y>f`Kw;)a*B7xt`PggSxZ;)X&R84`lxbUUxrI}gwvUZ?F=%iUbFH16qEq;S@B}}Gah+ zw&n9ZiDeuvy<=+#|CPiupGs37Xz^l_R}KYc_q&}=x`z&M%B&4zq`wk5&n9thT-1zy z^2+j85J`cnX4L+hjd3b8ox#ai`|bb?TTk?qyhi-O9H^6su6@cogrU#A0-w#M&uJ|p zdVRS;1z6)azSM*v^uGKZ0i~4roF`G@GQJwK=dImqqKhvZL_d+|qFKhSe(m-)m&Ii= zCr@zCWOf(P6X+|356G&USMGNv;2wNjL4P#r9UniIY%|;9R&RKA?&)3O*qTxNJ&2^k zOyl%I92G(@`_DA$($}%+c5gn}0?52;S2EF-_b zG?aFt>Jw|~=>9;EibCfg`4Pv>Lv?;T1{)^1IJOhG%^_-7G$89sIJq;|vZMUlH&5={ zjf&zYx$~0*1dLPZA*MI?GpTj_2s zVqcaWJ228bK?8C95f=>;JcbZH8DYwO%U@QqIDh#|IA}C=0d3Ul;Sk0M;ajkR2G8DM zap?MHr(vgja3`HBJ|U|ggR_d*aH+OxJkO7zt=n+}Yi@)~{vF@bZ#sP~xizJ)>69n& z?SeJUVzx$qkm@kC-%FOx1?iO4r$-J^I=GHUN!qDNm&03|V6co2T!0>(Bwv62eH0xV zTFKjdSRT`Bxa--hKfP7cj&T!cbfKa(J;@EI{66n?rA&PLxcg9>-tle6w)Nx3asxPV zV5qCW%k~{%CnIq8lRUZ~odmCS)nGeDDT)hm$4L29(ay=s_%yZKuhjd*Clw6Txf4pg zw=O{r9_7JQfLr|+o*yQ}KMaNXKMvUcza+SKNDO?Vwg6T9r)V^0hy#e6tfA-JgJ>X{ z?C$Q;rIEslr#bo*_MD^=7ijr(`{?8?|0yae+WNQ^0wGcb68{Ehb)O-6ZE>lCn%tj? zlqgE9{=^%776Hm&aovkwv07KI6?88?WK6<;hQaGyg74&Gj1`Z)(FZUiGYw8W!!>T# zK&8q8;}^hsmUbRqDJwHFJepXfwxTZ0*P>lE8QC1lP=LuM;>lgL~lr;-v4cil9vq0v*HtDrzkWFuV6vp#>(Fg9Y05VrGQANd{ zVD^hFT$78_?PDD~ta$813NyHnNS$?35L*P1ahR&xWlJB4b>`+8m z?){wb@%U~m5FAt?XPq3J);&p*W}=i}d90?QG7YLFqd~U`kkE@gY(5OXweab z`Sp#^rcy~}b!D5eUy#(s=Sg!k)iq}H6t3+~^xbz;7CxE`Q%T3eK8G5lEhSgjrn>hJ z9Dg?43=FVbd-VJiGJ*o}F+RQlf{Qewj{M?j#D5@h7=qgxWuT`Q@BKrhe)i?Q+gj;R zWT$`YJ(r&f46aqILF*a zHnqRXumNuAds|vym+gx5#U+NR+uUc1aGtUTVsOb`$-ho;_O1LQA0PA}kODBfyVjR4 zU#5rHKn>BBzLkmPVS>$EK#F`Q?0Rq zwY~OgVvQTztfY7kpy4ttEvYOP*1t|^L&cK znJ~EUexFd9Bh($`HFn;Z+2zh0P^2z?7MLyN>p*wqg501ZOu#gjxXYr1IV9`CWN=sl zXbS_F4FYW63@MSwN9r<3uS%h}9!h|?_w@=j`DJSI*+Y7xxl(#|y*}eTxYm^I0|GeZ z&d#i(T}4S1K1h(>-SHhh|6X1yh`!!*vte5B`}CKAz(2c{lE$D8px#8*;j* zrl#l9p(=wnaf(k*PX}~9pvh#gj`I9>lADc#P8VSIBM@~8ezOloS$w%v%jJ8n!|5?c zSDI*7xA{kf4X+I?8r<6ICH_=`M_}>IqUu+o*gzg(eDp*h`85t#8B%gk&t*6Js zvufHnx6L&Z|dxTl}VmJ|~oZg}kGahQxQ)>i2AgP7md#MAg4?jy*uX>A!N`$XL1 zNN1O8LQed~)xin@ZcxG*+O~Rd+)uvRh>Uy@4FgWQ>sQ3v(y=TElvsLt8wa6&Nr`x zPDT~dT47R!;3g9|zk;L+4<%@L!j+`x*p#kV?0Q{RD3BoHUSthe^O}B3Pj}20pJAm{ z155KOL(&aEsJh_hN{5ajV_-l4-PeV>fUqovfV0zqDEXxeID=~E*rw5ji`BN!jnU65 zLJu5zQlJ0+PdE1S9Esf5CVVSEv$2~)&$h@YT94uwqH5}shcX-~=cT`DaI)=Ys?x^m z@N%qO)!D6Htqe#aVBEYGIH&M4ZAHHb-xHAEd9#0l%?k`27J!Hw488J_b2Hg$Id#5j z>}*Yf8=Uk)ymy;rbnO(3oa8^{6xHhF$&2jM^N=LJ0TAl$G$n7U<|7j2Z~bQ3)3LGsh_lE$7?-rE!vo0NAbl!hxl;-|iP nOmXHv55x!kwEv@!6^_k}#(s{OSu_(*ZdX=RMHR?De)Zn~ML Date: Sun, 15 Oct 2023 17:52:43 +0100 Subject: [PATCH 033/199] Automatic changelog for PR #4643 [ci skip] --- html/changelogs/AutoChangeLog-pr-4643.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4643.yml diff --git a/html/changelogs/AutoChangeLog-pr-4643.yml b/html/changelogs/AutoChangeLog-pr-4643.yml new file mode 100644 index 000000000000..0ee2aa40b9aa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4643.yml @@ -0,0 +1,4 @@ +author: "Twomoon" +delete-after: True +changes: + - rscadd: "Added new haircut" \ No newline at end of file From 0065e57028f37054102a814e770f91cc234b2a8c Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 18:44:56 +0200 Subject: [PATCH 034/199] Fixes Turing Machine UI breaking down if its Smartfridge is exploded (#4662) # About the pull request Just occured on live game - turns out Research can and will explode themselves (who guessed), and the Turing UI runtimes due to a little oopsie if there is no associated storage. I didn't test if this actually broke the UI but a runtime mid ui_data makes it a safe bet # Explain why it's good for the game Freedom to explode things with controlled breakage. # Testing Photographs and Procedure Deleted the Smartfridge, pressed Turing buttons. # Changelog :cl: fix: The Turing Machine should now keep working as intended if its linked Smartfridge is blown up. /:cl: --- code/modules/reagents/chemistry_machinery/autodispenser.dm | 3 +-- tgui/packages/tgui/interfaces/Autodispenser.js | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry_machinery/autodispenser.dm b/code/modules/reagents/chemistry_machinery/autodispenser.dm index 3486e97524b8..a06042aac7a8 100644 --- a/code/modules/reagents/chemistry_machinery/autodispenser.dm +++ b/code/modules/reagents/chemistry_machinery/autodispenser.dm @@ -154,8 +154,7 @@ data["multiplier"] = multiplier data["cycle_limit"] = cycle_limit data["automode"] = automode - data["linked_storage"] = linked_storage - data["networked_storage"] = linked_storage.is_in_network() + data["networked_storage"] = linked_storage?.is_in_network() data["smartlink"] = smartlink data["outputmode"] = outputmode data["buffervolume"] = reagents.total_volume diff --git a/tgui/packages/tgui/interfaces/Autodispenser.js b/tgui/packages/tgui/interfaces/Autodispenser.js index 0c8ce91512e5..5d029b72b894 100644 --- a/tgui/packages/tgui/interfaces/Autodispenser.js +++ b/tgui/packages/tgui/interfaces/Autodispenser.js @@ -11,7 +11,6 @@ export const Autodispenser = (_props, context) => { multiplier, cycle_limit, automode, - linked_storage, networked_storage, smartlink, outputmode, From 312598c1e7e18c85f4442d9bc881a2ab41e6d412 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:13:50 +0100 Subject: [PATCH 035/199] Automatic changelog for PR #4662 [ci skip] --- html/changelogs/AutoChangeLog-pr-4662.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4662.yml diff --git a/html/changelogs/AutoChangeLog-pr-4662.yml b/html/changelogs/AutoChangeLog-pr-4662.yml new file mode 100644 index 000000000000..2143bfb05a35 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4662.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "The Turing Machine should now keep working as intended if its linked Smartfridge is blown up." \ No newline at end of file From 93cdb54da66526b93499f09b24895ca45884c57c Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sun, 15 Oct 2023 09:45:11 -0700 Subject: [PATCH 036/199] Fix join as xeno observer alert text url (#4681) # About the pull request This PR simply sets an argument for the join as xeno href that the hive surge observer action provides in chat so the href topic will actually respond to it if clicked. # Explain why it's good for the game Links to things should actually work. # Testing Photographs and Procedure

Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Drathek fix: Fixed the hive surge join as xeno observer alert text link not actually doing anything. /:cl: --- code/modules/cm_aliens/structures/special/pylon_core.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index 96ded23c8ac7..bee8e009ab28 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -284,7 +284,7 @@ linked_hive.stored_larva++ linked_hive.hijack_burrowed_left-- if(GLOB.xeno_queue_candidate_count < 1 + count_spawned) - notify_ghosts(header = "Claim Xeno", message = "The Hive has gained another burrowed larva! Click to take it.", source = src, action = NOTIFY_JOIN_XENO, enter_link = "join_xeno") + notify_ghosts(header = "Claim Xeno", message = "The Hive has gained another burrowed larva! Click to take it.", source = src, action = NOTIFY_JOIN_XENO, enter_link = "join_xeno=1") if(surge_cooldown > 30 SECONDS) //mostly for sanity purposes surge_cooldown = surge_cooldown - surge_incremental_reduction //ramps up over time if(linked_hive.hijack_burrowed_left < 1) From cc7d60d3bed974bfc02053cec71b9f7caabb8cc5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:34:56 +0100 Subject: [PATCH 037/199] Automatic changelog for PR #4681 [ci skip] --- html/changelogs/AutoChangeLog-pr-4681.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4681.yml diff --git a/html/changelogs/AutoChangeLog-pr-4681.yml b/html/changelogs/AutoChangeLog-pr-4681.yml new file mode 100644 index 000000000000..e65421559570 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4681.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed the hive surge join as xeno observer alert text link not actually doing anything." \ No newline at end of file From 6ba14e64d02816a257f188715c3876d768e3475a Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 18:45:24 +0200 Subject: [PATCH 038/199] Fixes a minor recurring runtime in origin selection (#4679) # About the pull request Harry forgot to account for indecisive people No user changes, just gets rid of a recurring runtime in live game logs --- code/modules/client/preferences.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8ca177ddf66c..1da30d6e47e3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1701,6 +1701,8 @@ var/const/MAX_SAVE_SLOTS = 10 if("origin") var/choice = tgui_input_list(user, "Please choose your character's origin.", "Origin Selection", GLOB.player_origins) var/datum/origin/picked_choice = GLOB.origins[choice] + if(!picked_choice) + return if(tgui_alert(user, "You've selected [picked_choice.name]. [picked_choice.desc]", "Selected Origin", list("Confirm", "Cancel")) == "Cancel") return if(choice) From 74c5d65722df22630592c9d43b66e58b0863bb6e Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 18:45:36 +0200 Subject: [PATCH 039/199] Fixes minor runtime with null skills pushups (#4680) # About the pull request Doing push up with null skills runtimes at every iteration since pushups don't account for it I wouldn't normally bother but I came across an unreadable log spammed by zombie pushups, because our zombie players LOVE doing pushups No functional changes, no changelog, etc --- code/modules/mob/living/carbon/human/exercise.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/exercise.dm b/code/modules/mob/living/carbon/human/exercise.dm index 7a83fd2886e3..3a2976da9130 100644 --- a/code/modules/mob/living/carbon/human/exercise.dm +++ b/code/modules/mob/living/carbon/human/exercise.dm @@ -102,7 +102,7 @@ Verbs related to getting fucking jacked, bro //humans have 100 stamina //default loss per pushup = 5 stamina var/stamina_loss = 5 - if(issynth(src)) + if(!skills || issynth(src)) return 0 switch(skills.get_skill_level(SKILL_ENDURANCE)) if(SKILL_ENDURANCE_NONE) From c0833a63058bad0535d10736983a6ce5b975c0af Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 18:45:51 +0200 Subject: [PATCH 040/199] Fixes Xeno Cultists always belonging to the Normal hive (#4684) # About the pull request Turns out making a xeno cultist of a given hive completely ignores the hive and makes it as default hive, because it was passed to the wrong proc entirely. Funny huh? # Explain why it's good for the game Avoids mishaps during the few events using cultists, as seen recently. # Testing Photographs and Procedure Tested before/after the setting of `hivenumber` on the human, as well as possibility of receiving hivemind messages. # Changelog :cl: fix: Fixed xeno cultists always being created into normal hive, irrespective of the selected hive. /:cl: --- code/modules/admin/player_panel/actions/antag.dm | 5 ++--- code/modules/admin/topic/topic.dm | 8 ++++---- code/modules/mob/living/carbon/human/human_abilities.dm | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/admin/player_panel/actions/antag.dm b/code/modules/admin/player_panel/actions/antag.dm index b3b62243c812..b1c2da6be123 100644 --- a/code/modules/admin/player_panel/actions/antag.dm +++ b/code/modules/admin/player_panel/actions/antag.dm @@ -56,9 +56,8 @@ if(params["leader"]) preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist/leader] - - preset.load_race(H, params["hivenumber"]) - preset.load_status(H) + preset.load_race(H) + preset.load_status(H, params["hivenumber"]) var/title = params["leader"]? "xeno cultist leader" : "cultist" diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 191b292ab95b..64647b8f87fb 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -836,14 +836,14 @@ if(href_list["makecultist"]) var/datum/equipment_preset/preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist] - preset.load_race(H, hive.hivenumber) - preset.load_status(H) + preset.load_race(H) + preset.load_status(H, hive.hivenumber) message_admins("[key_name_admin(usr)] has made [key_name_admin(H)] into a cultist for [hive.name].") else if(href_list["makecultistleader"]) var/datum/equipment_preset/preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist/leader] - preset.load_race(H, hive.hivenumber) - preset.load_status(H) + preset.load_race(H) + preset.load_status(H, hive.hivenumber) message_admins("[key_name_admin(usr)] has made [key_name_admin(H)] into a cultist leader for [hive.name].") H.faction = hive.internal_faction diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm index 502dd77a063d..fda4cea20ad1 100644 --- a/code/modules/mob/living/carbon/human/human_abilities.dm +++ b/code/modules/mob/living/carbon/human/human_abilities.dm @@ -414,8 +414,8 @@ CULT return var/datum/equipment_preset/preset = GLOB.gear_path_presets_list[/datum/equipment_preset/other/xeno_cultist] - preset.load_race(chosen, H.hivenumber) - preset.load_status(chosen) + preset.load_race(chosen) + preset.load_status(chosen, H.hivenumber) to_chat(chosen, SPAN_ROLE_HEADER("You are now a Xeno Cultist!")) to_chat(chosen, SPAN_ROLE_BODY("Worship the Xenomorphs and listen to the Cult Leader for orders. The Cult Leader is typically the person who transformed you. Do not kill anyone unless you are wearing your black robes, you may defend yourself.")) From 7a8a2811eaccae0253724baa0c1879f4a41dd394 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 19:15:57 +0100 Subject: [PATCH 041/199] Automatic changelog for PR #4684 [ci skip] --- html/changelogs/AutoChangeLog-pr-4684.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4684.yml diff --git a/html/changelogs/AutoChangeLog-pr-4684.yml b/html/changelogs/AutoChangeLog-pr-4684.yml new file mode 100644 index 000000000000..0aa80df958d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4684.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed xeno cultists always being created into normal hive, irrespective of the selected hive." \ No newline at end of file From 06fb75f5129dfe5654c7d3cf2cda5da4dd9641e3 Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 18:46:15 +0200 Subject: [PATCH 042/199] Fixed default value in cash splitting being out of bounds for tgui_input_number (#4672) `[2023-10-13 22:54:01.748] runtime error: Default value is greater than max value. (How many dollars do you want to take? (0 to 2), Take Money)` obviously a default of 20 can be out of bounds for a maximum of an arbitary positive value don't mock the poor... --- code/modules/economy/cash.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index bba80f85762a..ad09eaf3fa09 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -87,7 +87,7 @@ /obj/item/spacecash/bundle/attack_self(mob/user) ..() var/oldloc = loc - var/amount = tgui_input_number(user, "How many dollars do you want to take? (0 to [src.worth])", "Take Money", 20, src.worth, 0) + var/amount = tgui_input_number(user, "How many dollars do you want to take? (0 to [src.worth])", "Take Money", 0, src.worth, 0) amount = round(Clamp(amount, 0, src.worth)) if(amount == 0) return From 11b5f538a08e8edb49903f4ab41d63c92cc6d844 Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 18:46:58 +0200 Subject: [PATCH 043/199] Fixes dummy preview for yautja bracers causing runtimes (#4673) # About the pull request Fixes a simple runtime when the bracers are viewed off a character setup dummy, and therefore, nullspaced --- code/modules/cm_preds/yaut_bracers.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index 272882779d57..c10d148a2136 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -116,6 +116,9 @@ var/mob/living/carbon/human/human_owner = owner var/turf/wearer_turf = get_turf(owner) SSminimaps.remove_marker(owner) + if(!wearer_turf) + return + if(!isyautja(owner)) if(owner.stat >= DEAD) if(human_owner.undefibbable) From 99850e9e50dba04b97518924fc88d5e8d22a037e Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 19:54:38 +0200 Subject: [PATCH 044/199] Fixes crash in Join as Freed Mob if some had been deleted (#4678) # About the pull request Improper usage of weakrefs in ghost freed code resulted in them not being cleared on deletion + the Join as Freed Mob verb to crash if such an entry was still present. Because /mob/Destroy already clears the hard reference, there is no actual reason to use weak references at all, so i just removed all of them. # Explain why it's good for the game Feature must work! # Testing Photographs and Procedure Customary testing that Freed Mobs joining still works after fix. # Changelog :cl: fix: Fixed 'Join as Freed Mob' verb crashing if freed mobs had previously been deleted. /:cl: --- code/game/machinery/cryopod.dm | 2 +- code/modules/admin/verbs/freeforghosts.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 16 ++++++---------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index eb9aed4f71e4..86bb5f79a035 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li //Lifted from Unity stasis.dm and refactored. ~Zuhayr /obj/structure/machinery/cryopod/process() - if(occupant && !(WEAKREF(occupant) in GLOB.freed_mob_list)) //ignore freed mobs + if(occupant && !(occupant in GLOB.freed_mob_list)) //ignore freed mobs //if occupant ghosted, time till despawn is severely shorter if(!occupant.key && time_till_despawn == 10 MINUTES) time_till_despawn -= 8 MINUTES diff --git a/code/modules/admin/verbs/freeforghosts.dm b/code/modules/admin/verbs/freeforghosts.dm index 24c261ee18f3..4bf5549f30f0 100644 --- a/code/modules/admin/verbs/freeforghosts.dm +++ b/code/modules/admin/verbs/freeforghosts.dm @@ -20,7 +20,7 @@ if(mind || client) ghostize(FALSE) - GLOB.freed_mob_list |= WEAKREF(src) + GLOB.freed_mob_list |= src if(!notify) return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 130a8a923edc..4d06d1e07142 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1012,13 +1012,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return var/list/mobs_by_role = list() // the list the mobs are assigned to first, for sorting purposes - for(var/datum/weakref/ref as anything in GLOB.freed_mob_list) - var/mob/living/resolved_mob = ref.resolve() - var/role_name = resolved_mob.get_role_name() + for(var/mob/freed_mob as anything in GLOB.freed_mob_list) + var/role_name = freed_mob.get_role_name() if(!role_name) role_name = "No Role" LAZYINITLIST(mobs_by_role[role_name]) - mobs_by_role[role_name] += resolved_mob + mobs_by_role[role_name] += freed_mob var/list/freed_mob_choices = list() // the list we'll be choosing from for(var/role in mobs_by_role) @@ -1034,18 +1033,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp handle_joining_as_freed_mob(L) /mob/dead/proc/handle_joining_as_freed_mob(mob/living/freed_mob) - if(!freed_mob || !(WEAKREF(freed_mob) in GLOB.freed_mob_list)) - return - - if(!istype(freed_mob)) + if(!istype(freed_mob) || !(freed_mob in GLOB.freed_mob_list)) return if(QDELETED(freed_mob) || freed_mob.client) - GLOB.freed_mob_list -= WEAKREF(freed_mob) + GLOB.freed_mob_list -= freed_mob to_chat(src, SPAN_WARNING("Something went wrong.")) return - GLOB.freed_mob_list -= WEAKREF(freed_mob) + GLOB.freed_mob_list -= freed_mob mind.transfer_to(freed_mob, TRUE) /mob/dead/verb/join_as_hellhound() From ef6154b37be62fb5a6cd9f4810dd0a20e499324b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 19:52:07 +0100 Subject: [PATCH 045/199] Automatic changelog for PR #4678 [ci skip] --- html/changelogs/AutoChangeLog-pr-4678.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4678.yml diff --git a/html/changelogs/AutoChangeLog-pr-4678.yml b/html/changelogs/AutoChangeLog-pr-4678.yml new file mode 100644 index 000000000000..40c1d2ddad3e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4678.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed 'Join as Freed Mob' verb crashing if freed mobs had previously been deleted." \ No newline at end of file From 1d405a22c73896731a7dc499ca2c84fa4cdcd222 Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 15 Oct 2023 20:31:43 +0200 Subject: [PATCH 046/199] Fixes disconnected ahelpers runtime (#4668) # About the pull request If client disconnected, due to hard del, instances get replaced by null. This still goes through the timer CALLBACK somehow (?), causing invocation of the proc with src nulled out. # Explain why it's good for the game Every time this happens are two different runtimes, one for add_verb and one for deltimer. # Testing Photographs and Procedure Untested # Changelog Internal change --- code/modules/admin/verbs/adminhelp.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 758fd2327e77..5f10b8d24d22 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -753,6 +753,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) // /client/proc/giveadminhelpverb() + if(!src) + return add_verb(src, /client/verb/adminhelp) deltimer(adminhelptimerid) adminhelptimerid = 0 From 4b05e1d4de4426e4d5db3a011d03dc755746bb75 Mon Sep 17 00:00:00 2001 From: Waseemq1235 <42235601+Waseemq1235@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:58:09 +0200 Subject: [PATCH 047/199] Makes subtle messages more noticeable (Attempt no. 2) (#4644) I forgor to change something in #4384, so it didn't actually do anything. Now it does do something. My sanity is on a thin line. # Explain why it's good for the game People gotta notice those subtle messages man. Same reasoning as #4384. # Testing Photographs and Procedure I wish we could have the old PR format back
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: admin: Makes subtle messages more noticeable. /:cl: --- code/modules/admin/verbs/mob_verbs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/mob_verbs.dm b/code/modules/admin/verbs/mob_verbs.dm index 4809d9b2e6ee..351d281e1881 100644 --- a/code/modules/admin/verbs/mob_verbs.dm +++ b/code/modules/admin/verbs/mob_verbs.dm @@ -164,7 +164,7 @@ if(!H.get_type_in_ears(/obj/item/device/radio/headset)) to_chat(usr, "The person you are trying to contact is not wearing a headset") return - to_chat(H, SPAN_DANGER("Message received through headset. [message_option] Transmission \"[msg]\"")) + to_chat(H, SPAN_ANNOUNCEMENT_HEADER_BLUE("Message received through headset. [message_option] Transmission \"[msg]\"")) var/message = WRAP_STAFF_LOG(usr, SPAN_STAFF_IC("subtle messaged [key_name(M)] as [message_option], saying \"[msg]\" in [get_area(M)] ([M.x],[M.y],[M.z]).")) message_admins(message, M.x, M.y, M.z) From dc49f4df435d1b78e6503ba25c7947b2d65084a6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:15:23 +0100 Subject: [PATCH 048/199] Automatic changelog for PR #4644 [ci skip] --- html/changelogs/AutoChangeLog-pr-4644.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4644.yml diff --git a/html/changelogs/AutoChangeLog-pr-4644.yml b/html/changelogs/AutoChangeLog-pr-4644.yml new file mode 100644 index 000000000000..87b5f8b82644 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4644.yml @@ -0,0 +1,4 @@ +author: "Waseemq1235" +delete-after: True +changes: + - admin: "Makes subtle messages more noticeable." \ No newline at end of file From e7e86c3fa0257d080cfde44d5f85d8a233c07211 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:12:05 -0700 Subject: [PATCH 049/199] Nerfs the black market (#4674) # About the pull request - Removed several guns from the black market - Removed extended m4ra mags from black market - Removed monkeycubes from the "food" crate - The black market now requires a specialized tool (sprite by Wei) to hack. Can be found in the scanner object spawner 2.5% of the time. 9 spawners exist on the Almayer, meaning one will normally spawn every 2-3 rounds. - Removed lunge mines from black market # Explain why it's good for the game The black market is not in a good place currently. - It is completely trivial to access the black market, owing to the ease of hacking and the CL's ability to print money. This removes any chance of it being a special thing, instead turning it into an affair that occurs almost every round. - The CMB don't actually fix anything, they just encourage CTs to fuck around with the black market - Many of the things in the black market are just better than marine gear. Removing the really good weapons is the start, I will have to see if anything more is necessary. - Monkey cubes allow for effectively infinite greenoes. The black market shouldn't be significantly impacting a round, and this is directly counter to that. - Lunge mines are dumb as fuck, instantly gib humans (yes even the broken ones do that) and encourage LRP behavior. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/41448081/a5f28f12-f660-4d0d-944d-ecfba40879fc)
# Changelog :cl: Zonespace, Wei (sprites) balance: Removed NSG, Type71, tactical Mar-40, and Mar-50 from the black market balance: Removed Ext. M4ra mags from the black market balance: Removed monkeycubes from the black market balance: Removed lunge mines from the black market balance: You now need a modified security access tuner to access the black market, which can be found ship- and ground-side where scanners and radios can spawn. /:cl: --- code/__DEFINES/traits.dm | 3 + code/datums/supply_packs/black_market.dm | 89 +++++------------- code/game/objects/effects/spawners/random.dm | 11 ++- .../objects/items/circuitboards/computer.dm | 9 +- code/game/objects/items/devices/scanners.dm | 10 ++ icons/obj/items/devices.dmi | Bin 46032 -> 47010 bytes 6 files changed, 48 insertions(+), 74 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index b40ae85c3f5f..ef500b6af9f8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -221,6 +221,9 @@ /// Can lockout blackmarket from ASRS console circuits. #define TRAIT_TOOL_TRADEBAND "t_tool_tradeband" +/// Can hack ASRS consoles to access the black market +#define TRAIT_TOOL_BLACKMARKET_HACKER "t_tool_blackmarket_hacker" + // CLOTHING TRAITS #define TRAIT_CLOTHING_HOOD "t_clothing_hood" diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 5f8fae824312..1b8464820bb6 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -127,70 +127,42 @@ Non-USCM items, from CLF, UPP, colonies, etc. Mostly combat-related. spawn_guns() //the crate gives 2 guns /obj/structure/largecrate/black_market/confiscated_weaponry/proc/spawn_guns() - switch(rand(1,6)) + switch(rand(1, 5)) if(1) //pmc - if(prob(50)) - new /obj/item/weapon/gun/rifle/nsg23/no_lock(src) - new /obj/item/ammo_magazine/rifle/nsg23(src) - new /obj/item/ammo_magazine/rifle/nsg23(src) - new /obj/item/ammo_magazine/rifle/nsg23/ap(src) - new /obj/item/ammo_magazine/rifle/nsg23/extended(src) - else - new /obj/item/weapon/gun/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) - new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/weapon/gun/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) + new /obj/item/ammo_magazine/smg/fp9000(src) if(2) //pizza new /obj/item/weapon/gun/pistol/holdout(src) new /obj/item/ammo_magazine/pistol/holdout(src) if(3) //clf - switch(rand(1, 3)) + switch(rand(1, 2)) if(1) - new /obj/item/weapon/twohanded/lungemine/damaged(src) - if(2) new /obj/item/weapon/gun/smg/uzi(src) new /obj/item/ammo_magazine/smg/uzi/extended(src) new /obj/item/ammo_magazine/smg/uzi(src) new /obj/item/ammo_magazine/smg/uzi(src) - if(3) + if(2) new /obj/item/weapon/gun/smg/mac15(src) new /obj/item/ammo_magazine/smg/mac15/extended(src) new /obj/item/ammo_magazine/smg/mac15(src) new /obj/item/ammo_magazine/smg/mac15(src) if(4) //upp - if(prob(50)) - new /obj/item/weapon/gun/rifle/type71(src) - new /obj/item/ammo_magazine/rifle/type71/ap(src) - new /obj/item/ammo_magazine/rifle/type71(src) - new /obj/item/ammo_magazine/rifle/type71(src) - else - new /obj/item/weapon/gun/shotgun/type23/riot_control(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) - new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) //NO buckshot! + new /obj/item/weapon/gun/shotgun/type23/riot_control(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/beanbag(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/flechette(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) + new /obj/item/ammo_magazine/handful/shotgun/heavy/slug(src) //NO buckshot! if(5) //freelancer - if(prob(80)) - new /obj/item/weapon/gun/rifle/mar40(src) - new /obj/item/ammo_magazine/rifle/mar40/extended(src) - new /obj/item/ammo_magazine/rifle/mar40(src) - new /obj/item/ammo_magazine/rifle/mar40(src) - else - new /obj/item/weapon/gun/rifle/mar40/lmg(src) - new /obj/item/ammo_magazine/rifle/mar40/lmg(src) - if(6) //VAIPO - if(prob(50)) - new /obj/item/weapon/gun/rifle/mar40/tactical(src) - new /obj/item/ammo_magazine/rifle/mar40/extended(src) - new /obj/item/ammo_magazine/rifle/mar40/extended(src) - new /obj/item/ammo_magazine/rifle/mar40(src) - else - new /obj/item/weapon/gun/rifle/mar40/lmg(src) - new /obj/item/ammo_magazine/rifle/mar40/lmg(src) - new /obj/item/ammo_magazine/rifle/mar40/lmg(src) + new /obj/item/weapon/gun/rifle/mar40(src) + new /obj/item/ammo_magazine/rifle/mar40/extended(src) + new /obj/item/ammo_magazine/rifle/mar40(src) + new /obj/item/ammo_magazine/rifle/mar40(src) + /* Misc. Individual Guns */ @@ -561,10 +533,6 @@ Primarily made up of things that would be best utilized, well, shipside. Recreat /obj/item/reagent_container/food/snacks/egg/random, /obj/item/reagent_container/food/snacks/egg/random, //not a dupe /obj/item/reagent_container/food/snacks/xemeatpie, - /obj/item/reagent_container/food/snacks/monkeycube, - /obj/item/reagent_container/food/snacks/monkeycube/farwacube, - /obj/item/reagent_container/food/snacks/monkeycube/stokcube, - /obj/item/reagent_container/food/snacks/monkeycube/yirencube, /obj/item/reagent_container/food/snacks/upp, /obj/item/reagent_container/food/snacks/mre_pack/xmas1, /obj/item/reagent_container/food/snacks/mre_pack/xmas2, @@ -722,13 +690,6 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted dollar_cost = 50 containertype = /obj/structure/largecrate/black_market -/datum/supply_packs/contraband/surplus/surplus_m4ra_extended - name = "surplus magazine box (Ext M4RA x 12)" - contains = list(/obj/item/ammo_box/magazine/m4ra/ext) - dollar_cost = 45 - crate_heat = 3 - containertype = /obj/structure/largecrate/black_market - /* - Misc. USCM weaponry - */ /datum/supply_packs/contraband/surplus/mk45_automag @@ -1108,7 +1069,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro new /obj/item/ammo_magazine/smg/mac15/extended(loc) new /obj/item/ammo_magazine/smg/mac15/extended(loc) loot_message = SPAN_NOTICE("It's some CLF SMG armaments.") - if(21 to 25) + if(21 to 29) // Discovered Yautja ruins.. (None of these will trigger any alarms. They are far too old, degraded, and useless for any Yautja to care.) new /obj/item/clothing/mask/yautja_flavor(loc) new /obj/item/clothing/suit/armor/yautja_flavor(loc) @@ -1116,13 +1077,7 @@ Things that don't fit anywhere else. If they're meant for shipside use, they pro new /obj/item/weapon/twohanded/yautja/glaive/damaged(loc) new /obj/item/stack/yautja_rope(loc) loot_message = SPAN_NOTICE("It's some strange ancient gear...?") - if(26 to 30) - // Damaged lunge mines, don't let the marines near these. Not even *close* to effective against even a runner. - new /obj/item/weapon/twohanded/lungemine/damaged(loc) - new /obj/item/weapon/twohanded/lungemine/damaged(loc) - new /obj/item/weapon/twohanded/lungemine/damaged(loc) - loot_message = SPAN_NOTICE("It's a bunch of lunge mines..?") - if(31 to 35) + if(30 to 35) // CLF nades! loot_message = SPAN_NOTICE("It's a package of assorted CLF grenades!") var/list/nades_to_pick = list( diff --git a/code/game/objects/effects/spawners/random.dm b/code/game/objects/effects/spawners/random.dm index 450981377a73..a70fb5588f84 100644 --- a/code/game/objects/effects/spawners/random.dm +++ b/code/game/objects/effects/spawners/random.dm @@ -57,10 +57,13 @@ icon_state = "atmos" /obj/effect/spawner/random/technology_scanner/item_to_spawn() - return pick(prob(5);/obj/item/device/t_scanner,\ - prob(2);/obj/item/device/radio,\ - prob(5);/obj/item/device/analyzer) - + return pick_weight(list( + "none" = 10, + /obj/item/device/t_scanner = 10, + /obj/item/device/radio = 8, + /obj/item/device/analyzer = 10, + /obj/item/device/black_market_hacking_device = 2, + )) /obj/effect/spawner/random/powercell name = "Random Powercell" diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm index db19b79ac0fd..7276e8a7f051 100644 --- a/code/game/objects/items/circuitboards/computer.dm +++ b/code/game/objects/items/circuitboards/computer.dm @@ -177,7 +177,11 @@ /obj/item/circuitboard/computer/supplycomp/attackby(obj/item/tool, mob/user) if(HAS_TRAIT(tool, TRAIT_TOOL_MULTITOOL)) - to_chat(user, SPAN_WARNING("You start messing around with the electronics of \the [src]...")) + to_chat(user, SPAN_WARNING("You try to pulse the circuit board, but nothing happens. Maybe you need something more specialized?")) + return + + else if(HAS_TRAIT(tool, TRAIT_TOOL_BLACKMARKET_HACKER)) + to_chat(user, SPAN_WARNING("You start messing around with the electronics of [src]...")) if(do_after(user, 8 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You have no idea what you're doing.")) @@ -191,8 +195,7 @@ to_chat(user, SPAN_WARNING("You weaken the broadcasting function with \the [tool], and the red light stops blinking, turning off. It's probably good now.")) contraband_enabled = FALSE - if(HAS_TRAIT(tool, TRAIT_TOOL_TRADEBAND)) - + else if(HAS_TRAIT(tool, TRAIT_TOOL_TRADEBAND)) if(!skillcheck(user, SKILL_POLICE, SKILL_POLICE_SKILLED)) to_chat(user, SPAN_NOTICE("You do not know how to use [tool]")) return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 38ff8859ef97..512ca8baad9b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -457,6 +457,16 @@ FORENSIC SCANNER playsound(user, 'sound/machines/twobeep.ogg', 15, TRUE) to_chat(user, SPAN_NOTICE("You scan [hit_atom] and notice a reading on [src]'s pad, it says: ITEM HAS [market_value] VALUE ")) +/obj/item/device/black_market_hacking_device + name = "modified security access tuner" + desc = "A security access tuner with wires and electrical pins sticking out at odd angles. A handwritten label on the bottom says something about the ASRS system." + icon_state = "bm_hacker" + item_state = "analyzer" + w_class = SIZE_SMALL + flags_atom = FPRINT + flags_equip_slot = SLOT_WAIST + inherent_traits = list(TRAIT_TOOL_BLACKMARKET_HACKER) + /obj/item/device/cmb_black_market_tradeband name = "\improper CMB Tradeband Compliance Device" desc = "A device used to reset any tampering done to trading devices' signal range. Occasionally used to fix any signal chips damaged in an accident, but often for malpractice in trading. Use this with caution, as it will also reset any evidence of potential illicit trade. Created to fulfill a joint-organization requirement for CMB-ICC teams on the frontier, where tampered machinery was difficult to move and refurbish. Smugglers beware." diff --git a/icons/obj/items/devices.dmi b/icons/obj/items/devices.dmi index 8bf7634a7df44ad715301b3e9605eb266069fcee..9e0891f361702c51fe083b5b99ca5e9d4affd4f8 100644 GIT binary patch delta 2617 zcmYjSdpy(o8~;v3xt~grxVLP%~Mp%RguavNQ2F14uKim^hGOXe1` zG|6SIle;a2x!*Qvv&&iM{9eD;`TX&DJ+II6Jn!f8ykF0yhbcx}7JH-)>V2zGEv}|H zjw_Aq9nYL7Zd-Tmn+#j$57x|$c7q=aLB__WPuh<3pC+w|o8^lAc9x`{A0vhNo}t-o zBKMVX9=8kGqWyrP`)1~iwSf*B-ln7zeypQ9IV0bQD=(MTqe@kM7U0_V=xCUhvPO0Q zYT!X?waW<7rn(?-K2*JvU-i+!^i)xZC9+P2=IY6JCBilVI0BrWqLuGE5&s}R71JX%VP5+#hkG*4;eYRD{2-% zxnD<`gjLELOYe`Ztx^>v(!_d1{!R;e+2$(e=~DS-4Z^FHCshtWAP^wVA&b#aYqDUb z8j?0Y)Pl}0frShdx+JHfq%LOWDr>s4z)Q+`Cjx5s{E=Cc7kOkA2QP<( ziC?aoB>f7|H#CGh*9ol}wWOaqYG|m>_!d<^e%-a-X+J~BnGEJ0LQBj%8#2EN{lZFBFeQ|r%RprejSLVOqd4+ zl^izqd<#4DJu4etSy_qMbG@T|x7tY<3>Ke{_nW@3%B6kJboNlcBFJ(T_#=_Mp~l&X zql>6tj?)An?ww{;RaMcjzeU13_{EDCO8|FJ)L!18a)W(jawg|sP)|i?R}FU^n)*P^ z9J$lzxm}@ejpU)>#1sX$!Z;%%qa*10i?Rpi91@d~K;nrhn1>JLXwpD*BW2<&`#wH7 z>chw&!P-zsfz`nV^ zDDbTOm!sB;QkjGy4ifpcMGTi#BGTXH|2X>NPgj;dh1c8#g(Pakq&hU~oT26|d`Z8- zo^hyZAlkypUO9ryd4HO*5^&#Cq*W7JUt?&WpPVbiYcabCpC>3-5U`Ixzqgin*!h1} z7n`LI8uouV`D4q{P#dkFWPf|qRhC3=?;?B?Mh`@gy@d$jje&kcT}=37*g+(u!WJoU z*7D+mtU4`8D=Wmd%{}S!(x>rq&-%6*Fh-)@i=dBb9FqlB?!E#0QsN6SGMnVk`ZJ67 zGRekkZh&HnGqFy|wW*Z(aVhLwBd$)5ipTSc+V5V8X)&fm8x=5xPKOGFlE8{R<9FLD z%7)i&Z9jKTUKTHW+Zq20JIgMElaOtXRJUxF=$ZD{zwu)^82(Pkomoj#{uDLO+9)jC z0vP&T76VY9TUNM>n7}9Rx%#1@p&^_#znf9);Gc!daPFoE^L+m{eZ*T4Q&c4f(9v)E zDBV96kv29z6>;?9!LPgp+AgDH&cGBQDEg0HrG{tE#dQ&4J%S(D5h+07X942ax&i|X zw%BNv*={h97wNn8Ld_Ix&o1wOxVLh`es~B*96&QLbT5JNT#GIuX6-hSL3AYlf^p9B1H1% zx@f8wN>J)i*3WCGBDG#HDIQmLI;uk3e z4A2kOvYG%p|%|aw>T$CI-3@{vT6$ae{5HyS;AS1nX1;AHNEaJF4S-OU|n=e1&$~Qpckm+N67+f#jV__U5KQqjtIg1CemFUZ@cM%mj@J`W{!|+y!O`HX+>EGPq{n%x z^Px78$*xlN>#wcl1a7yvC#}~sN@`gtWG z-t8asYGAfX)3x+|^||71^Z#zfTH;nwAeI$$VU|t(>t1ZNf~Tl#ui<01kI9TJZy+#I z^>(LUZb$F@Kx67vYP6-R!@xl5X6nQ&D>t`!NXdlD$TX1(>5{;`vLf0CNc$q;7RgtN22TU7_W`0~V`Yad IweY_4H-m>SHvj+t delta 1632 zcmV-m2A}z&?*h>00+1vD#jz!}1Q*EMh<>iV|N2&a`}t$?KO(>_4eLfBue1IHKA-{) zinBhYeh7b`&?fIVj^m$R^a$9#W8;W)q=E)zZciEu|I2!w?V44(Su0w5Ix`d45lxJnt8j zKIs$v{F2M_<@ftOzXy;ceemA9HM2TS&SK}!3;%!V%b|ZCb!b8~am z86ip9wr$(GqR7+|n5|SQDH@HcSS%VTgo^iPbYps|?)e>i_ml4e1rPv0Qe~Frn@@V{ zo|7tfxvsoF8p&iTcYS(wlY{daUv}~Hs$1JlErHpM&(Ubq=nPObe{n^U6z%M&IVRs7 z3Lt*~K()7LqgkCyCKFjPI3{Ni^ytweZU5|Z?da~-?81VI*RRz)9Cht7nRB+t3-
`<%d*O`SWNMFr4cum%c)Q(D4R92okE!NGnq`JUjBh& zUZ>ah;K75+CWzOsskr*L-rnA7kux(hBk6y|(pOhkm*)>cwTqwg=g%8&@OSQZTw1Ig zo1B4ZmwXB!04*hzO6jNch3f11;+#^c6!|{qTb5O`sj0~gPVJ>H=iWZfB{Anrkt98R z`qb0n$HYTVH{zW2u=`&8nt=&&J_QhfmM}g(UcPwoqGGX_Bvof1=8JQhn3zy1l`4M^ z3=AldNO*GbA^-LAozMI8VjOGP#ZA3ko$W%$%YvuX*fSu}&W@U6^4*~T0?-mJU%8}M zET;KlrI9t4d$GUAd~r^(SWK6%Tv8&DAm7LQKPJrY>>j4#=5@47502mY6hHu4!bjVC z6pzQ1PNySMWky2My4POk=kxjFl8%234h|lWqIU;F9(yi5>k=4Id-{WQenlV(f zz0UXh`v**81_(gQ$Y!$<%c?Zl+A|@hZUaxJ(-F(E%BxE~k-ok@NtI$`e0<#V0>GJ{ zNF*Z8!pB6ump!(U9Nr`2c?av;$W=L7yHv zQGVycZpGst*L_becT@i^E$D{}KR12*bn=^@&rZ+)fG}$4Sz!D2?5cY%m%G{UV8{WtA+;1YN`X0G&J)*V!{UNz&OfIh{NeZ`z=On7?!P7T@yk%{(#w z`2he3vW5#F=SAOnF*e0n^z7Wd#n=3kr{cOd^TgMD)1MyzfFOT!-2=35&n}HgT3VKt zmMa(i@4nB~ocEG5-_Eti;a9%jpWkFY008a4bpdqy&Rq=*{iyEl?sexD78Z2-&fTUA zjQrNj2LPZQxGsQ-_h)otdaCaE9eek0YCz<-c0K?A?V#Zvpwi-sN{cJ&j!hxo-+TZ7 zf~=u^fF#K}cu0SeG&?<2b8HIv{^kP!5M&J(K+fHUON*7`Xs5X+k(2LlJ^%ng)|43_ zyYIxW84&W#=K}x`WSgD=igtF?9GgPEzxe*^mIJ Date: Sun, 15 Oct 2023 20:34:37 +0100 Subject: [PATCH 050/199] Automatic changelog for PR #4674 [ci skip] --- html/changelogs/AutoChangeLog-pr-4674.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4674.yml diff --git a/html/changelogs/AutoChangeLog-pr-4674.yml b/html/changelogs/AutoChangeLog-pr-4674.yml new file mode 100644 index 000000000000..50eab8e3be7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4674.yml @@ -0,0 +1,8 @@ +author: "Zonespace, Wei (sprites)" +delete-after: True +changes: + - balance: "Removed NSG, Type71, tactical Mar-40, and Mar-50 from the black market" + - balance: "Removed Ext. M4ra mags from the black market" + - balance: "Removed monkeycubes from the black market" + - balance: "Removed lunge mines from the black market" + - balance: "You now need a modified security access tuner to access the black market, which can be found ship- and ground-side where scanners and radios can spawn." \ No newline at end of file From 7e4a1dba7e9a87653c4fc0147272319e74036082 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 16 Oct 2023 01:09:22 +0000 Subject: [PATCH 051/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4643.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4644.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4661.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4662.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4670.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4674.yml | 8 ------- html/changelogs/AutoChangeLog-pr-4678.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4681.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4684.yml | 4 ---- html/changelogs/archive/2023-10.yml | 27 +++++++++++++++++++++++ 10 files changed, 27 insertions(+), 41 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4643.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4644.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4661.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4662.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4670.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4674.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4678.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4681.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4684.yml diff --git a/html/changelogs/AutoChangeLog-pr-4643.yml b/html/changelogs/AutoChangeLog-pr-4643.yml deleted file mode 100644 index 0ee2aa40b9aa..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4643.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Twomoon" -delete-after: True -changes: - - rscadd: "Added new haircut" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4644.yml b/html/changelogs/AutoChangeLog-pr-4644.yml deleted file mode 100644 index 87b5f8b82644..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4644.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Waseemq1235" -delete-after: True -changes: - - admin: "Makes subtle messages more noticeable." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4661.yml b/html/changelogs/AutoChangeLog-pr-4661.yml deleted file mode 100644 index 9f0d81051a27..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4661.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed issues with turfs, notably lighting, arising when building it from a sheets stack." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4662.yml b/html/changelogs/AutoChangeLog-pr-4662.yml deleted file mode 100644 index 2143bfb05a35..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4662.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "The Turing Machine should now keep working as intended if its linked Smartfridge is blown up." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4670.yml b/html/changelogs/AutoChangeLog-pr-4670.yml deleted file mode 100644 index 2acabfacff2d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4670.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - balance: "ERTs now have a variant of the standard medkit that has no storage lock." - - bugfix: "Lots of ERTs now correctly have a medkit spawning in their gear" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4674.yml b/html/changelogs/AutoChangeLog-pr-4674.yml deleted file mode 100644 index 50eab8e3be7f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4674.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Zonespace, Wei (sprites)" -delete-after: True -changes: - - balance: "Removed NSG, Type71, tactical Mar-40, and Mar-50 from the black market" - - balance: "Removed Ext. M4ra mags from the black market" - - balance: "Removed monkeycubes from the black market" - - balance: "Removed lunge mines from the black market" - - balance: "You now need a modified security access tuner to access the black market, which can be found ship- and ground-side where scanners and radios can spawn." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4678.yml b/html/changelogs/AutoChangeLog-pr-4678.yml deleted file mode 100644 index 40c1d2ddad3e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4678.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed 'Join as Freed Mob' verb crashing if freed mobs had previously been deleted." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4681.yml b/html/changelogs/AutoChangeLog-pr-4681.yml deleted file mode 100644 index e65421559570..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4681.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed the hive surge join as xeno observer alert text link not actually doing anything." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4684.yml b/html/changelogs/AutoChangeLog-pr-4684.yml deleted file mode 100644 index 0aa80df958d2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4684.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed xeno cultists always being created into normal hive, irrespective of the selected hive." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 05fc1ddd7ea2..5cd6bcd00c06 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -188,3 +188,30 @@ harryob: - admin: administrators without R_DEBUG can now restart the server without starting the round +2023-10-16: + CapCamIII: + - balance: ERTs now have a variant of the standard medkit that has no storage lock. + - bugfix: Lots of ERTs now correctly have a medkit spawning in their gear + Drathek: + - bugfix: Fixed the hive surge join as xeno observer alert text link not actually + doing anything. + Twomoon: + - rscadd: Added new haircut + Waseemq1235: + - admin: Makes subtle messages more noticeable. + Zonespace, Wei (sprites): + - balance: Removed NSG, Type71, tactical Mar-40, and Mar-50 from the black market + - balance: Removed Ext. M4ra mags from the black market + - balance: Removed monkeycubes from the black market + - balance: Removed lunge mines from the black market + - balance: You now need a modified security access tuner to access the black market, + which can be found ship- and ground-side where scanners and radios can spawn. + fira: + - bugfix: The Turing Machine should now keep working as intended if its linked Smartfridge + is blown up. + - bugfix: Fixed xeno cultists always being created into normal hive, irrespective + of the selected hive. + - bugfix: Fixed 'Join as Freed Mob' verb crashing if freed mobs had previously been + deleted. + - bugfix: Fixed issues with turfs, notably lighting, arising when building it from + a sheets stack. From 4911b13744f6a9ef187a1478138bbb453aabd761 Mon Sep 17 00:00:00 2001 From: Vile Beggar Date: Mon, 16 Oct 2023 06:29:47 +0200 Subject: [PATCH 052/199] Makes the Queen's psychic messages bigger (#4687) # About the pull request makes the queen's psychic messages (whisper and radiance) bigger. # Explain why it's good for the game unless you are specifically looking out for these messages, there is a really big likelihood that you're going to miss them in the heat of the moment. hopefully this should reduce such cases # Testing Photographs and Procedure
Screenshots & Videos ![xenosmall](https://github.com/cmss13-devs/cmss13/assets/17518895/87cf78f4-af32-431f-aed9-869600844bf0) ![xenobig](https://github.com/cmss13-devs/cmss13/assets/17518895/614ef7e1-e795-4ed5-884f-7fd9543837d1)
# Changelog :cl: qol: The Queen's psychic messages now use a bigger font and are harder to miss. /:cl: --- code/modules/mob/living/carbon/xenomorph/Abilities.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm index eb5a629760ee..0a6e0ff2ca26 100644 --- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm @@ -207,9 +207,9 @@ if(msg) log_say("PsychicWhisper: [key_name(X)]->[M.key] : [msg]") if(!istype(M, /mob/living/carbon/xenomorph)) - to_chat(M, SPAN_XENO("You hear a strange, alien voice in your head. \"[msg]\"")) + to_chat(M, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[msg]\"")) else - to_chat(M, SPAN_XENO("You hear the voice of [X] resonate in your head. \"[msg]\"")) + to_chat(M, SPAN_XENOQUEEN("You hear the voice of [X] resonate in your head. \"[msg]\"")) to_chat(X, SPAN_XENONOTICE("You said: \"[msg]\" to [M]")) return ..() @@ -234,9 +234,9 @@ continue target_list += possible_target if(!istype(possible_target, /mob/living/carbon/xenomorph)) - to_chat(possible_target, SPAN_XENO("You hear a strange, alien voice in your head. \"[msg]\"")) + to_chat(possible_target, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[msg]\"")) else - to_chat(possible_target, SPAN_XENO("You hear the voice of [X] resonate in your head. \"[msg]\"")) + to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [X] resonate in your head. \"[msg]\"")) if(!length(target_list)) return var/targetstring = english_list(target_list) From d04fbdbc66258ab723e4fcc5130a83367a5d59aa Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 16 Oct 2023 05:38:02 +0100 Subject: [PATCH 053/199] Automatic changelog for PR #4687 [ci skip] --- html/changelogs/AutoChangeLog-pr-4687.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4687.yml diff --git a/html/changelogs/AutoChangeLog-pr-4687.yml b/html/changelogs/AutoChangeLog-pr-4687.yml new file mode 100644 index 000000000000..77fb738581b7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4687.yml @@ -0,0 +1,4 @@ +author: "VileBeggar" +delete-after: True +changes: + - qol: "The Queen's psychic messages now use a bigger font and are harder to miss." \ No newline at end of file From ab4a617582ce154871ed9469910467739728c33f Mon Sep 17 00:00:00 2001 From: Warfan1815 <69102610+Warfan1815@users.noreply.github.com> Date: Tue, 17 Oct 2023 01:01:03 +0100 Subject: [PATCH 054/199] Squad Briefings 2: The Briefening (#4539) # About the pull request Adds optional briefing rooms in place of long-rest bunks (moved further north and south respectively) that don't replace standard briefing. Excuse for me having to make a new PR, I fucked up the old branch so beyond repair I had to close it (next time I won't mess around with merge conflicts and just trust the hook) # Explain why it's good for the game Gives SLs a platform where they can host anything they want. As well , if command wants to brief the SLs and then have the SLs brief squads they can also do that. The old squad briefing room PR was cool, its just it was replacing instead of adding. Here I hope to satisfy both camps. # Testing Photographs and Procedure
Screenshots & Videos ![map](https://cdn.discordapp.com/attachments/746325498896056329/1156699977750413352/2023-09-27_22.12.02.png?ex=6515ec4d&is=65149acd&hm=c3714095cc2af47b74f98730fbde3a813258ee5cac50664f7170d5fa41cb426e&)
:cl: mapadd: New Squad Briefings south and north of normal briefing! Feel free to use them to your heart's content. maptweak: Moved long-rest bunks further north and further south of where they were originally /:cl: --- maps/map_files/USS_Almayer/USS_Almayer.dmm | 5534 +++++++++++--------- 1 file changed, 2952 insertions(+), 2582 deletions(-) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index fb842c754dd9..e77f1db95b95 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -1973,6 +1973,24 @@ "agu" = ( /turf/open/floor/almayer, /area/almayer/living/officer_study) +"agv" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/almayer/glass{ + access_modified = 1; + dir = 2; + name = "\improper Requisitions Break Room"; + req_one_access_txt = "19;21" + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/squads/req) "agw" = ( /obj/structure/machinery/light{ dir = 8 @@ -2370,19 +2388,6 @@ icon_state = "bluecorner" }, /area/almayer/living/offices/flight) -"ahX" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "SE-out" - }, -/obj/effect/decal/warning_stripes{ - icon_state = "NE-out"; - pixel_y = 1 - }, -/obj/structure/machinery/door/airlock/almayer/maint, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/upper_hull/u_a_s) "ahY" = ( /obj/structure/machinery/light, /obj/structure/surface/table/woodentable/fancy, @@ -3352,12 +3357,6 @@ icon_state = "red" }, /area/almayer/living/starboard_garden) -"akX" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "akY" = ( /obj/structure/cable/heavyduty{ icon_state = "4-8" @@ -3449,13 +3448,6 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/hallways/aft_hallway) -"alm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "alo" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_18" @@ -3489,15 +3481,6 @@ /obj/item/device/radio, /turf/open/floor/wood/ship, /area/almayer/living/commandbunks) -"alv" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 8; - name = "ship-grade camera" - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_p) "alw" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 2; @@ -5867,14 +5850,6 @@ icon_state = "plate" }, /area/almayer/medical/morgue) -"asV" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/north2) "asW" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -6646,14 +6621,6 @@ icon_state = "cargo" }, /area/almayer/engineering/engineering_workshop/hangar) -"auJ" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/north1) "auK" = ( /obj/structure/stairs/perspective{ icon_state = "p_stair_sn_full_cap" @@ -7827,28 +7794,6 @@ icon_state = "redcorner" }, /area/almayer/shipboard/navigation) -"ayy" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = 15 - }, -/obj/structure/machinery/light, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Bravo Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Bravo Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = -8 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "ayz" = ( /obj/structure/bed/chair/office/dark{ dir = 8; @@ -8497,47 +8442,6 @@ icon_state = "plate" }, /area/almayer/command/cic) -"aAD" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door_control{ - id = "CIC Lockdown"; - name = "CIC Lockdown"; - pixel_x = -7; - pixel_y = 9; - req_access_txt = "1" - }, -/obj/structure/machinery/door_control{ - id = "Hangar Lockdown"; - name = "Hangar Lockdown"; - pixel_x = -7; - pixel_y = 2; - req_access_txt = "1" - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4; - icon_state = "exposed01-supply" - }, -/obj/structure/machinery/door_control{ - id = "bot_armory"; - name = "Armory Lockdown"; - pixel_x = -7; - pixel_y = -5; - req_one_access_txt = "1;4" - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Combat Information Center Telephone"; - phone_category = "Command"; - phone_id = "Combat Information Center"; - pixel_x = 5; - pixel_y = 4 - }, -/obj/structure/machinery/door/window/westright{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "aAE" = ( /obj/structure/pipes/vents/scrubber{ dir = 8 @@ -8927,18 +8831,6 @@ }, /turf/open/floor/almayer, /area/almayer/command/cic) -"aBN" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - name = "\improper Port Railguns and Viewing Room" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/upper_hull/u_f_p) "aBP" = ( /obj/structure/machinery/door/airlock/almayer/maint/reinforced{ access_modified = 1; @@ -8965,30 +8857,6 @@ icon_state = "silver" }, /area/almayer/command/cic) -"aBV" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = -17 - }, -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Charlie Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Charlie Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = 7 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "aBW" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -9124,12 +8992,6 @@ icon_state = "sterile_green" }, /area/almayer/medical/medical_science) -"aCu" = ( -/obj/structure/sink{ - pixel_y = 24 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "aCv" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 2; @@ -9226,13 +9088,6 @@ icon_state = "orangecorner" }, /area/almayer/engineering/upper_engineering) -"aDf" = ( -/obj/structure/machinery/shower{ - pixel_y = 16 - }, -/obj/item/tool/soap, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "aDg" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -11069,6 +10924,13 @@ allow_construction = 0 }, /area/almayer/hallways/aft_hallway) +"aKK" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 1; + name = "\improper Tool Closet" + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/living/port_emb) "aKN" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/clothing/accessory/red, @@ -11458,13 +11320,6 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) "aMM" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, /turf/open/floor/almayer{ dir = 4; icon_state = "red" @@ -12161,18 +12016,21 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) -"aQA" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 +"aQD" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19"; + access_modified = 1 }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 }, /turf/open/floor/almayer{ - icon_state = "dark_sterile" + icon_state = "test_floor4" }, -/area/almayer/hull/upper_hull/u_a_s) +/area/almayer/living/briefing) "aQF" = ( /turf/closed/wall/almayer, /area/almayer/living/offices) @@ -12294,21 +12152,6 @@ icon_state = "test_floor4" }, /area/almayer/engineering/upper_engineering) -"aRk" = ( -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/hull/upper_hull/u_a_s) "aRo" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -12530,6 +12373,15 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) +"aSh" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/item/prop/helmetgarb/helmet_nvg/cosmetic, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "aSl" = ( /obj/structure/machinery/light, /obj/structure/machinery/cm_vending/sorted/medical, @@ -13541,12 +13393,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) -"aWN" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "aWR" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, @@ -13848,10 +13694,6 @@ icon_state = "plate" }, /area/almayer/hallways/starboard_hallway) -"aYU" = ( -/obj/structure/largecrate/supply/supplies/flares, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "aYV" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -14443,24 +14285,10 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) -"bbI" = ( -/obj/structure/machinery/door/airlock/almayer/maint, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - layer = 1.9 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) "bbJ" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer{ - icon_state = "greencorner" + icon_state = "green" }, /area/almayer/hallways/starboard_hallway) "bbL" = ( @@ -14488,18 +14316,6 @@ "bbS" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/starboard_point_defense) -"bbU" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = -25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "bbV" = ( /obj/structure/machinery/light{ dir = 8 @@ -14802,31 +14618,6 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_s) -"bdp" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) -"bdq" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) "bdr" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) @@ -15104,12 +14895,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) -"beO" = ( -/turf/open/floor/almayer{ - dir = 5; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) "beP" = ( /obj/item/stack/catwalk, /obj/structure/disposalpipe/segment{ @@ -15170,12 +14955,6 @@ }, /turf/open/floor/almayer, /area/almayer/living/chapel) -"bfa" = ( -/obj/structure/machinery/cm_vending/sorted/tech/tool_storage, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bfb" = ( /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, @@ -15540,12 +15319,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_one) -"bgF" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) "bgG" = ( /obj/structure/window/framed/almayer/white, /turf/open/floor/plating, @@ -17024,12 +16797,6 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) -"bpf" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "bph" = ( /obj/structure/bed/chair/comfy/orange, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -17489,10 +17256,6 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) -"brT" = ( -/obj/structure/machinery/light, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_a_s) "brW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -17542,16 +17305,6 @@ /obj/structure/machinery/computer/arcade, /turf/open/floor/wood/ship, /area/almayer/command/corporateliason) -"bsf" = ( -/obj/structure/machinery/camera/autoname/almayer{ - dir = 8; - name = "ship-grade camera" - }, -/obj/structure/largecrate/random, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_s) "bsj" = ( /obj/structure/machinery/line_nexter/med{ dir = 4 @@ -18941,19 +18694,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) -"bzG" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/obj/effect/landmark/yautja_teleport, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "bzH" = ( /obj/structure/surface/rack, /obj/effect/spawner/random/toolbox, @@ -19480,21 +19220,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_lobby) -"bCf" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "bCg" = ( /obj/structure/machinery/light{ dir = 8 @@ -20843,15 +20568,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) -"bHM" = ( -/obj/structure/machinery/cm_vending/sorted/tech/comp_storage, -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bHP" = ( /turf/open/floor/plating/almayer, /area/almayer/shipboard/weapon_room) @@ -20993,17 +20709,6 @@ icon_state = "cargo" }, /area/almayer/squads/req) -"bIu" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - name = "Storage"; - req_one_access_txt = "19;21" - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/squads/req) "bIw" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/light{ @@ -21461,21 +21166,6 @@ icon_state = "red" }, /area/almayer/shipboard/weapon_room) -"bKo" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/machinery/disposal/broken, -/obj/item/reagent_container/food/drinks/cans/beer{ - layer = 3.1; - pixel_x = -7; - pixel_y = 16 - }, -/obj/structure/machinery/light, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "bKp" = ( /obj/structure/surface/table/almayer, /obj/item/paper_bin/uscm, @@ -22124,6 +21814,21 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_s) +"bMY" = ( +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/hull/upper_hull/u_a_s) "bNa" = ( /obj/structure/surface/table/almayer, /obj/item/folder/black, @@ -22270,15 +21975,6 @@ icon_state = "kitchen" }, /area/almayer/living/grunt_rnr) -"bNz" = ( -/obj/structure/surface/rack, -/obj/item/frame/table, -/obj/item/frame/table, -/obj/item/frame/table, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bNA" = ( /obj/structure/machinery/computer/ordercomp, /obj/structure/sign/safety/galley{ @@ -23294,6 +22990,17 @@ icon_state = "test_floor4" }, /area/almayer/squads/req) +"bRS" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + dir = 1; + name = "\improper Kitchen Hydroponics"; + req_one_access_txt = "30;19"; + access_modified = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "bRU" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -23780,8 +23487,14 @@ }, /area/almayer/living/briefing) "bUc" = ( -/obj/structure/foamed_metal, -/turf/open/floor/plating, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "Secretroom"; + indestructible = 1; + unacidable = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/hull/lower_hull/l_m_s) "bUd" = ( /turf/open/floor/almayer{ @@ -23995,19 +23708,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_m_s) -"bUR" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "blue" - }, -/area/almayer/hallways/port_hallway) "bUT" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 26 @@ -24111,25 +23811,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"bVr" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/upper_hull/u_f_p) -"bVt" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "bVw" = ( /turf/open/floor/almayer{ dir = 4; @@ -24345,12 +24026,6 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engineering_workshop/hangar) -"bWy" = ( -/obj/structure/closet/toolcloset, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "bWC" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out"; @@ -25784,6 +25459,17 @@ icon_state = "plate" }, /area/almayer/engineering/lower_engineering) +"ccF" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "ccG" = ( /obj/structure/largecrate/random/secure, /obj/effect/decal/warning_stripes{ @@ -26383,6 +26069,18 @@ }, /turf/open/floor/almayer, /area/almayer/squads/charlie) +"cgz" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/sign/poster{ + desc = "Eat an EAT bar! ...Aren't they called MEAT bars?"; + icon_state = "poster7"; + name = "EAT - poster"; + pixel_x = 27 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "cgA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27025,13 +26723,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_a_s) -"ckD" = ( -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/turf/closed/wall/almayer, -/area/almayer/hull/lower_hull/l_m_p) "ckI" = ( /obj/structure/disposalpipe/segment, /obj/item/device/radio/intercom{ @@ -27380,15 +27071,9 @@ }, /area/almayer/hull/lower_hull/l_m_p) "clR" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, /turf/open/floor/almayer{ - icon_state = "test_floor4" + dir = 4; + icon_state = "blue" }, /area/almayer/hallways/port_hallway) "clS" = ( @@ -27449,25 +27134,13 @@ icon_state = "plate" }, /area/almayer/squads/delta) -"cmb" = ( -/obj/structure/machinery/door/airlock/almayer/maint, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "cmc" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_y = -30 + }, /turf/open/floor/almayer{ icon_state = "green" }, @@ -28100,24 +27773,18 @@ icon_state = "greencorner" }, /area/almayer/hallways/starboard_hallway) -"csw" = ( -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 6; - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "csz" = ( /turf/open/floor/almayer{ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_p) +"csG" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/item/trash/popcorn, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "csI" = ( /turf/open/floor/almayer{ dir = 8; @@ -28993,6 +28660,13 @@ icon_state = "orangecorner" }, /area/almayer/engineering/upper_engineering/port) +"cKX" = ( +/obj/structure/platform, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "cKY" = ( /obj/structure/machinery/light, /turf/open/floor/almayer{ @@ -29054,6 +28728,12 @@ icon_state = "cargo" }, /area/almayer/living/bridgebunks) +"cLV" = ( +/obj/structure/largecrate/random/barrel/green, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "cMl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29297,6 +28977,16 @@ icon_state = "red" }, /area/almayer/shipboard/starboard_missiles) +"cSK" = ( +/obj/structure/sign/safety/hvac_old{ + pixel_x = 8; + pixel_y = 32 + }, +/obj/structure/largecrate/supply/supplies/flares, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "cSN" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/light{ @@ -29819,13 +29509,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/weapon_room) -"ddG" = ( -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "ddK" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -30017,6 +29700,15 @@ icon_state = "test_floor4" }, /area/almayer/hallways/starboard_umbilical) +"diw" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "diz" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ id_tag = "Boat1-D4"; @@ -30163,6 +29855,15 @@ icon_state = "red" }, /area/almayer/living/briefing) +"dkH" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "dkO" = ( /obj/effect/step_trigger/teleporter_vector{ name = "Almayer_Down2"; @@ -30401,6 +30102,21 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"dpo" = ( +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/sign/safety/waterhazard{ + pixel_y = 32 + }, +/obj/structure/sign/safety/rewire{ + pixel_x = 14; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/north1) "dpy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30439,6 +30155,13 @@ /obj/structure/largecrate/random/secure, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_s) +"dqg" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "dqj" = ( /turf/open/floor/almayer{ dir = 4; @@ -31307,21 +31030,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) -"dGW" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "dHd" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -31642,6 +31350,15 @@ icon_state = "silver" }, /area/almayer/command/airoom) +"dQs" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "dQv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -31880,6 +31597,18 @@ icon_state = "blue" }, /area/almayer/living/briefing) +"dVm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + name = "\improper Port Railguns and Viewing Room" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hull/upper_hull/u_f_p) "dVu" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -32549,15 +32278,6 @@ icon_state = "plate" }, /area/almayer/living/port_emb) -"ehZ" = ( -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_f_p) "eim" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -32734,17 +32454,6 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering) -"elh" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 - }, -/obj/structure/machinery/light{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer, -/area/almayer/shipboard/brig/cic_hallway) "elq" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -32856,6 +32565,9 @@ /area/almayer/shipboard/brig/evidence_storage) "enx" = ( /obj/structure/pipes/vents/pump, +/obj/structure/machinery/status_display{ + pixel_y = 30 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "green" @@ -32880,6 +32592,18 @@ /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/almayer, /area/almayer/engineering/upper_engineering/port) +"eoM" = ( +/obj/structure/surface/table/almayer, +/obj/item/storage/beer_pack, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = -27; + serial_number = 11 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "eoP" = ( /obj/structure/bed, /obj/structure/machinery/flasher{ @@ -32903,6 +32627,20 @@ icon_state = "red" }, /area/almayer/hallways/aft_hallway) +"epq" = ( +/obj/structure/stairs/perspective{ + dir = 1; + icon_state = "p_stair_full" + }, +/obj/structure/sign/poster{ + desc = "One of those hot, tanned babes back the beaches of good ol' Earth."; + icon_state = "poster12"; + name = "Beach Babe Pinup"; + pixel_x = 27; + serial_number = 12 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "epu" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/poddoor/almayer/open{ @@ -33153,15 +32891,6 @@ icon_state = "plating" }, /area/almayer/engineering/upper_engineering) -"etB" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/safety/storage{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "etE" = ( /obj/structure/prop/almayer/name_stencil, /turf/open/floor/almayer_hull{ @@ -33278,6 +33007,16 @@ icon_state = "greencorner" }, /area/almayer/hallways/starboard_hallway) +"ewr" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/shipboard/brig/cic_hallway) "ewO" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -33406,6 +33145,14 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lockerroom) +"ezO" = ( +/obj/item/tool/screwdriver{ + layer = 2.9; + pixel_x = -21; + pixel_y = -14 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/living/port_emb) "ezQ" = ( /obj/structure/sign/safety/restrictedarea{ pixel_x = 8; @@ -33428,6 +33175,20 @@ icon_state = "red" }, /area/almayer/shipboard/brig/lobby) +"ezW" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/item/tool/soap, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "ezX" = ( /obj/structure/bed/chair/wood/normal, /turf/open/floor/wood/ship, @@ -33587,6 +33348,16 @@ }, /turf/open/floor/almayer, /area/almayer/living/bridgebunks) +"eDz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/sign/safety/distribution_pipes{ + pixel_x = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "eDG" = ( /obj/structure/barricade/handrail{ dir = 1; @@ -33818,21 +33589,6 @@ icon_state = "plate" }, /area/almayer/command/corporateliason) -"eHq" = ( -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = 16; - pixel_y = -15 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/prop/invuln/pipe_water{ - pixel_x = 17 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "eHx" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/faxmachine/uscm/command, @@ -33991,19 +33747,6 @@ icon_state = "test_floor4" }, /area/almayer/engineering/laundry) -"eMn" = ( -/obj/structure/machinery/light, -/obj/structure/sign/safety/waterhazard{ - pixel_y = -32 - }, -/obj/structure/sign/safety/rewire{ - pixel_x = 14; - pixel_y = -32 - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/south1) "eMP" = ( /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -34081,6 +33824,15 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) +"eOs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hallways/starboard_hallway) "eOM" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ dir = 2; @@ -34231,27 +33983,6 @@ icon_state = "outerhull_dir" }, /area/space) -"eSV" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = -17 - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Delta Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Delta Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = 7 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "eTd" = ( /obj/structure/surface/table/almayer, /obj/item/trash/boonie{ @@ -34384,11 +34115,6 @@ icon_state = "test_floor4" }, /area/almayer/living/briefing) -"eVy" = ( -/obj/structure/surface/table/almayer, -/obj/item/storage/beer_pack, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "eVQ" = ( /obj/structure/machinery/light{ dir = 4 @@ -34454,7 +34180,7 @@ /area/almayer/living/offices) "eXE" = ( /turf/open/floor/almayer{ - dir = 8; + dir = 9; icon_state = "green" }, /area/almayer/hallways/port_hallway) @@ -34827,19 +34553,6 @@ icon_state = "green" }, /area/almayer/living/grunt_rnr) -"feC" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "feD" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -34879,6 +34592,17 @@ icon_state = "plating" }, /area/almayer/command/airoom) +"ffV" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/crew/alt, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Brig Cells Telephone"; + phone_category = "Almayer"; + phone_id = "Brig Cells"; + pixel_x = 15 + }, +/turf/open/floor/almayer, +/area/almayer/shipboard/brig/processing) "fgh" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -35064,24 +34788,6 @@ icon_state = "silver" }, /area/almayer/living/briefing) -"fmf" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/almayer/glass{ - access_modified = 1; - dir = 2; - name = "\improper Requisitions Break Room"; - req_one_access_txt = "19;21" - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/squads/req) "fmv" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -35434,8 +35140,8 @@ }, /area/almayer/shipboard/brig/armory) "fsH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/machinery/firealarm{ + pixel_y = 28 }, /turf/open/floor/almayer{ dir = 1; @@ -35457,6 +35163,14 @@ icon_state = "plating" }, /area/almayer/shipboard/brig/armory) +"fsU" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/north1) "fsV" = ( /obj/structure/target, /turf/open/floor/almayer{ @@ -35532,6 +35246,20 @@ }, /turf/open/floor/plating, /area/almayer/shipboard/brig/perma) +"fuY" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice2"; + pixel_x = 16; + pixel_y = 16 + }, +/obj/structure/largecrate/supply/supplies/flares, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "fvd" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -35597,14 +35325,6 @@ icon_state = "plate" }, /area/almayer/living/starboard_garden) -"fwF" = ( -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_s) "fwY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -35653,6 +35373,25 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) +"fxR" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + pixel_x = -8 + }, +/obj/item/toy/farwadoll{ + desc = "A USCM approved plush doll. It's not soft and hardly comforting!"; + force = 15; + icon_state = "therapyred"; + layer = 4.1; + name = "Sergeant Huggs"; + pixel_y = -1; + throwforce = 15; + pixel_x = 7 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "fxW" = ( /obj/structure/platform_decoration{ dir = 1 @@ -35691,6 +35430,9 @@ }, /turf/open/floor/plating/almayer, /area/almayer/living/briefing) +"fza" = ( +/turf/open/floor/almayer, +/area/almayer/hull/lower_hull/l_m_s) "fzq" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -35767,12 +35509,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_a_s) -"fBx" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/port_hallway) "fBA" = ( /obj/item/device/assembly/mousetrap/armed, /obj/structure/pipes/standard/manifold/hidden/supply{ @@ -35916,17 +35652,6 @@ icon_state = "test_floor4" }, /area/almayer/command/cichallway) -"fEo" = ( -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - name = "Kitchen"; - req_one_access_txt = "30;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "fEC" = ( /obj/structure/machinery/power/apc/almayer, /turf/open/floor/almayer{ @@ -35969,17 +35694,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/morgue) -"fFz" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 4; - id = "Secretroom"; - indestructible = 1; - unacidable = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/lower_hull/l_m_p) "fFD" = ( /obj/structure/window/reinforced{ dir = 4; @@ -36194,18 +35908,6 @@ }, /turf/open/floor/almayer, /area/almayer/living/pilotbunks) -"fJA" = ( -/obj/structure/coatrack, -/obj/structure/sign/poster/clf{ - pixel_x = -28 - }, -/obj/structure/sign/nosmoking_1{ - pixel_y = 30 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "fJO" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -36555,15 +36257,12 @@ /obj/effect/step_trigger/clone_cleaner, /turf/closed/wall/almayer, /area/almayer/hull/upper_hull/u_m_p) -"fQS" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "plate" +"fQQ" = ( +/turf/open/floor/almayer_hull{ + dir = 8; + icon_state = "outerhull_dir" }, -/area/almayer/hull/upper_hull/u_f_p) +/area/almayer/hull/lower_hull/l_m_p) "fRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -36622,13 +36321,6 @@ /obj/item/tool/soap/syndie, /turf/open/floor/almayer, /area/almayer/living/port_emb) -"fSG" = ( -/obj/structure/bed/chair{ - dir = 8; - pixel_y = 3 - }, -/turf/open/floor/almayer, -/area/almayer/living/grunt_rnr) "fTi" = ( /obj/structure/largecrate/supply/floodlights, /turf/open/floor/almayer{ @@ -36849,6 +36541,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/req) +"fZq" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer, +/area/almayer/shipboard/brig/cic_hallway) "fZx" = ( /obj/structure/sign/safety/security{ pixel_x = 15; @@ -37396,17 +37096,6 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/lower_medical_medbay) -"gjL" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/computer/crew/alt, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Brig Cells Telephone"; - phone_category = "Almayer"; - phone_id = "Brig Cells"; - pixel_x = 15; - }, -/turf/open/floor/almayer, -/area/almayer/shipboard/brig/processing) "gjN" = ( /obj/effect/landmark/yautja_teleport, /turf/open/floor/almayer{ @@ -37489,6 +37178,20 @@ /obj/structure/bed/chair/office/dark, /turf/open/floor/carpet, /area/almayer/living/commandbunks) +"gmb" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; + dir = 1; + name = "Storage"; + req_one_access_txt = "19;21" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/squads/req) "gmj" = ( /obj/structure/machinery/portable_atmospherics/canister/air, /turf/open/floor/almayer{ @@ -37547,6 +37250,24 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/weapon_room) +"goy" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/airlock/almayer/generic{ + name = "\improper Dorms" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "goD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37583,15 +37304,6 @@ icon_state = "test_floor4" }, /area/almayer/hallways/hangar) -"gpE" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/safety/distribution_pipes{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "gpI" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -37603,6 +37315,16 @@ "gpY" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/lifeboat_pumps/north1) +"gqq" = ( +/obj/structure/machinery/camera/autoname/almayer{ + dir = 8; + name = "ship-grade camera" + }, +/obj/structure/largecrate/random, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_s) "gqK" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -37693,15 +37415,6 @@ }, /turf/open/floor/wood/ship, /area/almayer/living/basketball) -"gte" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "gtp" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /obj/structure/disposalpipe/junction{ @@ -37731,8 +37444,7 @@ dir = 1 }, /turf/open/floor/almayer{ - dir = 8; - icon_state = "greencorner" + icon_state = "green" }, /area/almayer/hallways/port_hallway) "guC" = ( @@ -37745,21 +37457,6 @@ }, /turf/open/floor/carpet, /area/almayer/command/corporateliason) -"guG" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/obj/item/tool/soap, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "guS" = ( /obj/structure/reagent_dispensers/fueltank/custom, /turf/open/floor/almayer{ @@ -38191,6 +37888,15 @@ icon_state = "plate" }, /area/almayer/squads/bravo) +"gBg" = ( +/obj/item/reagent_container/food/drinks/cans/beer{ + layer = 3.1; + pixel_x = -7; + pixel_y = 16 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/living/port_emb) "gBi" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -38206,6 +37912,14 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"gBW" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/south1) "gCd" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -38403,27 +38117,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) -"gHl" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/computer/overwatch/almayer{ - dir = 8; - layer = 3.2; - pixel_x = -17; - pixel_y = 16 - }, -/obj/structure/transmitter/rotary/no_dnd{ - name = "Alpha Overwatch Telephone"; - phone_category = "Command"; - phone_id = "Alpha Overwatch" - }, -/obj/structure/sign/safety/terminal{ - pixel_x = -17; - pixel_y = -8 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/command/cic) "gHo" = ( /obj/structure/machinery/door/airlock/almayer/marine/delta/tl, /turf/open/floor/almayer{ @@ -38519,6 +38212,13 @@ icon_state = "redfull" }, /area/almayer/shipboard/port_missiles) +"gKH" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/item/trash/uscm_mre, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "gKJ" = ( /obj/structure/machinery/vending/cola{ density = 0; @@ -38701,6 +38401,15 @@ icon_state = "cargo" }, /area/almayer/engineering/engine_core) +"gNi" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "gNp" = ( /turf/open/floor/almayer{ dir = 9; @@ -38898,6 +38607,21 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) +"gSZ" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door/window/eastright{ + dir = 8; + req_access_txt = "19"; + access_modified = 1 + }, +/obj/effect/landmark/map_item, +/obj/structure/machinery/door/window/eastleft{ + req_access_txt = "19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "gTl" = ( /obj/structure/pipes/vents/pump{ dir = 8 @@ -39160,6 +38884,17 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_m_p) +"gZj" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + name = "Kitchen"; + req_one_access_txt = "30;19"; + access_modified = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "gZr" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/device/camera_film{ @@ -39176,6 +38911,16 @@ /obj/structure/bed/sofa/vert/grey/bot, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) +"gZG" = ( +/obj/structure/largecrate/supply/supplies/mre, +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "gZK" = ( /turf/open/floor/almayer, /area/almayer/living/auxiliary_officer_office) @@ -39425,6 +39170,15 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"heb" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "hec" = ( /turf/open/floor/almayer{ dir = 8; @@ -39522,6 +39276,10 @@ icon_state = "red" }, /area/almayer/command/lifeboat) +"hfy" = ( +/obj/structure/machinery/light, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "hfO" = ( /obj/structure/surface/table/almayer, /obj/item/reagent_container/spray/cleaner, @@ -40405,17 +40163,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"hzP" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/power/apc/almayer{ - dir = 1 - }, -/obj/structure/machinery/recharger, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "hzV" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -40501,6 +40248,17 @@ /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) +"hBL" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19"; + access_modified = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "hBU" = ( /obj/structure/largecrate/random/secure, /obj/effect/decal/warning_stripes{ @@ -40560,6 +40318,13 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"hDL" = ( +/obj/structure/sign/safety/distribution_pipes{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "hDR" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/storage/syringe_case{ @@ -40651,6 +40416,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) +"hGI" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "hGN" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -40911,18 +40685,17 @@ }, /area/almayer/shipboard/brig/main_office) "hNL" = ( -/obj/structure/machinery/firealarm{ - pixel_y = 28 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters"; + dir = 8 + }, /turf/open/floor/almayer{ - dir = 1; - icon_state = "green" + icon_state = "test_floor4" }, /area/almayer/hallways/port_hallway) "hNM" = ( @@ -41079,22 +40852,6 @@ icon_state = "plate" }, /area/almayer/squads/alpha) -"hRg" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = -16; - pixel_y = -15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "hRi" = ( /obj/structure/pipes/vents/scrubber{ dir = 1 @@ -41438,6 +41195,24 @@ }, /turf/open/floor/almayer, /area/almayer/squads/alpha_bravo_shared) +"hXm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer, +/area/almayer/shipboard/brig/cic_hallway) +"hXS" = ( +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = -32 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_p) "hXV" = ( /obj/structure/machinery/light{ dir = 1 @@ -41696,6 +41471,14 @@ icon_state = "plate" }, /area/almayer/living/port_emb) +"iew" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/item/trash/uscm_mre, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "iey" = ( /obj/structure/surface/table/almayer, /obj/item/roller, @@ -42074,6 +41857,15 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"inh" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/shipboard/brig/cic_hallway) "ins" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -42152,6 +41944,20 @@ }, /turf/open/floor/almayer, /area/almayer/squads/req) +"ipb" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 1; + req_one_access = null; + req_one_access_txt = "30;19"; + access_modified = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "ipe" = ( /obj/item/toy/crayon{ name = "chewed crayon"; @@ -42271,16 +42077,6 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south2) -"irI" = ( -/obj/structure/sign/safety/maint{ - pixel_y = 32 - }, -/obj/structure/sign/safety/storage{ - pixel_x = 15; - pixel_y = 32 - }, -/turf/open/floor/almayer, -/area/almayer/hallways/starboard_hallway) "irJ" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -42551,6 +42347,17 @@ icon_state = "dark_sterile" }, /area/almayer/engineering/laundry) +"iwI" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; + name = "Storage"; + req_one_access_txt = "19;21" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/squads/req) "iwJ" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out"; @@ -42676,6 +42483,12 @@ icon_state = "blue" }, /area/almayer/squads/delta) +"iza" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "izk" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -42685,6 +42498,17 @@ icon_state = "plate" }, /area/almayer/living/offices) +"izr" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/sign/poster/propaganda{ + pixel_x = -27 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "izx" = ( /obj/structure/reagent_dispensers/water_cooler/stacks{ density = 0; @@ -42760,6 +42584,15 @@ "iBt" = ( /turf/open/floor/plating, /area/almayer/hull/upper_hull/u_m_p) +"iBx" = ( +/obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "iBE" = ( /obj/effect/landmark/yautja_teleport, /turf/open/floor/almayer{ @@ -42777,6 +42610,15 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_p) +"iBT" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "iBY" = ( /obj/structure/machinery/vending/snack, /turf/open/floor/almayer{ @@ -42817,6 +42659,14 @@ icon_state = "test_floor4" }, /area/almayer/command/cichallway) +"iCz" = ( +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_s) "iCF" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -42957,13 +42807,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_four) -"iGE" = ( -/obj/structure/janitorialcart, -/obj/item/tool/mop, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "iGK" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -43008,17 +42851,6 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/cells) -"iHO" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/item/storage/fancy/crayons{ - layer = 3.1; - pixel_x = -11; - pixel_y = 16 - }, -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "iIl" = ( /obj/structure/sink{ dir = 8; @@ -43225,15 +43057,6 @@ icon_state = "silver" }, /area/almayer/command/computerlab) -"iLQ" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "orangecorner" - }, -/area/almayer/hallways/starboard_hallway) "iMm" = ( /turf/open/floor/almayer, /area/almayer/living/grunt_rnr) @@ -43389,22 +43212,6 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) -"iQL" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 2; - req_one_access = list(2,34,30) - }, -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = 16; - pixel_y = -16 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "iRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -43587,15 +43394,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) -"iVY" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/shipboard/brig/cic_hallway) "iVZ" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/folder/black, @@ -43965,12 +43763,6 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/shipboard/brig/processing) -"jcl" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "jcK" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -44028,6 +43820,13 @@ icon_state = "dark_sterile" }, /area/almayer/medical/operating_room_three) +"jdQ" = ( +/obj/structure/machinery/shower{ + pixel_y = 16 + }, +/obj/item/tool/soap, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "jea" = ( /obj/structure/sign/safety/autoopenclose{ pixel_y = 32 @@ -44297,6 +44096,18 @@ icon_state = "green" }, /area/almayer/living/offices) +"jhz" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19"; + access_modified = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "jhA" = ( /obj/structure/bed/chair{ dir = 8; @@ -44328,16 +44139,6 @@ icon_state = "silver" }, /area/almayer/hull/upper_hull/u_m_p) -"jip" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - access_modified = 1; - name = "\improper Main Kitchen"; - req_one_access_txt = "30;19" - }, -/turf/open/floor/prison{ - icon_state = "kitchen" - }, -/area/almayer/living/grunt_rnr) "jiw" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -44376,14 +44177,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/vehiclehangar) -"jjK" = ( -/obj/structure/surface/table/almayer, -/obj/item/paper_bin/uscm, -/obj/item/tool/pen, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "jjM" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -44940,6 +44733,29 @@ "jvY" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/command/telecomms) +"jwD" = ( +/obj/structure/prop/almayer/computers/sensor_computer2, +/obj/structure/machinery/door_control{ + id = "Secretroom"; + indestructible = 1; + layer = 2.5; + name = "Shutters"; + use_power = 0 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) +"jwI" = ( +/obj/structure/window/framed/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "jwK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -45308,12 +45124,12 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) "jJe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_y = 25 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "green" @@ -45342,6 +45158,15 @@ /obj/effect/landmark/start/doctor, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/offices) +"jKl" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "jKn" = ( /turf/open/floor/almayer{ dir = 5; @@ -45421,6 +45246,15 @@ icon_state = "kitchen" }, /area/almayer/living/captain_mess) +"jLv" = ( +/obj/structure/machinery/firealarm{ + dir = 1; + pixel_y = -28 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "jLK" = ( /obj/structure/machinery/light{ dir = 4 @@ -45668,22 +45502,6 @@ dir = 8 }, /area/almayer/medical/containment/cell) -"jQA" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) -"jRn" = ( -/obj/structure/machinery/light/small, -/obj/structure/largecrate/supply/supplies/mre, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "jRz" = ( /obj/effect/step_trigger/teleporter/random{ affect_ghosts = 1; @@ -45750,6 +45568,15 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) +"jSy" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/bed/chair{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/grunt_rnr) "jSU" = ( /obj/structure/bed/chair{ can_buckle = 0; @@ -45894,6 +45721,15 @@ icon_state = "dark_sterile" }, /area/almayer/medical/medical_science) +"jUT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "jUW" = ( /obj/effect/step_trigger/clone_cleaner, /obj/effect/decal/warning_stripes{ @@ -46142,6 +45978,12 @@ "kan" = ( /turf/closed/wall/almayer/white, /area/almayer/medical/lower_medical_medbay) +"kat" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/hull/lower_hull/l_m_s) "kaA" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -46348,15 +46190,6 @@ icon_state = "red" }, /area/almayer/hallways/stern_hallway) -"kfp" = ( -/obj/structure/sign/safety/distribution_pipes{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "kfv" = ( /obj/structure/surface/table/almayer, /obj/item/stack/nanopaste{ @@ -46504,6 +46337,18 @@ icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"kio" = ( +/obj/structure/machinery/firealarm{ + pixel_y = 28 + }, +/obj/structure/closet, +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "kiF" = ( /obj/effect/decal/cleanable/blood/oil, /obj/effect/decal/warning_stripes{ @@ -46652,6 +46497,17 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/north2) +"kmH" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "kmK" = ( /obj/structure/platform{ dir = 1 @@ -46693,6 +46549,25 @@ icon_state = "plate" }, /area/almayer/living/pilotbunks) +"knG" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + pixel_x = 7; + layer = 3.03; + pixel_y = 4 + }, +/obj/item/prop/helmetgarb/spacejam_tickets{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/prop/helmetgarb/spacejam_tickets{ + pixel_x = -8; + pixel_y = -3 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "knH" = ( /obj/structure/machinery/vending/coffee, /obj/structure/sign/safety/coffee{ @@ -46774,6 +46649,14 @@ icon_state = "plate" }, /area/almayer/hallways/aft_hallway) +"kpo" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/south2) "kpQ" = ( /obj/structure/machinery/door_control{ id = "engidorm"; @@ -47082,12 +46965,6 @@ icon_state = "tcomms" }, /area/almayer/engineering/engine_core) -"kvN" = ( -/turf/open/floor/almayer{ - dir = 10; - icon_state = "orange" - }, -/area/almayer/hull/lower_hull/l_m_s) "kvU" = ( /obj/structure/surface/table/almayer, /turf/open/floor/plating/plating_catwalk, @@ -47632,18 +47509,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) -"kHA" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/sign/safety/high_voltage{ - pixel_x = 32; - pixel_y = -8 - }, -/obj/structure/sign/safety/hazard{ - pixel_x = 32; - pixel_y = 7 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "kHK" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47789,6 +47654,13 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"kKL" = ( +/obj/structure/stairs/perspective{ + dir = 4; + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "kKR" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -47823,6 +47695,44 @@ icon_state = "orange" }, /area/almayer/squads/bravo) +"kLo" = ( +/obj/structure/machinery/door/airlock/almayer/marine/charlie{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) +"kLp" = ( +/obj/structure/sign/safety/stairs{ + pixel_x = -17; + pixel_y = 7 + }, +/obj/structure/sign/safety/escapepod{ + pixel_x = -17; + pixel_y = -8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/hallways/starboard_hallway) +"kLv" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/machinery/door/airlock/almayer/security{ + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19"; + access_modified = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "kLP" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47867,14 +47777,6 @@ icon_state = "outerhull_dir" }, /area/almayer/engineering/upper_engineering/port) -"kMU" = ( -/obj/structure/sign/safety/maint{ - pixel_x = -17 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/port_hallway) "kNi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47926,12 +47828,6 @@ }, /turf/open/floor/wood/ship, /area/almayer/living/basketball) -"kNQ" = ( -/turf/open/floor/almayer{ - dir = 1; - icon_state = "orangecorner" - }, -/area/almayer/hallways/starboard_hallway) "kNY" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -48099,6 +47995,17 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_f_p) +"kQU" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "kRd" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48108,6 +48015,24 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_three) +"kRm" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/mre_pack/xmas2{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/effect/landmark/map_item{ + pixel_x = -7; + layer = 3.03; + pixel_y = 4 + }, +/obj/item/reagent_container/food/snacks/mre_pack/xmas3{ + pixel_x = 5 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "kRu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48176,6 +48101,18 @@ icon_state = "red" }, /area/almayer/hallways/aft_hallway) +"kSU" = ( +/obj/structure/transmitter/no_dnd{ + name = "Requisition Telephone"; + phone_category = "Almayer"; + phone_id = "Requisition"; + pixel_y = 30 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/almayer/squads/req) "kTc" = ( /obj/structure/closet/secure_closet/guncabinet/red, /obj/item/ammo_magazine/shotgun, @@ -48300,6 +48237,15 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south2) +"kVm" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "kVX" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -48342,6 +48288,17 @@ icon_state = "silvercorner" }, /area/almayer/command/cichallway) +"kWF" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "kWT" = ( /turf/open/floor/almayer{ dir = 9; @@ -48467,6 +48424,15 @@ icon_state = "plate" }, /area/almayer/living/offices) +"kZf" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "kZA" = ( /turf/open/floor/almayer{ dir = 4; @@ -48532,12 +48498,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cic_hallway) -"laP" = ( -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "laQ" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -48645,6 +48605,11 @@ }, /turf/open/floor/wood/ship, /area/almayer/shipboard/brig/chief_mp_office) +"ldj" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/platform, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "ldl" = ( /obj/structure/sign/safety/maint{ pixel_x = 32 @@ -48827,6 +48792,21 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/starboard) +"lhu" = ( +/obj/structure/coatrack, +/obj/structure/sign/poster/clf{ + pixel_x = -28 + }, +/obj/structure/sign/nosmoking_1{ + pixel_y = 30 + }, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "lhv" = ( /obj/structure/machinery/door_control{ id = "CMO Shutters"; @@ -49301,14 +49281,6 @@ icon_state = "orange" }, /area/almayer/living/port_emb) -"lqZ" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/south1) "lra" = ( /obj/structure/machinery/door/airlock/almayer/engineering{ name = "\improper Disposals" @@ -49341,15 +49313,6 @@ icon_state = "plate" }, /area/almayer/engineering/engineering_workshop) -"lru" = ( -/obj/structure/machinery/firealarm{ - pixel_y = 28 - }, -/obj/structure/closet, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "lrF" = ( /obj/structure/machinery/light, /obj/structure/surface/table/almayer, @@ -49774,6 +49737,14 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"lzn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "lzq" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -49904,6 +49875,13 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) +"lBz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "lBF" = ( /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, @@ -50231,13 +50209,6 @@ /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_s) -"lGO" = ( -/obj/structure/largecrate/random/case/double, -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "lHc" = ( /obj/effect/landmark/start/doctor, /obj/structure/sign/safety/maint{ @@ -50724,6 +50695,15 @@ icon_state = "redcorner" }, /area/almayer/living/briefing) +"lSh" = ( +/obj/structure/machinery/door/airlock/almayer/marine/delta{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "lSD" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -50731,15 +50711,16 @@ }, /area/almayer/hull/upper_hull/u_m_p) "lSO" = ( -/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ - pixel_y = 25 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/door_control{ + id = "laddersoutheast"; + name = "South East Ladders Shutters"; + req_one_access_txt = "2;3;12;19"; + throw_range = 15; + pixel_y = 25 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "green" @@ -50768,6 +50749,15 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) +"lUB" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "lVl" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer, @@ -50786,6 +50776,27 @@ icon_state = "redfull" }, /area/almayer/living/briefing) +"lVX" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = 16 + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Alpha Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Alpha Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = -8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "lWh" = ( /obj/structure/machinery/pipedispenser/orderable, /turf/open/floor/almayer{ @@ -51566,16 +51577,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall/almayer, /area/almayer/squads/req) -"mqc" = ( -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "mqg" = ( /obj/structure/bed/chair{ dir = 4 @@ -51638,6 +51639,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"mrB" = ( +/obj/structure/machinery/camera/autoname/almayer{ + dir = 8; + name = "ship-grade camera" + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_p) "mrD" = ( /obj/structure/machinery/light{ dir = 1 @@ -51662,6 +51672,19 @@ icon_state = "green" }, /area/almayer/squads/req) +"msg" = ( +/obj/structure/machinery/light, +/obj/structure/sign/safety/waterhazard{ + pixel_y = -32 + }, +/obj/structure/sign/safety/rewire{ + pixel_x = 14; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "mono" + }, +/area/almayer/lifeboat_pumps/south1) "msi" = ( /obj/structure/filingcabinet/filingcabinet{ density = 0; @@ -52196,32 +52219,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) -"mFD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 5 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) -"mFM" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = -25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/obj/item/device/radio/intercom{ - freerange = 1; - name = "General Listening Channel"; - pixel_y = 28 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/port_hallway) "mFN" = ( /obj/effect/step_trigger/ares_alert/mainframe, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -52409,6 +52406,12 @@ icon_state = "silver" }, /area/almayer/command/cichallway) +"mJi" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/grunt_rnr) "mJj" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -52419,6 +52422,13 @@ "mJu" = ( /turf/open/floor/almayer/uscm/directional, /area/almayer/command/cic) +"mJx" = ( +/obj/structure/prop/server_equipment/broken, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "orange" + }, +/area/almayer/engineering/upper_engineering/starboard) "mJL" = ( /turf/open/floor/almayer{ dir = 5; @@ -52548,6 +52558,20 @@ /obj/structure/pipes/standard/manifold/fourway/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"mLb" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/item/toy/deck/uno{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/item/toy/deck{ + pixel_x = -6; + pixel_y = -2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "mLu" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -52611,14 +52635,6 @@ icon_state = "orange" }, /area/almayer/hallways/stern_hallway) -"mMu" = ( -/obj/structure/machinery/floodlight/landing{ - name = "bolted floodlight" - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/south2) "mMP" = ( /obj/effect/landmark/start/intel, /turf/open/floor/plating/plating_catwalk, @@ -52804,17 +52820,6 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) -"mRc" = ( -/obj/structure/prop/invuln/lattice_prop{ - dir = 1; - icon_state = "lattice-simple"; - pixel_x = -16; - pixel_y = -16 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "mRl" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 8; @@ -52853,6 +52858,16 @@ icon_state = "test_floor4" }, /area/almayer/command/airoom) +"mRS" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "mRW" = ( /turf/open/floor/almayer/research/containment/corner1, /area/almayer/medical/containment/cell/cl) @@ -53187,12 +53202,16 @@ }, /area/almayer/hallways/vehiclehangar) "mYZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 }, +/obj/structure/machinery/door_control{ + id = "laddersoutheast"; + name = "South East Ladders Shutters"; + req_one_access_txt = "2;3;12;19"; + throw_range = 15; + pixel_y = 25 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "green" @@ -54398,6 +54417,17 @@ icon_state = "green" }, /area/almayer/hallways/starboard_hallway) +"nyO" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "laddernortheast"; + name = "\improper North East Ladders Shutters"; + dir = 8 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "nyQ" = ( /turf/open/floor/almayer, /area/almayer/squads/charlie_delta_shared) @@ -54466,12 +54496,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) -"nBl" = ( -/obj/structure/machinery/power/apc/almayer{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "nBo" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54694,15 +54718,17 @@ }, /area/almayer/shipboard/starboard_point_defense) "nFy" = ( -/obj/structure/machinery/firealarm{ - dir = 1; - pixel_y = -28 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "laddernortheast"; + name = "\improper North East Ladders Shutters"; + dir = 8 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ - icon_state = "green" + icon_state = "test_floor4" }, /area/almayer/hallways/starboard_hallway) "nFI" = ( @@ -54734,6 +54760,16 @@ }, /turf/open/floor/almayer, /area/almayer/squads/alpha_bravo_shared) +"nFV" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "nFX" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 2; @@ -54772,6 +54808,12 @@ icon_state = "plate" }, /area/almayer/shipboard/port_point_defense) +"nGZ" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "nHg" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -55066,23 +55108,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) -"nNT" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/machinery/door_control{ - id = "Alpha_1"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "nNV" = ( /obj/structure/bed/chair{ dir = 8; @@ -55207,6 +55232,23 @@ icon_state = "plate" }, /area/almayer/squads/req) +"nQd" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) +"nQg" = ( +/obj/structure/sink{ + pixel_y = 24 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "nQv" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -55264,6 +55306,12 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/main_office) +"nSN" = ( +/obj/structure/largecrate/supply/supplies/mre, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "nSS" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -55406,12 +55454,16 @@ }, /area/almayer/hull/lower_hull/l_f_s) "nVU" = ( -/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ - pixel_y = -30 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/machinery/door_control{ + id = "laddernortheast"; + name = "North East Ladders Shutters"; + req_one_access_txt = "2;3;12;19"; + throw_range = 15; + pixel_y = -25 + }, /turf/open/floor/almayer{ icon_state = "green" }, @@ -55745,16 +55797,6 @@ icon_state = "dark_sterile" }, /area/almayer/engineering/laundry) -"odM" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/shipboard/brig/cic_hallway) "odN" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -55993,6 +56035,13 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"oiZ" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8; + name = "\improper Tool Closet" + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "ojF" = ( /obj/structure/machinery/cm_vending/clothing/tl/charlie{ density = 0; @@ -56308,6 +56357,16 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) +"oqc" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 1; + req_one_access = null; + req_one_access_txt = "30;19"; + access_modified = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/living/port_emb) "oqu" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -56683,12 +56742,6 @@ icon_state = "test_floor4" }, /area/almayer/hallways/starboard_hallway) -"owN" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "owW" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -56943,14 +56996,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) -"oDu" = ( -/obj/structure/sign/safety/distribution_pipes{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "oDv" = ( /turf/open/floor/almayer{ dir = 9; @@ -57051,6 +57096,15 @@ icon_state = "bluefull" }, /area/almayer/command/cichallway) +"oES" = ( +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_f_p) "oEX" = ( /obj/structure/pipes/vents/scrubber{ dir = 4 @@ -57162,13 +57216,6 @@ icon_state = "orange" }, /area/almayer/shipboard/brig/perma) -"oIm" = ( -/obj/structure/prop/server_equipment/broken, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "orange" - }, -/area/almayer/engineering/upper_engineering/starboard) "oIn" = ( /obj/structure/bed/chair{ dir = 8; @@ -57214,6 +57261,20 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) +"oJq" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters"; + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "oJR" = ( /obj/effect/projector{ name = "Almayer_AresDown"; @@ -57450,6 +57511,16 @@ icon_state = "plating" }, /area/almayer/medical/upper_medical) +"oNO" = ( +/obj/structure/window/framed/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "oOO" = ( /obj/structure/sign/safety/debark_lounge{ pixel_x = 15; @@ -57459,6 +57530,15 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) +"oPa" = ( +/obj/structure/sign/safety/storage{ + pixel_y = -32; + pixel_x = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "oPf" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -57564,6 +57644,15 @@ icon_state = "silver" }, /area/almayer/living/auxiliary_officer_office) +"oRc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "oRj" = ( /obj/structure/stairs{ icon_state = "ramptop" @@ -57782,17 +57871,6 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/cryo) -"oWX" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - access_modified = 1; - dir = 1; - name = "\improper Kitchen Hydroponics"; - req_one_access_txt = "30;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "oXb" = ( /obj/effect/landmark/start/marine/charlie, /obj/effect/landmark/late_join/charlie, @@ -57896,6 +57974,21 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) +"oZX" = ( +/obj/structure/machinery/door/airlock/almayer/medical/glass{ + dir = 2; + name = "\improper Field Surgery Equipment"; + req_access_txt = "20"; + req_one_access = null; + access_modified = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/medical/lower_medical_medbay) "paa" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/almayer{ @@ -57978,6 +58071,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_p) +"pcj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "silvercorner" + }, +/area/almayer/shipboard/brig/cic_hallway) "pcl" = ( /turf/open/floor/almayer{ icon_state = "cargo" @@ -58115,6 +58218,18 @@ icon_state = "test_floor4" }, /area/almayer/engineering/upper_engineering/starboard) +"pfe" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + pixel_x = 5 + }, +/obj/item/facepaint/black{ + pixel_x = -10 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "pfh" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -58163,6 +58278,13 @@ icon_state = "test_floor4" }, /area/almayer/command/airoom) +"pgt" = ( +/obj/structure/machinery/cm_vending/sorted/tech/comp_storage, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "pgD" = ( /turf/closed/wall/almayer, /area/almayer/lifeboat_pumps/south1) @@ -58386,6 +58508,16 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) +"pon" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/obj/item/trash/uscm_mre, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "pop" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -58818,14 +58950,6 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) -"pyB" = ( -/obj/structure/sign/safety/maint{ - pixel_x = -17 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hallways/starboard_hallway) "pyC" = ( /obj/structure/largecrate/random/barrel/red, /obj/structure/machinery/light{ @@ -58864,16 +58988,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) -"pzi" = ( -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_p) "pzG" = ( /obj/docking_port/stationary/emergency_response/port1, /turf/open/floor/almayer{ @@ -59275,14 +59389,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) -"pJb" = ( -/obj/structure/bed/chair{ - dir = 8 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "pJi" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -59355,13 +59461,6 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_medbay) -"pLv" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "orange" - }, -/area/almayer/engineering/upper_engineering/starboard) "pLO" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -60003,6 +60102,16 @@ icon_state = "plating" }, /area/almayer/squads/req) +"pXW" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/obj/item/trash/popcorn, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "pXZ" = ( /obj/effect/landmark/start/marine/spec/charlie, /obj/effect/landmark/late_join/charlie, @@ -60215,21 +60324,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) -"qcq" = ( -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/sign/safety/waterhazard{ - pixel_y = 32 - }, -/obj/structure/sign/safety/rewire{ - pixel_x = 14; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "mono" - }, -/area/almayer/lifeboat_pumps/north1) "qcy" = ( /obj/structure/sign/safety/bathunisex{ pixel_x = 8; @@ -60239,6 +60333,15 @@ icon_state = "plate" }, /area/almayer/living/auxiliary_officer_office) +"qcN" = ( +/obj/structure/machinery/door/airlock/almayer/marine/alpha{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "qdk" = ( /obj/structure/surface/table/almayer, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -60397,6 +60500,12 @@ icon_state = "test_floor4" }, /area/almayer/living/starboard_garden) +"qgw" = ( +/obj/structure/stairs/perspective{ + icon_state = "p_stair_sn_full_cap" + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "qgG" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -60575,6 +60684,15 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"qkb" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/upper_hull/u_f_p) "qki" = ( /obj/effect/landmark/start/marine/smartgunner/charlie, /obj/effect/landmark/late_join/charlie, @@ -60766,6 +60884,15 @@ icon_state = "test_floor4" }, /area/almayer/living/pilotbunks) +"qnM" = ( +/obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "qnP" = ( /obj/structure/prop/invuln/overhead_pipe{ pixel_x = 12 @@ -60823,13 +60950,6 @@ icon_state = "orange" }, /area/almayer/squads/bravo) -"qoX" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "qoY" = ( /obj/structure/machinery/vending/hydroseeds, /turf/open/floor/almayer{ @@ -61039,6 +61159,15 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) +"quJ" = ( +/obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "quT" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ layer = 1.9 @@ -61073,6 +61202,16 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/cryo) +"qvy" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "qvC" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -61265,13 +61404,6 @@ icon_state = "plating" }, /area/almayer/hallways/vehiclehangar) -"qyK" = ( -/obj/structure/surface/table/almayer, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/living/grunt_rnr) "qyW" = ( /obj/structure/bed/chair{ dir = 4 @@ -61336,6 +61468,17 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"qBM" = ( +/obj/item/storage/fancy/crayons{ + layer = 3.1; + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "green" + }, +/area/almayer/living/grunt_rnr) "qCc" = ( /obj/structure/sign/safety/security{ pixel_x = 15; @@ -62095,6 +62238,21 @@ icon_state = "red" }, /area/almayer/shipboard/brig/general_equipment) +"qRp" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 4 + }, +/obj/item/stack/folding_barricade, +/obj/item/stack/sheet/mineral/uranium{ + layer = 2.99 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "qRT" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -62491,6 +62649,14 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) +"rbl" = ( +/obj/structure/sign/poster{ + desc = "It says DRUG."; + icon_state = "poster2"; + pixel_x = -27 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "rbp" = ( /obj/structure/largecrate/random/case/small, /turf/open/floor/almayer{ @@ -62789,6 +62955,17 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) +"ril" = ( +/obj/structure/prop/invuln/lattice_prop{ + dir = 1; + icon_state = "lattice-simple"; + pixel_x = -16; + pixel_y = 17 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "riA" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -62870,6 +63047,44 @@ icon_state = "plate" }, /area/almayer/command/corporateliason) +"rjV" = ( +/obj/structure/surface/table/almayer, +/obj/structure/machinery/computer/cameras/wooden_tv/prop{ + dir = 8; + layer = 3.2; + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = 27; + serial_number = 11 + }, +/obj/item/trash/pistachios{ + layer = 2; + pixel_x = 6; + pixel_y = -6 + }, +/obj/structure/machinery/recharger{ + layer = 3.1; + pixel_y = 22 + }, +/obj/item/ammo_magazine/rifle/incendiary{ + current_rounds = 0; + desc = "A 10mm assault rifle magazine with ':D' drawn on the side"; + pixel_x = 10; + pixel_y = 2 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "blue" + }, +/area/almayer/living/port_emb) "rka" = ( /obj/structure/surface/table/almayer, /obj/item/paper_bin/uscm, @@ -62971,15 +63186,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) -"rlG" = ( -/obj/structure/machinery/status_display{ - pixel_y = 30 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "rlQ" = ( /turf/open/floor/almayer{ dir = 1; @@ -63151,6 +63357,15 @@ icon_state = "plate" }, /area/almayer/command/cichallway) +"rpN" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "rpW" = ( /obj/structure/prop/invuln/overhead_pipe{ pixel_x = 12 @@ -63275,14 +63490,6 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) -"rsj" = ( -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice2"; - pixel_x = 16; - pixel_y = 16 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "rsx" = ( /obj/structure/largecrate/random/barrel/red, /obj/structure/sign/safety/high_voltage{ @@ -63413,6 +63620,26 @@ icon_state = "cargo" }, /area/almayer/hallways/hangar) +"ruP" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/structure/machinery/door_control{ + id = "Alpha_1"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "rvo" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -63541,24 +63768,36 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/main_office) -"rzM" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer, -/area/almayer/shipboard/brig/cic_hallway) "rzN" = ( /turf/open/floor/almayer{ icon_state = "dark_sterile" }, /area/almayer/medical/containment) +"rzP" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/obj/structure/machinery/door/airlock/almayer/maint, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hull/upper_hull/u_a_s) "rAb" = ( /turf/open/floor/almayer{ icon_state = "bluecorner" }, /area/almayer/living/briefing) +"rAt" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "rAv" = ( /obj/structure/toilet{ dir = 8 @@ -64056,6 +64295,16 @@ icon_state = "test_floor4" }, /area/almayer/medical/lower_medical_lobby) +"rIm" = ( +/obj/structure/window/framed/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "rID" = ( /turf/open/floor/almayer{ dir = 6; @@ -64179,6 +64428,12 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_m_s) +"rKw" = ( +/obj/structure/sign/poster/safety{ + pixel_x = 27 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "rKy" = ( /obj/structure/machinery/firealarm{ dir = 1; @@ -64227,8 +64482,14 @@ /obj/structure/machinery/status_display{ pixel_y = -30 }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters"; + dir = 8 + }, /turf/open/floor/almayer{ - icon_state = "green" + icon_state = "test_floor4" }, /area/almayer/hallways/port_hallway) "rLU" = ( @@ -64245,23 +64506,6 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) -"rNW" = ( -/obj/structure/machinery/door_control{ - id = "Secretroom"; - indestructible = 1; - layer = 2.5; - name = "Shutters"; - use_power = 0 - }, -/obj/structure/prop/almayer/computers/sensor_computer1, -/obj/structure/sign/safety/water{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "rOc" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -64525,18 +64769,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) -"rTY" = ( -/obj/structure/transmitter/no_dnd{ - name = "Requisition Telephone"; - phone_category = "Almayer"; - phone_id = "Requisition"; - pixel_y = 30; - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/squads/req) "rTZ" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 @@ -64971,6 +65203,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_s) +"sfT" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/obj/structure/sign/poster{ + icon_state = "poster14"; + pixel_x = -27 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "sfU" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -65297,6 +65539,27 @@ icon_state = "cargo" }, /area/almayer/engineering/upper_engineering/port) +"snI" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = -17 + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Delta Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Delta Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "snM" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -65420,12 +65683,6 @@ icon_state = "plate" }, /area/almayer/command/cic) -"soZ" = ( -/obj/structure/largecrate/random/case/double, -/turf/open/floor/almayer{ - icon_state = "cargo" - }, -/area/almayer/hull/lower_hull/l_m_s) "spF" = ( /obj/structure/surface/table/almayer, /obj/structure/flora/pottedplant{ @@ -65772,6 +66029,12 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) +"sxH" = ( +/turf/open/floor/almayer_hull{ + dir = 10; + icon_state = "outerhull_dir" + }, +/area/almayer/hull/lower_hull/l_m_p) "syH" = ( /obj/structure/machinery/firealarm{ pixel_y = -28 @@ -65851,6 +66114,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/numbertwobunks) +"szX" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/hull/upper_hull/u_a_s) "sAc" = ( /obj/structure/bed/chair{ dir = 8; @@ -65877,20 +66152,6 @@ icon_state = "orange" }, /area/almayer/engineering/ce_room) -"sBp" = ( -/obj/structure/sign/safety/escapepod{ - pixel_x = -17; - pixel_y = -8 - }, -/obj/structure/sign/safety/stairs{ - pixel_x = -17; - pixel_y = 7 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "red" - }, -/area/almayer/hallways/starboard_hallway) "sBF" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -66410,6 +66671,12 @@ dir = 1 }, /area/almayer/medical/containment/cell) +"sNI" = ( +/obj/structure/bed/chair/comfy/delta, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "sNO" = ( /obj/structure/desertdam/decals/road_edge{ icon_state = "road_edge_decal3" @@ -66629,6 +66896,30 @@ icon_state = "blue" }, /area/almayer/squads/delta) +"sSG" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = -17 + }, +/obj/structure/machinery/light{ + dir = 1 + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Charlie Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Charlie Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = 7 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "sSR" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out"; @@ -66760,7 +67051,7 @@ pixel_y = -32 }, /turf/open/floor/almayer{ - icon_state = "greencorner" + icon_state = "green" }, /area/almayer/hallways/port_hallway) "sVi" = ( @@ -66975,6 +67266,13 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"sZF" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12; + pixel_y = 12 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_p) "sZH" = ( /obj/structure/surface/table/almayer, /obj/item/ashtray/bronze{ @@ -67212,6 +67510,18 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"teH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/sign/safety/maint{ + pixel_y = 32 + }, +/obj/structure/sign/safety/storage{ + pixel_x = 15; + pixel_y = 32 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "teY" = ( /obj/structure/machinery/light{ dir = 1 @@ -67242,9 +67552,6 @@ name = "General Listening Channel"; pixel_y = 28 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, @@ -67487,6 +67794,13 @@ /obj/item/toy/farwadoll, /turf/open/floor/wood/ship, /area/almayer/shipboard/brig/cells) +"tki" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "tkq" = ( /obj/structure/pipes/vents/scrubber{ dir = 4 @@ -67750,6 +68064,12 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) +"tpY" = ( +/turf/open/floor/almayer_hull{ + dir = 9; + icon_state = "outerhull_dir" + }, +/area/almayer/hull/lower_hull/l_m_s) "tqe" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -68383,6 +68703,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) +"tBP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "tCb" = ( /obj/structure/surface/rack, /obj/item/device/radio{ @@ -68415,6 +68742,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) +"tDz" = ( +/obj/structure/machinery/door/airlock/almayer/marine/bravo{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "tDA" = ( /obj/item/tool/weldpack{ pixel_y = 15 @@ -68556,6 +68892,14 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) +"tGG" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "tGO" = ( /obj/effect/projector{ name = "Almayer_Up3"; @@ -68564,41 +68908,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) -"tHc" = ( -/obj/structure/surface/table/almayer, -/obj/structure/machinery/computer/cameras/wooden_tv/prop{ - dir = 8; - layer = 3.2; - pixel_x = -3; - pixel_y = 6 - }, -/obj/structure/sign/poster{ - desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; - icon_state = "poster11"; - name = "YOU ALWAYS KNOW A WORKING JOE."; - pixel_x = 27; - serial_number = 11 - }, -/obj/item/trash/pistachios{ - layer = 2; - pixel_x = 6; - pixel_y = -6 - }, -/obj/structure/machinery/recharger{ - layer = 3.1; - pixel_y = 22 - }, -/obj/item/ammo_magazine/rifle/incendiary{ - current_rounds = 0; - desc = "A 10mm assault rifle magazine with ':D' drawn on the side"; - pixel_x = 10; - pixel_y = 2 - }, -/turf/open/floor/almayer{ - dir = 6; - icon_state = "blue" - }, -/area/almayer/living/port_emb) "tHh" = ( /obj/structure/sign/safety/ladder{ pixel_x = 8; @@ -68717,20 +69026,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_s) -"tJa" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - dir = 1; - name = "Storage"; - req_one_access_txt = "19;21" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/squads/req) "tJi" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/paper_bin/uscm, @@ -69135,17 +69430,6 @@ /obj/item/tool/pen, /turf/open/floor/almayer, /area/almayer/command/cic) -"tUv" = ( -/obj/structure/machinery/iv_drip, -/obj/structure/machinery/computer/working_joe{ - dir = 8; - pixel_x = 17 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "sterile_green_corner" - }, -/area/almayer/medical/lower_medical_medbay) "tUx" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) @@ -69270,21 +69554,6 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/cryo) -"tXG" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door/window/eastright{ - access_modified = 1; - dir = 8; - req_access_txt = "19" - }, -/obj/effect/landmark/map_item, -/obj/structure/machinery/door/window/eastleft{ - req_access_txt = "19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "tXM" = ( /obj/structure/pipes/vents/pump{ dir = 8 @@ -69486,6 +69755,13 @@ dir = 4 }, /area/almayer/medical/containment/cell) +"uay" = ( +/obj/structure/machinery/iv_drip, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "sterile_green_corner" + }, +/area/almayer/medical/lower_medical_medbay) "uaI" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/processor{ @@ -69545,6 +69821,28 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) +"ucz" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/computer/overwatch/almayer{ + dir = 8; + layer = 3.2; + pixel_x = -17; + pixel_y = 15 + }, +/obj/structure/machinery/light, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Bravo Overwatch Telephone"; + phone_category = "Command"; + phone_id = "Bravo Overwatch" + }, +/obj/structure/sign/safety/terminal{ + pixel_x = -17; + pixel_y = -8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "udi" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -69598,6 +69896,14 @@ icon_state = "silver" }, /area/almayer/shipboard/brig/cic_hallway) +"udV" = ( +/obj/structure/machinery/firealarm{ + pixel_y = -28 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "udZ" = ( /obj/structure/pipes/vents/scrubber, /turf/open/floor/almayer, @@ -69894,17 +70200,6 @@ }, /turf/open/floor/almayer, /area/almayer/squads/charlie_delta_shared) -"ukW" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "ula" = ( /obj/structure/machinery/door/airlock/almayer/security/glass{ name = "Evidence Room" @@ -70039,6 +70334,13 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) +"uoc" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "uoi" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -70086,6 +70388,14 @@ icon_state = "cargo" }, /area/almayer/engineering/engine_core) +"upt" = ( +/obj/structure/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "upM" = ( /obj/structure/machinery/light{ dir = 4 @@ -70153,19 +70463,6 @@ "uqo" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/armory) -"uqr" = ( -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_x = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "uqA" = ( /obj/structure/machinery/firealarm{ dir = 8; @@ -70906,6 +71203,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, /area/almayer/command/cichallway) +"uCX" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "uDn" = ( /obj/structure/ladder{ height = 1; @@ -71170,6 +71473,13 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/main_office) +"uJB" = ( +/obj/structure/janitorialcart, +/obj/item/tool/mop, +/turf/open/floor/almayer{ + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "uJU" = ( /obj/structure/machinery/cryopod/right{ pixel_y = 6 @@ -71497,20 +71807,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) -"uRI" = ( -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice1"; - pixel_x = 16; - pixel_y = -8 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/largecrate/supply/supplies/mre, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "uRM" = ( /obj/structure/bed{ can_buckle = 0 @@ -71705,6 +72001,13 @@ icon_state = "kitchen" }, /area/almayer/engineering/upper_engineering/port) +"uVb" = ( +/obj/structure/closet/toolcloset, +/turf/open/floor/almayer{ + dir = 6; + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "uVd" = ( /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ pixel_y = -25 @@ -71842,6 +72145,15 @@ dir = 8 }, /area/almayer/medical/containment/cell) +"uXu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/port_hallway) "uXL" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -71864,12 +72176,6 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/command/lifeboat) -"uYO" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "uZo" = ( /obj/structure/bed/stool, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -72072,9 +72378,6 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) -"vdU" = ( -/turf/open/floor/wood/ship, -/area/almayer/living/grunt_rnr) "vdW" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -72483,6 +72786,18 @@ icon_state = "green" }, /area/almayer/living/grunt_rnr) +"vjD" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12; + pixel_y = 12 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_p) "vjK" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer, @@ -72650,6 +72965,13 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) +"vnY" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_f_p) "vot" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72685,12 +73007,38 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_m_p) +"voW" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8; + req_one_access = list(2,34,30); + access_modified = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "vpn" = ( /turf/open/floor/almayer{ dir = 9; icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) +"vpt" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/sign/poster{ + desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; + icon_state = "poster11"; + name = "YOU ALWAYS KNOW A WORKING JOE."; + pixel_x = 27; + serial_number = 11 + }, +/obj/item/stack/folding_barricade, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "vpI" = ( /obj/effect/landmark/start/police, /turf/open/floor/plating/plating_catwalk, @@ -72791,6 +73139,27 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) +"vrB" = ( +/obj/structure/closet/crate{ + desc = "One of those old special operations crates from back in the day. After a leaked report from a meeting of SOF leadership lambasted the crates as 'waste of operational funds' the crates were removed from service."; + name = "special operations crate" + }, +/obj/item/clothing/mask/gas/swat, +/obj/item/clothing/mask/gas/swat, +/obj/item/clothing/mask/gas/swat, +/obj/item/clothing/mask/gas/swat, +/obj/item/attachable/suppressor, +/obj/item/attachable/suppressor, +/obj/item/attachable/suppressor, +/obj/item/attachable/suppressor, +/obj/item/explosive/grenade/smokebomb, +/obj/item/explosive/grenade/smokebomb, +/obj/item/explosive/grenade/smokebomb, +/obj/item/explosive/grenade/smokebomb, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "vrI" = ( /obj/structure/machinery/cryopod{ layer = 3.1; @@ -73176,6 +73545,15 @@ "vyI" = ( /turf/open/floor/almayer, /area/almayer/engineering/upper_engineering/port) +"vyU" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "vzl" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -73392,6 +73770,17 @@ /obj/effect/landmark/start/synthetic, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/synthcloset) +"vEn" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/item/stack/sheet/mineral/uranium{ + layer = 2.99 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "vEr" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -73419,21 +73808,6 @@ /obj/structure/machinery/vending/coffee, /turf/open/floor/almayer, /area/almayer/living/briefing) -"vEI" = ( -/obj/structure/machinery/door/airlock/almayer/medical/glass{ - access_modified = 1; - dir = 2; - name = "\improper Field Surgery Equipment"; - req_access_txt = "20"; - req_one_access = null - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/medical/lower_medical_medbay) "vFb" = ( /obj/structure/surface/table/almayer, /obj/item/attachable/lasersight, @@ -73445,17 +73819,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) -"vFh" = ( -/obj/structure/surface/table/reinforced/prison, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 1; - pixel_y = 7 - }, -/obj/item/tool/wrench, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "vFv" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer{ @@ -73537,6 +73900,47 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) +"vHt" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door_control{ + id = "CIC Lockdown"; + name = "CIC Lockdown"; + pixel_x = -7; + pixel_y = 9; + req_access_txt = "1" + }, +/obj/structure/machinery/door_control{ + id = "Hangar Lockdown"; + name = "Hangar Lockdown"; + pixel_x = -7; + pixel_y = 2; + req_access_txt = "1" + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4; + icon_state = "exposed01-supply" + }, +/obj/structure/machinery/door_control{ + id = "bot_armory"; + name = "Armory Lockdown"; + pixel_x = -7; + pixel_y = -5; + req_one_access_txt = "1;4" + }, +/obj/structure/transmitter/rotary/no_dnd{ + name = "Combat Information Center Telephone"; + phone_category = "Command"; + phone_id = "Combat Information Center"; + pixel_x = 5; + pixel_y = 4 + }, +/obj/structure/machinery/door/window/westright{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/command/cic) "vHO" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -74120,6 +74524,14 @@ icon_state = "cargo" }, /area/almayer/squads/delta) +"vTt" = ( +/obj/structure/machinery/firealarm{ + pixel_y = 28 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "vTu" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -74741,20 +75153,6 @@ icon_state = "mono" }, /area/almayer/living/pilotbunks) -"weB" = ( -/obj/item/tool/screwdriver{ - layer = 2.9; - pixel_x = -21; - pixel_y = -14 - }, -/obj/structure/machinery/light{ - dir = 1 - }, -/obj/structure/closet, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "weC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -75191,6 +75589,14 @@ icon_state = "red" }, /area/almayer/shipboard/starboard_missiles) +"wmz" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "wmE" = ( /obj/structure/machinery/door/window/brigdoor/southright{ id = "Cell 4"; @@ -75258,16 +75664,6 @@ dir = 4 }, /area/almayer/medical/containment/cell) -"wom" = ( -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "wos" = ( /obj/structure/machinery/cm_vending/sorted/marine_food{ density = 0; @@ -75458,6 +75854,31 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cic_hallway) +"wsP" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/item/prop/helmetgarb/gunoil{ + layer = 4.2; + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/prop/helmetgarb/gunoil{ + layer = 4.2; + pixel_x = -10; + pixel_y = 1 + }, +/obj/item/prop/helmetgarb/gunoil{ + layer = 4.2; + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/weapon/broken_bottle{ + pixel_x = 11; + pixel_y = -2 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "wsR" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -75565,18 +75986,6 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) -"wvl" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "wvI" = ( /obj/item/paper_bin/uscm{ pixel_y = 7 @@ -75730,16 +76139,6 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) -"wyK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "silvercorner" - }, -/area/almayer/shipboard/brig/cic_hallway) "wyO" = ( /obj/structure/largecrate/random/barrel/red, /obj/structure/prop/invuln/overhead_pipe{ @@ -75802,6 +76201,15 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"wAU" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/structure/sign/poster/music{ + pixel_x = -27 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "wBY" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, @@ -75830,6 +76238,11 @@ icon_state = "redcorner" }, /area/almayer/living/briefing) +"wCK" = ( +/turf/open/floor/almayer_hull{ + icon_state = "outerhull_dir" + }, +/area/almayer/hull/lower_hull/l_m_p) "wCM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -76175,6 +76588,14 @@ "wJH" = ( /turf/closed/wall/almayer/research/containment/wall/east, /area/almayer/medical/containment/cell/cl) +"wKd" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "wKn" = ( /obj/structure/surface/rack, /obj/item/facepaint/sniper, @@ -76303,6 +76724,12 @@ icon_state = "sterile_green" }, /area/almayer/medical/containment) +"wLV" = ( +/obj/structure/bed/chair/comfy/charlie, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "wMm" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -76647,28 +77074,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/aft_hallway) -"wUD" = ( -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice2"; - pixel_x = 16; - pixel_y = 16 - }, -/obj/structure/prop/almayer/computers/sensor_computer3, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/obj/structure/sign/safety/terminal{ - pixel_x = 8; - pixel_y = 32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "wUN" = ( /obj/structure/machinery/optable, /turf/open/floor/almayer{ @@ -76901,12 +77306,14 @@ /obj/effect/landmark/late_join/delta, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) -"wXv" = ( -/obj/structure/prop/invuln/joey, +"wXh" = ( +/obj/structure/machinery/floodlight/landing{ + name = "bolted floodlight" + }, /turf/open/floor/almayer{ - icon_state = "plate" + icon_state = "mono" }, -/area/almayer/hull/lower_hull/l_m_s) +/area/almayer/lifeboat_pumps/north2) "wXH" = ( /obj/structure/bed/chair{ dir = 1 @@ -77200,23 +77607,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_m_p) -"xeP" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/surface/table/almayer, -/obj/item/spacecash/c10{ - pixel_x = 6 - }, -/obj/item/spacecash/c10{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/toy/deck{ - pixel_x = -9 - }, -/turf/open/floor/almayer, -/area/almayer/living/grunt_rnr) "xfc" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/sign/safety/cryo{ @@ -77343,24 +77733,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) -"xgM" = ( -/obj/structure/prop/invuln/lattice_prop{ - icon_state = "lattice2"; - pixel_x = 16; - pixel_y = 16 - }, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12 - }, -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/prop/invuln/overhead_pipe{ - pixel_x = 12; - pixel_y = 12 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_p) "xgS" = ( /obj/structure/largecrate/supply/supplies/mre{ desc = "A supply crate containing everything you need to stop a CLF uprising."; @@ -77431,6 +77803,13 @@ }, /turf/open/floor/carpet, /area/almayer/command/cichallway) +"xiz" = ( +/obj/structure/prop/invuln/lattice_prop{ + icon_state = "lattice12"; + pixel_y = -16 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/l_m_s) "xiC" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -77516,18 +77895,6 @@ "xkd" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/shipboard/brig/cells) -"xkw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "greencorner" - }, -/area/almayer/hallways/port_hallway) "xlk" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer, @@ -77773,12 +78140,6 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) -"xqg" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "xqp" = ( /obj/structure/machinery/body_scanconsole{ dir = 8; @@ -77887,20 +78248,13 @@ icon_state = "cargo" }, /area/almayer/hallways/vehiclehangar) -"xtC" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; +"xtc" = ( +/obj/structure/stairs/perspective{ dir = 1; - req_one_access = null; - req_one_access_txt = "30;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" + icon_state = "p_stair_full" }, -/area/almayer/living/grunt_rnr) +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xtD" = ( /obj/structure/surface/table/almayer, /obj/item/tool/weldpack, @@ -78091,19 +78445,6 @@ /obj/structure/largecrate/supply/supplies/mre, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) -"xwv" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/structure/sign/poster{ - desc = "YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE. YOU ALWAYS KNOW A WORKING JOE."; - icon_state = "poster11"; - name = "YOU ALWAYS KNOW A WORKING JOE."; - pixel_x = -27; - serial_number = 11 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_m_s) "xwG" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -78268,6 +78609,12 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"xyE" = ( +/obj/structure/toilet{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/upper_hull/u_a_s) "xyY" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/effect/decal/warning_stripes{ @@ -78464,6 +78811,22 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) +"xDQ" = ( +/obj/structure/platform, +/obj/item/trash/USCMtray{ + pixel_y = 4 + }, +/obj/item/trash/USCMtray{ + pixel_y = 6 + }, +/obj/item/trash/USCMtray{ + pixel_y = 8 + }, +/obj/item/trash/USCMtray{ + pixel_y = 10 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xEc" = ( /turf/open/floor/almayer{ dir = 9; @@ -78794,22 +79157,13 @@ /turf/open/floor/almayer, /area/almayer/shipboard/port_point_defense) "xMh" = ( -/obj/structure/closet/crate{ - desc = "One of those old special operations crates from back in the day. After a leaked report from a meeting of SOF leadership lambasted the crates as 'waste of operational funds' the crates were removed from service."; - name = "special operations crate" +/obj/structure/prop/invuln/lattice_prop{ + dir = 1; + icon_state = "lattice-simple"; + pixel_x = -16; + pixel_y = 17 }, -/obj/item/clothing/mask/gas/swat, -/obj/item/clothing/mask/gas/swat, -/obj/item/clothing/mask/gas/swat, -/obj/item/clothing/mask/gas/swat, -/obj/item/attachable/suppressor, -/obj/item/attachable/suppressor, -/obj/item/attachable/suppressor, -/obj/item/attachable/suppressor, -/obj/item/explosive/grenade/smokebomb, -/obj/item/explosive/grenade/smokebomb, -/obj/item/explosive/grenade/smokebomb, -/obj/item/explosive/grenade/smokebomb, +/obj/structure/largecrate/random/barrel/red, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -78990,7 +79344,13 @@ /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 }, -/obj/structure/machinery/light, +/obj/structure/machinery/door_control{ + id = "laddernortheast"; + name = "North East Ladders Shutters"; + req_one_access_txt = "2;3;12;19"; + throw_range = 15; + pixel_y = -25 + }, /turf/open/floor/almayer{ icon_state = "green" }, @@ -79200,6 +79560,16 @@ icon_state = "red" }, /area/almayer/shipboard/brig/lobby) +"xSE" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + name = "\improper Main Kitchen"; + req_one_access_txt = "30;19"; + access_modified = 1 + }, +/turf/open/floor/prison{ + icon_state = "kitchen" + }, +/area/almayer/living/grunt_rnr) "xSI" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/emails{ @@ -79659,13 +80029,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_s) -"ybV" = ( -/obj/structure/disposalpipe/segment{ - dir = 1; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "ybZ" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/transmitter{ @@ -79873,6 +80236,15 @@ icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"yfw" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "orange" + }, +/area/almayer/hallways/starboard_hallway) "yfy" = ( /obj/structure/surface/table/almayer, /obj/item/trash/crushed_cup, @@ -79925,6 +80297,12 @@ /obj/effect/spawner/random/tool, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_f_p) +"ygK" = ( +/obj/structure/prop/almayer/computers/sensor_computer3, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "yhI" = ( /turf/open/floor/almayer{ dir = 4; @@ -80046,6 +80424,13 @@ icon_state = "cargo" }, /area/almayer/hull/lower_hull/l_m_s) +"ykF" = ( +/obj/structure/machinery/cm_vending/sorted/tech/tool_storage, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "orange" + }, +/area/almayer/hull/lower_hull/l_m_s) "ykP" = ( /obj/structure/filingcabinet{ density = 0; @@ -80095,21 +80480,6 @@ icon_state = "ai_floors" }, /area/almayer/command/airoom) -"ylm" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door/airlock/almayer/generic{ - name = "\improper Dorms" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/port_emb) "ylJ" = ( /obj/structure/sign/safety/maint{ pixel_x = 8; @@ -91160,7 +91530,7 @@ gaJ gaJ tRA lMc -gjL +ffV cMl oeB rkL @@ -94323,7 +94693,7 @@ bSv aIX aIX bSv -ehZ +oES eXo vRz aag @@ -94998,8 +95368,8 @@ adG adG adG adG -bsf -fwF +gqq +iCz dav rPC rPC @@ -95036,7 +95406,7 @@ mnm kIV wNU kIV -alv +mrB tuA tuA tuA @@ -96651,13 +97021,13 @@ vGA uwN pYX xuZ -wyK -elh -rzM -aBN -fQS -bVr -bVr +pcj +hXm +fZq +dVm +qkb +vnY +vnY bpd bqT vZv @@ -96853,8 +97223,8 @@ awz vSN mPj rWs -iVY -odM +inh +ewr lPC mgy wWT @@ -98670,9 +99040,9 @@ wVW wVW wVW swH -ayy +ucz wVW -aBV +sSG sEM wVW wVW @@ -98871,13 +99241,13 @@ apo fHh wVW lZs -gHl +lVX sni ayz dAX aQg vpV -eSV +snI aGp wVW aDv @@ -100498,7 +100868,7 @@ wVW rOC soX azX -aAD +vHt aCb aDv aEC @@ -103717,7 +104087,7 @@ bdH aaC abs adq -qcq +dpo ajI add add @@ -103775,7 +104145,7 @@ gjq aJU aJU tiW -eMn +msg pgD tQV aaC @@ -103923,13 +104293,13 @@ adq jWH ajI add -auJ +fsU aHU aTm awW aTm jgF -auJ +fsU add ajI add @@ -103969,13 +104339,13 @@ aJU aJU tiW aJU -lqZ +gBW ouQ iun baw vPm qys -lqZ +gBW aJU tiW pUe @@ -104532,13 +104902,13 @@ adq add ajI add -auJ +fsU aHU aTm awW aTm jgF -auJ +fsU add ajI add @@ -104578,13 +104948,13 @@ aJU aJU tiW aJU -lqZ +gBW ouQ vbB baw tBq qys -lqZ +gBW aJU tiW aJU @@ -110338,7 +110708,7 @@ iMI rlZ rlZ rlZ -vEI +oZX cnr qqK qqK @@ -110540,7 +110910,7 @@ kan avW bZn dXr -tUv +uay vhX gDW rlZ @@ -110981,7 +111351,7 @@ uaa uaa fiq oed -uqH +oDf yhQ ajZ bdH @@ -111086,11 +111456,11 @@ eGz csz czu aaa -aaa -aaa -aaa -aaa -aaa +aac +aaf +aaf +aaf +ajY aaa aaa aaa @@ -111111,15 +111481,15 @@ aaa aab aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -111187,13 +111557,13 @@ oed oed yhQ ajZ -bdH -aaa -aaa -aaa -aaa -aaa aaa +avo +avo +avo +avo +avo +avo aaa aaa aaa @@ -111216,14 +111586,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -111289,13 +111659,13 @@ vGk csz czu aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aad +aag +aag +aag +aag +aaf +ajY aaa aaa aaa @@ -111314,15 +111684,15 @@ aaa aab aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -111387,10 +111757,17 @@ bJt bJt bJt oed -oDf +eHf yhQ ajZ -bdH +avo +avo +avs +avs +avs +avs +avo +avo aaa aaa aaa @@ -111399,34 +111776,27 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(155,1,1) = {" aaa aaa +aab aaa aaa aaa -aab +bdH +bdH +aaa aaa aaa -"} -(155,1,1) = {" aaa aaa -aab aaa aaa aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH aaa aaa aaa @@ -111491,14 +111861,14 @@ qVM vGk ofs czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaf +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -111517,8 +111887,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -111582,7 +111952,7 @@ gSk bDs bDs bDs -jip +xSE fbo duo iIl @@ -111590,10 +111960,18 @@ bDs ujV bJt oed -bxX +oed yhQ ajZ -bdH +avo +avs +avs +hAG +vtr +avs +avs +avo +aaa aaa aaa aaa @@ -111601,35 +111979,27 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(156,1,1) = {" aaa aaa +aab aaa aaa aaa +bdH +bdH aaa -aab aaa aaa -"} -(156,1,1) = {" aaa aaa -aab aaa aaa aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH aaa aaa aaa @@ -111694,14 +112064,14 @@ qVM vGk csz czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -111720,8 +112090,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -111793,10 +112163,17 @@ hAz fhQ bJt vhI -oDf -yhQ -ajZ -bdH +oed +avo +avo +avo +avs +rKn +awa +awa +umm +avs +avo aaa aaa aaa @@ -111805,34 +112182,27 @@ aaa aaa aaa aaa +aab aaa aaa +"} +(157,1,1) = {" aaa aaa +aab aaa aaa aaa -aab +bdH +bdH +aaa aaa aaa -"} -(157,1,1) = {" aaa aaa -aab aaa aaa aaa -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH aaa aaa aaa @@ -111897,14 +112267,14 @@ qVM csz qVM czu -aaa -aac -aaf -aaf -aaf -ajY -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ bdH bdH aaa @@ -111923,8 +112293,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -111987,7 +112357,7 @@ nFI qdk vzP bJt -fEo +gZj bJt dpn bDs @@ -111997,16 +112367,16 @@ pdt bJt kTq oed -yhQ -ajZ -aaa -avo -avo -avo -avo -avo +lpy +avC +avC +wEg +axa +axa +dSZ +oMs +avs avo -aaa bdH aaa aaa @@ -112028,14 +112398,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -112100,14 +112470,14 @@ qVM hoX qVM czu -aaa -aad aag aag aag aag -aaf -ajY +aag +aag +aag +ajZ bdH bdH aaa @@ -112126,8 +112496,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112199,16 +112569,16 @@ reL wiI bJt nnr -eHf -yhQ -ajZ +eep +avo avo avo avs +awa +awa +awa +qUp avs -avs -avs -avo avo bdH aaa @@ -112231,14 +112601,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -112303,7 +112673,7 @@ qVM csz qVM czu -aaf +aah aag aag aag @@ -112329,8 +112699,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112402,14 +112772,14 @@ bDs vwI bJt koz -oed +oDf yhQ ajZ avo avs avs -hAG -vtr +loK +wpg avs avs avo @@ -112434,14 +112804,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -112506,14 +112876,14 @@ qVM vGk csz czu +aaa +aad aag aag aag aag -aag -aag -aag -ajZ +aah +afm bdH bdH aaa @@ -112532,8 +112902,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112605,16 +112975,16 @@ bDs oMd bJt oDf -oed -avo +uqH +yhQ +ajZ avo avo avs -rKn -awa -awa -umm avs +avs +avs +avo avo bdH aaa @@ -112637,14 +113007,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH bdH aaa @@ -112709,14 +113079,14 @@ qVM vGk csz czu -aag -aag -aag -aag -aag -aag -aag -ajZ +aaa +aae +aah +aah +aah +afm +aaa +aaa bdH bdH aaa @@ -112735,8 +113105,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -112808,17 +113178,17 @@ bDs pdt bJt sIx -oed -lpy -avC -avC -wEg -axa -axa -dSZ -oMs -avs +bxX +yhQ +ajZ +aaa +avo +avo +avo avo +avo +avo +aaa bdH aaa aaa @@ -112840,14 +113210,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -112912,14 +113282,14 @@ qVM vGk ofs czu -aag -aag -aag -aag -aag -aag -aag -ajZ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -112938,8 +113308,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -113011,17 +113381,17 @@ bDs knK bJt oed -eep -avo -avo -avo -avs -awa -awa -awa -qUp -avs -avo +vgQ +yhQ +ajZ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113043,14 +113413,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -113115,14 +113485,14 @@ csz vGk csz czu -aah -aag -aag -aag -aag -aag -aag -ajZ +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -113141,8 +113511,8 @@ aaa aab aaa aaa -aaa -aaa +bdH +bdH bdH bdH bdH @@ -113175,27 +113545,27 @@ aQF aLG aYO aLG -bCf +kLv ngI dkq lRZ -wvl +jhz beH beH dwl bdd bdd -ukW +hBL bdd bdd aMt beH beH -wvl +jhz qby btY bAJ -dGW +aQD buH bHL buH @@ -113214,17 +113584,17 @@ ljG tSp bJt oed -oDf +sHg yhQ ajZ -avo -avs -avs -loK -wpg -avs -avs -avo +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113246,14 +113616,14 @@ aaa aaa bdH bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH -bdH +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bdH aaa aaa @@ -113318,14 +113688,14 @@ qVM csz qVM czu -aaa -aad -aag -aag -aag -aag -aah -afm +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -113406,7 +113776,7 @@ bJt wbC lHu oiL -loY +qBM wXI nUd lkd @@ -113417,17 +113787,17 @@ oDE bJt bJt oed -uqH +oDf yhQ ajZ -avo -avo -avs -avs -avs -avs -avo -avo +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113457,7 +113827,7 @@ aaa aaa aaa aaa -bdH +aaa aaa aaa ahx @@ -113521,14 +113891,14 @@ qVM hoX qVM czu -aaa -aae -aah -aah -aah -afm -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH bdH aaa @@ -113608,8 +113978,8 @@ bCj rde vjC iMm -xeP -fSG +mJi +iMm iMm mkc bJt @@ -113620,17 +113990,17 @@ luS bJt iGg oed -bxX +oDf yhQ ajZ -aaa -avo -avo -avo -avo -avo -avo -aaa +bdH +bdH +bdH +bdH +bdH +bdH +bdH +bdH bdH aaa aaa @@ -113660,7 +114030,7 @@ aaa aaa aaa aaa -bdH +aaa aaa aaa lYA @@ -113768,18 +114138,18 @@ aKW aSm aSm hhw -baY -bfb -bNz +beG dIR yky +bfb +baY hhw -xnY -xnY +aLF +bPV +yaG +bPU aSm -aLf -aLf -soZ +bPS hhw bwd auv @@ -113808,31 +114178,31 @@ bCh bCi bCo bCi +ejw +xML +iMm +jSy +wGb +iMm +rjn bJt -hzP -vdU -owN -vdU -vdU -jjK -lkd wUX bDs gSk vSp -xtC +ipb qgH oDf oDf yhQ ajZ bdH -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +bdH +bdH +bdH +bdH aaa aaa aaa @@ -113856,16 +114226,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aac +aaf +aaf +aaf +aaf +aaf +aaf +aaf lYA aiS aao @@ -113927,14 +114297,14 @@ qVM vGk csz czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aaf +aaf +aaf +aaf +aaf +aaf +aaf +ajY aaa aaa aaa @@ -113959,66 +114329,66 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad +tpY +aKW +aKW +aKW +aKW +aKW +aKW +aKW aKW aSm aLf hhw -beG -bgF -jQA -bgF -kvN -hhw -aSm -aLf -aSm -aSm -aLf -aSm -hhw +beI +bTQ +tBP +jfm +lYu +maw +fAS +jfm +lzn +eDz +jfm +jfm +bUP aLG aYO aLG -bCf +kLv mng wTm wCI -wvl +jhz beH beH beH -wvl +jhz mng wTm wCI -wvl +jhz beH beH beH -wvl +jhz mng wTm wCI -bCf +kLv buH bHL buH -ejw -qyK -vdU -owN -vdU -vdU -pJb -lkd +bJt +swE +wpI +ocm +wpI +wnL +kHd +bJt hSw qxE rui @@ -114026,16 +114396,16 @@ vSp bJt wuH oed -vgQ +uqH yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa +yhQ +yhQ +yhQ +yhQ +yhQ +yhQ +yhQ +sxH aaa aaa aaa @@ -114059,16 +114429,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aiT aap @@ -114130,14 +114500,14 @@ qVM oLw csz czu -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114162,32 +114532,32 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad aKW -uDB +aKW +bPU +lLV +aLf +aLf +aLf +jiX +aSm +aSm aLf ahU -beI -bTQ -qoX -jfm -lYu -maw -fAS -jfm -jfm -fAS -jfm -jfm -bUP -aem +aLf +fza +kat +uJB +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +teH mUa xNB bdd @@ -114200,7 +114570,7 @@ fUA qYZ bdd vuA -tXG +gSZ vuA bdd qCc @@ -114213,32 +114583,32 @@ vuA bdd bSj bHL -buH -ejw -xML -vdU -jcl -iHO -vdU -rjn -bJt -bJt +bIR +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd bJt cDC -oWX +bRS bJt bJt +oed +oDf +oDf +oDf +qNy +cLV +oDf +oDf oDf -sHg yhQ -ajZ -bdH -bdH -aaa -aaa -aaa -aaa -aaa +yhQ aaa aaa aaa @@ -114262,16 +114632,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aiU aap @@ -114333,14 +114703,14 @@ qVM vGk ofs czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114365,32 +114735,32 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad aKW +bPV +aLf +xlD aSm +aSm +aSm +aLf +aLf +aLf aMs hhw -beO -bgH +pgt +ykF bgH -bgH -bPV -hhw -aLF -bPV -lGO -oDu -bPU -bPS -hhw -irI +uVb +bdd +pfe +wsP +izr +aSh +ccF +tGG +tGG +iBx +aLG awb aLG bdg @@ -114417,31 +114787,31 @@ bdg buH hOR buH -bJt -swE -wpI -ocm -wpI -wnL -kHd -bJt -bJt +quJ +sNI +wAU +diw +csG +sNI +wNT +knG +bdd qXo feq loY aDU bJt +oed +oDf +oed +oDf +mOU +oDf +oDf +oed +oed oDf -vFh yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -114465,16 +114835,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa bdH -aaa -aaa +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aiZ aap @@ -114536,14 +114906,14 @@ qVM noV csz czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114568,31 +114938,31 @@ bdH bdH bdH bdH -bdH -bdH -bdH -bdH -bdH -aaa -bdH -aad aKW -bhC aSm -hhw -bfa -bHM -bWy -iGE -nsY +aLf nsY nsY +oiZ nsY nsY nsY nsY nsY nsY +hhw +hhw +voW +hhw +bdd +bqZ +kbV +tGG +tGG +tGG +tGG +tGG +iBx aLG aYO aLG @@ -114620,31 +114990,31 @@ bdg buH bHL buH +quJ +sNI +sNI +sNI +sNI +dkH +cKX +bqZ +bdd +tLc +rsM +iMm +hTT nsY nsY +wKd nsY nsY nsY nsY nsY nsY -nsY -tLc -rsM -iMm -hTT -bJt +upt oDf -jRn yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -114668,16 +115038,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA adf aao @@ -114739,14 +115109,14 @@ iid csz qVM czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114771,31 +115141,31 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad aKW aLf aSm -hhw -hhw -hhw -hhw -hhw nsY xWT -rSW +wVK jgk nsY rSG rSW oqS nsY +lhu +btk +aSm +eoM +bdd +vTt +kbV +tGG +tGG +tGG +tGG +tGG +iBx aLG aYO aLG @@ -114823,31 +115193,31 @@ bdg buH bHL buH +quJ +sNI +csG +sNI +sNI +gNi +wNT +cab +bdd +hxZ +rsM +iMm +gzV nsY xWT -rSW +wVK viu nsY rSG whd oqS nsY -hxZ -rsM -iMm -gzV -bJt oDf -oed +oDf yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -114871,16 +115241,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA fZF aWs @@ -114942,14 +115312,14 @@ qVM hoX qVM czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -114974,22 +115344,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad aKW aLf aSm -hhw -fJA -btk -xwv -eVy nsY xWT wVK @@ -114999,8 +115356,21 @@ iIP wVK dDt nsY -beB -aYT +xiz +aSm +aSm +kOf +bdd +bDQ +kbV +tGG +kWF +kZf +nQd +kZf +oNO +crW +eOs beB bCx bqZ @@ -115024,8 +115394,21 @@ beH bqZ bCx buH -bHL -buH +jUT +bFu +rIm +rAt +rAt +hGI +rAt +pXW +wNT +udV +bdd +hTf +rsM +oos +sBL nsY xWT efa @@ -115035,22 +115418,9 @@ dmR wVK dDt nsY -hTf -rsM -oos -sBL -bJt -pzi -uNW +oDf +oed yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -115074,16 +115444,16 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bdH +bdH +aad +aag +aag +aag +aag +aag +aag +aag lYA aar aar @@ -115145,14 +115515,14 @@ qVM csz qVM czu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aag +aag +aag +aag +aag +ajZ aaa aaa aaa @@ -115177,24 +115547,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -bdH -aad aKW -rsj -sxe -iQL -glr -mhl +aLa aSm -ylY nsY -nNT +ruP fBA fSF nsY @@ -115202,6 +115559,19 @@ lmW mtS iKa nsY +glr +mhl +aSm +ylY +bdd +bqZ +qgw +beH +duv +nGZ +rJK +rKw +qcN aLG aZi aLG @@ -115229,31 +115599,31 @@ eVv bFu pIX buH +lSh +beH +beH +rJK +beH +beH +epq +bqZ +bdd +hTf +rKO +wGb +gUf nsY gwO mtS -guG +ezW nsY lwA mtS iKa nsY -tuo -rKO -wGb -gUf -bJt -ddG +oDf oed yhQ -ajZ -bdH -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -115380,22 +115750,9 @@ aaa aac aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aag aKW -mRc aLf -hhw -jFe -sxe -xZI -mNZ +aSm nsY nsY qxC @@ -115405,6 +115762,19 @@ nsY ntx nsY nsY +jFe +sxe +xZI +mNZ +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd aLG awb aLG @@ -115432,6 +115802,19 @@ bdg buH hOR buH +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +tuo +rsM +oos +gUf nsY nsY iFM @@ -115441,24 +115824,11 @@ nsY gLZ nsY nsY -hTf -rsM -oos -gUf -bJt oDf -oed +uqH yhQ -aag -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf +fQQ +fQQ ajY aaa aaa @@ -115584,20 +115954,7 @@ aad aKW aKW aKW -aKW -aKW -aKW -aKW -aKW -aKW -aKW -aKW aSm -vUi -hhw -xCN -pOB -hfk aLf nsY tUS @@ -115608,6 +115965,19 @@ fPp lqN kjV nsY +xCN +pOB +hfk +aLf +bdd +bqZ +kKL +beH +fcf +uCX +sfT +beH +tDz aLG awb aLG @@ -115635,6 +116005,19 @@ bdg buH hOR buH +kLo +beH +beH +duv +beH +rbl +xtc +bqZ +bdd +hTf +wRO +iMm +gUf nsY aaq lEL @@ -115644,25 +116027,12 @@ iQt uZo xmJ nsY -hTf -wRO -iMm -gUf -bJt -nBl -ndQ -yhQ -yhQ -yhQ -yhQ -yhQ -yhQ -yhQ -yhQ +oed +oDf yhQ yhQ yhQ -ajZ +wCK aaa aaa aaa @@ -115785,25 +116155,12 @@ aaa aaa aKW aKW -bPV -aSm -aSm -jiX -bPU bPT -uJo -aSm jiX aSm -aSm -aSm -hhw -nEA -lQu -lQu -aSm +aLf nsY -lru +kio sJY qJY qLH @@ -115811,8 +116168,21 @@ xTW oGP cnM nsY -aLG -awb +nEA +lQu +lQu +aSm +bdd +bDQ +kbV +wmz +kmH +iBT +qRp +iBT +jwI +tBF +lBz aLG bdg bqZ @@ -115836,8 +116206,21 @@ bqZ bqZ bdg buH -hOR -buH +uXu +bFu +rIm +uoc +iew +lUB +uoc +rpN +wNT +bqZ +bdd +gKB +rsM +oos +gUf nsY mKJ tIb @@ -115847,21 +116230,8 @@ pyc uMn ivz nsY -gKB -rsM -oos -gUf -bJt -oDf -oed -oed -sow oed oDf -oDf -oDf -laP -oDf oed oed yhQ @@ -115987,26 +116357,13 @@ aaa aaa aaa aKW -aLF -aLf -aLf -aLf -aSm +ygK aLf aLf aLf aLf -aLf -aSm -aLf -bPW -hhw -hhw -yfy -ugV -vUi -nsY -weB +aKK +ezO axc juD twW @@ -116014,6 +116371,19 @@ vHh pvh rgJ nsY +hhw +yfy +ugV +vUi +bdd +vTt +kbV +wmz +vEn +wmz +wmz +wmz +qnM aLG aYO bad @@ -116041,6 +116411,19 @@ bdd bGe bHL buH +quJ +wLV +wLV +wLV +wLV +pon +ldj +cab +bdd +sOt +cNX +cdI +sBL nsY eiN gLu @@ -116048,23 +116431,10 @@ eai veI xuQ uPW -bKo -nsY -sOt -cNX -cdI -sBL -bJt -oed -oDf -alm -hGZ +gBg +oqc +tbK tbK -hGZ -etB -hGZ -gpE -kHA tbK lNy oed @@ -116190,24 +116560,11 @@ aaa aaa aaa aKW -aSm +jwD aLf +oPa hhw hhw -hhw -hhw -hhw -hhw -bPV -aLF -aSm -bzG -hhw -hhw -sSe -aLf -qce -aSm nsY wpz oEX @@ -116217,7 +116574,20 @@ xxm qSK ieu nsY -kfp +sSe +aLf +qce +aSm +bdd +bqZ +kbV +wmz +wmz +wmz +wmz +wmz +qnM +beB aYT beB beB @@ -116244,6 +116614,19 @@ bJz bJz bHT bJz +quJ +wLV +wLV +wLV +wLV +wLV +wNT +udV +bdd +pEl +roU +oos +uVh nsY kzK lFh @@ -116253,22 +116636,9 @@ mzV pML ivz nsY -pEl -roU -oos -uVh -bJt -aYU -bVt -wlp -aYU -bVt -fiq -fiq -fFz -fiq -fiq jZO +oDf +oed wlp ndQ yhQ @@ -116393,24 +116763,11 @@ aaa aaa aaa aKW -uDB +cSK +aSm aSm -hhw -bUc -bUc -bUc bUc -aLB -aLB -aLB -bbI -aLB -aLB -wXv -aLf -aLf -tRc -qEW +nSN nsY xgS dbn @@ -116420,6 +116777,19 @@ uRM ipe ehR nsY +aLf +aLf +tRc +qEW +bdd +fxR +mLb +wmz +vpt +kQU +wmz +wmz +qnM aLG aYO aLG @@ -116447,31 +116817,31 @@ buH buH bHL buH +quJ +gKH +cgz +vyU +wLV +wLV +xDQ +kRm +bdd +pcO +tJV +qoY +uCh nsY tXT kOH wLG tyb sZH -tHc +rjV ivz nsY -pcO -tJV -qoY -uCh -bJt -bGb -bGb -cmb -bGb -bGb -fiq -xgM -eHq -uRI -ckD -wUD +fuY +sZF +vjD lFF ndM yhQ @@ -116598,22 +116968,9 @@ aaa aKW aLf aLf -hhw -bUc -bUc -bUc +xlD bUc -aLB -aWN -pyB -beB -bbU -aLB -aLB -aLB -aLB -aLB -aLB +vrB nsY nsY nsY @@ -116623,7 +116980,20 @@ nsY nsY nsY nsY -aLG +hhw +hhw +hhw +hhw +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +hDL aYO aNO aLG @@ -116649,34 +117019,34 @@ bdg buH bHa bHL -buH +bIR +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bdd +bJt +bJt +bJt +bJt nsY nsY nsY nsY -ylm +goy nsY nsY nsY nsY -bJt -bJt -bJt -bJt -bJt -bGb -mFM -bHW -kMU -fBx -fiq -hRg -oDf +gZG xMh -fiq -rNW +ril kRu -oDf +hXS yhQ aaa aaa @@ -116808,22 +117178,22 @@ hhw hhw aLB acF -akX -akX +heb cqa -bdp +bBh +aMV dRG -yiq -sBp aMV +yiq +kLp aMV bBh tCN -tCN -kNQ -awb -iLQ lDJ +tCN +tCN +yfw +tCN bBh aLG aLG @@ -116867,10 +117237,10 @@ bUM mYw iAT rdY -clR -eXE -gte +bUM +cbD eXE +hOR kJV fiq fiq @@ -117011,20 +117381,20 @@ nHF cmE aLB nyG -aNO -uYO -xqg -bdq -aQt -aQt -aQt -aQt -aQt -sOm -aQt -aQt -aQt -wom +qvy +jKl +nFV +tBL +tBL +tBL +tBL +tBL +tBL +mRS +tBL +tBL +tBL +tBL tBL tBL luz @@ -117070,10 +117440,10 @@ buI buI buI buI -feC -bFu -mFD -bHa +buI +rpd +kVm +bHL kro bGb uaa @@ -117214,10 +117584,10 @@ nHF nHF aLB csl -aQt +iza bbJ -csw -bdp +bBh +aMM aMM aNG bga @@ -117272,11 +117642,11 @@ ciU rOj bUd bUF -bUR clR -uqr -xkw -buI +clR +cbD +dQs +oRc guc bGb uaa @@ -117479,7 +117849,7 @@ vra vra vra jJe -bHa +bHY buH vfo uaa @@ -117682,7 +118052,7 @@ mgF asX vra tfw -bHa +bHY sVf bGb uaa @@ -117885,7 +118255,7 @@ qYQ ptj vra lSO -bHa +bHY haT bGb uaa @@ -118025,8 +118395,8 @@ hhw hhw hhw aLB -rlG -aNO +nyO +nyO nFy jeb vlX @@ -118088,7 +118458,7 @@ hQc asX vra hNL -bHa +oJq rLF bGb fiq @@ -118291,7 +118661,7 @@ qYQ asX vra mYZ -buI +tki lQQ bGb uaa @@ -118433,7 +118803,7 @@ nHF aLB ewo aNO -jJs +jLv jeb obE thA @@ -118494,7 +118864,7 @@ eBV ptj vra fsH -bHa +bHY pBn bGb uaa @@ -118636,7 +119006,7 @@ nHF cmC aLG aNO -jJs +uBw jeb vlX tdE @@ -118696,8 +119066,8 @@ lpt qYQ asX vra -mqc -ybV +pJJ +bHY buH cnd uaa @@ -120895,7 +121265,7 @@ bDY bCA bCA nLt -tJa +gmb bNQ bNQ bNQ @@ -121099,7 +121469,7 @@ bdj bri bLX bdl -rTY +kSU bNP bmD bNP @@ -121177,13 +121547,13 @@ acx aeC ajs aeC -asV +wXh ayn atr aeA aex ciw -asV +wXh aeC ydz ayb @@ -121225,13 +121595,13 @@ agJ sSl kkx vcE -mMu +kpo iMx tGi lJY bXe eyG -mMu +kpo vcE kUV vcE @@ -121299,7 +121669,7 @@ bkY bdl lOr lOr -bIu +iwI lOr bdl bEt @@ -121786,13 +122156,13 @@ acx umR ajs aeC -asV +wXh ayn atr aeA bXz ciw -asV +wXh aeC ajs qon @@ -121834,13 +122204,13 @@ vuv dHe kUV vcE -mMu +kpo iMx bXe lJY mzF eyG -mMu +kpo vcE kUV pPF @@ -123538,7 +123908,7 @@ ycp bdl bdl rtj -fmf +agv bdl bdl bdl @@ -126051,7 +126421,7 @@ pVZ xlX psm psm -ahX +rzP psm psm fnZ @@ -126253,9 +126623,9 @@ aag pVZ xlX psm -aCu -aQA -bpf +nQg +szX +xyE psm eKD pBW @@ -126456,9 +126826,9 @@ aag pVZ yeP psm -aDf -aRk -brT +jdQ +bMY +hfy psm eKD nZF @@ -133568,7 +133938,7 @@ bdH bdH aad cuC -oIm +mJx rtd odb cuC @@ -133771,7 +134141,7 @@ bdH bdH cuC cuC -pLv +dqg rtd fcP cuC From 25512256ad5148effa89ecd9b301fb41b49962c2 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 17 Oct 2023 01:09:57 +0100 Subject: [PATCH 055/199] Automatic changelog for PR #4539 [ci skip] --- html/changelogs/AutoChangeLog-pr-4539.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4539.yml diff --git a/html/changelogs/AutoChangeLog-pr-4539.yml b/html/changelogs/AutoChangeLog-pr-4539.yml new file mode 100644 index 000000000000..362d39b21e2a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4539.yml @@ -0,0 +1,5 @@ +author: "Warfan1815" +delete-after: True +changes: + - mapadd: "New Squad Briefings south and north of normal briefing! Feel free to use them to your heart's content." + - maptweak: "Moved long-rest bunks further north and further south of where they were originally" \ No newline at end of file From 2d5834caec5cff2ba467f1ef33757445bda8141d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 17 Oct 2023 01:08:59 +0000 Subject: [PATCH 056/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4539.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4687.yml | 4 ---- html/changelogs/archive/2023-10.yml | 8 ++++++++ 3 files changed, 8 insertions(+), 9 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4539.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4687.yml diff --git a/html/changelogs/AutoChangeLog-pr-4539.yml b/html/changelogs/AutoChangeLog-pr-4539.yml deleted file mode 100644 index 362d39b21e2a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4539.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Warfan1815" -delete-after: True -changes: - - mapadd: "New Squad Briefings south and north of normal briefing! Feel free to use them to your heart's content." - - maptweak: "Moved long-rest bunks further north and further south of where they were originally" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4687.yml b/html/changelogs/AutoChangeLog-pr-4687.yml deleted file mode 100644 index 77fb738581b7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4687.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VileBeggar" -delete-after: True -changes: - - qol: "The Queen's psychic messages now use a bigger font and are harder to miss." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 5cd6bcd00c06..5aa2778def50 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -215,3 +215,11 @@ deleted. - bugfix: Fixed issues with turfs, notably lighting, arising when building it from a sheets stack. +2023-10-17: + VileBeggar: + - qol: The Queen's psychic messages now use a bigger font and are harder to miss. + Warfan1815: + - mapadd: New Squad Briefings south and north of normal briefing! Feel free to use + them to your heart's content. + - maptweak: Moved long-rest bunks further north and further south of where they + were originally From c46e9d29cc48564fcfbf95d743bbe8422d0c11b8 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:16:35 +0100 Subject: [PATCH 057/199] Project ARES: Datacore (#4437) Moves most information from ARES Interface and APOLLO Interface to the ARES Datacore. Also reorganises the files so the two interfaces are in separate files with all their UI data. # About the pull request Centralises most of the information used by the ARES Interface and APOLLO Maintenance Console(s) into a datacore. Also reorganises the files so the two consoles are in their own individual files with all their UI data rather than having them separate from the UI data which was making it difficult to navigate. Also adds checks to everywhere I could find missing them for logging to the datacore. # Explain why it's good for the game This will help massively for future compatability and updates. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: code: Moved most data storage from ARES Interface and APOLLO consoles to a new ARES datacore datum. code: Moved the two consoles to separate files for easier navigation, and moved their respective UI data to the files. code: Ares logging procs are now global procs with integrated can_log checks, rather than requiring definition of ares_link for every use. add: Added ares_can_log checks to all the places I could find missing them. fix: Fixed missing rejection button for access tickets. del: Removed claim ticket button from Access Tickets. /:cl: --- code/defines/procs/announcement.dm | 40 +- code/game/bioscans.dm | 10 +- code/game/machinery/ARES/ARES.dm | 154 +-- code/game/machinery/ARES/ARES_interface.dm | 471 +++++++++ .../machinery/ARES/ARES_interface_apollo.dm | 414 ++++++++ code/game/machinery/ARES/ARES_procs.dm | 941 ++---------------- code/game/machinery/ARES/ARES_records.dm | 6 +- .../game/machinery/ARES/ARES_step_triggers.dm | 12 +- code/game/machinery/biohazard_lockdown.dm | 3 +- .../machinery/computer/almayer_control.dm | 10 +- .../game/machinery/computer/communications.dm | 5 +- code/game/objects/items/devices/cictablet.dm | 3 +- code/game/supplyshuttle.dm | 3 +- code/modules/admin/tabs/event_tab.dm | 4 +- code/modules/admin/topic/topic.dm | 2 +- code/modules/cm_marines/anti_air.dm | 5 +- code/modules/cm_marines/overwatch.dm | 2 +- .../mob/living/carbon/xenomorph/death.dm | 3 +- .../shuttle/computers/dropship_computer.dm | 21 +- code/modules/shuttles/marine_ferry.dm | 3 +- code/modules/shuttles/shuttle_console.dm | 3 +- colonialmarines.dme | 2 + tgui/packages/tgui/interfaces/WorkingJoe.js | 48 +- 23 files changed, 1080 insertions(+), 1085 deletions(-) create mode 100644 code/game/machinery/ARES/ARES_interface.dm create mode 100644 code/game/machinery/ARES/ARES_interface_apollo.dm diff --git a/code/defines/procs/announcement.dm b/code/defines/procs/announcement.dm index 60bf117a6b92..8e42fd1e76a8 100644 --- a/code/defines/procs/announcement.dm +++ b/code/defines/procs/announcement.dm @@ -45,13 +45,11 @@ if((H.faction != faction_to_display && !add_PMCs) || (H.faction != faction_to_display && add_PMCs && !(H.faction in FACTION_LIST_WY)) && !(faction_to_display in H.faction_group)) //faction checks targets.Remove(H) - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - switch(logging) - if(ARES_LOG_MAIN) - link.log_ares_announcement(title, message) - if(ARES_LOG_SECURITY) - link.log_ares_security(title, message) + switch(logging) + if(ARES_LOG_MAIN) + log_ares_announcement(title, message) + if(ARES_LOG_SECURITY) + log_ares_security(title, message) else if(faction_to_display == "Everyone (-Yautja)") for(var/mob/M in targets) @@ -98,13 +96,11 @@ for(var/mob/living/silicon/decoy/ship_ai/AI in ai_mob_list) INVOKE_ASYNC(AI, TYPE_PROC_REF(/mob/living/silicon/decoy/ship_ai, say), message) - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - switch(logging) - if(ARES_LOG_MAIN) - link.log_ares_announcement("[MAIN_AI_SYSTEM] Comms Update", message) - if(ARES_LOG_SECURITY) - link.log_ares_security("[MAIN_AI_SYSTEM] Security Update", message) + switch(logging) + if(ARES_LOG_MAIN) + log_ares_announcement("[MAIN_AI_SYSTEM] Comms Update", message) + if(ARES_LOG_SECURITY) + log_ares_security("[MAIN_AI_SYSTEM] Security Update", message) /proc/ai_silent_announcement(message, channel_prefix, bypass_cooldown = FALSE) if(!message) @@ -135,13 +131,11 @@ if(!isnull(signature)) message += "

Signed by,
[signature]
" - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - switch(ares_logging) - if(ARES_LOG_MAIN) - link.log_ares_announcement(title, message) - if(ARES_LOG_SECURITY) - link.log_ares_security(title, message) + switch(ares_logging) + if(ARES_LOG_MAIN) + log_ares_announcement(title, message) + if(ARES_LOG_SECURITY) + log_ares_security(title, message) announcement_helper(message, title, targets, sound_to_play) @@ -154,9 +148,7 @@ if(!ishuman(T) || isyautja(T) || !is_mainship_level(T.z)) targets.Remove(T) - var/datum/ares_link/link = GLOB.ares_link - if(ares_can_log()) - link.log_ares_announcement("[title] Shipwide Update", message) + log_ares_announcement("[title] Shipwide Update", message) announcement_helper(message, title, targets, sound_to_play) diff --git a/code/game/bioscans.dm b/code/game/bioscans.dm index 62c801a02d29..ff6e00ec430e 100644 --- a/code/game/bioscans.dm +++ b/code/game/bioscans.dm @@ -109,24 +109,21 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) to_chat(ghost, ghost_scan) -/// This will do something after Project ARES. /datum/bioscan_data/proc/ares_can_bioscan() var/datum/ares_link/link = GLOB.ares_link if(!istype(link)) return FALSE - if(link.p_bioscan && !link.p_bioscan.inoperable()) + if(link.processor_bioscan && !link.processor_bioscan.inoperable()) return TRUE return FALSE /// The announcement to all Humans. Slightly off for the planet and elsewhere, accurate for the ship. /datum/bioscan_data/proc/ares_bioscan(forced = FALSE, variance = 2) - var/datum/ares_link/link = GLOB.ares_link if(!forced && !ares_can_bioscan()) message_admins("An ARES Bioscan has failed.") var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan failed. \n\nInvestigation into Bioscan subsystem recommended." - if(ares_can_log()) - link.log_ares_bioscan(name, input) + log_ares_bioscan(name, input) if(ares_can_interface()) marine_announcement(input, name, 'sound/misc/interference.ogg', logging = ARES_LOG_NONE) return @@ -137,8 +134,7 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) log_game("BIOSCAN: ARES bioscan completed. [input]") - if(forced || ares_can_log()) - link.log_ares_bioscan(name, input) //if interface is down, bioscan still logged, just have to go read it. + log_ares_bioscan(name, input) //if interface is down, bioscan still logged, just have to go read it. if(forced || ares_can_interface()) marine_announcement(input, name, 'sound/AI/bioscan.ogg', logging = ARES_LOG_NONE) else diff --git a/code/game/machinery/ARES/ARES.dm b/code/game/machinery/ARES/ARES.dm index ed4391c89c24..1ecbb4a5d7d6 100644 --- a/code/game/machinery/ARES/ARES.dm +++ b/code/game/machinery/ARES/ARES.dm @@ -8,7 +8,6 @@ unslashable = TRUE unacidable = TRUE - var/link_id = MAIN_SHIP_DEFAULT_NAME var/datum/ares_link/link /obj/structure/machinery/ares/ex_act(severity) @@ -40,14 +39,12 @@ log_debug("Error: link_systems called without a link datum") if(link && !override) return FALSE - if(new_link.link_id == link_id) + if(new_link) link = new_link - log_debug("[name] linked to Ares Link [link_id]") new_link.linked_systems += src return TRUE /obj/structure/machinery/ares/proc/delink() - log_debug("[name] delinked from Ares Link [link.link_id]") link.linked_systems -= src link = null @@ -63,11 +60,11 @@ /obj/structure/machinery/ares/processor/apollo/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) ..() - new_link.p_apollo = src + new_link.processor_apollo = src /obj/structure/machinery/ares/processor/apollo/delink() - if(link && link.p_apollo == src) - link.p_apollo = null + if(link && link.processor_apollo == src) + link.processor_apollo = null ..() /obj/structure/machinery/ares/processor/interface @@ -77,11 +74,11 @@ /obj/structure/machinery/ares/processor/interface/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) ..() - new_link.p_interface = src + new_link.processor_interface = src /obj/structure/machinery/ares/processor/interface/delink() - if(link && link.p_interface == src) - link.p_interface = null + if(link && link.processor_interface == src) + link.processor_interface = null ..() /obj/structure/machinery/ares/processor/bioscan @@ -91,11 +88,11 @@ /obj/structure/machinery/ares/processor/bioscan/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) ..() - new_link.p_bioscan = src + new_link.processor_bioscan = src /obj/structure/machinery/ares/processor/bioscan/delink() - if(link && link.p_bioscan == src) - link.p_bioscan = null + if(link && link.processor_bioscan == src) + link.processor_bioscan = null ..() /// Central Core @@ -104,130 +101,17 @@ desc = "This is ARES' central processor. Made of a casing designed to withstand nuclear blasts, the CPU also contains ARES' blackbox recorder." icon_state = "CPU" +/obj/structure/machinery/ares/cpu/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + ..() + new_link.central_processor = src + +/obj/structure/machinery/ares/cpu/delink() + if(link && link.central_processor == src) + link.central_processor = null + ..() + /// Memory Substrate, /obj/structure/machinery/ares/substrate name = "ARES Substrate" desc = "The memory substrate of ARES, containing complex protocols and information. Limited capabilities can operate on substrate alone, without the main ARES Unit operational." icon_state = "substrate" - -// #################### ARES Interface Console ##################### -/obj/structure/machinery/computer/ares_console - name = "ARES Interface" - desc = "A console built to interface with ARES, allowing for 1:1 communication." - icon = 'icons/obj/structures/machinery/ares.dmi' - icon_state = "console" - exproof = TRUE - - var/current_menu = "login" - var/last_menu = "" - - var/authentication = ARES_ACCESS_BASIC - - /// The last person to login. - var/last_login - /// The person pretending to be last_login - var/sudo_holder - /// A record of who logged in and when. - var/list/access_list = list() - - /// The ID used to link all devices. - var/link_id = MAIN_SHIP_DEFAULT_NAME - var/datum/ares_link/link - - /// The current deleted chat log of 1:1 conversations being read. - var/list/deleted_1to1 = list() - - /// Holds all (/datum/ares_record/announcement)s - var/list/records_announcement = list() - /// Holds all (/datum/ares_record/bioscan)s - var/list/records_bioscan = list() - /// Holds all (/datum/ares_record/bombardment)s - var/list/records_bombardment = list() - /// Holds all (/datum/ares_record/deletion)s - var/list/records_deletion = list() - /// Holds all (/datum/ares_record/talk_log)s - var/list/records_talking = list() - /// Holds all (/datum/ares_record/requisition_log)s - var/list/records_asrs = list() - /// Holds all (/datum/ares_record/security)s (including AA) - var/list/records_security = list() - /// Holds all (/datum/ares_record/flight)s - var/list/records_flight = list() - /// Is nuke request usable or not? - var/nuke_available = TRUE - - - COOLDOWN_DECLARE(ares_distress_cooldown) - COOLDOWN_DECLARE(ares_nuclear_cooldown) - COOLDOWN_DECLARE(ares_quarters_cooldown) - -/obj/structure/machinery/computer/ares_console/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) - if(link && !override) - return FALSE - if(new_link.link_id == link_id) - new_link.interface = src - link = new_link - log_debug("[name] linked to Ares Link [link_id]") - new_link.linked_systems += src - return TRUE - -/obj/structure/machinery/computer/ares_console/Initialize(mapload, ...) - link_systems(override = FALSE) - . = ..() - -/obj/structure/machinery/computer/ares_console/proc/delink() - if(link && link.interface == src) - link.interface = null - link.linked_systems -= src - link = null - -/obj/structure/machinery/computer/ares_console/Destroy() - delink() - return ..() - -// #################### Working Joe Ticket Console ##################### -/obj/structure/machinery/computer/working_joe - name = "APOLLO Maintenance Controller" - desc = "A console built to facilitate Working Joes and their operation, allowing for simple allocation of resources." - icon = 'icons/obj/structures/machinery/ares.dmi' - icon_state = "console" - exproof = TRUE - - /// The ID used to link all devices. - var/link_id = MAIN_SHIP_DEFAULT_NAME - var/datum/ares_link/link - var/obj/structure/machinery/ares/processor/interface/processor - - var/current_menu = "login" - var/last_menu = "" - - var/authentication = ARES_ACCESS_BASIC - /// The last person to login. - var/last_login - /// A record of who logged in and when. - var/list/login_list = list() - - -/obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) - if(link && !override) - return FALSE - if(new_link.link_id == link_id) - new_link.ticket_computers += src - link = new_link - log_debug("[name] linked to Ares Link [link_id]") - new_link.linked_systems += src - return TRUE - -/obj/structure/machinery/computer/working_joe/Initialize(mapload, ...) - link_systems(override = FALSE) - . = ..() - -/obj/structure/machinery/computer/working_joe/proc/delink() - if(link) - link.ticket_computers -= src - link.linked_systems -= src - link = null - -/obj/structure/machinery/computer/working_joe/Destroy() - delink() - return ..() diff --git a/code/game/machinery/ARES/ARES_interface.dm b/code/game/machinery/ARES/ARES_interface.dm new file mode 100644 index 000000000000..64755897bc8e --- /dev/null +++ b/code/game/machinery/ARES/ARES_interface.dm @@ -0,0 +1,471 @@ +// #################### ARES Interface Console ##################### +/obj/structure/machinery/computer/ares_console + name = "ARES Interface" + desc = "A console built to interface with ARES, allowing for 1:1 communication." + icon = 'icons/obj/structures/machinery/ares.dmi' + icon_state = "console" + exproof = TRUE + + var/current_menu = "login" + var/last_menu = "" + + var/authentication = ARES_ACCESS_BASIC + + /// The last person to login. + var/last_login + /// The person pretending to be last_login + var/sudo_holder + + /// The current deleted chat log of 1:1 conversations being read. + var/list/deleted_1to1 = list() + + /// The ID used to link all devices. + var/datum/ares_link/link + /// The datacore storing all the information. + var/datum/ares_datacore/datacore + +/obj/structure/machinery/computer/ares_console/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link) + new_link.interface = src + link = new_link + new_link.linked_systems += src + if(!datacore) + datacore = GLOB.ares_datacore + return TRUE + +/obj/structure/machinery/computer/ares_console/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/computer/ares_console/proc/delink() + if(link) + if(link.interface == src) + link.interface = null + link.linked_systems -= src + link = null + datacore = null + +/obj/structure/machinery/computer/ares_console/Destroy() + delink() + return ..() + +// ------ ARES Interface UI ------ // + +/obj/structure/machinery/computer/ares_console/attack_hand(mob/user as mob) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/ares_console/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AresInterface", name) + ui.open() + +/obj/structure/machinery/computer/ares_console/ui_data(mob/user) + var/list/data = list() + + data["current_menu"] = current_menu + data["last_page"] = last_menu + + data["logged_in"] = last_login + data["sudo"] = sudo_holder ? TRUE : FALSE + + data["access_text"] = "[sudo_holder ? "(SUDO)," : ""] access level [authentication], [ares_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = security_level + data["evac_status"] = EvacuationAuthority.evac_status + data["worldtime"] = world.time + + data["access_log"] = datacore.interface_access_list + data["apollo_log"] = datacore.apollo_log + + data["deleted_conversation"] = deleted_1to1 + + data["distresstime"] = datacore.ares_distress_cooldown + data["distresstimelock"] = DISTRESS_TIME_LOCK + data["quarterstime"] = datacore.ares_quarters_cooldown + data["mission_failed"] = SSticker.mode.is_in_endgame + data["nuketimelock"] = NUCLEAR_TIME_LOCK + data["nuke_available"] = datacore.nuke_available + + var/list/logged_announcements = list() + for(var/datum/ares_record/announcement/broadcast as anything in datacore.records_announcement) + var/list/current_broadcast = list() + current_broadcast["time"] = broadcast.time + current_broadcast["title"] = broadcast.title + current_broadcast["details"] = broadcast.details + current_broadcast["ref"] = "\ref[broadcast]" + logged_announcements += list(current_broadcast) + data["records_announcement"] = logged_announcements + + var/list/logged_alerts = list() + for(var/datum/ares_record/security/security_alert as anything in datacore.records_security) + var/list/current_alert = list() + current_alert["time"] = security_alert.time + current_alert["title"] = security_alert.title + current_alert["details"] = security_alert.details + current_alert["ref"] = "\ref[security_alert]" + logged_alerts += list(current_alert) + data["records_security"] = logged_alerts + + var/list/logged_flights = list() + for(var/datum/ares_record/flight/flight_log as anything in datacore.records_flight) + var/list/current_flight = list() + current_flight["time"] = flight_log.time + current_flight["title"] = flight_log.title + current_flight["details"] = flight_log.details + current_flight["user"] = flight_log.user + current_flight["ref"] = "\ref[flight_log]" + logged_flights += list(current_flight) + data["records_flight"] = logged_flights + + var/list/logged_bioscans = list() + for(var/datum/ares_record/bioscan/scan as anything in datacore.records_bioscan) + var/list/current_scan = list() + current_scan["time"] = scan.time + current_scan["title"] = scan.title + current_scan["details"] = scan.details + current_scan["ref"] = "\ref[scan]" + logged_bioscans += list(current_scan) + data["records_bioscan"] = logged_bioscans + + var/list/logged_bombs = list() + for(var/datum/ares_record/bombardment/bomb as anything in datacore.records_bombardment) + var/list/current_bomb = list() + current_bomb["time"] = bomb.time + current_bomb["title"] = bomb.title + current_bomb["details"] = bomb.details + current_bomb["user"] = bomb.user + current_bomb["ref"] = "\ref[bomb]" + logged_bombs += list(current_bomb) + data["records_bombardment"] = logged_bombs + + var/list/logged_deletes = list() + for(var/datum/ares_record/deletion/deleted as anything in datacore.records_deletion) + if(!istype(deleted)) + continue + var/list/current_delete = list() + current_delete["time"] = deleted.time + current_delete["title"] = deleted.title + current_delete["details"] = deleted.details + current_delete["user"] = deleted.user + current_delete["ref"] = "\ref[deleted]" + logged_deletes += list(current_delete) + data["records_deletion"] = logged_deletes + + var/list/logged_discussions = list() + for(var/datum/ares_record/deleted_talk/deleted_convo as anything in datacore.records_deletion) + if(!istype(deleted_convo)) + continue + var/list/deleted_disc = list() + deleted_disc["time"] = deleted_convo.time + deleted_disc["title"] = deleted_convo.title + deleted_disc["ref"] = "\ref[deleted_convo]" + logged_discussions += list(deleted_disc) + data["deleted_discussions"] = logged_discussions + + var/list/logged_orders = list() + for(var/datum/ares_record/requisition_log/req_order as anything in datacore.records_asrs) + if(!istype(req_order)) + continue + var/list/current_order = list() + current_order["time"] = req_order.time + current_order["details"] = req_order.details + current_order["title"] = req_order.title + current_order["user"] = req_order.user + current_order["ref"] = "\ref[req_order]" + logged_orders += list(current_order) + data["records_requisition"] = logged_orders + + var/list/logged_convos = list() + var/list/active_convo = list() + var/active_ref + for(var/datum/ares_record/talk_log/log as anything in datacore.records_talking) + if(!istype(log)) + continue + if(log.user == last_login) + active_convo = log.conversation + active_ref = "\ref[log]" + + var/list/current_convo = list() + current_convo["user"] = log.user + current_convo["ref"] = "\ref[log]" + current_convo["conversation"] = log.conversation + logged_convos += list(current_convo) + + data["active_convo"] = active_convo + data["active_ref"] = active_ref + data["conversations"] = logged_convos + + return data + +/obj/structure/machinery/computer/ares_console/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/ares_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + playsound(src, "keyboard_alt", 15, 1) + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + var/temp_holder = current_menu + current_menu = last_menu + last_menu = temp_holder + + if("login") + var/mob/living/carbon/human/operator = usr + var/obj/item/card/id/idcard = operator.get_active_hand() + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else + to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + datacore.interface_access_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." + current_menu = "main" + + if("sudo") + var/new_user = tgui_input_text(usr, "Enter Sudo Username", "Sudo User", encode = FALSE) + if(new_user) + if(new_user == sudo_holder) + last_login = sudo_holder + sudo_holder = null + return FALSE + if(new_user == last_login) + to_chat(usr, SPAN_WARNING("Already remote logged in as this user.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + sudo_holder = last_login + last_login = new_user + datacore.interface_access_list += "[last_login] at [worldtime2text()], Sudo Access." + return TRUE + if("sudo_logout") + datacore.interface_access_list += "[last_login] at [worldtime2text()], Sudo Logout." + last_login = sudo_holder + sudo_holder = null + return + // -- Page Changers -- // + if("logout") + last_menu = current_menu + current_menu = "login" + if(sudo_holder) + datacore.interface_access_list += "[last_login] at [worldtime2text()], Sudo Logout." + last_login = sudo_holder + sudo_holder = null + datacore.interface_access_list += "[last_login] logged out at [worldtime2text()]." + + if("home") + last_menu = current_menu + current_menu = "main" + if("page_1to1") + last_menu = current_menu + current_menu = "talking" + if("page_announcements") + last_menu = current_menu + current_menu = "announcements" + if("page_bioscans") + last_menu = current_menu + current_menu = "bioscans" + if("page_bombardments") + last_menu = current_menu + current_menu = "bombardments" + if("page_apollo") + last_menu = current_menu + current_menu = "apollo" + if("page_access") + last_menu = current_menu + current_menu = "access_log" + if("page_security") + last_menu = current_menu + current_menu = "security" + if("page_flight") + last_menu = current_menu + current_menu = "flight_log" + if("page_requisitions") + last_menu = current_menu + current_menu = "requisitions" + if("page_emergency") + last_menu = current_menu + current_menu = "emergency" + if("page_deleted") + last_menu = current_menu + current_menu = "delete_log" + if("page_deleted_1to1") + last_menu = current_menu + current_menu = "deleted_talks" + + // -- Delete Button -- // + if("delete_record") + var/datum/ares_record/record = locate(params["record"]) + if(record.record_name == ARES_RECORD_DELETED) + return FALSE + var/datum/ares_record/deletion/new_delete = new + var/new_details = "Error" + var/new_title = "Error" + switch(record.record_name) + if(ARES_RECORD_ANNOUNCE) + new_title = "[record.title] at [record.time]" + new_details = record.details + datacore.records_announcement -= record + if(ARES_RECORD_SECURITY, ARES_RECORD_ANTIAIR) + new_title = "[record.title] at [record.time]" + new_details = record.details + datacore.records_security -= record + if(ARES_RECORD_BIOSCAN) + new_title = "[record.title] at [record.time]" + new_details = record.details + datacore.records_bioscan -= record + if(ARES_RECORD_BOMB) + new_title = "[record.title] at [record.time]" + new_details = "[record.details] Launched by [record.user]." + datacore.records_bombardment -= record + + new_delete.details = new_details + new_delete.user = last_login + new_delete.title = new_title + + datacore.records_deletion += new_delete + + // -- 1:1 Conversation -- // + if("new_conversation") + var/datum/ares_record/talk_log/convo = new(last_login) + convo.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], 'New 1:1 link initiated. Greetings, [last_login].'" + datacore.records_talking += convo + + if("clear_conversation") + var/datum/ares_record/talk_log/conversation = locate(params["active_convo"]) + if(!istype(conversation)) + return FALSE + var/datum/ares_record/deleted_talk/deleted = new + deleted.title = conversation.title + deleted.conversation = conversation.conversation + deleted.user = conversation.user + datacore.records_deletion += deleted + datacore.records_talking -= conversation + + if("message_ares") + var/message = tgui_input_text(usr, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) + if(message) + message_ares(message, usr, params["active_convo"]) + + if("read_record") + var/datum/ares_record/deleted_talk/conversation = locate(params["record"]) + deleted_1to1 = conversation.conversation + last_menu = current_menu + current_menu = "read_deleted" + + // -- Emergency Buttons -- // + if("general_quarters") + if(!COOLDOWN_FINISHED(datacore, ares_quarters_cooldown)) + to_chat(usr, SPAN_WARNING("It has not been long enough since the last General Quarters call!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(security_level < SEC_LEVEL_RED) + set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE) + shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') + log_game("[key_name(usr)] has called for general quarters via ARES.") + message_admins("[key_name_admin(usr)] has called for general quarters via ARES.") + log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.") + COOLDOWN_START(datacore, ares_quarters_cooldown, 10 MINUTES) + . = TRUE + + if("evacuation_start") + if(security_level < SEC_LEVEL_RED) + to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + if(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) + to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + if(!EvacuationAuthority.initiate_evacuation()) + to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + log_game("[key_name(usr)] has called for an emergency evacuation via ARES.") + message_admins("[key_name_admin(usr)] has called for an emergency evacuation via ARES.") + log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.") + . = TRUE + + if("distress") + if(!SSticker.mode) + return FALSE //Not a game mode? + if(world.time < DISTRESS_TIME_LOCK) + to_chat(usr, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(!COOLDOWN_FINISHED(datacore, ares_distress_cooldown)) + to_chat(usr, SPAN_WARNING("The distress launcher is cooling down!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(security_level == SEC_LEVEL_DELTA) + to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + else if(security_level < SEC_LEVEL_RED) + to_chat(usr, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + for(var/client/admin in GLOB.admins) + if((R_ADMIN|R_MOD) & admin.admin_holder.rights) + playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) + SSticker.mode.request_ert(usr, TRUE) + to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) + COOLDOWN_START(datacore, ares_distress_cooldown, COOLDOWN_COMM_REQUEST) + return TRUE + + if("nuclearbomb") + if(!SSticker.mode) + return FALSE //Not a game mode? + if(world.time < NUCLEAR_TIME_LOCK) + to_chat(usr, SPAN_WARNING("It is too soon to request Nuclear Ordnance!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(!COOLDOWN_FINISHED(datacore, ares_nuclear_cooldown)) + to_chat(usr, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame) + to_chat(usr, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + var/reason = tgui_input_text(usr, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance") + if(!reason) + return FALSE + for(var/client/admin in GLOB.admins) + if((R_ADMIN|R_MOD) & admin.admin_holder.rights) + playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) + message_admins("[key_name(usr)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(usr)] (APPROVE) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") + to_chat(usr, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]")) + log_ares_security("Nuclear Ordnance Request", "[last_login] has sent a request for nuclear ordnance for the following reason: [reason]") + if(ares_can_interface()) + ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V") + ai_silent_announcement("Reason given: [reason].", ".V") + COOLDOWN_START(datacore, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT) + return TRUE diff --git a/code/game/machinery/ARES/ARES_interface_apollo.dm b/code/game/machinery/ARES/ARES_interface_apollo.dm new file mode 100644 index 000000000000..ad4df31c35a8 --- /dev/null +++ b/code/game/machinery/ARES/ARES_interface_apollo.dm @@ -0,0 +1,414 @@ +// #################### Working Joe Ticket Console ##################### +/obj/structure/machinery/computer/working_joe + name = "APOLLO Maintenance Controller" + desc = "A console built to facilitate Working Joes and their operation, allowing for simple allocation of resources." + icon = 'icons/obj/structures/machinery/ares.dmi' + icon_state = "console" + exproof = TRUE + + /// The ID used to link all devices. + var/datum/ares_link/link + /// The datacore storing all the information. + var/datum/ares_datacore/datacore + + var/current_menu = "login" + var/last_menu = "" + + var/authentication = ARES_ACCESS_BASIC + /// The last person to login. + var/last_login + + +/obj/structure/machinery/computer/working_joe/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) + if(link && !override) + return FALSE + if(new_link) + new_link.ticket_computers += src + link = new_link + new_link.linked_systems += src + if(!datacore) + datacore = GLOB.ares_datacore + return TRUE + +/obj/structure/machinery/computer/working_joe/Initialize(mapload, ...) + link_systems(override = FALSE) + . = ..() + +/obj/structure/machinery/computer/working_joe/proc/delink() + if(link) + link.ticket_computers -= src + link.linked_systems -= src + link = null + datacore = null + +/obj/structure/machinery/computer/working_joe/Destroy() + delink() + return ..() + +// ------ Maintenance Controller UI ------ // +/obj/structure/machinery/computer/working_joe/attack_hand(mob/user as mob) + if(..() || !allowed(usr) || inoperable()) + return FALSE + + tgui_interact(user) + return TRUE + +/obj/structure/machinery/computer/working_joe/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "WorkingJoe", name) + ui.open() + +/obj/structure/machinery/computer/working_joe/ui_data(mob/user) + var/list/data = list() + + data["current_menu"] = current_menu + data["last_page"] = last_menu + + data["logged_in"] = last_login + + data["access_text"] = "access level [authentication], [ares_auth_to_text(authentication)]." + data["access_level"] = authentication + + data["alert_level"] = security_level + data["worldtime"] = world.time + + data["access_log"] = list() + data["access_log"] += datacore.apollo_login_list + + data["apollo_log"] = list() + data["apollo_log"] += datacore.apollo_log + + var/list/logged_maintenance = list() + for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) + if(!istype(maint_ticket)) + continue + var/lock_status = TICKET_OPEN + switch(maint_ticket.ticket_status) + if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_COMPLETED) + lock_status = TICKET_CLOSED + + var/list/current_maint = list() + current_maint["id"] = maint_ticket.ticket_id + current_maint["time"] = maint_ticket.ticket_time + current_maint["priority_status"] = maint_ticket.ticket_priority + current_maint["category"] = maint_ticket.ticket_name + current_maint["details"] = maint_ticket.ticket_details + current_maint["status"] = maint_ticket.ticket_status + current_maint["submitter"] = maint_ticket.ticket_submitter + current_maint["assignee"] = maint_ticket.ticket_assignee + current_maint["lock_status"] = lock_status + current_maint["ref"] = "\ref[maint_ticket]" + logged_maintenance += list(current_maint) + data["maintenance_tickets"] = logged_maintenance + + var/list/logged_access = list() + var/list/requesting_access = list() + for(var/datum/ares_ticket/access/access_ticket as anything in link.tickets_access) + var/lock_status = TICKET_OPEN + switch(access_ticket.ticket_status) + if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED) + lock_status = TICKET_CLOSED + + var/list/current_ticket = list() + current_ticket["id"] = access_ticket.ticket_id + current_ticket["time"] = access_ticket.ticket_time + current_ticket["priority_status"] = access_ticket.ticket_priority + current_ticket["title"] = access_ticket.ticket_name + current_ticket["details"] = access_ticket.ticket_details + current_ticket["status"] = access_ticket.ticket_status + current_ticket["submitter"] = access_ticket.ticket_submitter + current_ticket["assignee"] = access_ticket.ticket_assignee + current_ticket["lock_status"] = lock_status + current_ticket["ref"] = "\ref[access_ticket]" + logged_access += list(current_ticket) + + if(lock_status == TICKET_OPEN) + requesting_access += access_ticket.ticket_name + data["access_tickets"] = logged_access + + return data + +/obj/structure/machinery/computer/working_joe/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(!allowed(user)) + return UI_UPDATE + if(inoperable()) + return UI_DISABLED + +/obj/structure/machinery/computer/working_joe/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/playsound = TRUE + var/mob/living/carbon/human/operator = usr + + switch (action) + if("go_back") + if(!last_menu) + return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) + var/temp_holder = current_menu + current_menu = last_menu + last_menu = temp_holder + + if("login") + + var/obj/item/card/id/idcard = operator.get_active_hand() + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + authentication = get_ares_access(idcard) + last_login = idcard.registered_name + else + to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(authentication) + datacore.apollo_login_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." + current_menu = "main" + + if("logout") + last_menu = current_menu + current_menu = "login" + datacore.apollo_login_list += "[last_login] logged out at [worldtime2text()]." + + if("home") + last_menu = current_menu + current_menu = "main" + if("page_logins") + last_menu = current_menu + current_menu = "login_records" + if("page_apollo") + last_menu = current_menu + current_menu = "apollo" + if("page_request") + last_menu = current_menu + current_menu = "access_requests" + if("page_report") + last_menu = current_menu + current_menu = "maint_reports" + if("page_tickets") + last_menu = current_menu + current_menu = "access_tickets" + if("page_maintenance") + last_menu = current_menu + current_menu = "maint_claim" + + if("new_report") + var/priority_report = FALSE + var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) + switch(maint_type) + if("Major Structural Damage", "Fire", "Communications Failure", "Power Generation Failure") + priority_report = TRUE + + if(!maint_type) + return FALSE + var/details = tgui_input_text(operator, "What are the details for this report?", "Ticket Details", encode = FALSE) + if(!details) + return FALSE + + if((authentication >= APOLLO_ACCESS_REPORTER) && !priority_report) + var/is_priority = tgui_alert(operator, "Is this a priority report?", "Priority designation", list("Yes", "No")) + if(is_priority == "Yes") + priority_report = TRUE + + var/confirm = alert(operator, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"]\n Category: '[maint_type]'\n Details: '[details]'\n\n Is this correct?", "Confirmation", "Yes", "No") + if(confirm == "Yes") + if(link) + var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, maint_type, details, priority_report) + link.tickets_maintenance += maint_ticket + if(priority_report) + ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") + log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") + return TRUE + return FALSE + + if("claim_ticket") + var/datum/ares_ticket/ticket = locate(params["ticket"]) + if(!istype(ticket)) + return FALSE + var/claim = TRUE + var/assigned = ticket.ticket_assignee + if(assigned) + if(assigned == last_login) + var/prompt = tgui_alert(usr, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) + if(prompt != "Yes") + return FALSE + /// set ticket back to pending + ticket.ticket_assignee = null + ticket.ticket_status = TICKET_PENDING + return claim + var/choice = tgui_alert(usr, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) + if(choice != "Yes") + claim = FALSE + if(claim) + ticket.ticket_assignee = last_login + ticket.ticket_status = TICKET_ASSIGNED + return claim + + if("cancel_ticket") + var/datum/ares_ticket/ticket = locate(params["ticket"]) + if(!istype(ticket)) + return FALSE + if(ticket.ticket_submitter != last_login) + to_chat(usr, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) + return FALSE + to_chat(usr, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) + ticket.ticket_status = TICKET_CANCELLED + if(ticket.ticket_priority) + ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") + return TRUE + + if("mark_ticket") + var/datum/ares_ticket/ticket = locate(params["ticket"]) + if(!istype(ticket)) + return FALSE + if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) + to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + return FALSE + var/choice = tgui_alert(usr, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) + switch(choice) + if(TICKET_COMPLETED) + ticket.ticket_status = TICKET_COMPLETED + if(TICKET_REJECTED) + ticket.ticket_status = TICKET_REJECTED + else + return FALSE + if(ticket.ticket_priority) + ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") + to_chat(usr, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) + return TRUE + + if("new_access") + var/obj/item/card/id/idcard = operator.get_active_hand() + var/has_id = FALSE + if(istype(idcard)) + has_id = TRUE + else if(operator.wear_id) + idcard = operator.wear_id + if(istype(idcard)) + has_id = TRUE + if(!has_id) + to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + if(idcard.registered_name != last_login) + to_chat(operator, SPAN_WARNING("This ID card does not match the active login!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + var/details = tgui_input_text(operator, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) + if(!details) + return FALSE + + var/confirm = alert(operator, "Please confirm the submission of your access ticket request.\n\nHolder: '[last_login]'\nDetails: '[details]'\n\nIs this correct?", "Confirmation", "Yes", "No") + if(confirm != "Yes" || !link) + return FALSE + var/datum/ares_ticket/access/access_ticket = new(last_login, details, FALSE, idcard.registered_gid) + link.waiting_ids += idcard + link.tickets_access += access_ticket + log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Details of '[details]'.") + message_admins(SPAN_STAFF_IC("[key_name_admin(operator)] created a new ARES Access Ticket."), 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] requesting access for '[details].") + return TRUE + + if("return_access") + playsound = FALSE + var/datum/ares_ticket/access/access_ticket + for(var/datum/ares_ticket/access/possible_ticket in link.tickets_access) + if(possible_ticket.ticket_status != TICKET_GRANTED) + continue + if(possible_ticket.ticket_name != last_login) + continue + access_ticket = possible_ticket + break + + for(var/obj/item/card/id/identification in link.active_ids) + if(!istype(identification)) + continue + if(identification.registered_gid != access_ticket.user_id_num) + continue + + access_ticket.ticket_status = TICKET_RETURNED + identification.access -= ACCESS_MARINE_AI_TEMP + identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]." + + to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered.")) + playsound(src, 'sound/machines/chime.ogg', 15, 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] surrendered their access.") + + authentication = get_ares_access(identification) + if(authentication) + datacore.apollo_login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket." + return TRUE + + to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!")) + playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) + return FALSE + + if("auth_access") + playsound = FALSE + var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) + if(!access_ticket) + return FALSE + for(var/obj/item/card/id/identification in link.waiting_ids) + if(!istype(identification)) + continue + if(identification.registered_gid != access_ticket.user_id_num) + continue + identification.handle_ares_access(last_login, operator) + access_ticket.ticket_status = TICKET_GRANTED + playsound(src, 'sound/machines/chime.ogg', 15, 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was granted access by [last_login].") + return TRUE + for(var/obj/item/card/id/identification in link.active_ids) + if(!istype(identification)) + continue + if(identification.registered_gid != access_ticket.user_id_num) + continue + identification.handle_ares_access(last_login, operator) + access_ticket.ticket_status = TICKET_REVOKED + playsound(src, 'sound/machines/chime.ogg', 15, 1) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] had access revoked by [last_login].") + return TRUE + return FALSE + + if("reject_access") + var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) + if(!istype(access_ticket)) + return FALSE + if(access_ticket.ticket_assignee != last_login && access_ticket.ticket_assignee) //must be claimed by you or unclaimed.) + to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) + return FALSE + access_ticket.ticket_status = TICKET_REJECTED + to_chat(usr, SPAN_NOTICE("[access_ticket.ticket_type] [access_ticket.ticket_id] marked as rejected.")) + ares_apollo_talk("Access Ticket [access_ticket.ticket_id]: [access_ticket.ticket_submitter] was rejected access by [last_login].") + return TRUE + + if(playsound) + playsound(src, "keyboard_alt", 15, 1) + +/obj/item/card/id/proc/handle_ares_access(logged_in, mob/user) + var/operator = key_name(user) + var/datum/ares_link/link = GLOB.ares_link + if(logged_in == MAIN_AI_SYSTEM) + if(!user) + operator = "[MAIN_AI_SYSTEM] (Sensor Trip)" + else + operator = "[user.ckey]/([MAIN_AI_SYSTEM])" + if(ACCESS_MARINE_AI_TEMP in access) + access -= ACCESS_MARINE_AI_TEMP + link.active_ids -= src + modification_log += "Temporary AI access revoked by [operator]" + to_chat(user, SPAN_NOTICE("Access revoked from [registered_name].")) + else + access += ACCESS_MARINE_AI_TEMP + modification_log += "Temporary AI access granted by [operator]" + to_chat(user, SPAN_NOTICE("Access granted to [registered_name].")) + link.waiting_ids -= src + link.active_ids += src + return TRUE diff --git a/code/game/machinery/ARES/ARES_procs.dm b/code/game/machinery/ARES/ARES_procs.dm index e03f218f0f34..4dbcf794f7be 100644 --- a/code/game/machinery/ARES/ARES_procs.dm +++ b/code/game/machinery/ARES/ARES_procs.dm @@ -1,4 +1,5 @@ GLOBAL_DATUM_INIT(ares_link, /datum/ares_link, new) +GLOBAL_DATUM_INIT(ares_datacore, /datum/ares_datacore, new) GLOBAL_LIST_INIT(maintenance_categories, list( "Broken Light", "Shattered Glass", @@ -15,26 +16,56 @@ GLOBAL_LIST_INIT(maintenance_categories, list( )) /datum/ares_link - var/link_id = MAIN_SHIP_DEFAULT_NAME /// All motion triggers for the link var/list/linked_alerts = list() /// All machinery for the link var/list/linked_systems = list() - var/obj/structure/machinery/ares/processor/interface/p_interface - var/obj/structure/machinery/ares/processor/apollo/p_apollo - var/obj/structure/machinery/ares/processor/bioscan/p_bioscan + var/obj/structure/machinery/ares/cpu/central_processor + var/obj/structure/machinery/ares/processor/interface/processor_interface + var/obj/structure/machinery/ares/processor/apollo/processor_apollo + var/obj/structure/machinery/ares/processor/bioscan/processor_bioscan var/obj/structure/machinery/computer/ares_console/interface var/list/obj/structure/machinery/computer/working_joe/ticket_computers = list() - /// The chat log of the apollo link. Timestamped. - var/list/apollo_log = list() - /// Working Joe stuff var/list/tickets_maintenance = list() var/list/tickets_access = list() var/list/waiting_ids = list() var/list/active_ids = list() +/datum/ares_datacore + /// A record of who logged in and when. + var/list/interface_access_list = list() + /// Access list for Apollo Maintenance Console + var/list/apollo_login_list = list() + + /// The chat log of the apollo link. Timestamped. + var/list/apollo_log = list() + + /// Holds all (/datum/ares_record/announcement)s + var/list/records_announcement = list() + /// Holds all (/datum/ares_record/bioscan)s + var/list/records_bioscan = list() + /// Holds all (/datum/ares_record/bombardment)s + var/list/records_bombardment = list() + /// Holds all (/datum/ares_record/deletion)s + var/list/records_deletion = list() + /// Holds all (/datum/ares_record/talk_log)s + var/list/records_talking = list() + /// Holds all (/datum/ares_record/requisition_log)s + var/list/records_asrs = list() + /// Holds all (/datum/ares_record/security)s (including AA) + var/list/records_security = list() + /// Holds all (/datum/ares_record/flight)s + var/list/records_flight = list() + /// Is nuke request usable or not? + var/nuke_available = TRUE + + + COOLDOWN_DECLARE(ares_distress_cooldown) + COOLDOWN_DECLARE(ares_nuclear_cooldown) + COOLDOWN_DECLARE(ares_quarters_cooldown) + /datum/ares_link/Destroy() for(var/obj/structure/machinery/ares/link in linked_systems) link.delink() @@ -46,38 +77,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( // ------ ARES Logging Procs ------ // -/proc/log_ares_apollo(speaker, message) - if(!speaker) - speaker = "Unknown" - var/datum/ares_link/link = GLOB.ares_link - if(!link.p_apollo || link.p_apollo.inoperable()) - return FALSE - if(!link.p_interface || link.p_interface.inoperable()) - return FALSE - link.apollo_log.Add("[worldtime2text()]: [speaker], '[message]'") - -/datum/ares_link/proc/log_ares_bioscan(title, input) - interface.records_bioscan.Add(new /datum/ares_record/bioscan(title, input)) - -/datum/ares_link/proc/log_ares_bombardment(user_name, ob_name, coordinates) - interface.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user_name)) - -/datum/ares_link/proc/log_ares_announcement(title, message) - interface.records_announcement.Add(new /datum/ares_record/announcement(title, message)) - -/datum/ares_link/proc/log_ares_requisition(source, details, user_name) - interface.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user_name)) - -/datum/ares_link/proc/log_ares_security(title, details) - interface.records_security.Add(new /datum/ares_record/security(title, details)) - -/datum/ares_link/proc/log_ares_antiair(details) - interface.records_security.Add(new /datum/ares_record/security/antiair(details)) - -/datum/ares_link/proc/log_ares_flight(user_name, details) - interface.records_flight.Add(new /datum/ares_record/flight(details, user_name)) -// ------ End ARES Logging Procs ------ // - /proc/ares_apollo_talk(broadcast_message) var/datum/language/apollo/apollo = GLOB.all_languages[LANGUAGE_APOLLO] for(var/mob/living/silicon/decoy/ship_ai/ai in ai_mob_list) @@ -89,7 +88,7 @@ GLOBAL_LIST_INIT(maintenance_categories, list( playsound_client(listener.client, sound('sound/misc/interference.ogg'), listener, vol = 45) /proc/ares_can_interface() - var/obj/structure/machinery/ares/processor/interface/processor = GLOB.ares_link.p_interface + var/obj/structure/machinery/ares/processor/interface/processor = GLOB.ares_link.processor_interface if(!istype(GLOB.ares_link)) return FALSE if(processor && !processor.inoperable()) @@ -97,12 +96,66 @@ GLOBAL_LIST_INIT(maintenance_categories, list( return FALSE //interface processor not found or is broken /proc/ares_can_log() - var/obj/structure/machinery/computer/ares_console/interface = GLOB.ares_link.interface - if(!istype(GLOB.ares_link)) + if(!istype(GLOB.ares_link) || !istype(GLOB.ares_datacore)) return FALSE - if(interface && !interface.inoperable()) + var/obj/structure/machinery/ares/cpu/central_processor = GLOB.ares_link.central_processor + if(central_processor && !central_processor.inoperable()) return TRUE - return FALSE //ares interface not found or is broken + return FALSE //CPU not found or is broken + +/proc/log_ares_apollo(speaker, message) + if(!ares_can_log()) + return FALSE + var/datum/ares_link/link = GLOB.ares_link + if(!link.processor_apollo || link.processor_apollo.inoperable()) + return FALSE + if(!speaker) + speaker = "Unknown" + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.apollo_log.Add("[worldtime2text()]: [speaker], '[message]'") + +/proc/log_ares_bioscan(title, input) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_bioscan.Add(new /datum/ares_record/bioscan(title, input)) + +/proc/log_ares_bombardment(user_name, ob_name, coordinates) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_bombardment.Add(new /datum/ares_record/bombardment(ob_name, "Bombardment fired at [coordinates].", user_name)) + +/proc/log_ares_announcement(title, message) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_announcement.Add(new /datum/ares_record/announcement(title, message)) + +/proc/log_ares_requisition(source, details, user_name) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_asrs.Add(new /datum/ares_record/requisition_log(source, details, user_name)) + +/proc/log_ares_security(title, details) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_security.Add(new /datum/ares_record/security(title, details)) + +/proc/log_ares_antiair(details) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_security.Add(new /datum/ares_record/security/antiair(details)) + +/proc/log_ares_flight(user_name, details) + if(!ares_can_log()) + return FALSE + var/datum/ares_datacore/datacore = GLOB.ares_datacore + datacore.records_flight.Add(new /datum/ares_record/flight(details, user_name)) +// ------ End ARES Logging Procs ------ // // ------ ARES Interface Procs ------ // /obj/structure/machinery/computer/proc/get_ares_access(obj/item/card/id/card) @@ -172,440 +225,6 @@ GLOBAL_LIST_INIT(maintenance_categories, list( conversation.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], '[text]'" // ------ End ARES Interface Procs ------ // -// ------ ARES Interface UI ------ // - -/obj/structure/machinery/computer/ares_console/attack_hand(mob/user as mob) - if(..() || !allowed(usr) || inoperable()) - return FALSE - - tgui_interact(user) - return TRUE - -/obj/structure/machinery/computer/ares_console/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AresInterface", name) - ui.open() - -/obj/structure/machinery/computer/ares_console/ui_data(mob/user) - var/list/data = list() - - data["current_menu"] = current_menu - data["last_page"] = last_menu - - data["logged_in"] = last_login - data["sudo"] = sudo_holder ? TRUE : FALSE - - data["access_text"] = "[sudo_holder ? "(SUDO)," : ""] access level [authentication], [ares_auth_to_text(authentication)]." - data["access_level"] = authentication - - data["alert_level"] = security_level - data["evac_status"] = EvacuationAuthority.evac_status - data["worldtime"] = world.time - - data["access_log"] = list() - data["access_log"] += access_list - data["apollo_log"] = list() - data["apollo_log"] += link.apollo_log - - data["deleted_conversation"] = list() - data["deleted_conversation"] += deleted_1to1 - - data["distresstime"] = ares_distress_cooldown - data["distresstimelock"] = DISTRESS_TIME_LOCK - data["quarterstime"] = ares_quarters_cooldown - data["mission_failed"] = SSticker.mode.is_in_endgame - data["nuketimelock"] = NUCLEAR_TIME_LOCK - data["nuke_available"] = nuke_available - - var/list/logged_announcements = list() - for(var/datum/ares_record/announcement/broadcast as anything in records_announcement) - var/list/current_broadcast = list() - current_broadcast["time"] = broadcast.time - current_broadcast["title"] = broadcast.title - current_broadcast["details"] = broadcast.details - current_broadcast["ref"] = "\ref[broadcast]" - logged_announcements += list(current_broadcast) - data["records_announcement"] = logged_announcements - - var/list/logged_alerts = list() - for(var/datum/ares_record/security/security_alert as anything in records_security) - var/list/current_alert = list() - current_alert["time"] = security_alert.time - current_alert["title"] = security_alert.title - current_alert["details"] = security_alert.details - current_alert["ref"] = "\ref[security_alert]" - logged_alerts += list(current_alert) - data["records_security"] = logged_alerts - - var/list/logged_flights = list() - for(var/datum/ares_record/flight/flight_log as anything in records_flight) - var/list/current_flight = list() - current_flight["time"] = flight_log.time - current_flight["title"] = flight_log.title - current_flight["details"] = flight_log.details - current_flight["user"] = flight_log.user - current_flight["ref"] = "\ref[flight_log]" - logged_flights += list(current_flight) - data["records_flight"] = logged_flights - - var/list/logged_bioscans = list() - for(var/datum/ares_record/bioscan/scan as anything in records_bioscan) - var/list/current_scan = list() - current_scan["time"] = scan.time - current_scan["title"] = scan.title - current_scan["details"] = scan.details - current_scan["ref"] = "\ref[scan]" - logged_bioscans += list(current_scan) - data["records_bioscan"] = logged_bioscans - - var/list/logged_bombs = list() - for(var/datum/ares_record/bombardment/bomb as anything in records_bombardment) - var/list/current_bomb = list() - current_bomb["time"] = bomb.time - current_bomb["title"] = bomb.title - current_bomb["details"] = bomb.details - current_bomb["user"] = bomb.user - current_bomb["ref"] = "\ref[bomb]" - logged_bombs += list(current_bomb) - data["records_bombardment"] = logged_bombs - - var/list/logged_deletes = list() - for(var/datum/ares_record/deletion/deleted as anything in records_deletion) - if(!istype(deleted)) - continue - var/list/current_delete = list() - current_delete["time"] = deleted.time - current_delete["title"] = deleted.title - current_delete["details"] = deleted.details - current_delete["user"] = deleted.user - current_delete["ref"] = "\ref[deleted]" - logged_deletes += list(current_delete) - data["records_deletion"] = logged_deletes - - var/list/logged_discussions = list() - for(var/datum/ares_record/deleted_talk/deleted_convo as anything in records_deletion) - if(!istype(deleted_convo)) - continue - var/list/deleted_disc = list() - deleted_disc["time"] = deleted_convo.time - deleted_disc["title"] = deleted_convo.title - deleted_disc["ref"] = "\ref[deleted_convo]" - logged_discussions += list(deleted_disc) - data["deleted_discussions"] = logged_discussions - - var/list/logged_orders = list() - for(var/datum/ares_record/requisition_log/req_order as anything in records_asrs) - if(!istype(req_order)) - continue - var/list/current_order = list() - current_order["time"] = req_order.time - current_order["details"] = req_order.details - current_order["title"] = req_order.title - current_order["user"] = req_order.user - current_order["ref"] = "\ref[req_order]" - logged_orders += list(current_order) - data["records_requisition"] = logged_orders - - var/list/logged_convos = list() - var/list/active_convo = list() - var/active_ref - for(var/datum/ares_record/talk_log/log as anything in records_talking) - if(!istype(log)) - continue - if(log.user == last_login) - active_convo = log.conversation - active_ref = "\ref[log]" - - var/list/current_convo = list() - current_convo["user"] = log.user - current_convo["ref"] = "\ref[log]" - current_convo["conversation"] = log.conversation - logged_convos += list(current_convo) - - data["active_convo"] = active_convo - data["active_ref"] = active_ref - data["conversations"] = logged_convos - - return data - -/obj/structure/machinery/computer/ares_console/ui_static_data(mob/user) - var/list/data = list() - - data["link_id"] = link_id - - return data - -/obj/structure/machinery/computer/ares_console/ui_status(mob/user, datum/ui_state/state) - . = ..() - if(!allowed(user)) - return UI_UPDATE - if(inoperable()) - return UI_DISABLED - -/obj/structure/machinery/computer/ares_console/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - playsound(src, "keyboard_alt", 15, 1) - - switch (action) - if("go_back") - if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) - var/temp_holder = current_menu - current_menu = last_menu - last_menu = temp_holder - - if("login") - var/mob/living/carbon/human/operator = usr - var/obj/item/card/id/idcard = operator.get_active_hand() - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else - to_chat(usr, SPAN_WARNING("You require an ID card to access this terminal!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(authentication) - access_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." - current_menu = "main" - - if("sudo") - var/new_user = tgui_input_text(usr, "Enter Sudo Username", "Sudo User", encode = FALSE) - if(new_user) - if(new_user == sudo_holder) - last_login = sudo_holder - sudo_holder = null - return FALSE - if(new_user == last_login) - to_chat(usr, SPAN_WARNING("Already remote logged in as this user.")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - sudo_holder = last_login - last_login = new_user - access_list += "[last_login] at [worldtime2text()], Sudo Access." - return TRUE - if("sudo_logout") - access_list += "[last_login] at [worldtime2text()], Sudo Logout." - last_login = sudo_holder - sudo_holder = null - return - // -- Page Changers -- // - if("logout") - last_menu = current_menu - current_menu = "login" - if(sudo_holder) - access_list += "[last_login] at [worldtime2text()], Sudo Logout." - last_login = sudo_holder - sudo_holder = null - access_list += "[last_login] logged out at [worldtime2text()]." - - if("home") - last_menu = current_menu - current_menu = "main" - if("page_1to1") - last_menu = current_menu - current_menu = "talking" - if("page_announcements") - last_menu = current_menu - current_menu = "announcements" - if("page_bioscans") - last_menu = current_menu - current_menu = "bioscans" - if("page_bombardments") - last_menu = current_menu - current_menu = "bombardments" - if("page_apollo") - last_menu = current_menu - current_menu = "apollo" - if("page_access") - last_menu = current_menu - current_menu = "access_log" - if("page_security") - last_menu = current_menu - current_menu = "security" - if("page_flight") - last_menu = current_menu - current_menu = "flight_log" - if("page_requisitions") - last_menu = current_menu - current_menu = "requisitions" - if("page_emergency") - last_menu = current_menu - current_menu = "emergency" - if("page_deleted") - last_menu = current_menu - current_menu = "delete_log" - if("page_deleted_1to1") - last_menu = current_menu - current_menu = "deleted_talks" - - // -- Delete Button -- // - if("delete_record") - var/datum/ares_record/record = locate(params["record"]) - if(record.record_name == ARES_RECORD_DELETED) - return FALSE - var/datum/ares_record/deletion/new_delete = new - var/new_details = "Error" - var/new_title = "Error" - switch(record.record_name) - if(ARES_RECORD_ANNOUNCE) - new_title = "[record.title] at [record.time]" - new_details = record.details - records_announcement -= record - if(ARES_RECORD_SECURITY, ARES_RECORD_ANTIAIR) - new_title = "[record.title] at [record.time]" - new_details = record.details - records_security -= record - if(ARES_RECORD_BIOSCAN) - new_title = "[record.title] at [record.time]" - new_details = record.details - records_bioscan -= record - if(ARES_RECORD_BOMB) - new_title = "[record.title] at [record.time]" - new_details = "[record.details] Launched by [record.user]." - records_bombardment -= record - - new_delete.details = new_details - new_delete.user = last_login - new_delete.title = new_title - - records_deletion += new_delete - - // -- 1:1 Conversation -- // - if("new_conversation") - var/datum/ares_record/talk_log/convo = new(last_login) - convo.conversation += "[MAIN_AI_SYSTEM] at [worldtime2text()], 'New 1:1 link initiated. Greetings, [last_login].'" - records_talking += convo - - if("clear_conversation") - var/datum/ares_record/talk_log/conversation = locate(params["active_convo"]) - if(!istype(conversation)) - return FALSE - var/datum/ares_record/deleted_talk/deleted = new - deleted.title = conversation.title - deleted.conversation = conversation.conversation - deleted.user = conversation.user - records_deletion += deleted - records_talking -= conversation - - if("message_ares") - var/message = tgui_input_text(usr, "What do you wish to say to ARES?", "ARES Message", encode = FALSE) - if(message) - message_ares(message, usr, params["active_convo"]) - - if("read_record") - var/datum/ares_record/deleted_talk/conversation = locate(params["record"]) - deleted_1to1 = conversation.conversation - last_menu = current_menu - current_menu = "read_deleted" - - // -- Emergency Buttons -- // - if("general_quarters") - if(!COOLDOWN_FINISHED(src, ares_quarters_cooldown)) - to_chat(usr, SPAN_WARNING("It has not been long enough since the last General Quarters call!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(security_level < SEC_LEVEL_RED) - set_security_level(SEC_LEVEL_RED, no_sound = TRUE, announce = FALSE) - shipwide_ai_announcement("ATTENTION! GENERAL QUARTERS. ALL HANDS, MAN YOUR BATTLESTATIONS.", MAIN_AI_SYSTEM, 'sound/effects/GQfullcall.ogg') - log_game("[key_name(usr)] has called for general quarters via ARES.") - message_admins("[key_name_admin(usr)] has called for general quarters via ARES.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("General Quarters", "[last_login] has called for general quarters via ARES.") - COOLDOWN_START(src, ares_quarters_cooldown, 10 MINUTES) - . = TRUE - - if("evacuation_start") - if(security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert in order to enact evacuation procedures.")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - if(EvacuationAuthority.flags_scuttle & FLAGS_EVACUATION_DENY) - to_chat(usr, SPAN_WARNING("The USCM has placed a lock on deploying the evacuation pods.")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - if(!EvacuationAuthority.initiate_evacuation()) - to_chat(usr, SPAN_WARNING("You are unable to initiate an evacuation procedure right now!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - log_game("[key_name(usr)] has called for an emergency evacuation via ARES.") - message_admins("[key_name_admin(usr)] has called for an emergency evacuation via ARES.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Initiate Evacuation", "[last_login] has called for an emergency evacuation via ARES.") - . = TRUE - - if("distress") - if(!SSticker.mode) - return FALSE //Not a game mode? - if(world.time < DISTRESS_TIME_LOCK) - to_chat(usr, SPAN_WARNING("You have been here for less than six minutes... what could you possibly have done!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(!COOLDOWN_FINISHED(src, ares_distress_cooldown)) - to_chat(usr, SPAN_WARNING("The distress launcher is cooling down!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(security_level == SEC_LEVEL_DELTA) - to_chat(usr, SPAN_WARNING("The ship is already undergoing self destruct procedures!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - else if(security_level < SEC_LEVEL_RED) - to_chat(usr, SPAN_WARNING("The ship must be under red alert to launch a distress beacon!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - for(var/client/admin in GLOB.admins) - if((R_ADMIN|R_MOD) & admin.admin_holder.rights) - playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) - SSticker.mode.request_ert(usr, TRUE) - to_chat(usr, SPAN_NOTICE("A distress beacon request has been sent to USCM High Command.")) - COOLDOWN_START(src, ares_distress_cooldown, COOLDOWN_COMM_REQUEST) - return TRUE - - if("nuclearbomb") - if(!SSticker.mode) - return FALSE //Not a game mode? - if(world.time < NUCLEAR_TIME_LOCK) - to_chat(usr, SPAN_WARNING("It is too soon to request Nuclear Ordnance!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(!COOLDOWN_FINISHED(src, ares_nuclear_cooldown)) - to_chat(usr, SPAN_WARNING("The ordnance request frequency is garbled, wait for reset!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(security_level == SEC_LEVEL_DELTA || SSticker.mode.is_in_endgame) - to_chat(usr, SPAN_WARNING("The mission has failed catastrophically, what do you want a nuke for?!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - var/reason = tgui_input_text(usr, "Please enter reason nuclear ordnance is required.", "Reason for Nuclear Ordnance") - if(!reason) - return FALSE - for(var/client/admin in GLOB.admins) - if((R_ADMIN|R_MOD) & admin.admin_holder.rights) - playsound_client(admin,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(usr)] has requested use of Nuclear Ordnance (via ARES)! Reason: [reason] [CC_MARK(usr)] (APPROVE) (DENY) [ADMIN_JMP_USER(usr)] [CC_REPLY(usr)]") - to_chat(usr, SPAN_NOTICE("A nuclear ordnance request has been sent to USCM High Command for the following reason: [reason]")) - if(ares_can_log()) - link.log_ares_security("Nuclear Ordnance Request", "[last_login] has sent a request for nuclear ordnance for the following reason: [reason]") - if(ares_can_interface()) - ai_silent_announcement("[last_login] has sent a request for nuclear ordnance to USCM High Command.", ".V") - ai_silent_announcement("Reason given: [reason].", ".V") - COOLDOWN_START(src, ares_nuclear_cooldown, COOLDOWN_COMM_DESTRUCT) - return TRUE -// ------ End ARES Interface UI ------ // - - /obj/structure/machinery/computer/working_joe/get_ares_access(obj/item/card/id/card) if(ACCESS_ARES_DEBUG in card.access) return APOLLO_ACCESS_DEBUG @@ -639,369 +258,3 @@ GLOBAL_LIST_INIT(maintenance_categories, list( return "Working Joe" if(APOLLO_ACCESS_DEBUG)//6 return "AI Service Technician" - -// ------ Maintenance Controller UI ------ // -/obj/structure/machinery/computer/working_joe/attack_hand(mob/user as mob) - if(..() || !allowed(usr) || inoperable()) - return FALSE - - tgui_interact(user) - return TRUE - -/obj/structure/machinery/computer/working_joe/tgui_interact(mob/user, datum/tgui/ui, datum/ui_state/state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "WorkingJoe", name) - ui.open() - -/obj/structure/machinery/computer/working_joe/ui_data(mob/user) - var/list/data = list() - - data["current_menu"] = current_menu - data["last_page"] = last_menu - - data["logged_in"] = last_login - - data["access_text"] = "access level [authentication], [ares_auth_to_text(authentication)]." - data["access_level"] = authentication - - data["alert_level"] = security_level - data["worldtime"] = world.time - - data["access_log"] = list() - data["access_log"] += login_list - - data["apollo_log"] = list() - data["apollo_log"] += link.apollo_log - - var/list/logged_maintenance = list() - for(var/datum/ares_ticket/maintenance/maint_ticket as anything in link.tickets_maintenance) - if(!istype(maint_ticket)) - continue - var/lock_status = TICKET_OPEN - switch(maint_ticket.ticket_status) - if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_COMPLETED) - lock_status = TICKET_CLOSED - - var/list/current_maint = list() - current_maint["id"] = maint_ticket.ticket_id - current_maint["time"] = maint_ticket.ticket_time - current_maint["priority_status"] = maint_ticket.ticket_priority - current_maint["category"] = maint_ticket.ticket_name - current_maint["details"] = maint_ticket.ticket_details - current_maint["status"] = maint_ticket.ticket_status - current_maint["submitter"] = maint_ticket.ticket_submitter - current_maint["assignee"] = maint_ticket.ticket_assignee - current_maint["lock_status"] = lock_status - current_maint["ref"] = "\ref[maint_ticket]" - logged_maintenance += list(current_maint) - data["maintenance_tickets"] = logged_maintenance - - var/list/logged_access = list() - var/list/requesting_access = list() - for(var/datum/ares_ticket/access/access_ticket as anything in link.tickets_access) - var/lock_status = TICKET_OPEN - switch(access_ticket.ticket_status) - if(TICKET_REJECTED, TICKET_CANCELLED, TICKET_REVOKED) - lock_status = TICKET_CLOSED - - var/list/current_ticket = list() - current_ticket["id"] = access_ticket.ticket_id - current_ticket["time"] = access_ticket.ticket_time - current_ticket["priority_status"] = access_ticket.ticket_priority - current_ticket["title"] = access_ticket.ticket_name - current_ticket["details"] = access_ticket.ticket_details - current_ticket["status"] = access_ticket.ticket_status - current_ticket["submitter"] = access_ticket.ticket_submitter - current_ticket["assignee"] = access_ticket.ticket_assignee - current_ticket["lock_status"] = lock_status - current_ticket["ref"] = "\ref[access_ticket]" - logged_access += list(current_ticket) - - if(lock_status == TICKET_OPEN) - requesting_access += access_ticket.ticket_name - data["access_tickets"] = logged_access - - return data - -/obj/structure/machinery/computer/working_joe/ui_static_data(mob/user) - var/list/data = list() - - data["link_id"] = link_id - - return data - -/obj/structure/machinery/computer/working_joe/ui_status(mob/user, datum/ui_state/state) - . = ..() - if(!allowed(user)) - return UI_UPDATE - if(inoperable()) - return UI_DISABLED - -/obj/structure/machinery/computer/working_joe/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - var/playsound = TRUE - var/mob/living/carbon/human/operator = usr - - switch (action) - if("go_back") - if(!last_menu) - return to_chat(usr, SPAN_WARNING("Error, no previous page detected.")) - var/temp_holder = current_menu - current_menu = last_menu - last_menu = temp_holder - - if("login") - - var/obj/item/card/id/idcard = operator.get_active_hand() - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) - authentication = get_ares_access(idcard) - last_login = idcard.registered_name - else - to_chat(operator, SPAN_WARNING("You require an ID card to access this terminal!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(authentication) - login_list += "[last_login] at [worldtime2text()], Access Level [authentication] - [ares_auth_to_text(authentication)]." - current_menu = "main" - - if("logout") - last_menu = current_menu - current_menu = "login" - login_list += "[last_login] logged out at [worldtime2text()]." - - if("home") - last_menu = current_menu - current_menu = "main" - if("page_logins") - last_menu = current_menu - current_menu = "login_records" - if("page_apollo") - last_menu = current_menu - current_menu = "apollo" - if("page_request") - last_menu = current_menu - current_menu = "access_requests" - if("page_report") - last_menu = current_menu - current_menu = "maint_reports" - if("page_tickets") - last_menu = current_menu - current_menu = "access_tickets" - if("page_maintenance") - last_menu = current_menu - current_menu = "maint_claim" - - if("new_report") - var/priority_report = FALSE - var/maint_type = tgui_input_list(operator, "What is the type of maintenance item you wish to report?", "Report Category", GLOB.maintenance_categories, 30 SECONDS) - switch(maint_type) - if("Major Structural Damage", "Fire", "Communications Failure", "Power Generation Failure") - priority_report = TRUE - - if(!maint_type) - return FALSE - var/details = tgui_input_text(operator, "What are the details for this report?", "Ticket Details", encode = FALSE) - if(!details) - return FALSE - - if((authentication >= APOLLO_ACCESS_REPORTER) && !priority_report) - var/is_priority = tgui_alert(operator, "Is this a priority report?", "Priority designation", list("Yes", "No")) - if(is_priority == "Yes") - priority_report = TRUE - - var/confirm = alert(operator, "Please confirm the submission of your maintenance report. \n\n Priority: [priority_report ? "Yes" : "No"] \n Category: '[maint_type]' \n Details: '[details]' \n\n Is this correct?", "Confirmation", "Yes", "No") - if(confirm == "Yes") - if(link) - var/datum/ares_ticket/maintenance/maint_ticket = new(last_login, maint_type, details, priority_report) - link.tickets_maintenance += maint_ticket - if(priority_report) - ares_apollo_talk("Priority Maintenance Report: [maint_type] - ID [maint_ticket.ticket_id]. Seek and resolve.") - log_game("ARES: Maintenance Ticket '\ref[maint_ticket]' created by [key_name(operator)] as [last_login] with Category '[maint_type]' and Details of '[details]'.") - return TRUE - return FALSE - - if("claim_ticket") - var/datum/ares_ticket/ticket = locate(params["ticket"]) - if(!istype(ticket)) - return FALSE - var/claim = TRUE - var/assigned = ticket.ticket_assignee - if(assigned) - if(assigned == last_login) - var/prompt = tgui_alert(usr, "You already claimed this ticket! Do you wish to drop your claim?", "Unclaim ticket", list("Yes", "No")) - if(prompt != "Yes") - return FALSE - /// set ticket back to pending - ticket.ticket_assignee = null - ticket.ticket_status = TICKET_PENDING - return claim - var/choice = tgui_alert(usr, "This ticket has already been claimed by [assigned]! Do you wish to override their claim?", "Claim Override", list("Yes", "No")) - if(choice != "Yes") - claim = FALSE - if(claim) - ticket.ticket_assignee = last_login - ticket.ticket_status = TICKET_ASSIGNED - return claim - - if("cancel_ticket") - var/datum/ares_ticket/ticket = locate(params["ticket"]) - if(!istype(ticket)) - return FALSE - if(ticket.ticket_submitter != last_login) - to_chat(usr, SPAN_WARNING("You cannot cancel a ticket that does not belong to you!")) - return FALSE - to_chat(usr, SPAN_WARNING("[ticket.ticket_type] [ticket.ticket_id] has been cancelled.")) - ticket.ticket_status = TICKET_CANCELLED - if(ticket.ticket_priority) - ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been cancelled.") - return TRUE - - if("mark_ticket") - var/datum/ares_ticket/ticket = locate(params["ticket"]) - if(!istype(ticket)) - return FALSE - if(ticket.ticket_assignee != last_login && ticket.ticket_assignee) //must be claimed by you or unclaimed.) - to_chat(usr, SPAN_WARNING("You cannot update a ticket that is not assigned to you!")) - return FALSE - var/choice = tgui_alert(usr, "What do you wish to mark the ticket as?", "Mark", list(TICKET_COMPLETED, TICKET_REJECTED), 20 SECONDS) - switch(choice) - if(TICKET_COMPLETED) - ticket.ticket_status = TICKET_COMPLETED - if(TICKET_REJECTED) - ticket.ticket_status = TICKET_REJECTED - else - return FALSE - if(ticket.ticket_priority) - ares_apollo_talk("Priority [ticket.ticket_type] [ticket.ticket_id] has been [choice] by [last_login].") - to_chat(usr, SPAN_NOTICE("[ticket.ticket_type] [ticket.ticket_id] marked as [choice].")) - return TRUE - - if("new_access") - var/obj/item/card/id/idcard = operator.get_active_hand() - var/has_id = FALSE - if(istype(idcard)) - has_id = TRUE - else if(operator.wear_id) - idcard = operator.wear_id - if(istype(idcard)) - has_id = TRUE - if(!has_id) - to_chat(operator, SPAN_WARNING("You require an ID card to request an access ticket!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - if(idcard.registered_name != last_login) - to_chat(operator, SPAN_WARNING("This ID card does not match the active login!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - var/ticket_holder = last_login - if(!ticket_holder) - return FALSE - var/details = tgui_input_text(operator, "What is the purpose of this access ticket?", "Ticket Details", encode = FALSE) - if(!details) - return FALSE - - var/confirm = alert(operator, "Please confirm the submission of your access ticket request. \n\nHolder: '[ticket_holder]' \n Details: '[details]' \n\n Is this correct?", "Confirmation", "Yes", "No") - if(confirm != "Yes" || !link) - return FALSE - var/datum/ares_ticket/access/access_ticket = new(last_login, ticket_holder, details, FALSE, idcard.registered_gid) - link.waiting_ids += idcard - link.tickets_access += access_ticket - log_game("ARES: Access Ticket '\ref[access_ticket]' created by [key_name(operator)] as [last_login] with Holder '[ticket_holder]' and Details of '[details]'.") - message_admins(SPAN_STAFF_IC("[key_name_admin(operator)] created a new ARES Access Ticket."), 1) - return TRUE - - if("return_access") - playsound = FALSE - var/datum/ares_ticket/access/access_ticket - for(var/datum/ares_ticket/access/possible_ticket in link.tickets_access) - if(possible_ticket.ticket_status != TICKET_GRANTED) - continue - if(possible_ticket.ticket_name != last_login) - continue - access_ticket = possible_ticket - break - - for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue - if(identification.registered_gid != access_ticket.user_id_num) - continue - - access_ticket.ticket_status = TICKET_RETURNED - identification.access -= ACCESS_MARINE_AI_TEMP - identification.modification_log += "Temporary AI Access self-returned by [key_name(operator)]." - - to_chat(operator, SPAN_NOTICE("Temporary Access Ticket surrendered.")) - playsound(src, 'sound/machines/chime.ogg', 15, 1) - ares_apollo_talk("[last_login] surrendered their access ticket.") - - authentication = get_ares_access(identification) - if(authentication) - login_list += "[last_login] at [worldtime2text()], Surrendered Temporary Access Ticket." - return TRUE - - to_chat(operator, SPAN_WARNING("This ID card does not have an access ticket!")) - playsound(src, 'sound/machines/buzz-two.ogg', 15, 1) - return FALSE - - if("auth_access") - playsound = FALSE - var/datum/ares_ticket/access/access_ticket = locate(params["ticket"]) - if(!access_ticket) - return FALSE - for(var/obj/item/card/id/identification in link.waiting_ids) - if(!istype(identification)) - continue - if(identification.registered_gid != access_ticket.user_id_num) - continue - identification.handle_ares_access(last_login, operator) - access_ticket.ticket_status = TICKET_GRANTED - playsound(src, 'sound/machines/chime.ogg', 15, 1) - return TRUE - for(var/obj/item/card/id/identification in link.active_ids) - if(!istype(identification)) - continue - if(identification.registered_gid != access_ticket.user_id_num) - continue - identification.handle_ares_access(last_login, operator) - access_ticket.ticket_status = TICKET_REVOKED - playsound(src, 'sound/machines/chime.ogg', 15, 1) - return TRUE - return FALSE - - if(playsound) - playsound(src, "keyboard_alt", 15, 1) - -/obj/item/card/id/proc/handle_ares_access(logged_in, mob/user) - var/announce_text = "[logged_in] revoked core access from [registered_name]'s ID card." - var/operator = key_name(user) - var/datum/ares_link/link = GLOB.ares_link - if(logged_in == MAIN_AI_SYSTEM) - if(!user) - operator = "[MAIN_AI_SYSTEM] (Sensor Trip)" - else - operator = "[user.ckey]/([MAIN_AI_SYSTEM])" - if(ACCESS_MARINE_AI_TEMP in access) - access -= ACCESS_MARINE_AI_TEMP - link.active_ids -= src - modification_log += "Temporary AI access revoked by [operator]" - to_chat(user, SPAN_NOTICE("Access revoked from [registered_name].")) - else - access += ACCESS_MARINE_AI_TEMP - modification_log += "Temporary AI access granted by [operator]" - announce_text = "[logged_in] granted core access to [registered_name]'s ID card." - to_chat(user, SPAN_NOTICE("Access granted to [registered_name].")) - link.waiting_ids -= src - link.active_ids += src - ares_apollo_talk(announce_text) - return TRUE diff --git a/code/game/machinery/ARES/ARES_records.dm b/code/game/machinery/ARES/ARES_records.dm index 19751462bc37..f89b2c120e05 100644 --- a/code/game/machinery/ARES/ARES_records.dm +++ b/code/game/machinery/ARES/ARES_records.dm @@ -102,6 +102,7 @@ var/ref_holder = "\ref[src]" var/pos = length(ref_holder) var/new_id = "#[copytext("\ref[src]", pos - 4, pos)]" + new_id = uppertext(new_id) ticket_time = worldtime2text() ticket_submitter = user @@ -115,17 +116,18 @@ /datum/ares_ticket/access ticket_type = ARES_RECORD_ACCESS + ticket_name = ARES_RECORD_ACCESS var/user_id_num -/datum/ares_ticket/access/New(user, name, details, priority, global_id_num) +/datum/ares_ticket/access/New(user, details, priority, global_id_num) var/ref_holder = "\ref[src]" var/pos = length(ref_holder) var/new_id = "#[copytext("\ref[src]", pos - 4, pos)]" + new_id = uppertext(new_id) ticket_time = worldtime2text() ticket_submitter = user ticket_details = details - ticket_name = name ticket_priority = priority ticket_id = new_id user_id_num = global_id_num diff --git a/code/game/machinery/ARES/ARES_step_triggers.dm b/code/game/machinery/ARES/ARES_step_triggers.dm index 51480371be51..fdf7b26b2e65 100644 --- a/code/game/machinery/ARES/ARES_step_triggers.dm +++ b/code/game/machinery/ARES/ARES_step_triggers.dm @@ -3,7 +3,6 @@ layer = 5 /// Link alerts to ARES Link var/datum/ares_link/link - var/link_id = MAIN_SHIP_DEFAULT_NAME /// Alert message to report unless area based. var/alert_message = "ALERT: Unauthorized movement detected in ARES Core!" /// Connect alerts to use same cooldowns @@ -53,7 +52,7 @@ /obj/effect/step_trigger/ares_alert/proc/link_systems(datum/ares_link/new_link = GLOB.ares_link, override) if(link && !override) return FALSE - if(new_link.link_id == link_id) + if(new_link) link = new_link new_link.linked_alerts += src return TRUE @@ -70,7 +69,7 @@ broadcast_message = "ALERT: Unauthorized movement detected in [area_name]!" var/datum/ares_link/link = GLOB.ares_link - if(link.p_apollo.inoperable()) + if(link.processor_apollo.inoperable()) return FALSE to_chat(passer, SPAN_BOLDWARNING("You hear a soft beeping sound as you cross the threshold.")) @@ -113,8 +112,6 @@ /obj/effect/step_trigger/ares_alert/access_control/Crossed(atom/passer as mob|obj) if(isobserver(passer) || isxeno(passer)) return FALSE - if(!COOLDOWN_FINISHED(src, sensor_cooldown))//Don't want alerts spammed. - return FALSE if(!passer) return FALSE if(HAS_TRAIT(passer, TRAIT_CLOAKED))//Can't be seen/detected to trigger alert. @@ -157,11 +154,12 @@ var/broadcast_message = get_broadcast(passer, idcard, failure) var/datum/ares_link/link = GLOB.ares_link - if(link.p_apollo.inoperable()) + if(link.processor_apollo.inoperable()) return FALSE to_chat(passer, SPAN_BOLDWARNING("You hear a harsh buzzing sound as you cross the threshold!")) - ares_apollo_talk(broadcast_message) + if(COOLDOWN_FINISHED(src, sensor_cooldown))//Don't want alerts spammed. + ares_apollo_talk(broadcast_message) if(idcard) /// Removes the access from the ID and updates the ID's modification log. for(var/obj/item/card/id/identification in link.active_ids) diff --git a/code/game/machinery/biohazard_lockdown.dm b/code/game/machinery/biohazard_lockdown.dm index fd6205baa1d9..2e3cbf6de234 100644 --- a/code/game/machinery/biohazard_lockdown.dm +++ b/code/game/machinery/biohazard_lockdown.dm @@ -102,8 +102,7 @@ GLOBAL_VAR_INIT(lockdown_state, LOCKDOWN_READY) shipwide_ai_announcement(message, MAIN_AI_SYSTEM, 'sound/effects/biohazard.ogg') message_admins(log) - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Containment Lockdown", ares_log) + log_ares_security("Containment Lockdown", ares_log) #undef LOCKDOWN_READY #undef LOCKDOWN_ACTIVE diff --git a/code/game/machinery/computer/almayer_control.dm b/code/game/machinery/computer/almayer_control.dm index c3b17dbf8090..145d0d278cb6 100644 --- a/code/game/machinery/computer/almayer_control.dm +++ b/code/game/machinery/computer/almayer_control.dm @@ -108,7 +108,6 @@ . = ..() if(.) return - switch(action) if("award") print_medal(usr, src) @@ -131,8 +130,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") . = TRUE if("evacuation_cancel") @@ -144,8 +142,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") . = TRUE // evac stuff end \\ @@ -167,8 +164,7 @@ set_security_level(seclevel2num(level_selected), log = ARES_LOG_NONE) log_game("[key_name(usr)] has changed the security level to [get_security_level()].") message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Manual Security Update", "[usr] has changed the security level to [get_security_level()].") + log_ares_security("Manual Security Update", "[usr] has changed the security level to [get_security_level()].") . = TRUE if("messageUSCM") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index f7ea31fba36a..d4d45de8db4e 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -65,7 +65,6 @@ if(..()) return FALSE usr.set_interaction(src) - var/datum/ares_link/link = GLOB.ares_link switch(href_list["operation"]) if("mapview") tacmap.tgui_interact(usr) @@ -149,7 +148,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") return TRUE state = STATE_EVACUATION @@ -169,7 +168,7 @@ log_game("[key_name(usr)] has canceled the emergency evacuation.") message_admins("[key_name_admin(usr)] has canceled the emergency evacuation.") - link.log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") + log_ares_security("Cancel Evacuation", "[usr] has cancelled the emergency evacuation.") return TRUE state = STATE_EVACUATION_CANCEL diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm index fc9bb015ece0..f355b39c468a 100644 --- a/code/game/objects/items/devices/cictablet.dm +++ b/code/game/objects/items/devices/cictablet.dm @@ -145,8 +145,7 @@ log_game("[key_name(usr)] has called for an emergency evacuation.") message_admins("[key_name_admin(usr)] has called for an emergency evacuation.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") + log_ares_security("Initiate Evacuation", "[usr] has called for an emergency evacuation.") . = TRUE if("distress") diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 3d774cedc616..53ce9ef177fa 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1020,7 +1020,6 @@ var/datum/controller/supply/supply_controller = new() to_chat(usr, SPAN_DANGER("Current retrieval load has reached maximum capacity.")) return - var/datum/ares_link/link = GLOB.ares_link for(var/i=1, i<=supply_controller.requestlist.len, i++) var/datum/supply_order/SO = supply_controller.requestlist[i] if(SO.ordernum == ordernum) @@ -1046,7 +1045,7 @@ var/datum/controller/supply/supply_controller = new() pack_source = "Unknown" if(prob(90)) pack_name = "Unknown" - link.log_ares_requisition(pack_source, pack_name, usr.name) + log_ares_requisition(pack_source, pack_name, usr.name) else temp = "Not enough money left.
" temp += "
Back Main Menu" diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 6ba329109902..2bd20b14ab56 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -597,9 +597,9 @@ return FALSE var/datum/ares_link/link = GLOB.ares_link - if(link.p_apollo.inoperable()) + if(link.processor_apollo.inoperable()) var/prompt = tgui_alert(src, "ARES APOLLO processor is offline or destroyed, send the message anyways?", "Choose.", list("Yes", "No"), 20 SECONDS) - if(prompt == "No") + if(prompt != "Yes") to_chat(usr, SPAN_WARNING("[MAIN_AI_SYSTEM] is not responding. It's APOLLO processor may be offline or destroyed.")) return FALSE diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 64647b8f87fb..ed0d67198af3 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -1963,7 +1963,7 @@ supply_controller.shoppinglist += new_order //Can no longer request a nuke - GLOB.ares_link.interface.nuke_available = FALSE + GLOB.ares_datacore.nuke_available = FALSE marine_announcement("A nuclear device has been authorized by High Command and will be delivered to requisitions via ASRS.", "NUCLEAR ORDNANCE AUTHORIZED", 'sound/misc/notice2.ogg', logging = ARES_LOG_MAIN) log_game("[key_name_admin(usr)] has authorized a [nuketype], requested by [key_name_admin(ref_person)]") diff --git a/code/modules/cm_marines/anti_air.dm b/code/modules/cm_marines/anti_air.dm index cdb162cddfa3..8c8cab302e19 100644 --- a/code/modules/cm_marines/anti_air.dm +++ b/code/modules/cm_marines/anti_air.dm @@ -102,7 +102,6 @@ var/obj/structure/anti_air_cannon/almayer_aa_cannon if(!almayer_aa_cannon) return - var/datum/ares_link/link = GLOB.ares_link switch(action) if("protect") almayer_aa_cannon.protecting_section = params["section_id"] @@ -110,12 +109,12 @@ var/obj/structure/anti_air_cannon/almayer_aa_cannon almayer_aa_cannon.protecting_section = "" return message_admins("[key_name(usr)] has set the AA to [html_encode(almayer_aa_cannon.protecting_section)].") - link.log_ares_antiair("[usr] Set AA to cover [html_encode(almayer_aa_cannon.protecting_section)].") + log_ares_antiair("[usr] Set AA to cover [html_encode(almayer_aa_cannon.protecting_section)].") . = TRUE if("deactivate") almayer_aa_cannon.protecting_section = "" message_admins("[key_name(usr)] has deactivated the AA cannon.") - link.log_ares_antiair("[usr] Deactivated Anti Air systems.") + log_ares_antiair("[usr] Deactivated Anti Air systems.") . = TRUE add_fingerprint(usr) diff --git a/code/modules/cm_marines/overwatch.dm b/code/modules/cm_marines/overwatch.dm index d2d55a8cadb1..66d83f9e73b8 100644 --- a/code/modules/cm_marines/overwatch.dm +++ b/code/modules/cm_marines/overwatch.dm @@ -798,7 +798,7 @@ log_attack("[key_name(user)] fired an orbital bombardment in [A.name] for squad '[current_squad]'") /// Project ARES interface log. - GLOB.ares_link.log_ares_bombardment(user.name, ob_name, "X[x_bomb], Y[y_bomb] in [A.name]") + log_ares_bombardment(user.name, ob_name, "X[x_bomb], Y[y_bomb] in [A.name]") busy = FALSE var/turf/target = locate(T.x + rand(-3, 3), T.y + rand(-3, 3), T.z) diff --git a/code/modules/mob/living/carbon/xenomorph/death.dm b/code/modules/mob/living/carbon/xenomorph/death.dm index d81413b68651..0374b21c6f36 100644 --- a/code/modules/mob/living/carbon/xenomorph/death.dm +++ b/code/modules/mob/living/carbon/xenomorph/death.dm @@ -124,8 +124,7 @@ // Tell the marines where the last one is. var/name = "[MAIN_AI_SYSTEM] Bioscan Status" var/input = "Bioscan complete.\n\nSensors indicate one remaining unknown lifeform signature in [get_area(X)]." - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_bioscan(name, input) + log_ares_bioscan(name, input) marine_announcement(input, name, 'sound/AI/bioscan.ogg', logging = ARES_LOG_NONE) // Tell the xeno she is the last one. if(X.client) diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 15b6a6ca6e87..a798c04b037e 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -179,9 +179,8 @@ return to_chat(xeno, SPAN_NOTICE("You command the metal bird to come down. Clever girl.")) xeno_announcement(SPAN_XENOANNOUNCE("Your Queen has commanded the metal bird to the hive at [linked_lz]."), xeno.hivenumber, XENO_GENERAL_ANNOUNCE) - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Unknown", "Remote launch signal for [shuttle.name] received. Authentication garbled.") - link.log_ares_security("Security Alert", "Remote launch signal for [shuttle.name] received. Authentication garbled.") + log_ares_flight("Unknown", "Remote launch signal for [shuttle.name] received. Authentication garbled.") + log_ares_security("Security Alert", "Remote launch signal for [shuttle.name] received. Authentication garbled.") return if(shuttle.destination.id != linked_lz) to_chat(xeno, "The shuttle not ready. The screen reads T-[shuttle.timeLeft(10)]. Have patience.") @@ -275,8 +274,7 @@ GLOB.alt_ctrl_disabled = TRUE marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") + log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") var/mob/living/carbon/xenomorph/xeno = user var/hivenumber = XENO_HIVE_NORMAL @@ -364,7 +362,6 @@ to_chat(user, SPAN_WARNING("The dropship isn't responding to controls.")) return - var/datum/ares_link/link = GLOB.ares_link switch(action) if("move") if(shuttle.mode != SHUTTLE_IDLE && (shuttle.mode != SHUTTLE_CALL && !shuttle.destination)) @@ -382,7 +379,7 @@ to_chat(user, SPAN_WARNING("You don't have the skill to perform a flyby.")) return FALSE to_chat(user, SPAN_NOTICE("You begin the launch sequence for a flyby.")) - link.log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flyby.") + log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flyby.") var/log = "[key_name(user)] launched the dropship [src.shuttleId] on flyby." msg_admin_niche(log) log_interact(user, msg = "[log]") @@ -411,7 +408,7 @@ return TRUE SSshuttle.moveShuttle(shuttle.id, dock.id, TRUE) to_chat(user, SPAN_NOTICE("You begin the launch sequence to [dock].")) - link.log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flight to [dock].") + log_ares_flight(user.name, "Launched Dropship [shuttle.name] on a flight to [dock].") var/log = "[key_name(user)] launched the dropship [src.shuttleId] on transport." msg_admin_niche(log) log_interact(user, msg = "[log]") @@ -431,13 +428,13 @@ to_chat(user, SPAN_WARNING("Door controls have been overridden. Please call technical support.")) if("set-ferry") is_set_flyby = FALSE - link.log_ares_flight(user.name, "Set Dropship [shuttle.name] to transport runs.") + log_ares_flight(user.name, "Set Dropship [shuttle.name] to transport runs.") var/log = "[key_name(user)] set the dropship [src.shuttleId] into transport" msg_admin_niche(log) log_interact(user, msg = "[log]") if("set-flyby") is_set_flyby = TRUE - link.log_ares_flight(user.name, "Set Dropship [shuttle.name] to flyby runs.") + log_ares_flight(user.name, "Set Dropship [shuttle.name] to flyby runs.") var/log = "[key_name(user)] set the dropship [src.shuttleId] into flyby." msg_admin_niche(log) log_interact(user, msg = "[log]") @@ -460,7 +457,7 @@ shuttle.automated_lz_id = ground_lz shuttle.automated_delay = delay playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) - link.log_ares_flight(user.name, "Enabled autopilot for Dropship [shuttle.name].") + log_ares_flight(user.name, "Enabled autopilot for Dropship [shuttle.name].") var/log = "[key_name(user)] has enabled auto pilot on '[shuttle.name]'" message_admins(log) log_interact(user, msg = "[log]") @@ -477,7 +474,7 @@ shuttle.automated_lz_id = null shuttle.automated_delay = null playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) - link.log_ares_flight(user.name, "Disabled autopilot for Dropship [shuttle.name].") + log_ares_flight(user.name, "Disabled autopilot for Dropship [shuttle.name].") var/log = "[key_name(user)] has disabled auto pilot on '[shuttle.name]'" message_admins(log) log_interact(user, msg = "[log]") diff --git a/code/modules/shuttles/marine_ferry.dm b/code/modules/shuttles/marine_ferry.dm index 7ec4b2eb7333..6d84881fe9bf 100644 --- a/code/modules/shuttles/marine_ferry.dm +++ b/code/modules/shuttles/marine_ferry.dm @@ -102,8 +102,7 @@ automated_launch = FALSE automated_launch_timer = TIMER_ID_NULL ai_silent_announcement("Dropship '[name]' departing.") - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Automated", "Dropship [name] launched on an automatic flight.") + log_ares_flight("Automated", "Dropship [name] launched on an automatic flight.") /* diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 12356754872c..dccdfad920f4 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -293,8 +293,7 @@ GLOBAL_LIST_EMPTY(shuttle_controls) marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) shuttle.alerts_allowed-- - var/datum/ares_link/link = GLOB.ares_link - link.log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") + log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") to_chat(Q, SPAN_DANGER("A loud alarm erupts from [src]! The fleshy hosts must know that you can access it!")) xeno_message(SPAN_XENOANNOUNCE("The Queen has commanded the metal bird to depart for the metal hive in the sky! Rejoice!"),3,Q.hivenumber) diff --git a/colonialmarines.dme b/colonialmarines.dme index e79c6c0585cb..094abc940d70 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -796,6 +796,8 @@ s// DM Environment file for colonialmarines.dme. #include "code\game\machinery\washing_machine.dm" #include "code\game\machinery\weather_siren.dm" #include "code\game\machinery\ARES\ARES.dm" +#include "code\game\machinery\ARES\ARES_interface.dm" +#include "code\game\machinery\ARES\ARES_interface_apollo.dm" #include "code\game\machinery\ARES\ARES_procs.dm" #include "code\game\machinery\ARES\ARES_records.dm" #include "code\game\machinery\ARES\ARES_step_triggers.dm" diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.js b/tgui/packages/tgui/interfaces/WorkingJoe.js index 6881d731db1b..6e6372326d9a 100644 --- a/tgui/packages/tgui/interfaces/WorkingJoe.js +++ b/tgui/packages/tgui/interfaces/WorkingJoe.js @@ -870,24 +870,20 @@ const AccessTickets = (props, context) => { can_claim = 'No'; } let can_update = 'Yes'; - if (ticket.assignee !== logged_in) { - can_update = 'No'; - } else if (ticket.lock_status === 'CLOSED') { + if (ticket.lock_status === 'CLOSED') { can_update = 'No'; } let view_status = 'Ticket is pending assignment.'; let view_icon = 'circle-question'; - let update_tooltip = 'Update Access'; - if (ticket.status === 'assigned') { - view_status = 'Ticket is assigned.'; - view_icon = 'circle-plus'; - update_tooltip = 'Grant Access'; - } else if (ticket.status === 'rejected') { + let update_tooltip = 'Grant Access'; + if (ticket.status === 'rejected') { view_status = 'Ticket has been rejected.'; view_icon = 'circle-xmark'; + update_tooltip = 'Ticket rejected. No further changes possible.'; } else if (ticket.status === 'cancelled') { view_status = 'Ticket was cancelled by reporter.'; view_icon = 'circle-stop'; + update_tooltip = 'Ticket cancelled. No further changes possible.'; } else if (ticket.status === 'granted') { view_status = 'Access ticket has been granted.'; view_icon = 'circle-check'; @@ -902,19 +898,19 @@ const AccessTickets = (props, context) => { update_tooltip = 'Access self-returned. No further changes possible.'; } + let can_reject = 'Yes'; + if (can_update === 'No') { + can_reject = 'No'; + } + if (ticket.status !== 'pending') { + can_reject = 'No'; + } return ( - {!!ticket.priority_status && ( - - {ticket.id} - - )} - {!ticket.priority_status && ( - - {ticket.id} - - )} + + {ticket.id} + {ticket.time} @@ -929,18 +925,20 @@ const AccessTickets = (props, context) => { - )} - {data.has_flyby_skill === 1 && data.flight_configuration === 'ferry' && ( - - )} - {data.has_flyby_skill === 1 && data.shuttle_mode === 'called' && ( - - )} - {data.has_flyby_skill === 1 && data.shuttle_mode === 'idle' && ( - - )} - - } - /> - ); -}; - export const TouchdownCooldown = (_, context) => { const { data } = useBackend(context); return ( diff --git a/tgui/packages/tgui/interfaces/NavigationShuttle.tsx b/tgui/packages/tgui/interfaces/NavigationShuttle.tsx index 19ff7a0c7149..d262fa81dc3c 100644 --- a/tgui/packages/tgui/interfaces/NavigationShuttle.tsx +++ b/tgui/packages/tgui/interfaces/NavigationShuttle.tsx @@ -41,7 +41,7 @@ export const CancelLaunchButton = (_, context) => { export const LaunchButton = (_, context) => { const { act } = useBackend(context); - const [siteselection] = useSharedState( + const [siteselection, setSiteSelection] = useSharedState( context, 'target_site', undefined @@ -50,7 +50,10 @@ export const LaunchButton = (_, context) => { ); @@ -156,9 +159,15 @@ export const LaunchCountdown = (_, context) => { }; export const InFlightCountdown = (_, context) => { - const { data } = useBackend(context); + const { data, act } = useBackend(context); return ( -
+
act('cancel-flyby')}>Cancel + ) + }>
From 61a087dd605899f254ea5620d7354c753f5a2777 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 17 Oct 2023 22:11:08 +0100 Subject: [PATCH 060/199] Automatic changelog for PR #4653 [ci skip] --- html/changelogs/AutoChangeLog-pr-4653.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4653.yml diff --git a/html/changelogs/AutoChangeLog-pr-4653.yml b/html/changelogs/AutoChangeLog-pr-4653.yml new file mode 100644 index 000000000000..7340da20aac1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4653.yml @@ -0,0 +1,5 @@ +author: "mullenpaul" +delete-after: True +changes: + - code_imp: "resolves flyby issues by refactoring update_equipment logic" + - refactor: "removes unwanted code" \ No newline at end of file From 297584d8b3b708ecd32af1c785ce270704bf1758 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 18 Oct 2023 01:08:28 +0000 Subject: [PATCH 061/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4437.yml | 9 --------- html/changelogs/AutoChangeLog-pr-4653.yml | 5 ----- html/changelogs/archive/2023-10.yml | 14 ++++++++++++++ 3 files changed, 14 insertions(+), 14 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4437.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4653.yml diff --git a/html/changelogs/AutoChangeLog-pr-4437.yml b/html/changelogs/AutoChangeLog-pr-4437.yml deleted file mode 100644 index f25fa89eeb09..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4437.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - code_imp: "Moved most data storage from ARES Interface and APOLLO consoles to a new ARES datacore datum." - - code_imp: "Moved the two consoles to separate files for easier navigation, and moved their respective UI data to the files." - - code_imp: "Ares logging procs are now global procs with integrated can_log checks, rather than requiring definition of ares_link for every use." - - rscadd: "Added ares_can_log checks to all the places I could find missing them." - - bugfix: "Fixed missing rejection button for access tickets." - - rscdel: "Removed claim ticket button from Access Tickets." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4653.yml b/html/changelogs/AutoChangeLog-pr-4653.yml deleted file mode 100644 index 7340da20aac1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4653.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "mullenpaul" -delete-after: True -changes: - - code_imp: "resolves flyby issues by refactoring update_equipment logic" - - refactor: "removes unwanted code" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 5aa2778def50..7f83b35154e2 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -223,3 +223,17 @@ them to your heart's content. - maptweak: Moved long-rest bunks further north and further south of where they were originally +2023-10-18: + mullenpaul: + - code_imp: resolves flyby issues by refactoring update_equipment logic + - refactor: removes unwanted code + realforest2001: + - code_imp: Moved most data storage from ARES Interface and APOLLO consoles to a + new ARES datacore datum. + - code_imp: Moved the two consoles to separate files for easier navigation, and + moved their respective UI data to the files. + - code_imp: Ares logging procs are now global procs with integrated can_log checks, + rather than requiring definition of ares_link for every use. + - rscadd: Added ares_can_log checks to all the places I could find missing them. + - bugfix: Fixed missing rejection button for access tickets. + - rscdel: Removed claim ticket button from Access Tickets. From 65d9e8e9d74b789b826e35506a4adb4c5b190237 Mon Sep 17 00:00:00 2001 From: Julian56 <117036822+Huffie56@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:35:08 +0200 Subject: [PATCH 062/199] Refactor ammo_datums file. (#4682) # About the pull request # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: refactor: refactor ammo_datums file. /:cl: --------- Co-authored-by: Julien --- code/datums/ammo/ammo.dm | 237 ++ code/datums/ammo/bullet/bullet.dm | 81 + code/datums/ammo/bullet/lever_action.dm | 72 + code/datums/ammo/bullet/pistol.dm | 265 ++ code/datums/ammo/bullet/revolver.dm | 179 ++ code/datums/ammo/bullet/rifle.dm | 210 ++ code/datums/ammo/bullet/shotgun.dm | 362 +++ code/datums/ammo/bullet/smg.dm | 147 + code/datums/ammo/bullet/sniper.dm | 170 ++ code/datums/ammo/bullet/special_ammo.dm | 176 ++ code/datums/ammo/bullet/tank.dm | 74 + code/datums/ammo/energy.dm | 241 ++ code/datums/ammo/misc.dm | 294 ++ code/datums/ammo/rocket.dm | 300 ++ code/datums/ammo/shrapnel.dm | 157 ++ code/datums/ammo/xeno.dm | 394 +++ code/modules/projectiles/ammo_datums.dm | 3447 ----------------------- colonialmarines.dme | 17 +- 18 files changed, 3375 insertions(+), 3448 deletions(-) create mode 100644 code/datums/ammo/ammo.dm create mode 100644 code/datums/ammo/bullet/bullet.dm create mode 100644 code/datums/ammo/bullet/lever_action.dm create mode 100644 code/datums/ammo/bullet/pistol.dm create mode 100644 code/datums/ammo/bullet/revolver.dm create mode 100644 code/datums/ammo/bullet/rifle.dm create mode 100644 code/datums/ammo/bullet/shotgun.dm create mode 100644 code/datums/ammo/bullet/smg.dm create mode 100644 code/datums/ammo/bullet/sniper.dm create mode 100644 code/datums/ammo/bullet/special_ammo.dm create mode 100644 code/datums/ammo/bullet/tank.dm create mode 100644 code/datums/ammo/energy.dm create mode 100644 code/datums/ammo/misc.dm create mode 100644 code/datums/ammo/rocket.dm create mode 100644 code/datums/ammo/shrapnel.dm create mode 100644 code/datums/ammo/xeno.dm delete mode 100644 code/modules/projectiles/ammo_datums.dm diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm new file mode 100644 index 000000000000..c536ac83484c --- /dev/null +++ b/code/datums/ammo/ammo.dm @@ -0,0 +1,237 @@ +/datum/ammo + var/name = "generic bullet" + //Icon state when a human is permanently killed with it by execution/suicide. + var/headshot_state = null + var/icon = 'icons/obj/items/weapons/projectiles.dmi' + var/icon_state = "bullet" + /// The icon that is displayed when the bullet bounces off something. + var/ping = "ping_b" + /// When it deals damage. + var/sound_hit + /// When it's blocked by human armor. + var/sound_armor + /// When it misses someone. + var/sound_miss + /// When it bounces off something. + var/sound_bounce + /// When the bullet is absorbed by a xeno_shield + var/sound_shield_hit + /// Snipers use this to simulate poor accuracy at close ranges + var/accurate_range_min = 0 + /// How much the ammo scatters when burst fired, added to gun scatter, along with other mods + var/scatter = 0 + var/stamina_damage = 0 + /// This is the base damage of the bullet as it is fired + var/damage = 0 + /// BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here + var/damage_type = BRUTE + /// How much armor it ignores before calculations take place + var/penetration = 0 + /// The % chance it will imbed in a human + var/shrapnel_chance = 0 + /// The shrapnel type the ammo will embed, if the chance rolls + var/shrapnel_type = 0 + /// Type path of the extra projectiles + var/bonus_projectiles_type + /// How many extra projectiles it shoots out. Works kind of like firing on burst, but all of the projectiles travel together + var/bonus_projectiles_amount = 0 + /// Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony + var/debilitate[] = null + /// how much armor breaking will be done per point of penetration. This is for weapons that penetrate with their shape (like needle bullets) + var/pen_armor_punch = 0.5 + /// how much armor breaking is done by sheer weapon force. This is for big blunt weapons + var/damage_armor_punch = 0.5 + /// if we should play a special sound when firing. + var/sound_override = null + var/flags_ammo_behavior = NO_FLAGS + + /// This is added to the bullet's base accuracy. + var/accuracy = HIT_ACCURACY_TIER_1 + /// How much the accuracy varies when fired. // This REDUCES the lower bound of accuracy variance by 2%, to 96%. + var/accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 + /// This INCREASES the upper bound of accuracy variance by 2%, to 107%. + var/accuracy_var_high = PROJECTILE_VARIANCE_TIER_9 + /// For most guns, this is where the bullet dramatically looses accuracy. Not for snipers though. + var/accurate_range = 6 + /// This will de-increment a counter on the bullet. + var/max_range = 22 + /// Same as with accuracy variance. + var/damage_var_low = PROJECTILE_VARIANCE_TIER_9 + /// This INCREASES the upper bound of damage variance by 2%, to 107%. + var/damage_var_high = PROJECTILE_VARIANCE_TIER_9 + /// How much damage the bullet loses per turf traveled after the effective range + var/damage_falloff = DAMAGE_FALLOFF_TIER_10 + /// How much damage the bullet loses per turf away before the effective range + var/damage_buildup = DAMAGE_BUILDUP_TIER_1 + /// What minimum range the ammo deals full damage, builds up the closer you get. 0 for no minimum. Added onto gun range as a modifier. + var/effective_range_min = EFFECTIVE_RANGE_OFF + /// What maximum range the ammo deals full damage, tapers off using damage_falloff after hitting this value. 0 for no maximum. Added onto gun range as a modifier. + var/effective_range_max = EFFECTIVE_RANGE_OFF + /// How fast the projectile moves. + var/shell_speed = AMMO_SPEED_TIER_1 + + var/handful_type = /obj/item/ammo_magazine/handful + var/handful_color + /// custom handful sprite, for shotgun shells or etc. + var/handful_state = "bullet" + /// so handfuls say 'buckshot shells' not 'shell' + var/multiple_handful_name + + /// Does this apply xenomorph behaviour delegate? + var/apply_delegate = TRUE + + /// An assoc list in the format list(/datum/element/bullet_trait_to_give = list(...args)) + /// that will be given to a projectile with the current ammo datum + var/list/list/traits_to_give + + var/flamer_reagent_type = /datum/reagent/napalm/ut + + /// The flicker that plays when a bullet hits a target. Usually red. Can be nulled so it doesn't show up at all. + var/hit_effect_color = "#FF0000" + +/datum/ammo/New() + set_bullet_traits() + +/datum/ammo/proc/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) //NOT used on New(), applied to the projectiles. + return + +/// Populate traits_to_give in this proc +/datum/ammo/proc/set_bullet_traits() + return + +/datum/ammo/can_vv_modify() + return FALSE + +/datum/ammo/proc/do_at_half_range(obj/projectile/P) + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) + return + +/datum/ammo/proc/do_at_max_range(obj/projectile/P) + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_shield_block(mob/M, obj/projectile/P) //Does it do something special when shield blocked? Ie. a flare or grenade that still blows up. + return + +/datum/ammo/proc/on_hit_turf(turf/T, obj/projectile/P) //Special effects when hitting dense turfs. + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_hit_mob(mob/M, obj/projectile/P, mob/user) //Special effects when hitting mobs. + SHOULD_NOT_SLEEP(TRUE) + return + +///Special effects when pointblanking mobs. Ultimately called from /living/attackby(). Return TRUE to end the PB attempt. +/datum/ammo/proc/on_pointblank(mob/living/L, obj/projectile/P, mob/living/user, obj/item/weapon/gun/fired_from) + return + +/datum/ammo/proc/on_hit_obj(obj/O, obj/projectile/P) //Special effects when hitting objects. + SHOULD_NOT_SLEEP(TRUE) + return + +/datum/ammo/proc/on_near_target(turf/T, obj/projectile/P) //Special effects when passing near something. Range of things that triggers it is controlled by other ammo flags. + return 0 //return 0 means it flies even after being near something. Return 1 means it stops + +/datum/ammo/proc/knockback(mob/living/living_mob, obj/projectile/fired_projectile, max_range = 2) + if(!living_mob || living_mob == fired_projectile.firer) + return + if(fired_projectile.distance_travelled > max_range || living_mob.lying) + return //Two tiles away or more, basically. + + if(living_mob.mob_size >= MOB_SIZE_BIG) + return //Big xenos are not affected. + + shake_camera(living_mob, 3, 4) + knockback_effects(living_mob, fired_projectile) + slam_back(living_mob, fired_projectile) + +/datum/ammo/proc/slam_back(mob/living/living_mob, obj/projectile/fired_projectile) + /// Either knockback or slam them into an obstacle. + var/direction = Get_Compass_Dir(fired_projectile.z ? fired_projectile : fired_projectile.firer, living_mob) //More precise than get_dir. + if(!direction) //Same tile. + return + if(!step(living_mob, direction)) + living_mob.animation_attack_on(get_step(living_mob, direction)) + playsound(living_mob.loc, "punch", 25, 1) + living_mob.visible_message(SPAN_DANGER("[living_mob] slams into an obstacle!"), + isxeno(living_mob) ? SPAN_XENODANGER("You slam into an obstacle!") : SPAN_HIGHDANGER("You slam into an obstacle!"), null, 4, CHAT_TYPE_TAKING_HIT) + living_mob.apply_damage(MELEE_FORCE_TIER_2) + +///The applied effects for knockback(), overwrite to change slow/stun amounts for different ammo datums +/datum/ammo/proc/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + target.apply_effect(0.7, WEAKEN) // 0.9 seconds of stun, per agreement from Balance Team when switched from MC stuns to exact stuns + target.apply_effect(1, SUPERSLOW) + target.apply_effect(2, SLOW) + to_chat(target, SPAN_XENODANGER("You are shaken by the sudden impact!")) + else + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) + if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) + return + + if(target_mob.mob_size >= MOB_SIZE_BIG) + return //too big to push + + to_chat(target_mob, isxeno(target_mob) ? SPAN_XENODANGER("You are pushed back by the sudden impact!") : SPAN_HIGHDANGER("You are pushed back by the sudden impact!"), null, 4, CHAT_TYPE_TAKING_HIT) + slam_back(target_mob, fired_projectile, max_range) + +/datum/ammo/proc/burst(atom/target, obj/projectile/P, damage_type = BRUTE, range = 1, damage_div = 2, show_message = SHOW_MESSAGE_VISIBLE) //damage_div says how much we divide damage + if(!target || !P) return + for(var/mob/living/carbon/M in orange(range,target)) + if(P.firer == M) + continue + if(show_message) + var/msg = "You are hit by backlash from \a
[P.name]
!" + M.visible_message(SPAN_DANGER("[M] is hit by backlash from \a [P.name]!"),isxeno(M) ? SPAN_XENODANGER("[msg]"):SPAN_HIGHDANGER("[msg]")) + var/damage = P.damage/damage_div + + var/mob/living/carbon/xenomorph/XNO = null + + if(isxeno(M)) + XNO = M + var/total_explosive_resistance = XNO.caste.xeno_explosion_resistance + XNO.armor_explosive_buff + damage = armor_damage_reduction(GLOB.xeno_explosive, damage, total_explosive_resistance , 60, 0, 0.5, XNO.armor_integrity) + var/armor_punch = armor_break_calculation(GLOB.xeno_explosive, damage, total_explosive_resistance, 60, 0, 0.5, XNO.armor_integrity) + XNO.apply_armorbreak(armor_punch) + + M.apply_damage(damage,damage_type) + + if(XNO && XNO.xeno_shields.len) + P.play_shielded_hit_effect(M) + else + P.play_hit_effect(M) + +/datum/ammo/proc/fire_bonus_projectiles(obj/projectile/original_P) + set waitfor = 0 + + var/turf/curloc = get_turf(original_P.shot_from) + var/initial_angle = Get_Angle(curloc, original_P.target_turf) + + for(var/i in 1 to bonus_projectiles_amount) //Want to run this for the number of bonus projectiles. + var/final_angle = initial_angle + + var/obj/projectile/P = new /obj/projectile(curloc, original_P.weapon_cause_data) + P.generate_bullet(GLOB.ammo_list[bonus_projectiles_type]) //No bonus damage or anything. + P.accuracy = round(P.accuracy * original_P.accuracy/initial(original_P.accuracy)) //if the gun changes the accuracy of the main projectile, it also affects the bonus ones. + original_P.give_bullet_traits(P) + + var/total_scatter_angle = P.scatter + final_angle += rand(-total_scatter_angle, total_scatter_angle) + var/turf/new_target = get_angle_target_turf(curloc, final_angle, 30) + + P.fire_at(new_target, original_P.firer, original_P.shot_from, P.ammo.max_range, P.ammo.shell_speed, original_P.original) //Fire! + +/datum/ammo/proc/drop_flame(turf/T, datum/cause_data/cause_data) // ~Art updated fire 20JAN17 + if(!istype(T)) + return + if(locate(/obj/flamer_fire) in T) + return + + var/datum/reagent/R = new flamer_reagent_type() + new /obj/flamer_fire(T, cause_data, R) diff --git a/code/datums/ammo/bullet/bullet.dm b/code/datums/ammo/bullet/bullet.dm new file mode 100644 index 000000000000..dadb644201df --- /dev/null +++ b/code/datums/ammo/bullet/bullet.dm @@ -0,0 +1,81 @@ +/* +//====== + Default Ammo +//====== +*/ +//Only when things screw up do we use this as a placeholder. +/datum/ammo/bullet + name = "default bullet" + icon_state = "bullet" + headshot_state = HEADSHOT_OVERLAY_LIGHT + flags_ammo_behavior = AMMO_BALLISTIC + sound_hit = "ballistic_hit" + sound_armor = "ballistic_armor" + sound_miss = "ballistic_miss" + sound_bounce = "ballistic_bounce" + sound_shield_hit = "ballistic_shield_hit" + + accurate_range_min = 0 + damage = 10 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_1 + shrapnel_type = /obj/item/shard/shrapnel + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/proc/handle_battlefield_execution(datum/ammo/firing_ammo, mob/living/hit_mob, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) + SIGNAL_HANDLER + + if(!user || hit_mob == user || user.zone_selected != "head" || user.a_intent != INTENT_HARM || !ishuman_strict(hit_mob)) + return + + if(!skillcheck(user, SKILL_EXECUTION, SKILL_EXECUTION_TRAINED)) + to_chat(user, SPAN_DANGER("You don't know how to execute someone correctly.")) + return + + var/mob/living/carbon/human/execution_target = hit_mob + + if(execution_target.status_flags & PERMANENTLY_DEAD) + to_chat(user, SPAN_DANGER("[execution_target] has already been executed!")) + return + + INVOKE_ASYNC(src, PROC_REF(attempt_battlefield_execution), src, execution_target, firing_projectile, user, fired_from) + + return COMPONENT_CANCEL_AMMO_POINT_BLANK + +/datum/ammo/bullet/proc/attempt_battlefield_execution(datum/ammo/firing_ammo, mob/living/carbon/human/execution_target, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) + user.affected_message(execution_target, + SPAN_HIGHDANGER("You aim \the [fired_from] at [execution_target]'s head!"), + SPAN_HIGHDANGER("[user] aims \the [fired_from] directly at your head!"), + SPAN_DANGER("[user] aims \the [fired_from] at [execution_target]'s head!")) + + user.next_move += 1.1 SECONDS //PB has no click delay; readding it here to prevent people accidentally queuing up multiple executions. + + if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE) || !user.Adjacent(execution_target)) + fired_from.delete_bullet(firing_projectile, TRUE) + return + + if(!(fired_from.flags_gun_features & GUN_SILENCED)) + playsound(user, fired_from.fire_sound, fired_from.firesound_volume, FALSE) + else + playsound(user, fired_from.fire_sound, 25, FALSE) + + shake_camera(user, 1, 2) + + execution_target.apply_damage(damage * 3, BRUTE, "head", no_limb_loss = TRUE, permanent_kill = TRUE) //Apply gobs of damage and make sure they can't be revived later... + execution_target.apply_damage(200, OXY) //...fill out the rest of their health bar with oxyloss... + execution_target.death(create_cause_data("execution", user)) //...make certain they're properly dead... + shake_camera(execution_target, 3, 4) + execution_target.update_headshot_overlay(headshot_state) //...and add a gory headshot overlay. + + execution_target.visible_message(SPAN_HIGHDANGER(uppertext("[execution_target] WAS EXECUTED!")), \ + SPAN_HIGHDANGER("You WERE EXECUTED!")) + + user.count_niche_stat(STATISTICS_NICHE_EXECUTION, 1, firing_projectile.weapon_cause_data?.cause_name) + + var/area/execution_area = get_area(execution_target) + + msg_admin_attack(FONT_SIZE_HUGE("[key_name(usr)] has battlefield executed [key_name(execution_target)] in [get_area(usr)] ([usr.loc.x],[usr.loc.y],[usr.loc.z])."), usr.loc.x, usr.loc.y, usr.loc.z) + log_attack("[key_name(usr)] battlefield executed [key_name(execution_target)] at [execution_area.name].") + + if(flags_ammo_behavior & AMMO_EXPLOSIVE) + execution_target.gib() + diff --git a/code/datums/ammo/bullet/lever_action.dm b/code/datums/ammo/bullet/lever_action.dm new file mode 100644 index 000000000000..2770231b6811 --- /dev/null +++ b/code/datums/ammo/bullet/lever_action.dm @@ -0,0 +1,72 @@ +/* +//====== + Lever Action +//====== +*/ + +/datum/ammo/bullet/lever_action + name = "lever-action bullet" + + damage = 80 + penetration = 0 + accuracy = HIT_ACCURACY_TIER_1 + shell_speed = AMMO_SPEED_TIER_6 + accurate_range = 14 + handful_state = "lever_action_bullet" + +//unused and not working. need to refactor MD code. Unobtainable. +//intended mechanic is to have xenos hit with it show up very frequently on any MDs around +/datum/ammo/bullet/lever_action/tracker + name = "tracking lever-action bullet" + icon_state = "redbullet" + damage = 70 + penetration = ARMOR_PENETRATION_TIER_3 + accuracy = HIT_ACCURACY_TIER_1 + handful_state = "tracking_lever_action_bullet" + +/datum/ammo/bullet/lever_action/tracker/on_hit_mob(mob/M, obj/projectile/P, mob/user) + //SEND_SIGNAL(user, COMSIG_BULLET_TRACKING, user, M) + M.visible_message(SPAN_DANGER("You hear a faint beep under [M]'s [M.mob_size > MOB_SIZE_HUMAN ? "chitin" : "skin"].")) + +/datum/ammo/bullet/lever_action/training + name = "lever-action blank" + icon_state = "blank" + damage = 70 //blanks CAN hurt you if shot very close + penetration = 0 + accuracy = HIT_ACCURACY_TIER_1 + damage_falloff = DAMAGE_FALLOFF_BLANK //not much, though (comparatively) + shell_speed = AMMO_SPEED_TIER_5 + handful_state = "training_lever_action_bullet" + +//unused, and unobtainable... for now +/datum/ammo/bullet/lever_action/marksman + name = "marksman lever-action bullet" + shrapnel_chance = 0 + damage_falloff = 0 + accurate_range = 12 + damage = 70 + penetration = ARMOR_PENETRATION_TIER_6 + shell_speed = AMMO_SPEED_TIER_6 + handful_state = "marksman_lever_action_bullet" + +/datum/ammo/bullet/lever_action/xm88 + name = ".458 SOCOM round" + + damage = 80 + penetration = ARMOR_PENETRATION_TIER_2 + accuracy = HIT_ACCURACY_TIER_1 + shell_speed = AMMO_SPEED_TIER_6 + accurate_range = 14 + handful_state = "boomslang_bullet" + +/datum/ammo/bullet/lever_action/xm88/pen20 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/lever_action/xm88/pen30 + penetration = ARMOR_PENETRATION_TIER_6 + +/datum/ammo/bullet/lever_action/xm88/pen40 + penetration = ARMOR_PENETRATION_TIER_8 + +/datum/ammo/bullet/lever_action/xm88/pen50 + penetration = ARMOR_PENETRATION_TIER_10 diff --git a/code/datums/ammo/bullet/pistol.dm b/code/datums/ammo/bullet/pistol.dm new file mode 100644 index 000000000000..8be63b0a15af --- /dev/null +++ b/code/datums/ammo/bullet/pistol.dm @@ -0,0 +1,265 @@ +/* +//====== + Pistol Ammo +//====== +*/ + +// Used by M4A3, M4A3 Custom and B92FS +/datum/ammo/bullet/pistol + name = "pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + damage = 40 + penetration= ARMOR_PENETRATION_TIER_2 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pistol/tiny + name = "light pistol bullet" + +/datum/ammo/bullet/pistol/tranq + name = "tranquilizer bullet" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST + stamina_damage = 30 + damage = 15 + +//2020 rebalance: is supposed to counter runners and lurkers, dealing high damage to the only castes with no armor. +//Limited by its lack of versatility and lower supply, so marines finally have an answer for flanker castes that isn't just buckshot. + +/datum/ammo/bullet/pistol/hollow + name = "hollowpoint pistol bullet" + + damage = 55 //hollowpoint is strong + penetration = 0 //hollowpoint can't pierce armor! + shrapnel_chance = SHRAPNEL_CHANCE_TIER_3 //hollowpoint causes shrapnel + +// Used by M4A3 AP and mod88 +/datum/ammo/bullet/pistol/ap + name = "armor-piercing pistol bullet" + + damage = 25 + accuracy = HIT_ACCURACY_TIER_2 + penetration= ARMOR_PENETRATION_TIER_8 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pistol/ap/penetrating + name = "wall-penetrating pistol bullet" + shrapnel_chance = 0 + + damage = 30 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/pistol/ap/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/pistol/ap/toxin + name = "toxic pistol bullet" + var/acid_per_hit = 10 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/pistol/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/pistol/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/le + name = "armor-shredding pistol bullet" + + damage = 15 + penetration = ARMOR_PENETRATION_TIER_4 + pen_armor_punch = 3 + +/datum/ammo/bullet/pistol/rubber + name = "rubber pistol bullet" + sound_override = 'sound/weapons/gun_c99.ogg' + + damage = 0 + stamina_damage = 25 + shrapnel_chance = 0 + +// Reskinned rubber bullet used for the ES-4 CL pistol. +/datum/ammo/bullet/pistol/rubber/stun + name = "stun pistol bullet" + sound_override = null + +// Used by M1911, Deagle and KT-42 +/datum/ammo/bullet/pistol/heavy + name = "heavy pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + damage = 55 + penetration = ARMOR_PENETRATION_TIER_3 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pistol/heavy/super //Commander's variant + name = ".50 heavy pistol bullet" + damage = 60 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/pistol/heavy/super/highimpact + name = ".50 high-impact pistol bullet" + penetration = ARMOR_PENETRATION_TIER_1 + debilitate = list(0,1.5,0,0,0,1,0,0) + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/pistol/heavy/super/highimpact/ap + name = ".50 high-impact armor piercing pistol bullet" + penetration = ARMOR_PENETRATION_TIER_10 + damage = 45 + +/datum/ammo/bullet/pistol/heavy/super/highimpact/upp + name = "high-impact pistol bullet" + sound_override = 'sound/weapons/gun_DE50.ogg' + penetration = ARMOR_PENETRATION_TIER_6 + debilitate = list(0,1.5,0,0,0,1,0,0) + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/pistol/heavy/super/highimpact/New() + ..() + RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) + +/datum/ammo/bullet/pistol/heavy/super/highimpact/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 4) + +/datum/ammo/bullet/pistol/deagle + name = ".50 heavy pistol bullet" + damage = 45 + headshot_state = HEADSHOT_OVERLAY_HEAVY + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_5 + +/datum/ammo/bullet/pistol/incendiary + name = "incendiary pistol bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_3 + damage = 20 + +/datum/ammo/bullet/pistol/incendiary/set_bullet_traits() + ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +// Used by the hipower +// I know that the 'high power' in the name is supposed to mean its 'impressive' magazine capacity +// but this is CM, half our guns have baffling misconceptions and mistakes (how do you grab the type-71?) so it's on-brand. +// maybe in the far flung future of 2280 someone screwed up the design. + +/datum/ammo/bullet/pistol/highpower + name = "high-powered pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = HIT_ACCURACY_TIER_3 + damage = 36 + penetration = ARMOR_PENETRATION_TIER_5 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + +// Used by VP78 and Auto 9 +/datum/ammo/bullet/pistol/squash + name = "squash-head pistol bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + debilitate = list(0,0,0,0,0,0,0,2) + + accuracy = HIT_ACCURACY_TIER_4 + damage = 45 + penetration= ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_6 //"VP78 - the only pistol viable as a primary."-Vampmare, probably. + +/datum/ammo/bullet/pistol/squash/toxin + name = "toxic squash-head pistol bullet" + var/acid_per_hit = 10 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/pistol/squash/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/pistol/squash/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/squash/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/pistol/squash/penetrating + name = "wall-penetrating squash-head pistol bullet" + shrapnel_chance = 0 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/pistol/squash/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/pistol/squash/incendiary + name = "incendiary squash-head pistol bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + accuracy = HIT_ACCURACY_TIER_3 + damage = 35 + +/datum/ammo/bullet/pistol/squash/incendiary/set_bullet_traits() + ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + + +/datum/ammo/bullet/pistol/mankey + name = "live monkey" + icon_state = "monkey1" + ping = null //no bounce off. + damage_type = BURN + debilitate = list(4,4,0,0,0,0,0,0) + flags_ammo_behavior = AMMO_IGNORE_ARMOR + + damage = 15 + damage_var_high = PROJECTILE_VARIANCE_TIER_5 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/bullet/pistol/mankey/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/pistol/mankey/on_hit_mob(mob/M,obj/projectile/P) + if(P && P.loc && !M.stat && !istype(M,/mob/living/carbon/human/monkey)) + P.visible_message(SPAN_DANGER("The [src] chimpers furiously!")) + new /mob/living/carbon/human/monkey(P.loc) + +/datum/ammo/bullet/pistol/smart + name = "smartpistol bullet" + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_8 + damage = 30 + penetration = 20 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm new file mode 100644 index 000000000000..339609f57be7 --- /dev/null +++ b/code/datums/ammo/bullet/revolver.dm @@ -0,0 +1,179 @@ +/* +//====== + Revolver Ammo +//====== +*/ + +/datum/ammo/bullet/revolver + name = "revolver bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + damage = 55 + penetration = ARMOR_PENETRATION_TIER_1 + accuracy = HIT_ACCURACY_TIER_1 + +/datum/ammo/bullet/revolver/marksman + name = "marksman revolver bullet" + + shrapnel_chance = 0 + damage_falloff = 0 + accurate_range = 12 + penetration = ARMOR_PENETRATION_TIER_7 + +/datum/ammo/bullet/revolver/heavy + name = "heavy revolver bullet" + + damage = 35 + penetration = ARMOR_PENETRATION_TIER_4 + accuracy = HIT_ACCURACY_TIER_3 + +/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 4) + +/datum/ammo/bullet/revolver/incendiary + name = "incendiary revolver bullet" + damage = 40 + +/datum/ammo/bullet/revolver/incendiary/set_bullet_traits() + ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/revolver/marksman/toxin + name = "toxic revolver bullet" + var/acid_per_hit = 10 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/revolver/marksman/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/revolver/marksman/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/revolver/marksman/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/revolver/penetrating + name = "wall-penetrating revolver bullet" + shrapnel_chance = 0 + + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/revolver/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/revolver/upp + name = "heavy revolver bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + penetration = ARMOR_PENETRATION_TIER_4 + damage = 70 + + +/datum/ammo/bullet/revolver/upp/shrapnel + name = "shrapnel shot" + headshot_state = HEADSHOT_OVERLAY_HEAVY //Gol-dang shotgun blow your fething head off. + debilitate = list(0,0,0,0,0,0,0,0) + icon_state = "shrapnelshot" + handful_state = "shrapnel" + bonus_projectiles_type = /datum/ammo/bullet/revolver/upp/shrapnel_bits + + max_range = 6 + damage = 40 // + TIER_4 * 3 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + penetration = ARMOR_PENETRATION_TIER_8 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + shrapnel_chance = 100 + shrapnel_type = /obj/item/shard/shrapnel/upp + //roughly 90 or so damage with the additional shrapnel, around 130 in total with primary round + +/datum/ammo/bullet/revolver/upp/shrapnel/on_hit_mob(mob/M, obj/projectile/P) + pushback(M, P, 1) + +/datum/ammo/bullet/revolver/upp/shrapnel_bits + name = "small shrapnel" + icon_state = "shrapnelshot_bit" + + max_range = 6 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_4 + scatter = SCATTER_AMOUNT_TIER_1 + bonus_projectiles_amount = 0 + shrapnel_type = /obj/item/shard/shrapnel/upp/bits + +/datum/ammo/bullet/revolver/small + name = "small revolver bullet" + headshot_state = HEADSHOT_OVERLAY_LIGHT + + damage = 45 + + penetration = ARMOR_PENETRATION_TIER_3 + +/datum/ammo/bullet/revolver/small/hollowpoint + name = "small hollowpoint revolver bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + damage = 75 // way too strong because it's hard to make a good balance between HP and normal with this system, but the damage falloff is really strong + penetration = 0 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + +/datum/ammo/bullet/revolver/mateba + name = ".454 heavy revolver bullet" + + damage = 60 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/revolver/mateba/highimpact + name = ".454 heavy high-impact revolver bullet" + debilitate = list(0,2,0,0,0,1,0,0) + penetration = ARMOR_PENETRATION_TIER_1 + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/revolver/mateba/highimpact/ap + name = ".454 heavy high-impact armor piercing revolver bullet" + penetration = ARMOR_PENETRATION_TIER_10 + damage = 45 + +/datum/ammo/bullet/revolver/mateba/highimpact/New() + ..() + RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) + +/datum/ammo/bullet/revolver/mateba/highimpact/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 4) + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive //if you ever put this in normal gameplay, i am going to scream + name = ".454 heavy explosive revolver bullet" + damage = 100 + damage_var_low = PROJECTILE_VARIANCE_TIER_10 + damage_var_high = PROJECTILE_VARIANCE_TIER_1 + penetration = ARMOR_PENETRATION_TIER_10 + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_BALLISTIC + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_mob(mob/M, obj/projectile/P) + ..() + cell_explosion(get_turf(M), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_obj(obj/O, obj/projectile/P) + ..() + cell_explosion(get_turf(O), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_turf(turf/T, obj/projectile/P) + ..() + cell_explosion(T, 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/revolver/webley //Mateba round without the knockdown. + name = ".455 Webley bullet" + damage = 60 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_2 diff --git a/code/datums/ammo/bullet/rifle.dm b/code/datums/ammo/bullet/rifle.dm new file mode 100644 index 000000000000..b6085572e3b9 --- /dev/null +++ b/code/datums/ammo/bullet/rifle.dm @@ -0,0 +1,210 @@ +/* +//====== + Rifle Ammo +//====== +*/ + +/datum/ammo/bullet/rifle + name = "rifle bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + damage = 40 + penetration = ARMOR_PENETRATION_TIER_1 + accurate_range = 16 + accuracy = HIT_ACCURACY_TIER_4 + scatter = SCATTER_AMOUNT_TIER_10 + shell_speed = AMMO_SPEED_TIER_6 + effective_range_max = 7 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + max_range = 24 //So S8 users don't have their bullets magically disappaer at 22 tiles (S8 can see 24 tiles) + +/datum/ammo/bullet/rifle/holo_target + name = "holo-targeting rifle bullet" + damage = 30 + var/holo_stacks = 10 + +/datum/ammo/bullet/rifle/holo_target/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) + +/datum/ammo/bullet/rifle/holo_target/hunting + name = "holo-targeting hunting bullet" + damage = 25 + holo_stacks = 15 + +/datum/ammo/bullet/rifle/explosive + name = "explosive rifle bullet" + + damage = 25 + accurate_range = 22 + accuracy = 0 + shell_speed = AMMO_SPEED_TIER_4 + damage_falloff = DAMAGE_FALLOFF_TIER_9 + +/datum/ammo/bullet/rifle/explosive/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(get_turf(M), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/rifle/explosive/on_hit_obj(obj/O, obj/projectile/P) + cell_explosion(get_turf(O), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/rifle/explosive/on_hit_turf(turf/T, obj/projectile/P) + if(T.density) + cell_explosion(T, 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) + +/datum/ammo/bullet/rifle/ap + name = "armor-piercing rifle bullet" + + damage = 30 + penetration = ARMOR_PENETRATION_TIER_8 + +// Basically AP but better. Focused at taking out armour temporarily +/datum/ammo/bullet/rifle/ap/toxin + name = "toxic rifle bullet" + var/acid_per_hit = 7 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/rifle/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/rifle/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/rifle/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + + +/datum/ammo/bullet/rifle/ap/penetrating + name = "wall-penetrating rifle bullet" + shrapnel_chance = 0 + + damage = 35 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/rifle/ap/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/rifle/le + name = "armor-shredding rifle bullet" + + damage = 20 + penetration = ARMOR_PENETRATION_TIER_4 + pen_armor_punch = 5 + +/datum/ammo/bullet/rifle/heap + name = "high-explosive armor-piercing rifle bullet" + + headshot_state = HEADSHOT_OVERLAY_HEAVY + damage = 55//big damage, doesn't actually blow up because thats stupid. + penetration = ARMOR_PENETRATION_TIER_8 + +/datum/ammo/bullet/rifle/rubber + name = "rubber rifle bullet" + sound_override = 'sound/weapons/gun_c99.ogg' + + damage = 0 + stamina_damage = 15 + shrapnel_chance = 0 + +/datum/ammo/bullet/rifle/incendiary + name = "incendiary rifle bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 30 + shell_speed = AMMO_SPEED_TIER_4 + accuracy = -HIT_ACCURACY_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_10 + +/datum/ammo/bullet/rifle/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/rifle/m4ra + name = "A19 high velocity bullet" + shrapnel_chance = 0 + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + accurate_range_min = 4 + + damage = 55 + scatter = -SCATTER_AMOUNT_TIER_8 + penetration= ARMOR_PENETRATION_TIER_7 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/rifle/m4ra/incendiary + name = "A19 high velocity incendiary bullet" + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 40 + accuracy = HIT_ACCURACY_TIER_4 + scatter = -SCATTER_AMOUNT_TIER_8 + penetration= ARMOR_PENETRATION_TIER_5 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/rifle/m4ra/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/rifle/m4ra/impact + name = "A19 high velocity impact bullet" + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 40 + accuracy = -HIT_ACCURACY_TIER_2 + scatter = -SCATTER_AMOUNT_TIER_8 + penetration = ARMOR_PENETRATION_TIER_10 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/rifle/m4ra/impact/on_hit_mob(mob/M, obj/projectile/P) + knockback(M, P, 32) // Can knockback basically at max range + +/datum/ammo/bullet/rifle/m4ra/impact/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(2, SUPERSLOW) + target.apply_effect(5, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/bullet/rifle/mar40 + name = "heavy rifle bullet" + + damage = 55 + +/datum/ammo/bullet/rifle/type71 + name = "heavy rifle bullet" + + damage = 55 + penetration = ARMOR_PENETRATION_TIER_3 + +/datum/ammo/bullet/rifle/type71/ap + name = "heavy armor-piercing rifle bullet" + + damage = 40 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/rifle/type71/heap + name = "heavy high-explosive armor-piercing rifle bullet" + + headshot_state = HEADSHOT_OVERLAY_HEAVY + damage = 65 + penetration = ARMOR_PENETRATION_TIER_10 diff --git a/code/datums/ammo/bullet/shotgun.dm b/code/datums/ammo/bullet/shotgun.dm new file mode 100644 index 000000000000..4cedb8b3ee69 --- /dev/null +++ b/code/datums/ammo/bullet/shotgun.dm @@ -0,0 +1,362 @@ +/* +//====== + Shotgun Ammo +//====== +*/ + +/datum/ammo/bullet/shotgun + headshot_state = HEADSHOT_OVERLAY_HEAVY + +/datum/ammo/bullet/shotgun/slug + name = "shotgun slug" + handful_state = "slug_shell" + + accurate_range = 6 + max_range = 8 + damage = 70 + penetration = ARMOR_PENETRATION_TIER_4 + damage_armor_punch = 2 + handful_state = "slug_shell" + +/datum/ammo/bullet/shotgun/slug/on_hit_mob(mob/M,obj/projectile/P) + knockback(M, P, 6) + +/datum/ammo/bullet/shotgun/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(1, SUPERSLOW) + target.apply_effect(3, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/bullet/shotgun/beanbag + name = "beanbag slug" + headshot_state = HEADSHOT_OVERLAY_LIGHT //It's not meant to kill people... but if you put it in your mouth, it will. + handful_state = "beanbag_slug" + icon_state = "beanbag" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST + sound_override = 'sound/weapons/gun_shotgun_riot.ogg' + + max_range = 12 + shrapnel_chance = 0 + damage = 0 + stamina_damage = 45 + accuracy = HIT_ACCURACY_TIER_3 + shell_speed = AMMO_SPEED_TIER_3 + handful_state = "beanbag_slug" + +/datum/ammo/bullet/shotgun/beanbag/on_hit_mob(mob/M, obj/projectile/P) + if(!M || M == P.firer) return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + shake_camera(H, 2, 1) + + +/datum/ammo/bullet/shotgun/incendiary + name = "incendiary slug" + handful_state = "incendiary_slug" + damage_type = BURN + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = -HIT_ACCURACY_TIER_2 + max_range = 12 + damage = 55 + penetration= ARMOR_PENETRATION_TIER_1 + handful_state = "incendiary_slug" + +/datum/ammo/bullet/shotgun/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shotgun/incendiary/on_hit_mob(mob/M,obj/projectile/P) + burst(get_turf(M),P,damage_type) + knockback(M,P) + +/datum/ammo/bullet/shotgun/incendiary/on_hit_obj(obj/O,obj/projectile/P) + burst(get_turf(P),P,damage_type) + +/datum/ammo/bullet/shotgun/incendiary/on_hit_turf(turf/T,obj/projectile/P) + burst(get_turf(T),P,damage_type) + + +/datum/ammo/bullet/shotgun/flechette + name = "flechette shell" + icon_state = "flechette" + handful_state = "flechette_shell" + bonus_projectiles_type = /datum/ammo/bullet/shotgun/flechette_spread + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + max_range = 12 + damage = 30 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_7 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + handful_state = "flechette_shell" + multiple_handful_name = TRUE + +/datum/ammo/bullet/shotgun/flechette_spread + name = "additional flechette" + icon_state = "flechette" + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + max_range = 12 + damage = 30 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_7 + scatter = SCATTER_AMOUNT_TIER_5 + +/datum/ammo/bullet/shotgun/buckshot + name = "buckshot shell" + icon_state = "buckshot" + handful_state = "buckshot_shell" + multiple_handful_name = TRUE + bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_5 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_5 + accurate_range = 4 + max_range = 4 + damage = 65 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_1 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + shell_speed = AMMO_SPEED_TIER_2 + damage_armor_punch = 0 + pen_armor_punch = 0 + handful_state = "buckshot_shell" + multiple_handful_name = TRUE + +/datum/ammo/bullet/shotgun/buckshot/incendiary + name = "incendiary buckshot shell" + handful_state = "incen_buckshot" + handful_type = /obj/item/ammo_magazine/handful/shotgun/buckshot/incendiary + +/datum/ammo/bullet/shotgun/buckshot/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shotgun/buckshot/on_hit_mob(mob/M,obj/projectile/P) + knockback(M,P) + +//buckshot variant only used by the masterkey shotgun attachment. +/datum/ammo/bullet/shotgun/buckshot/masterkey + bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread/masterkey + + damage = 55 + +/datum/ammo/bullet/shotgun/spread + name = "additional buckshot" + icon_state = "buckshot" + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 4 + max_range = 6 + damage = 65 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_2 + scatter = SCATTER_AMOUNT_TIER_1 + damage_armor_punch = 0 + pen_armor_punch = 0 + +/datum/ammo/bullet/shotgun/spread/masterkey + damage = 20 + +/* + 8 GAUGE SHOTGUN AMMO +*/ + +/datum/ammo/bullet/shotgun/heavy/buckshot + name = "heavy buckshot shell" + icon_state = "buckshot" + handful_state = "heavy_buckshot" + multiple_handful_name = TRUE + bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/spread + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 + accurate_range = 3 + max_range = 3 + damage = 75 + penetration = 0 + shell_speed = AMMO_SPEED_TIER_2 + damage_armor_punch = 0 + pen_armor_punch = 0 + +/datum/ammo/bullet/shotgun/heavy/buckshot/on_hit_mob(mob/M,obj/projectile/P) + knockback(M,P) + +/datum/ammo/bullet/shotgun/heavy/buckshot/spread + name = "additional heavy buckshot" + max_range = 4 + scatter = SCATTER_AMOUNT_TIER_1 + bonus_projectiles_amount = 0 + +//basically the same +/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath + name = "dragon's breath shell" + handful_state = "heavy_dragonsbreath" + multiple_handful_name = TRUE + damage_type = BURN + damage = 60 + accurate_range = 3 + max_range = 4 + bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread + +/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread + name = "additional dragon's breath" + bonus_projectiles_amount = 0 + accurate_range = 4 + max_range = 5 //make use of the ablaze property + shell_speed = AMMO_SPEED_TIER_4 // so they hit before the main shell stuns + + +/datum/ammo/bullet/shotgun/heavy/slug + name = "heavy shotgun slug" + handful_state = "heavy_slug" + + accurate_range = 7 + max_range = 8 + damage = 90 //ouch. + penetration = ARMOR_PENETRATION_TIER_6 + damage_armor_punch = 2 + +/datum/ammo/bullet/shotgun/heavy/slug/on_hit_mob(mob/M,obj/projectile/P) + knockback(M, P, 7) + +/datum/ammo/bullet/shotgun/heavy/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(2, SUPERSLOW) + target.apply_effect(5, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + +/datum/ammo/bullet/shotgun/heavy/beanbag + name = "heavy beanbag slug" + icon_state = "beanbag" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + handful_state = "heavy_beanbag" + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST + sound_override = 'sound/weapons/gun_shotgun_riot.ogg' + + max_range = 7 + shrapnel_chance = 0 + damage = 0 + stamina_damage = 100 + accuracy = HIT_ACCURACY_TIER_2 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/bullet/shotgun/heavy/beanbag/on_hit_mob(mob/M, obj/projectile/P) + if(!M || M == P.firer) + return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + shake_camera(H, 2, 1) + +/datum/ammo/bullet/shotgun/heavy/flechette + name = "heavy flechette shell" + icon_state = "flechette" + handful_state = "heavy_flechette" + multiple_handful_name = TRUE + bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/flechette_spread + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_3 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_3 + max_range = 12 + damage = 45 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_10 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_2 + +/datum/ammo/bullet/shotgun/heavy/flechette_spread + name = "additional heavy flechette" + icon_state = "flechette" + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + max_range = 12 + damage = 45 + damage_var_low = PROJECTILE_VARIANCE_TIER_8 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_10 + scatter = SCATTER_AMOUNT_TIER_4 + +//Enormous shell for Van Bandolier's superheavy double-barreled hunting gun. +/datum/ammo/bullet/shotgun/twobore + name = "two bore bullet" + icon_state = "autocannon" + handful_state = "twobore" + + accurate_range = 8 //Big low-velocity projectile; this is for blasting dangerous game at close range. + max_range = 14 //At this range, it's lost all its damage anyway. + damage = 300 //Hits like a buckshot PB. + penetration = ARMOR_PENETRATION_TIER_3 + damage_falloff = DAMAGE_FALLOFF_TIER_1 * 3 //It has a lot of energy, but the 26mm bullet drops off fast. + effective_range_max = EFFECTIVE_RANGE_MAX_TIER_2 //Full damage up to this distance, then falloff for each tile beyond. + var/hit_messages = list() + +/datum/ammo/bullet/shotgun/twobore/on_hit_mob(mob/living/M, obj/projectile/P) + var/mob/shooter = P.firer + if(shooter && ismob(shooter) && HAS_TRAIT(shooter, TRAIT_TWOBORE_TRAINING) && M.stat != DEAD && prob(40)) //Death is handled by periodic life() checks so this should have a chance to fire on a killshot. + if(!length(hit_messages)) //Pick and remove lines, refill on exhaustion. + hit_messages = list("Got you!", "Aha!", "Bullseye!", "It's curtains for you, Sonny Jim!", "Your head will look fantastic on my wall!", "I have you now!", "You miserable coward! Come and fight me like a man!", "Tally ho!") + var/message = pick_n_take(hit_messages) + shooter.say(message) + + if(P.distance_travelled > 8) + knockback(M, P, 12) + + else if(!M || M == P.firer || M.lying) //These checks are included in knockback and would be redundant above. + return + + shake_camera(M, 3, 4) + M.apply_effect(2, WEAKEN) + M.apply_effect(4, SLOW) + if(iscarbonsizexeno(M)) + to_chat(M, SPAN_XENODANGER("The impact knocks you off your feet!")) + else //This will hammer a Yautja as hard as a human. + to_chat(M, SPAN_HIGHDANGER("The impact knocks you off your feet!")) + + step(M, get_dir(P.firer, M)) + +/datum/ammo/bullet/shotgun/twobore/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) + target.apply_effect(0.5, WEAKEN) + target.apply_effect(2, SUPERSLOW) + target.apply_effect(5, SLOW) + else + if(!isyautja(living_mob)) //Not predators. + living_mob.apply_effect(1, SUPERSLOW) + living_mob.apply_effect(2, SLOW) + to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) diff --git a/code/datums/ammo/bullet/smg.dm b/code/datums/ammo/bullet/smg.dm new file mode 100644 index 000000000000..e24b3021da97 --- /dev/null +++ b/code/datums/ammo/bullet/smg.dm @@ -0,0 +1,147 @@ +/* +//====== + SMG Ammo +//====== +*/ +//2020 SMG/ammo rebalance. default ammo actually has penetration so it can be useful, by 4khan: should be meh against t3s, better under 15 armor. Perfectly does this right now (oct 2020) +//has reduced falloff compared to the m39. this means it is best for kiting castes (mostly t2s and below admittedly) +//while the m39 ap is better for shredding them at close range, but has reduced velocity, so it's better for just running in and erasing armor-centric castes (defender, crusher) +// which i think is really interesting and good balance, giving both ammo types a reason to exist even against ravagers. +//i feel it is necessary to reflavor the default bullet, because otherwise, people won't be able to notice it has less falloff and faster bullet speed. even with a changelog, +//way too many people don't read the changelog, and after one or two months the changelog entry is all but archive, so there needs to be an ingame description of what the ammo does +//in comparison to armor-piercing rounds. + +/datum/ammo/bullet/smg + name = "submachinegun bullet" + damage = 34 + accurate_range = 4 + effective_range_max = 4 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_6 + damage_falloff = DAMAGE_FALLOFF_TIER_5 + scatter = SCATTER_AMOUNT_TIER_6 + accuracy = HIT_ACCURACY_TIER_3 + +/datum/ammo/bullet/smg/m39 + name = "high-velocity submachinegun bullet" //i don't want all smgs to inherit 'high velocity' + +/datum/ammo/bullet/smg/ap + name = "armor-piercing submachinegun bullet" + + damage = 26 + penetration = ARMOR_PENETRATION_TIER_6 + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/smg/heap + name = "high-explosive armor-piercing submachinegun bullet" + + damage = 45 + headshot_state = HEADSHOT_OVERLAY_MEDIUM + penetration = ARMOR_PENETRATION_TIER_6 + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/smg/ap/toxin + name = "toxic submachinegun bullet" + var/acid_per_hit = 5 + var/organic_damage_mult = 3 + +/datum/ammo/bullet/smg/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + +/datum/ammo/bullet/smg/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) + . = ..() + if(T.flags_turf & TURF_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/smg/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) + . = ..() + if(O.flags_obj & OBJ_ORGANIC) + P.damage *= organic_damage_mult + +/datum/ammo/bullet/smg/nail + name = "7x45mm plasteel nail" + icon_state = "nail-projectile" + + damage = 25 + penetration = ARMOR_PENETRATION_TIER_5 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + accurate_range = 5 + shell_speed = AMMO_SPEED_TIER_4 + +/datum/ammo/bullet/smg/incendiary + name = "incendiary submachinegun bullet" + damage_type = BURN + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + damage = 25 + accuracy = -HIT_ACCURACY_TIER_2 + +/datum/ammo/bullet/smg/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/smg/ap/penetrating + name = "wall-penetrating submachinegun bullet" + shrapnel_chance = 0 + + damage = 30 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/smg/ap/penetrating/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/smg/le + name = "armor-shredding submachinegun bullet" + + scatter = SCATTER_AMOUNT_TIER_10 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_4 + shell_speed = AMMO_SPEED_TIER_3 + damage_falloff = DAMAGE_FALLOFF_TIER_10 + pen_armor_punch = 4 + +/datum/ammo/bullet/smg/rubber + name = "rubber submachinegun bullet" + sound_override = 'sound/weapons/gun_c99.ogg' + + damage = 0 + stamina_damage = 10 + shrapnel_chance = 0 + +/datum/ammo/bullet/smg/mp27 + name = "simple submachinegun bullet" + damage = 40 + accurate_range = 5 + effective_range_max = 7 + penetration = 0 + shell_speed = AMMO_SPEED_TIER_6 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + scatter = SCATTER_AMOUNT_TIER_6 + accuracy = HIT_ACCURACY_TIER_2 + +// less damage than the m39, but better falloff, range, and AP + +/datum/ammo/bullet/smg/ppsh + name = "crude submachinegun bullet" + damage = 26 + accurate_range = 7 + effective_range_max = 7 + penetration = ARMOR_PENETRATION_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_7 + scatter = SCATTER_AMOUNT_TIER_5 + +/datum/ammo/bullet/smg/pps43 + name = "simple submachinegun bullet" + damage = 35 + accurate_range = 7 + effective_range_max = 10 + penetration = ARMOR_PENETRATION_TIER_4 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + scatter = SCATTER_AMOUNT_TIER_6 diff --git a/code/datums/ammo/bullet/sniper.dm b/code/datums/ammo/bullet/sniper.dm new file mode 100644 index 000000000000..a82f00631608 --- /dev/null +++ b/code/datums/ammo/bullet/sniper.dm @@ -0,0 +1,170 @@ +/* +//====== + Sniper Ammo +//====== +*/ + +/datum/ammo/bullet/sniper + name = "sniper bullet" + headshot_state = HEADSHOT_OVERLAY_HEAVY + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER + accurate_range_min = 4 + + accuracy = HIT_ACCURACY_TIER_8 + accurate_range = 32 + max_range = 32 + scatter = 0 + damage = 70 + penetration= ARMOR_PENETRATION_TIER_10 + shell_speed = AMMO_SPEED_TIER_6 + damage_falloff = 0 + +/datum/ammo/bullet/sniper/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + L.apply_armoured_damage(damage*2, ARMOR_BULLET, BRUTE, null, penetration) + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + +/datum/ammo/bullet/sniper/incendiary + name = "incendiary sniper bullet" + damage_type = BRUTE + shrapnel_chance = 0 + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER + + //Removed accuracy = 0, accuracy_var_high = Variance Tier 6, and scatter = 0. -Kaga + damage = 60 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/sniper/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/sniper/incendiary/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + var/blind_duration = 5 + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_BIG) + blind_duration = 2 + L.AdjustEyeBlur(blind_duration) + L.adjust_fire_stacks(10) + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + +/datum/ammo/bullet/sniper/flak + name = "flak sniper bullet" + damage_type = BRUTE + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER + + accuracy = HIT_ACCURACY_TIER_8 + scatter = SCATTER_AMOUNT_TIER_8 + damage = 55 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 //Documenting old code: This converts to a variance of 96-109% damage. -Kaga + penetration = 0 + +/datum/ammo/bullet/sniper/flak/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/slow_duration = 7 + var/mob/living/L = M + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_BIG) + slow_duration = 4 + M.adjust_effect(slow_duration, SUPERSLOW) + L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + else + burst(get_turf(M),P,damage_type, 2 , 2) + burst(get_turf(M),P,damage_type, 1 , 2 , 0) + +/datum/ammo/bullet/sniper/flak/on_near_target(turf/T, obj/projectile/P) + burst(T,P,damage_type, 2 , 2) + burst(T,P,damage_type, 1 , 2, 0) + return 1 + +/datum/ammo/bullet/sniper/crude + name = "crude sniper bullet" + damage = 42 + penetration = ARMOR_PENETRATION_TIER_6 + +/datum/ammo/bullet/sniper/crude/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + pushback(M, P, 3) + +/datum/ammo/bullet/sniper/upp + name = "armor-piercing sniper bullet" + damage = 80 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/bullet/sniper/anti_materiel + name = "anti-materiel sniper bullet" + + shrapnel_chance = 0 // This isn't leaving any shrapnel. + accuracy = HIT_ACCURACY_TIER_8 + damage = 125 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + var/size_damage_mod = 0.8 + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_XENO) + size_damage_mod += 0.6 + if(target.mob_size >= MOB_SIZE_BIG) + size_damage_mod += 0.6 + L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) + // 180% damage to all targets (225), 240% (300) against non-Runner xenos, and 300% against Big xenos (375). -Kaga + to_chat(P.firer, SPAN_WARNING("Bullseye!")) + +/datum/ammo/bullet/sniper/anti_materiel/vulture + damage = 400 // Fully intended to vaporize anything smaller than a mini cooper + accurate_range_min = 10 + handful_state = "vulture_bullet" + sound_hit = 'sound/bullets/bullet_vulture_impact.ogg' + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER|AMMO_ANTIVEHICLE + +/datum/ammo/bullet/sniper/anti_materiel/vulture/on_hit_mob(mob/hit_mob, obj/projectile/bullet) + . = ..() + knockback(hit_mob, bullet, 30) + hit_mob.apply_effect(3, SLOW) + +/datum/ammo/bullet/sniper/anti_materiel/vulture/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating/heavy) + )) + +/datum/ammo/bullet/sniper/elite + name = "supersonic sniper bullet" + + shrapnel_chance = 0 // This isn't leaving any shrapnel. + accuracy = HIT_ACCURACY_TIER_8 + damage = 150 + shell_speed = AMMO_SPEED_TIER_6 + AMMO_SPEED_TIER_2 + +/datum/ammo/bullet/sniper/elite/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) + )) + +/datum/ammo/bullet/sniper/elite/on_hit_mob(mob/M,obj/projectile/P) + if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) + var/mob/living/L = M + var/size_damage_mod = 0.5 + if(isxeno(M)) + var/mob/living/carbon/xenomorph/target = M + if(target.mob_size >= MOB_SIZE_XENO) + size_damage_mod += 0.5 + if(target.mob_size >= MOB_SIZE_BIG) + size_damage_mod += 1 + L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) + else + L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) + // 150% damage to runners (225), 300% against Big xenos (450), and 200% against all others (300). -Kaga + to_chat(P.firer, SPAN_WARNING("Bullseye!")) diff --git a/code/datums/ammo/bullet/special_ammo.dm b/code/datums/ammo/bullet/special_ammo.dm new file mode 100644 index 000000000000..cdf30b1af7fe --- /dev/null +++ b/code/datums/ammo/bullet/special_ammo.dm @@ -0,0 +1,176 @@ +/* +//====== + Special Ammo +//====== +*/ + +/datum/ammo/bullet/smartgun + name = "smartgun bullet" + icon_state = "redbullet" + flags_ammo_behavior = AMMO_BALLISTIC + + max_range = 12 + accuracy = HIT_ACCURACY_TIER_4 + damage = 30 + penetration = 0 + +/datum/ammo/bullet/smartgun/armor_piercing + name = "armor-piercing smartgun bullet" + icon_state = "bullet" + + accurate_range = 12 + accuracy = HIT_ACCURACY_TIER_2 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_8 + damage_armor_punch = 1 + +/datum/ammo/bullet/smartgun/dirty + name = "irradiated smartgun bullet" + debilitate = list(0,0,0,3,0,0,0,1) + + shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 + accurate_range = 32 + accuracy = HIT_ACCURACY_TIER_3 + damage = 40 + penetration = 0 + +/datum/ammo/bullet/smartgun/dirty/armor_piercing + debilitate = list(0,0,0,3,0,0,0,1) + + accurate_range = 22 + accuracy = HIT_ACCURACY_TIER_3 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_7 + damage_armor_punch = 3 + +/datum/ammo/bullet/smartgun/holo_target //Royal marines smartgun bullet has only diff between regular ammo is this one does holostacks + name = "holo-targeting smartgun bullet" + damage = 30 + ///Stuff for the HRP holotargetting stacks + var/holo_stacks = 15 + +/datum/ammo/bullet/smartgun/holo_target/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) + +/datum/ammo/bullet/smartgun/holo_target/ap + name = "armor-piercing smartgun bullet" + icon_state = "bullet" + + accurate_range = 12 + accuracy = HIT_ACCURACY_TIER_2 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_8 + damage_armor_punch = 1 + +/datum/ammo/bullet/smartgun/m56_fpw + name = "\improper M56 FPW bullet" + icon_state = "redbullet" + flags_ammo_behavior = AMMO_BALLISTIC + + max_range = 7 + accuracy = HIT_ACCURACY_TIER_7 + damage = 35 + penetration = ARMOR_PENETRATION_TIER_1 + +/datum/ammo/bullet/turret + name = "autocannon bullet" + icon_state = "redbullet" //Red bullets to indicate friendly fire restriction + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_COVER + + accurate_range = 22 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 + max_range = 22 + damage = 30 + penetration = ARMOR_PENETRATION_TIER_7 + damage_armor_punch = 0 + pen_armor_punch = 0 + shell_speed = 2*AMMO_SPEED_TIER_6 + accuracy = HIT_ACCURACY_TIER_5 + +/datum/ammo/bullet/turret/dumb + icon_state = "bullet" + flags_ammo_behavior = AMMO_BALLISTIC + +/datum/ammo/bullet/machinegun //Adding this for the MG Nests (~Art) + name = "machinegun bullet" + icon_state = "bullet" // Keeping it bog standard with the turret but allows it to be changed + + accurate_range = 12 + damage = 35 + penetration= ARMOR_PENETRATION_TIER_10 //Bumped the penetration to serve a different role from sentries, MGs are a bit more offensive + accuracy = HIT_ACCURACY_TIER_3 + +/datum/ammo/bullet/machinegun/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) + )) + +/datum/ammo/bullet/machinegun/auto // for M2C, automatic variant for M56D, stats for bullet should always be moderately overtuned to fulfill its ultra-offense + flank-push purpose + name = "heavy machinegun bullet" + + accurate_range = 10 + damage = 50 + penetration = ARMOR_PENETRATION_TIER_6 + accuracy = -HIT_ACCURACY_TIER_2 // 75 accuracy + shell_speed = AMMO_SPEED_TIER_2 + max_range = 15 + effective_range_max = 7 + damage_falloff = DAMAGE_FALLOFF_TIER_8 + +/datum/ammo/bullet/machinegun/auto/set_bullet_traits() + return + +/datum/ammo/bullet/minigun + name = "minigun bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = -HIT_ACCURACY_TIER_3 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 12 + damage = 35 + penetration = ARMOR_PENETRATION_TIER_6 + +/datum/ammo/bullet/minigun/New() + ..() + if(SSticker.mode && MODE_HAS_FLAG(MODE_FACTION_CLASH)) + damage = 15 + else if(SSticker.current_state < GAME_STATE_PLAYING) + RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(setup_hvh_damage)) + +/datum/ammo/bullet/minigun/proc/setup_hvh_damage() + if(MODE_HAS_FLAG(MODE_FACTION_CLASH)) + damage = 15 + +/datum/ammo/bullet/minigun/tank + accuracy = -HIT_ACCURACY_TIER_1 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 + accurate_range = 12 + +/datum/ammo/bullet/m60 + name = "M60 bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = HIT_ACCURACY_TIER_2 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 12 + damage = 45 //7.62x51 is scary + penetration= ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + +/datum/ammo/bullet/pkp + name = "machinegun bullet" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + + accuracy = HIT_ACCURACY_TIER_1 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 14 + damage = 35 + penetration= ARMOR_PENETRATION_TIER_6 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 diff --git a/code/datums/ammo/bullet/tank.dm b/code/datums/ammo/bullet/tank.dm new file mode 100644 index 000000000000..70a953c6e273 --- /dev/null +++ b/code/datums/ammo/bullet/tank.dm @@ -0,0 +1,74 @@ +/* +//====== + Tank Ammo +//====== +*/ + +/datum/ammo/bullet/tank/flak + name = "flak autocannon bullet" + icon_state = "autocannon" + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + accurate_range_min = 4 + + accuracy = HIT_ACCURACY_TIER_8 + scatter = 0 + damage = 60 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_6 + accurate_range = 32 + max_range = 32 + shell_speed = AMMO_SPEED_TIER_6 + +/datum/ammo/bullet/tank/flak/on_hit_mob(mob/M,obj/projectile/P) + burst(get_turf(M),P,damage_type, 2 , 3) + burst(get_turf(M),P,damage_type, 1 , 3 , 0) + +/datum/ammo/bullet/tank/flak/on_near_target(turf/T, obj/projectile/P) + burst(get_turf(T),P,damage_type, 2 , 3) + burst(get_turf(T),P,damage_type, 1 , 3, 0) + return 1 + +/datum/ammo/bullet/tank/flak/on_hit_obj(obj/O,obj/projectile/P) + burst(get_turf(P),P,damage_type, 2 , 3) + burst(get_turf(P),P,damage_type, 1 , 3 , 0) + +/datum/ammo/bullet/tank/flak/on_hit_turf(turf/T,obj/projectile/P) + burst(get_turf(T),P,damage_type, 2 , 3) + burst(get_turf(T),P,damage_type, 1 , 3 , 0) + +/datum/ammo/bullet/tank/dualcannon + name = "dualcannon bullet" + icon_state = "autocannon" + damage_falloff = 0 + flags_ammo_behavior = AMMO_BALLISTIC + + accuracy = HIT_ACCURACY_TIER_8 + scatter = 0 + damage = 50 + damage_var_high = PROJECTILE_VARIANCE_TIER_8 + penetration = ARMOR_PENETRATION_TIER_3 + accurate_range = 10 + max_range = 12 + shell_speed = AMMO_SPEED_TIER_5 + +/datum/ammo/bullet/tank/dualcannon/on_hit_mob(mob/M,obj/projectile/P) + for(var/mob/living/carbon/L in get_turf(M)) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) + +/datum/ammo/bullet/tank/dualcannon/on_near_target(turf/T, obj/projectile/P) + for(var/mob/living/carbon/L in T) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) + return 1 + +/datum/ammo/bullet/tank/dualcannon/on_hit_obj(obj/O,obj/projectile/P) + for(var/mob/living/carbon/L in get_turf(O)) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) + +/datum/ammo/bullet/tank/dualcannon/on_hit_turf(turf/T,obj/projectile/P) + for(var/mob/living/carbon/L in T) + if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) + shake_camera(L, 1, 1) diff --git a/code/datums/ammo/energy.dm b/code/datums/ammo/energy.dm new file mode 100644 index 000000000000..01c69ffa0015 --- /dev/null +++ b/code/datums/ammo/energy.dm @@ -0,0 +1,241 @@ +/* +//====== + Energy Ammo +//====== +*/ + +/datum/ammo/energy + ping = null //no bounce off. We can have one later. + sound_hit = "energy_hit" + sound_miss = "energy_miss" + sound_bounce = "energy_bounce" + + damage_type = BURN + flags_ammo_behavior = AMMO_ENERGY + + accuracy = HIT_ACCURACY_TIER_4 + +/datum/ammo/energy/emitter //Damage is determined in emitter.dm + name = "emitter bolt" + icon_state = "emitter" + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_ARMOR + + accurate_range = 6 + max_range = 6 + +/datum/ammo/energy/taser + name = "taser bolt" + icon_state = "stun" + damage_type = OXY + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_ALWAYS_FF //Not that ignoring will do much right now. + + stamina_damage = 45 + accuracy = HIT_ACCURACY_TIER_8 + shell_speed = AMMO_SPEED_TIER_1 // Slightly faster + hit_effect_color = "#FFFF00" + +/datum/ammo/energy/taser/on_hit_mob(mob/M, obj/projectile/P) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.disable_special_items() // Disables scout cloak + +/datum/ammo/energy/taser/precise + name = "precise taser bolt" + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_MP + +/datum/ammo/energy/rxfm_eva + name = "laser blast" + icon_state = "laser_new" + flags_ammo_behavior = AMMO_LASER + accurate_range = 14 + max_range = 22 + damage = 45 + stamina_damage = 25 //why not + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/energy/rxfm_eva/on_hit_mob(mob/living/M, obj/projectile/P) + ..() + if(prob(10)) //small chance for one to ignite on hit + M.fire_act() + +/datum/ammo/energy/laz_uzi + name = "laser bolt" + icon_state = "laser_new" + flags_ammo_behavior = AMMO_ENERGY + damage = 40 + accurate_range = 5 + effective_range_max = 7 + max_range = 10 + shell_speed = AMMO_SPEED_TIER_4 + scatter = SCATTER_AMOUNT_TIER_6 + accuracy = HIT_ACCURACY_TIER_3 + damage_falloff = DAMAGE_FALLOFF_TIER_8 + +/datum/ammo/energy/yautja + headshot_state = HEADSHOT_OVERLAY_MEDIUM + accurate_range = 12 + shell_speed = AMMO_SPEED_TIER_3 + damage_type = BURN + flags_ammo_behavior = AMMO_IGNORE_RESIST + +/datum/ammo/energy/yautja/pistol + name = "plasma pistol bolt" + icon_state = "ion" + + damage = 40 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/energy/yautja/pistol/incendiary + damage = 10 + +/datum/ammo/energy/yautja/pistol/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shrapnel/plasma + name = "plasma wave" + shrapnel_chance = 0 + penetration = ARMOR_PENETRATION_TIER_10 + accuracy = HIT_ACCURACY_TIER_MAX + damage = 15 + icon_state = "shrapnel_plasma" + damage_type = BURN + +/datum/ammo/bullet/shrapnel/plasma/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) + hit_mob.apply_effect(2, WEAKEN) + +/datum/ammo/energy/yautja/caster + name = "root caster bolt" + icon_state = "ion" + +/datum/ammo/energy/yautja/caster/stun + name = "low power stun bolt" + debilitate = list(2,2,0,0,0,1,0,0) + + damage = 0 + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + +/datum/ammo/energy/yautja/caster/bolt + name = "plasma bolt" + icon_state = "pulse1" + flags_ammo_behavior = AMMO_IGNORE_RESIST + shell_speed = AMMO_SPEED_TIER_6 + damage = 35 + +/datum/ammo/energy/yautja/caster/bolt/stun + name = "high power stun bolt" + var/stun_time = 2 + + damage = 0 + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + +/datum/ammo/energy/yautja/caster/bolt/stun/on_hit_mob(mob/M, obj/projectile/P) + var/mob/living/carbon/C = M + var/stun_time = src.stun_time + if(istype(C)) + if(isyautja(C) || ispredalien(C)) + return + to_chat(C, SPAN_DANGER("An electric shock ripples through your body, freezing you in place!")) + log_attack("[key_name(C)] was stunned by a high power stun bolt from [key_name(P.firer)] at [get_area(P)]") + + if(ishuman(C)) + var/mob/living/carbon/human/H = C + stun_time++ + H.apply_effect(stun_time, WEAKEN) + else + M.apply_effect(stun_time, WEAKEN) + + C.apply_effect(stun_time, STUN) + ..() + +/datum/ammo/energy/yautja/caster/sphere + name = "plasma eradicator" + icon_state = "bluespace" + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_HITS_TARGET_TURF + shell_speed = AMMO_SPEED_TIER_4 + accuracy = HIT_ACCURACY_TIER_8 + + damage = 55 + + accurate_range = 8 + max_range = 8 + + var/vehicle_slowdown_time = 5 SECONDS + +/datum/ammo/energy/yautja/caster/sphere/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/sphere/on_hit_turf(turf/T, obj/projectile/P) + cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/sphere/on_hit_obj(obj/O, obj/projectile/P) + if(istype(O, /obj/vehicle/multitile)) + var/obj/vehicle/multitile/multitile_vehicle = O + multitile_vehicle.next_move = world.time + vehicle_slowdown_time + playsound(multitile_vehicle, 'sound/effects/meteorimpact.ogg', 35) + multitile_vehicle.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Eradicator", P.firer)) + multitile_vehicle.interior_crash_effect() + multitile_vehicle.ex_act(150, P.dir, P.weapon_cause_data, 100) + cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/energy/yautja/caster/sphere/do_at_max_range(obj/projectile/P) + cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + + +/datum/ammo/energy/yautja/caster/sphere/stun + name = "plasma immobilizer" + damage = 0 + flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST + accurate_range = 20 + max_range = 20 + + var/stun_range = 4 // Big + var/stun_time = 6 + +/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_mob(mob/M, obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_turf(turf/T,obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_obj(obj/O,obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/do_at_max_range(obj/projectile/P) + do_area_stun(P) + +/datum/ammo/energy/yautja/caster/sphere/stun/proc/do_area_stun(obj/projectile/P) + playsound(P, 'sound/weapons/wave.ogg', 75, 1, 25) + for (var/mob/living/carbon/M in view(src.stun_range, get_turf(P))) + var/stun_time = src.stun_time + log_attack("[key_name(M)] was stunned by a plasma immobilizer from [key_name(P.firer)] at [get_area(P)]") + if (isyautja(M)) + stun_time -= 2 + if(ispredalien(M)) + continue + to_chat(M, SPAN_DANGER("A powerful electric shock ripples through your body, freezing you in place!")) + M.apply_effect(stun_time, STUN) + + if (ishuman(M)) + var/mob/living/carbon/human/H = M + H.apply_effect(stun_time, WEAKEN) + else + M.apply_effect(stun_time, WEAKEN) + +/datum/ammo/energy/yautja/rifle/bolt + name = "plasma rifle bolt" + icon_state = "ion" + damage_type = BURN + debilitate = list(0,2,0,0,0,0,0,0) + flags_ammo_behavior = AMMO_IGNORE_RESIST + + damage = 55 + penetration = ARMOR_PENETRATION_TIER_10 + +/datum/ammo/energy/yautja/rifle/bolt/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) + if(isxeno(hit_mob)) + var/mob/living/carbon/xenomorph/xeno = hit_mob + xeno.apply_damage(damage * 0.75, BURN) + xeno.interference = 30 diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm new file mode 100644 index 000000000000..bdb284753dc4 --- /dev/null +++ b/code/datums/ammo/misc.dm @@ -0,0 +1,294 @@ +/* +//====== + Misc Ammo +//====== +*/ + +/datum/ammo/alloy_spike + name = "alloy spike" + headshot_state = HEADSHOT_OVERLAY_MEDIUM + ping = "ping_s" + icon_state = "MSpearFlight" + sound_hit = "alloy_hit" + sound_armor = "alloy_armor" + sound_bounce = "alloy_bounce" + + accuracy = HIT_ACCURACY_TIER_8 + accurate_range = 12 + max_range = 12 + damage = 30 + penetration= ARMOR_PENETRATION_TIER_10 + shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 + shrapnel_type = /obj/item/shard/shrapnel + +/datum/ammo/flamethrower + name = "flame" + icon_state = "pulse0" + damage_type = BURN + flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_HITS_TARGET_TURF + + max_range = 6 + damage = 35 + +/datum/ammo/flamethrower/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/flamethrower/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + +/datum/ammo/flamethrower/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + +/datum/ammo/flamethrower/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + +/datum/ammo/flamethrower/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + +/datum/ammo/flamethrower/tank_flamer + flamer_reagent_type = /datum/reagent/napalm/blue + +/datum/ammo/flamethrower/sentry_flamer + flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME + flamer_reagent_type = /datum/reagent/napalm/blue + + accuracy = HIT_ACCURACY_TIER_8 + accurate_range = 6 + max_range = 12 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/flamethrower/sentry_flamer/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/flamethrower/sentry_flamer/glob + max_range = 14 + accurate_range = 10 + var/datum/effect_system/smoke_spread/phosphorus/smoke + +/datum/ammo/flamethrower/sentry_flamer/glob/New() + . = ..() + smoke = new() + +/datum/ammo/flamethrower/sentry_flamer/glob/drop_flame(turf/T, datum/cause_data/cause_data) + if(!istype(T)) + return + smoke.set_up(1, 0, T, new_cause_data = cause_data) + smoke.start() + +/datum/ammo/flamethrower/sentry_flamer/glob/Destroy() + qdel(smoke) + return ..() + +/datum/ammo/flamethrower/sentry_flamer/mini + name = "normal fire" + +/datum/ammo/flamethrower/sentry_flamer/mini/drop_flame(turf/T, datum/cause_data/cause_data) + if(!istype(T)) + return + var/datum/reagent/napalm/ut/R = new() + R.durationfire = BURN_TIME_INSTANT + new /obj/flamer_fire(T, cause_data, R, 0) + +/datum/ammo/flare + name = "flare" + ping = null //no bounce off. + damage_type = BURN + flags_ammo_behavior = AMMO_HITS_TARGET_TURF + icon_state = "flare" + + damage = 15 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 14 + shell_speed = AMMO_SPEED_TIER_3 + + var/flare_type = /obj/item/device/flashlight/flare/on/gun + handful_type = /obj/item/device/flashlight/flare + +/datum/ammo/flare/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/flare/on_hit_mob(mob/M,obj/projectile/P) + drop_flare(get_turf(M), P, P.firer) + +/datum/ammo/flare/on_hit_obj(obj/O,obj/projectile/P) + drop_flare(get_turf(P), P, P.firer) + +/datum/ammo/flare/on_hit_turf(turf/T, obj/projectile/P) + if(T.density && isturf(P.loc)) + drop_flare(P.loc, P, P.firer) + else + drop_flare(T, P, P.firer) + +/datum/ammo/flare/do_at_max_range(obj/projectile/P, mob/firer) + drop_flare(get_turf(P), P, P.firer) + +/datum/ammo/flare/proc/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) + var/obj/item/device/flashlight/flare/G = new flare_type(T) + var/matrix/rotation = matrix() + rotation.Turn(fired_projectile.angle - 90) + G.apply_transform(rotation) + G.visible_message(SPAN_WARNING("\A [G] bursts into brilliant light nearby!")) + return G + +/datum/ammo/flare/signal + name = "signal flare" + icon_state = "flare_signal" + flare_type = /obj/item/device/flashlight/flare/signal/gun + handful_type = /obj/item/device/flashlight/flare/signal + +/datum/ammo/flare/signal/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) + var/obj/item/device/flashlight/flare/signal/gun/signal_flare = ..() + signal_flare.activate_signal(firer) + if(istype(fired_projectile.shot_from, /obj/item/weapon/gun/flare)) + var/obj/item/weapon/gun/flare/flare_gun_fired_from = fired_projectile.shot_from + flare_gun_fired_from.last_signal_flare_name = signal_flare.name + +/datum/ammo/flare/starshell + name = "starshell ash" + icon_state = "starshell_bullet" + max_range = 5 + flare_type = /obj/item/device/flashlight/flare/on/starshell_ash + +/datum/ammo/flare/starshell/set_bullet_traits() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff, /datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/souto + name = "Souto Can" + ping = null //no bounce off. + damage_type = BRUTE + shrapnel_type = /obj/item/reagent_container/food/drinks/cans/souto/classic + flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_IGNORE_ARMOR|AMMO_IGNORE_RESIST|AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER|AMMO_SPECIAL_EMBED + var/obj/item/reagent_container/food/drinks/cans/souto/can_type + icon_state = "souto_classic" + + max_range = 12 + shrapnel_chance = 10 + accuracy = HIT_ACCURACY_TIER_8 + HIT_ACCURACY_TIER_8 + accurate_range = 12 + shell_speed = AMMO_SPEED_TIER_1 + +/datum/ammo/souto/on_embed(mob/embedded_mob, obj/limb/target_organ) + if(ishuman(embedded_mob) && !isyautja(embedded_mob)) + if(istype(target_organ)) + target_organ.embed(new can_type) + +/datum/ammo/souto/on_hit_mob(mob/M, obj/projectile/P) + if(!M || M == P.firer) return + if(M.throw_mode && !M.get_active_hand()) //empty active hand and we're in throw mode. If so we catch the can. + if(!M.is_mob_incapacitated()) // People who are not able to catch cannot catch. + if(P.contents.len == 1) + for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents) + M.put_in_active_hand(S) + for(var/mob/O in viewers(world_view_size, P)) //find all people in view. + O.show_message(SPAN_DANGER("[M] catches the [S]!"), SHOW_MESSAGE_VISIBLE) //Tell them the can was caught. + return //Can was caught. + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.name == "Human") //no effect on synths or preds. + H.apply_effect(6, STUN) + H.apply_effect(8, WEAKEN) + H.apply_effect(15, DAZE) + H.apply_effect(15, SLOW) + shake_camera(H, 2, 1) + if(P.contents.len) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/on_hit_obj(obj/O,obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/on_hit_turf(turf/T, obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/do_at_max_range(obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/on_shield_block(mob/M, obj/projectile/P) + drop_can(P.loc, P) //We make a can at the location. + +/datum/ammo/souto/proc/drop_can(loc, obj/projectile/P) + if(P.contents.len) + for(var/obj/item/I in P.contents) + I.forceMove(loc) + randomize_projectile(P) + +/datum/ammo/souto/proc/randomize_projectile(obj/projectile/P) + shrapnel_type = pick(typesof(/obj/item/reagent_container/food/drinks/cans/souto)-/obj/item/reagent_container/food/drinks/cans/souto) + +/datum/ammo/grenade_container + name = "grenade shell" + ping = null + damage_type = BRUTE + var/nade_type = /obj/item/explosive/grenade/high_explosive + icon_state = "grenade" + flags_ammo_behavior = AMMO_IGNORE_COVER|AMMO_SKIPS_ALIENS + + damage = 15 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 6 + +/datum/ammo/grenade_container/on_hit_mob(mob/M,obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/on_hit_obj(obj/O,obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/on_hit_turf(turf/T,obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/do_at_max_range(obj/projectile/P) + drop_nade(P) + +/datum/ammo/grenade_container/proc/drop_nade(obj/projectile/P) + var/turf/T = get_turf(P) + var/obj/item/explosive/grenade/G = new nade_type(T) + G.visible_message(SPAN_WARNING("\A [G] lands on [T]!")) + G.det_time = 10 + G.cause_data = P.weapon_cause_data + G.activate() + +/datum/ammo/grenade_container/rifle + flags_ammo_behavior = NO_FLAGS + +/datum/ammo/grenade_container/smoke + name = "smoke grenade shell" + nade_type = /obj/item/explosive/grenade/smokebomb + icon_state = "smoke_shell" + +/datum/ammo/hugger_container + name = "hugger shell" + ping = null + damage_type = BRUTE + var/hugger_hive = XENO_HIVE_NORMAL + icon_state = "smoke_shell" + + damage = 15 + accuracy = HIT_ACCURACY_TIER_3 + max_range = 6 + +/datum/ammo/hugger_container/on_hit_mob(mob/M,obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/on_hit_obj(obj/O,obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/on_hit_turf(turf/T,obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/do_at_max_range(obj/projectile/P) + spawn_hugger(get_turf(P)) + +/datum/ammo/hugger_container/proc/spawn_hugger(turf/T) + var/obj/item/clothing/mask/facehugger/child = new(T) + child.hivenumber = hugger_hive + INVOKE_ASYNC(child, TYPE_PROC_REF(/obj/item/clothing/mask/facehugger, leap_at_nearest_target)) diff --git a/code/datums/ammo/rocket.dm b/code/datums/ammo/rocket.dm new file mode 100644 index 000000000000..52914f745110 --- /dev/null +++ b/code/datums/ammo/rocket.dm @@ -0,0 +1,300 @@ +/* +//====== + Rocket Ammo +//====== +*/ + +/datum/ammo/rocket + name = "high explosive rocket" + icon_state = "missile" + ping = null //no bounce off. + sound_bounce = "rocket_bounce" + damage_falloff = 0 + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE + var/datum/effect_system/smoke_spread/smoke + + accuracy = HIT_ACCURACY_TIER_2 + accurate_range = 7 + max_range = 7 + damage = 15 + shell_speed = AMMO_SPEED_TIER_2 + +/datum/ammo/rocket/New() + ..() + smoke = new() + +/datum/ammo/rocket/Destroy() + qdel(smoke) + smoke = null + . = ..() + +/datum/ammo/rocket/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(get_turf(M), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, get_turf(M)) + if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. + M.ex_act(350, P.dir, P.weapon_cause_data, 100) + smoke.start() + +/datum/ammo/rocket/on_hit_obj(obj/O, obj/projectile/P) + cell_explosion(get_turf(O), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, get_turf(O)) + smoke.start() + +/datum/ammo/rocket/on_hit_turf(turf/T, obj/projectile/P) + cell_explosion(T, 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/do_at_max_range(obj/projectile/P) + cell_explosion(get_turf(P), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, get_turf(P)) + smoke.start() + +/datum/ammo/rocket/ap + name = "anti-armor rocket" + damage_falloff = 0 + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET + + accuracy = HIT_ACCURACY_TIER_8 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 + accurate_range = 6 + max_range = 6 + damage = 10 + penetration= ARMOR_PENETRATION_TIER_10 + +/datum/ammo/rocket/ap/on_hit_mob(mob/M, obj/projectile/P) + var/turf/T = get_turf(M) + M.ex_act(150, P.dir, P.weapon_cause_data, 100) + M.apply_effect(2, WEAKEN) + M.apply_effect(2, PARALYZE) + if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. + M.ex_act(300, P.dir, P.weapon_cause_data, 100) + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/on_hit_obj(obj/O, obj/projectile/P) + var/turf/T = get_turf(O) + O.ex_act(150, P.dir, P.weapon_cause_data, 100) + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/on_hit_turf(turf/T, obj/projectile/P) + var/hit_something = 0 + for(var/mob/M in T) + M.ex_act(150, P.dir, P.weapon_cause_data, 100) + M.apply_effect(4, WEAKEN) + M.apply_effect(4, PARALYZE) + hit_something = 1 + continue + if(!hit_something) + for(var/obj/O in T) + if(O.density) + O.ex_act(150, P.dir, P.weapon_cause_data, 100) + hit_something = 1 + continue + if(!hit_something) + T.ex_act(150, P.dir, P.weapon_cause_data, 200) + + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/do_at_max_range(obj/projectile/P) + var/turf/T = get_turf(P) + var/hit_something = 0 + for(var/mob/M in T) + M.ex_act(250, P.dir, P.weapon_cause_data, 100) + M.apply_effect(2, WEAKEN) + M.apply_effect(2, PARALYZE) + hit_something = 1 + continue + if(!hit_something) + for(var/obj/O in T) + if(O.density) + O.ex_act(250, P.dir, P.weapon_cause_data, 100) + hit_something = 1 + continue + if(!hit_something) + T.ex_act(250, P.dir, P.weapon_cause_data) + cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + smoke.set_up(1, T) + smoke.start() + +/datum/ammo/rocket/ap/anti_tank + name = "anti-tank rocket" + damage = 100 + var/vehicle_slowdown_time = 5 SECONDS + shrapnel_chance = 5 + shrapnel_type = /obj/item/large_shrapnel/at_rocket_dud + +/datum/ammo/rocket/ap/anti_tank/on_hit_obj(obj/O, obj/projectile/P) + if(istype(O, /obj/vehicle/multitile)) + var/obj/vehicle/multitile/M = O + M.next_move = world.time + vehicle_slowdown_time + playsound(M, 'sound/effects/meteorimpact.ogg', 35) + M.at_munition_interior_explosion_effect(cause_data = create_cause_data("Anti-Tank Rocket")) + M.interior_crash_effect() + var/turf/T = get_turf(M.loc) + M.ex_act(150, P.dir, P.weapon_cause_data, 100) + smoke.set_up(1, T) + smoke.start() + return + return ..() + + +/datum/ammo/rocket/ltb + name = "cannon round" + icon_state = "ltb" + flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE + + accuracy = HIT_ACCURACY_TIER_3 + accurate_range = 32 + max_range = 32 + damage = 25 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/rocket/ltb/on_hit_mob(mob/M, obj/projectile/P) + cell_explosion(get_turf(M), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(M), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/ltb/on_hit_obj(obj/O, obj/projectile/P) + cell_explosion(get_turf(O), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(O), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/ltb/on_hit_turf(turf/T, obj/projectile/P) + cell_explosion(get_turf(T), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(T), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/ltb/do_at_max_range(obj/projectile/P) + cell_explosion(get_turf(P), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + cell_explosion(get_turf(P), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) + +/datum/ammo/rocket/wp + name = "white phosphorous rocket" + flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE + damage_type = BURN + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 8 + damage = 90 + max_range = 8 + +/datum/ammo/rocket/wp/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/rocket/wp/drop_flame(turf/T, datum/cause_data/cause_data) + playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) + if(!istype(T)) return + smoke.set_up(1, T) + smoke.start() + var/datum/reagent/napalm/blue/R = new() + new /obj/flamer_fire(T, cause_data, R, 3) + + var/datum/effect_system/smoke_spread/phosphorus/landingSmoke = new /datum/effect_system/smoke_spread/phosphorus + landingSmoke.set_up(3, 0, T, null, 6, cause_data) + landingSmoke.start() + landingSmoke = null + +/datum/ammo/rocket/wp/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + +/datum/ammo/rocket/wp/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + +/datum/ammo/rocket/wp/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + +/datum/ammo/rocket/wp/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp + name = "extreme-intensity incendiary rocket" + flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE + damage_type = BURN + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 8 + damage = 150 + max_range = 10 + +/datum/ammo/rocket/wp/upp/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/rocket/wp/upp/drop_flame(turf/T, datum/cause_data/cause_data) + playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) + if(!istype(T)) return + smoke.set_up(1, T) + smoke.start() + var/datum/reagent/napalm/upp/R = new() + new /obj/flamer_fire(T, cause_data, R, 3) + +/datum/ammo/rocket/wp/upp/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + +/datum/ammo/rocket/wp/upp/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad + name = "thermobaric rocket" + flags_ammo_behavior = AMMO_ROCKET|AMMO_STRIKES_SURFACE + + damage = 100 + max_range = 32 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/rocket/wp/quad/on_hit_mob(mob/M, obj/projectile/P) + drop_flame(get_turf(M), P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad/on_hit_obj(obj/O, obj/projectile/P) + drop_flame(get_turf(O), P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad/on_hit_turf(turf/T, obj/projectile/P) + drop_flame(T, P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/wp/quad/do_at_max_range(obj/projectile/P) + drop_flame(get_turf(P), P.weapon_cause_data) + explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) + +/datum/ammo/rocket/custom + name = "custom rocket" + +/datum/ammo/rocket/custom/proc/prime(atom/A, obj/projectile/P) + var/obj/item/weapon/gun/launcher/rocket/launcher = P.shot_from + var/obj/item/ammo_magazine/rocket/custom/rocket = launcher.current_mag + if(rocket.locked && rocket.warhead && rocket.warhead.detonator) + if(rocket.fuel && rocket.fuel.reagents.get_reagent_amount(rocket.fuel_type) >= rocket.fuel_requirement) + rocket.forceMove(P.loc) + rocket.warhead.cause_data = P.weapon_cause_data + rocket.warhead.prime() + qdel(rocket) + smoke.set_up(1, get_turf(A)) + smoke.start() + +/datum/ammo/rocket/custom/on_hit_mob(mob/M, obj/projectile/P) + prime(M, P) + +/datum/ammo/rocket/custom/on_hit_obj(obj/O, obj/projectile/P) + prime(O, P) + +/datum/ammo/rocket/custom/on_hit_turf(turf/T, obj/projectile/P) + prime(T, P) + +/datum/ammo/rocket/custom/do_at_max_range(obj/projectile/P) + prime(null, P) diff --git a/code/datums/ammo/shrapnel.dm b/code/datums/ammo/shrapnel.dm new file mode 100644 index 000000000000..e27caa4b277d --- /dev/null +++ b/code/datums/ammo/shrapnel.dm @@ -0,0 +1,157 @@ +/* +//====== + Shrapnel +//====== +*/ +/datum/ammo/bullet/shrapnel + name = "shrapnel" + icon_state = "buckshot" + accurate_range_min = 5 + flags_ammo_behavior = AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER + + accuracy = HIT_ACCURACY_TIER_3 + accurate_range = 32 + max_range = 8 + damage = 25 + damage_var_low = -PROJECTILE_VARIANCE_TIER_6 + damage_var_high = PROJECTILE_VARIANCE_TIER_6 + penetration = ARMOR_PENETRATION_TIER_4 + shell_speed = AMMO_SPEED_TIER_2 + shrapnel_chance = 5 + +/datum/ammo/bullet/shrapnel/on_hit_obj(obj/O, obj/projectile/P) + if(istype(O, /obj/structure/barricade)) + var/obj/structure/barricade/B = O + B.health -= rand(2, 5) + B.update_health(1) + +/datum/ammo/bullet/shrapnel/rubber + name = "rubber pellets" + icon_state = "rubber_pellets" + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + + damage = 0 + stamina_damage = 25 + shrapnel_chance = 0 + + +/datum/ammo/bullet/shrapnel/hornet_rounds + name = ".22 hornet round" + icon_state = "hornet_round" + flags_ammo_behavior = AMMO_BALLISTIC + damage = 20 + shrapnel_chance = 0 + shell_speed = AMMO_SPEED_TIER_3//she fast af boi + penetration = ARMOR_PENETRATION_TIER_5 + +/datum/ammo/bullet/shrapnel/hornet_rounds/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + M.AddComponent(/datum/component/bonus_damage_stack, 10, world.time) + +/datum/ammo/bullet/shrapnel/incendiary + name = "flaming shrapnel" + icon_state = "beanbag" // looks suprisingly a lot like flaming shrapnel chunks + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + + shell_speed = AMMO_SPEED_TIER_1 + damage = 20 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/shrapnel/incendiary/set_bullet_traits() + . = ..() + LAZYADD(traits_to_give, list( + BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) + )) + +/datum/ammo/bullet/shrapnel/metal + name = "metal shrapnel" + icon_state = "shrapnelshot_bit" + flags_ammo_behavior = AMMO_STOPPED_BY_COVER|AMMO_BALLISTIC + shell_speed = AMMO_SPEED_TIER_1 + damage = 30 + shrapnel_chance = 15 + accuracy = HIT_ACCURACY_TIER_8 + penetration = ARMOR_PENETRATION_TIER_4 + +/datum/ammo/bullet/shrapnel/light // weak shrapnel + name = "light shrapnel" + icon_state = "shrapnel_light" + + damage = 10 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_1 + shrapnel_chance = 0 + +/datum/ammo/bullet/shrapnel/light/human + name = "human bone fragments" + icon_state = "shrapnel_human" + + shrapnel_chance = 50 + shrapnel_type = /obj/item/shard/shrapnel/bone_chips/human + +/datum/ammo/bullet/shrapnel/light/human/var1 // sprite variants + icon_state = "shrapnel_human1" + +/datum/ammo/bullet/shrapnel/light/human/var2 // sprite variants + icon_state = "shrapnel_human2" + +/datum/ammo/bullet/shrapnel/light/xeno + name = "alien bone fragments" + icon_state = "shrapnel_xeno" + + shrapnel_chance = 50 + shrapnel_type = /obj/item/shard/shrapnel/bone_chips/xeno + +/datum/ammo/bullet/shrapnel/spall // weak shrapnel + name = "spall" + icon_state = "shrapnel_light" + + damage = 10 + penetration = ARMOR_PENETRATION_TIER_1 + shell_speed = AMMO_SPEED_TIER_1 + shrapnel_chance = 0 + +/datum/ammo/bullet/shrapnel/light/glass + name = "glass shrapnel" + icon_state = "shrapnel_glass" + +/datum/ammo/bullet/shrapnel/light/effect/ // no damage, but looks bright and neat + name = "sparks" + + damage = 1 // Tickle tickle + +/datum/ammo/bullet/shrapnel/light/effect/ver1 + icon_state = "shrapnel_bright1" + +/datum/ammo/bullet/shrapnel/light/effect/ver2 + icon_state = "shrapnel_bright2" + +/datum/ammo/bullet/shrapnel/jagged + shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 + accuracy = HIT_ACCURACY_TIER_MAX + +/datum/ammo/bullet/shrapnel/jagged/on_hit_mob(mob/M, obj/projectile/P) + if(isxeno(M)) + M.apply_effect(0.4, SLOW) + +/* +//======== + CAS 30mm impacters +//======== +*/ +/datum/ammo/bullet/shrapnel/gau //for the GAU to have a impact bullet instead of firecrackers + name = "30mm Multi-Purpose shell" + + damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. + damage_type = BRUTE + penetration = ARMOR_PENETRATION_TIER_2 + accuracy = HIT_ACCURACY_TIER_MAX + max_range = 0 + shrapnel_chance = 100 //the least of your problems + +/datum/ammo/bullet/shrapnel/gau/at + name = "30mm Anti-Tank shell" + + damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. + penetration = ARMOR_PENETRATION_TIER_8 + accuracy = HIT_ACCURACY_TIER_MAX diff --git a/code/datums/ammo/xeno.dm b/code/datums/ammo/xeno.dm new file mode 100644 index 000000000000..9d91920ac6f8 --- /dev/null +++ b/code/datums/ammo/xeno.dm @@ -0,0 +1,394 @@ +/* +//====== + Xeno Spits +//====== +*/ +/datum/ammo/xeno + icon_state = "neurotoxin" + ping = "ping_x" + damage_type = TOX + flags_ammo_behavior = AMMO_XENO + + ///used to make cooldown of the different spits vary. + var/added_spit_delay = 0 + var/spit_cost + + /// Should there be a windup for this spit? + var/spit_windup = FALSE + + /// Should there be an additional warning while winding up? (do not put to true if there is not a windup) + var/pre_spit_warn = FALSE + accuracy = HIT_ACCURACY_TIER_8*2 + max_range = 12 + +/datum/ammo/xeno/toxin + name = "neurotoxic spit" + damage_falloff = 0 + flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST + spit_cost = 25 + var/effect_power = XENO_NEURO_TIER_4 + var/datum/callback/neuro_callback + + shell_speed = AMMO_SPEED_TIER_3 + max_range = 7 + +/datum/ammo/xeno/toxin/New() + ..() + + neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_neuro)) + +/proc/apply_neuro(mob/M, power, insta_neuro) + if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX) && !insta_neuro) + M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) + return //endurance 5 makes you immune to weak neurotoxin + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) + H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) + return //species like zombies or synths are immune to neurotoxin + + if(!isxeno(M)) + if(insta_neuro) + if(M.knocked_down < 3) + M.adjust_effect(1 * power, WEAKEN) + return + + if(ishuman(M)) + M.apply_effect(2.5, SUPERSLOW) + M.visible_message(SPAN_DANGER("[M]'s movements are slowed.")) + + var/no_clothes_neuro = FALSE + + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(!H.wear_suit || H.wear_suit.slowdown == 0) + no_clothes_neuro = TRUE + + if(no_clothes_neuro) + if(M.knocked_down < 5) + M.adjust_effect(1 * power, WEAKEN) // KD them a bit more + M.visible_message(SPAN_DANGER("[M] falls prone.")) + +/proc/apply_scatter_neuro(mob/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX)) + M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) + return //endurance 5 makes you immune to weak neuro + if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) + H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) + return + + if(M.knocked_down < 0.7) // apply knockdown only if current knockdown is less than 0.7 second + M.apply_effect(0.7, WEAKEN) + M.visible_message(SPAN_DANGER("[M] falls prone.")) + +/datum/ammo/xeno/toxin/on_hit_mob(mob/M,obj/projectile/P) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.status_flags & XENO_HOST) + neuro_callback.Invoke(H, effect_power, TRUE) + return + + neuro_callback.Invoke(M, effect_power, FALSE) + +/datum/ammo/xeno/toxin/medium //Spitter + name = "neurotoxic spatter" + spit_cost = 50 + effect_power = 1 + + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/xeno/toxin/queen + name = "neurotoxic spit" + spit_cost = 50 + effect_power = 2 + + accuracy = HIT_ACCURACY_TIER_5*2 + max_range = 6 - 1 + +/datum/ammo/xeno/toxin/queen/on_hit_mob(mob/M,obj/projectile/P) + neuro_callback.Invoke(M, effect_power, TRUE) + +/datum/ammo/xeno/toxin/shotgun + name = "neurotoxic droplet" + flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST + bonus_projectiles_type = /datum/ammo/xeno/toxin/shotgun/additional + + accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 + accurate_range = 5 + max_range = 5 + scatter = SCATTER_AMOUNT_NEURO + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_4 + +/datum/ammo/xeno/toxin/shotgun/New() + ..() + + neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_scatter_neuro)) + +/datum/ammo/xeno/toxin/shotgun/additional + name = "additional neurotoxic droplets" + + bonus_projectiles_amount = 0 + +/datum/ammo/xeno/acid + name = "acid spit" + icon_state = "xeno_acid" + sound_hit = "acid_hit" + sound_bounce = "acid_bounce" + damage_type = BURN + spit_cost = 25 + flags_ammo_behavior = AMMO_ACIDIC|AMMO_XENO + accuracy = HIT_ACCURACY_TIER_5 + damage = 20 + max_range = 8 // 7 will disappear on diagonals. i love shitcode + penetration = ARMOR_PENETRATION_TIER_2 + shell_speed = AMMO_SPEED_TIER_3 + +/datum/ammo/xeno/acid/on_shield_block(mob/M, obj/projectile/P) + burst(M,P,damage_type) + +/datum/ammo/xeno/acid/on_hit_mob(mob/M, obj/projectile/P) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.status_flags & XENO_HOST && HAS_TRAIT(C, TRAIT_NESTED) || C.stat == DEAD) + return FALSE + ..() + +/datum/ammo/xeno/acid/spatter + name = "acid spatter" + + damage = 30 + max_range = 6 + +/datum/ammo/xeno/acid/spatter/on_hit_mob(mob/M, obj/projectile/P) + . = ..() + if(. == FALSE) + return + + new /datum/effects/acid(M, P.firer) + +/datum/ammo/xeno/acid/praetorian + name = "acid splash" + + accuracy = HIT_ACCURACY_TIER_10 + HIT_ACCURACY_TIER_5 + max_range = 8 + damage = 30 + shell_speed = AMMO_SPEED_TIER_2 + added_spit_delay = 0 + +/datum/ammo/xeno/acid/dot + name = "acid spit" + +/datum/ammo/xeno/acid/prae_nade // Used by base prae's acid nade + name = "acid scatter" + + flags_ammo_behavior = AMMO_STOPPED_BY_COVER + accuracy = HIT_ACCURACY_TIER_5 + accurate_range = 32 + max_range = 4 + damage = 25 + shell_speed = AMMO_SPEED_TIER_1 + scatter = SCATTER_AMOUNT_TIER_6 + + apply_delegate = FALSE + +/datum/ammo/xeno/acid/prae_nade/on_hit_mob(mob/M, obj/projectile/P) + if (!ishuman(M)) + return + + var/mob/living/carbon/human/H = M + + var/datum/effects/prae_acid_stacks/PAS = null + for (var/datum/effects/prae_acid_stacks/prae_acid_stacks in H.effects_list) + PAS = prae_acid_stacks + break + + if (PAS == null) + PAS = new /datum/effects/prae_acid_stacks(H) + else + PAS.increment_stack_count() + +/datum/ammo/xeno/boiler_gas + name = "glob of neuro gas" + icon_state = "neuro_glob" + ping = "ping_x" + debilitate = list(2,2,0,1,11,12,1,10) // Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony + flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE|AMMO_IGNORE_RESIST|AMMO_HITS_TARGET_TURF|AMMO_ACIDIC + var/datum/effect_system/smoke_spread/smoke_system + spit_cost = 200 + pre_spit_warn = TRUE + spit_windup = 5 SECONDS + accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_4 + accuracy = HIT_ACCURACY_TIER_2 + scatter = SCATTER_AMOUNT_TIER_4 + shell_speed = 0.75 + max_range = 16 + /// range on the smoke in tiles from center + var/smokerange = 4 + var/lifetime_mult = 1.0 + +/datum/ammo/xeno/boiler_gas/New() + ..() + set_xeno_smoke() + +/datum/ammo/xeno/boiler_gas/Destroy() + qdel(smoke_system) + smoke_system = null + . = ..() + +/datum/ammo/xeno/boiler_gas/on_hit_mob(mob/moob, obj/projectile/proj) + if(iscarbon(moob)) + var/mob/living/carbon/carbon = moob + if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) + return + var/datum/effects/neurotoxin/neuro_effect = locate() in moob.effects_list + if(!neuro_effect) + neuro_effect = new /datum/effects/neurotoxin(moob, proj.firer) + neuro_effect.duration += 5 + moob.apply_effect(3, DAZE) + to_chat(moob, SPAN_HIGHDANGER("Neurotoxic liquid spreads all over you and immediately soaks into your pores and orifices! Oh fuck!")) // Fucked up but have a chance to escape rather than being game-ended + drop_nade(get_turf(proj), proj,TRUE) + +/datum/ammo/xeno/boiler_gas/on_hit_obj(obj/outbacksteakhouse, obj/projectile/proj) + drop_nade(get_turf(proj), proj) + +/datum/ammo/xeno/boiler_gas/on_hit_turf(turf/Turf, obj/projectile/proj) + if(Turf.density && isturf(proj.loc)) + drop_nade(proj.loc, proj) //we don't want the gas globs to land on dense turfs, they block smoke expansion. + else + drop_nade(Turf, proj) + +/datum/ammo/xeno/boiler_gas/do_at_max_range(obj/projectile/proj) + drop_nade(get_turf(proj), proj) + +/datum/ammo/xeno/boiler_gas/proc/set_xeno_smoke(obj/projectile/proj) + smoke_system = new /datum/effect_system/smoke_spread/xeno_weaken() + +/datum/ammo/xeno/boiler_gas/proc/drop_nade(turf/turf, obj/projectile/proj) + var/lifetime_mult = 1.0 + var/datum/cause_data + if(isboiler(proj.firer)) + cause_data = proj.weapon_cause_data + smoke_system.set_up(smokerange, 0, turf, new_cause_data = cause_data) + smoke_system.lifetime = 12 * lifetime_mult + smoke_system.start() + turf.visible_message(SPAN_DANGER("A glob of acid lands with a splat and explodes into noxious fumes!")) + + +/datum/ammo/xeno/boiler_gas/acid + name = "glob of acid gas" + icon_state = "acid_glob" + ping = "ping_x" + accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 + smokerange = 3 + + +/datum/ammo/xeno/boiler_gas/acid/set_xeno_smoke(obj/projectile/proj) + smoke_system = new /datum/effect_system/smoke_spread/xeno_acid() + +/datum/ammo/xeno/boiler_gas/acid/on_hit_mob(mob/moob, obj/projectile/proj) + if(iscarbon(moob)) + var/mob/living/carbon/carbon = moob + if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) + return + to_chat(moob,SPAN_HIGHDANGER("Acid covers your body! Oh fuck!")) + playsound(moob,"acid_strike",75,1) + INVOKE_ASYNC(moob, TYPE_PROC_REF(/mob, emote), "pain") // why do I need this bullshit + new /datum/effects/acid(moob, proj.firer) + drop_nade(get_turf(proj), proj,TRUE) + +/datum/ammo/xeno/bone_chips + name = "bone chips" + icon_state = "shrapnel_light" + ping = null + flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR + damage_type = BRUTE + bonus_projectiles_type = /datum/ammo/xeno/bone_chips/spread + + damage = 8 + max_range = 6 + accuracy = HIT_ACCURACY_TIER_8 + accuracy_var_low = PROJECTILE_VARIANCE_TIER_7 + accuracy_var_high = PROJECTILE_VARIANCE_TIER_7 + bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_7 + shrapnel_type = /obj/item/shard/shrapnel/bone_chips + shrapnel_chance = 60 + +/datum/ammo/xeno/bone_chips/on_hit_mob(mob/M, obj/projectile/P) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) + return + if(ishuman_strict(M) || isxeno(M)) + playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) + if(M.slowed < 3) + M.apply_effect(3, SLOW) + +/datum/ammo/xeno/bone_chips/spread + name = "small bone chips" + + scatter = 30 // We want a wild scatter angle + max_range = 5 + bonus_projectiles_amount = 0 + +/datum/ammo/xeno/bone_chips/spread/short_range + name = "small bone chips" + + max_range = 3 // Very short range + +/datum/ammo/xeno/bone_chips/spread/runner_skillshot + name = "bone chips" + + scatter = 0 + max_range = 5 + damage = 10 + shrapnel_chance = 0 + +/datum/ammo/xeno/bone_chips/spread/runner/on_hit_mob(mob/M, obj/projectile/P) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) + return + if(ishuman_strict(M) || isxeno(M)) + playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) + if(M.slowed < 6) + M.apply_effect(6, SLOW) + +/datum/ammo/xeno/oppressor_tail + name = "tail hook" + icon_state = "none" + ping = null + flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR + damage_type = BRUTE + + damage = XENO_DAMAGE_TIER_5 + max_range = 4 + accuracy = HIT_ACCURACY_TIER_MAX + +/datum/ammo/xeno/oppressor_tail/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) + //The projectile has no icon, so the overlay shows up in FRONT of the projectile, and the beam connects to it in the middle. + var/image/hook_overlay = new(icon = 'icons/effects/beam.dmi', icon_state = "oppressor_tail_hook", layer = BELOW_MOB_LAYER) + generated_projectile.overlays += hook_overlay + +/datum/ammo/xeno/oppressor_tail/on_hit_mob(mob/target, obj/projectile/fired_proj) + var/mob/living/carbon/xenomorph/xeno_firer = fired_proj.firer + if(xeno_firer.can_not_harm(target)) + return + + shake_camera(target, 5, 0.1 SECONDS) + var/obj/effect/beam/tail_beam = fired_proj.firer.beam(target, "oppressor_tail", 'icons/effects/beam.dmi', 0.5 SECONDS, 5) + var/image/tail_image = image('icons/effects/status_effects.dmi', "hooked") + target.overlays += tail_image + + new /datum/effects/xeno_slow(target, fired_proj.firer, ttl = 0.5 SECONDS) + target.apply_effect(0.5, STUN) + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom/movable, throw_atom), fired_proj.firer, get_dist(fired_proj.firer, target)-1, SPEED_VERY_FAST) + + qdel(tail_beam) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/ammo/xeno/oppressor_tail, remove_tail_overlay), target, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. + +/datum/ammo/xeno/oppressor_tail/proc/remove_tail_overlay(mob/overlayed_mob, image/tail_image) + overlayed_mob.overlays -= tail_image diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm deleted file mode 100644 index 783b982f10bd..000000000000 --- a/code/modules/projectiles/ammo_datums.dm +++ /dev/null @@ -1,3447 +0,0 @@ -/datum/ammo - var/name = "generic bullet" - var/headshot_state = null //Icon state when a human is permanently killed with it by execution/suicide. - var/icon = 'icons/obj/items/weapons/projectiles.dmi' - var/icon_state = "bullet" - var/ping = "ping_b" //The icon that is displayed when the bullet bounces off something. - var/sound_hit //When it deals damage. - var/sound_armor //When it's blocked by human armor. - var/sound_miss //When it misses someone. - var/sound_bounce //When it bounces off something. - var/sound_shield_hit //When the bullet is absorbed by a xeno_shield - - var/accurate_range_min = 0 // Snipers use this to simulate poor accuracy at close ranges - var/scatter = 0 // How much the ammo scatters when burst fired, added to gun scatter, along with other mods - var/stamina_damage = 0 - var/damage = 0 // This is the base damage of the bullet as it is fired - var/damage_type = BRUTE // BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here - var/penetration = 0 // How much armor it ignores before calculations take place - var/shrapnel_chance = 0 // The % chance it will imbed in a human - var/shrapnel_type = 0 // The shrapnel type the ammo will embed, if the chance rolls - var/bonus_projectiles_type // Type path of the extra projectiles - var/bonus_projectiles_amount = 0 // How many extra projectiles it shoots out. Works kind of like firing on burst, but all of the projectiles travel together - var/debilitate[] = null // Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony - var/pen_armor_punch = 0.5 // how much armor breaking will be done per point of penetration. This is for weapons that penetrate with their shape (like needle bullets) - var/damage_armor_punch = 0.5 // how much armor breaking is done by sheer weapon force. This is for big blunt weapons - var/sound_override = null // if we should play a special sound when firing. - var/flags_ammo_behavior = NO_FLAGS - - var/accuracy = HIT_ACCURACY_TIER_1 // This is added to the bullet's base accuracy. - var/accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 // How much the accuracy varies when fired. // This REDUCES the lower bound of accuracy variance by 2%, to 96%. - var/accuracy_var_high = PROJECTILE_VARIANCE_TIER_9 // This INCREASES the upper bound of accuracy variance by 2%, to 107%. - var/accurate_range = 6 // For most guns, this is where the bullet dramatically looses accuracy. Not for snipers though. - var/max_range = 22 // This will de-increment a counter on the bullet. - var/damage_var_low = PROJECTILE_VARIANCE_TIER_9 // Same as with accuracy variance. - var/damage_var_high = PROJECTILE_VARIANCE_TIER_9 // This INCREASES the upper bound of damage variance by 2%, to 107%. - var/damage_falloff = DAMAGE_FALLOFF_TIER_10 // How much damage the bullet loses per turf traveled after the effective range - var/damage_buildup = DAMAGE_BUILDUP_TIER_1 // How much damage the bullet loses per turf away before the effective range - var/effective_range_min = EFFECTIVE_RANGE_OFF //What minimum range the ammo deals full damage, builds up the closer you get. 0 for no minimum. Added onto gun range as a modifier. - var/effective_range_max = EFFECTIVE_RANGE_OFF //What maximum range the ammo deals full damage, tapers off using damage_falloff after hitting this value. 0 for no maximum. Added onto gun range as a modifier. - var/shell_speed = AMMO_SPEED_TIER_1 // How fast the projectile moves. - - var/handful_type = /obj/item/ammo_magazine/handful - var/handful_color - var/handful_state = "bullet" //custom handful sprite, for shotgun shells or etc. - var/multiple_handful_name //so handfuls say 'buckshot shells' not 'shell' - - /// Does this apply xenomorph behaviour delegate? - var/apply_delegate = TRUE - - /// An assoc list in the format list(/datum/element/bullet_trait_to_give = list(...args)) - /// that will be given to a projectile with the current ammo datum - var/list/list/traits_to_give - - var/flamer_reagent_type = /datum/reagent/napalm/ut - - /// The flicker that plays when a bullet hits a target. Usually red. Can be nulled so it doesn't show up at all. - var/hit_effect_color = "#FF0000" - -/datum/ammo/New() - set_bullet_traits() - -/datum/ammo/proc/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) //NOT used on New(), applied to the projectiles. - return - -/// Populate traits_to_give in this proc -/datum/ammo/proc/set_bullet_traits() - return - -/datum/ammo/can_vv_modify() - return FALSE - -/datum/ammo/proc/do_at_half_range(obj/projectile/P) - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_embed(mob/embedded_mob, obj/limb/target_organ) - return - -/datum/ammo/proc/do_at_max_range(obj/projectile/P) - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_shield_block(mob/M, obj/projectile/P) //Does it do something special when shield blocked? Ie. a flare or grenade that still blows up. - return - -/datum/ammo/proc/on_hit_turf(turf/T, obj/projectile/P) //Special effects when hitting dense turfs. - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_hit_mob(mob/M, obj/projectile/P, mob/user) //Special effects when hitting mobs. - SHOULD_NOT_SLEEP(TRUE) - return - -///Special effects when pointblanking mobs. Ultimately called from /living/attackby(). Return TRUE to end the PB attempt. -/datum/ammo/proc/on_pointblank(mob/living/L, obj/projectile/P, mob/living/user, obj/item/weapon/gun/fired_from) - return - -/datum/ammo/proc/on_hit_obj(obj/O, obj/projectile/P) //Special effects when hitting objects. - SHOULD_NOT_SLEEP(TRUE) - return - -/datum/ammo/proc/on_near_target(turf/T, obj/projectile/P) //Special effects when passing near something. Range of things that triggers it is controlled by other ammo flags. - return 0 //return 0 means it flies even after being near something. Return 1 means it stops - -/datum/ammo/proc/knockback(mob/living/living_mob, obj/projectile/fired_projectile, max_range = 2) - if(!living_mob || living_mob == fired_projectile.firer) - return - if(fired_projectile.distance_travelled > max_range || living_mob.lying) - return //Two tiles away or more, basically. - - if(living_mob.mob_size >= MOB_SIZE_BIG) - return //Big xenos are not affected. - - shake_camera(living_mob, 3, 4) - knockback_effects(living_mob, fired_projectile) - slam_back(living_mob, fired_projectile) - -/datum/ammo/proc/slam_back(mob/living/living_mob, obj/projectile/fired_projectile) - //Either knockback or slam them into an obstacle. - var/direction = Get_Compass_Dir(fired_projectile.z ? fired_projectile : fired_projectile.firer, living_mob) //More precise than get_dir. - if(!direction) //Same tile. - return - if(!step(living_mob, direction)) - living_mob.animation_attack_on(get_step(living_mob, direction)) - playsound(living_mob.loc, "punch", 25, 1) - living_mob.visible_message(SPAN_DANGER("[living_mob] slams into an obstacle!"), - isxeno(living_mob) ? SPAN_XENODANGER("You slam into an obstacle!") : SPAN_HIGHDANGER("You slam into an obstacle!"), null, 4, CHAT_TYPE_TAKING_HIT) - living_mob.apply_damage(MELEE_FORCE_TIER_2) - -///The applied effects for knockback(), overwrite to change slow/stun amounts for different ammo datums -/datum/ammo/proc/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - target.apply_effect(0.7, WEAKEN) // 0.9 seconds of stun, per agreement from Balance Team when switched from MC stuns to exact stuns - target.apply_effect(1, SUPERSLOW) - target.apply_effect(2, SLOW) - to_chat(target, SPAN_XENODANGER("You are shaken by the sudden impact!")) - else - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) - if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) - return - - if(target_mob.mob_size >= MOB_SIZE_BIG) - return //too big to push - - to_chat(target_mob, isxeno(target_mob) ? SPAN_XENODANGER("You are pushed back by the sudden impact!") : SPAN_HIGHDANGER("You are pushed back by the sudden impact!"), null, 4, CHAT_TYPE_TAKING_HIT) - slam_back(target_mob, fired_projectile, max_range) - -/datum/ammo/proc/burst(atom/target, obj/projectile/P, damage_type = BRUTE, range = 1, damage_div = 2, show_message = SHOW_MESSAGE_VISIBLE) //damage_div says how much we divide damage - if(!target || !P) return - for(var/mob/living/carbon/M in orange(range,target)) - if(P.firer == M) - continue - if(show_message) - var/msg = "You are hit by backlash from \a [P.name]!" - M.visible_message(SPAN_DANGER("[M] is hit by backlash from \a [P.name]!"),isxeno(M) ? SPAN_XENODANGER("[msg]"):SPAN_HIGHDANGER("[msg]")) - var/damage = P.damage/damage_div - - var/mob/living/carbon/xenomorph/XNO = null - - if(isxeno(M)) - XNO = M - var/total_explosive_resistance = XNO.caste.xeno_explosion_resistance + XNO.armor_explosive_buff - damage = armor_damage_reduction(GLOB.xeno_explosive, damage, total_explosive_resistance , 60, 0, 0.5, XNO.armor_integrity) - var/armor_punch = armor_break_calculation(GLOB.xeno_explosive, damage, total_explosive_resistance, 60, 0, 0.5, XNO.armor_integrity) - XNO.apply_armorbreak(armor_punch) - - M.apply_damage(damage,damage_type) - - if(XNO && XNO.xeno_shields.len) - P.play_shielded_hit_effect(M) - else - P.play_hit_effect(M) - -/datum/ammo/proc/fire_bonus_projectiles(obj/projectile/original_P) - set waitfor = 0 - - var/turf/curloc = get_turf(original_P.shot_from) - var/initial_angle = Get_Angle(curloc, original_P.target_turf) - - for(var/i in 1 to bonus_projectiles_amount) //Want to run this for the number of bonus projectiles. - var/final_angle = initial_angle - - var/obj/projectile/P = new /obj/projectile(curloc, original_P.weapon_cause_data) - P.generate_bullet(GLOB.ammo_list[bonus_projectiles_type]) //No bonus damage or anything. - P.accuracy = round(P.accuracy * original_P.accuracy/initial(original_P.accuracy)) //if the gun changes the accuracy of the main projectile, it also affects the bonus ones. - original_P.give_bullet_traits(P) - - var/total_scatter_angle = P.scatter - final_angle += rand(-total_scatter_angle, total_scatter_angle) - var/turf/new_target = get_angle_target_turf(curloc, final_angle, 30) - - P.fire_at(new_target, original_P.firer, original_P.shot_from, P.ammo.max_range, P.ammo.shell_speed, original_P.original) //Fire! - -/datum/ammo/proc/drop_flame(turf/T, datum/cause_data/cause_data) // ~Art updated fire 20JAN17 - if(!istype(T)) - return - if(locate(/obj/flamer_fire) in T) - return - - var/datum/reagent/R = new flamer_reagent_type() - new /obj/flamer_fire(T, cause_data, R) - - -/* -//====== - Default Ammo -//====== -*/ -//Only when things screw up do we use this as a placeholder. -/datum/ammo/bullet - name = "default bullet" - icon_state = "bullet" - headshot_state = HEADSHOT_OVERLAY_LIGHT - flags_ammo_behavior = AMMO_BALLISTIC - sound_hit = "ballistic_hit" - sound_armor = "ballistic_armor" - sound_miss = "ballistic_miss" - sound_bounce = "ballistic_bounce" - sound_shield_hit = "ballistic_shield_hit" - - accurate_range_min = 0 - damage = 10 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_1 - shrapnel_type = /obj/item/shard/shrapnel - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/proc/handle_battlefield_execution(datum/ammo/firing_ammo, mob/living/hit_mob, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) - SIGNAL_HANDLER - - if(!user || hit_mob == user || user.zone_selected != "head" || user.a_intent != INTENT_HARM || !ishuman_strict(hit_mob)) - return - - if(!skillcheck(user, SKILL_EXECUTION, SKILL_EXECUTION_TRAINED)) - to_chat(user, SPAN_DANGER("You don't know how to execute someone correctly.")) - return - - var/mob/living/carbon/human/execution_target = hit_mob - - if(execution_target.status_flags & PERMANENTLY_DEAD) - to_chat(user, SPAN_DANGER("[execution_target] has already been executed!")) - return - - INVOKE_ASYNC(src, PROC_REF(attempt_battlefield_execution), src, execution_target, firing_projectile, user, fired_from) - - return COMPONENT_CANCEL_AMMO_POINT_BLANK - -/datum/ammo/bullet/proc/attempt_battlefield_execution(datum/ammo/firing_ammo, mob/living/carbon/human/execution_target, obj/projectile/firing_projectile, mob/living/user, obj/item/weapon/gun/fired_from) - user.affected_message(execution_target, - SPAN_HIGHDANGER("You aim \the [fired_from] at [execution_target]'s head!"), - SPAN_HIGHDANGER("[user] aims \the [fired_from] directly at your head!"), - SPAN_DANGER("[user] aims \the [fired_from] at [execution_target]'s head!")) - - user.next_move += 1.1 SECONDS //PB has no click delay; readding it here to prevent people accidentally queuing up multiple executions. - - if(!do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE) || !user.Adjacent(execution_target)) - fired_from.delete_bullet(firing_projectile, TRUE) - return - - if(!(fired_from.flags_gun_features & GUN_SILENCED)) - playsound(user, fired_from.fire_sound, fired_from.firesound_volume, FALSE) - else - playsound(user, fired_from.fire_sound, 25, FALSE) - - shake_camera(user, 1, 2) - - execution_target.apply_damage(damage * 3, BRUTE, "head", no_limb_loss = TRUE, permanent_kill = TRUE) //Apply gobs of damage and make sure they can't be revived later... - execution_target.apply_damage(200, OXY) //...fill out the rest of their health bar with oxyloss... - execution_target.death(create_cause_data("execution", user)) //...make certain they're properly dead... - shake_camera(execution_target, 3, 4) - execution_target.update_headshot_overlay(headshot_state) //...and add a gory headshot overlay. - - execution_target.visible_message(SPAN_HIGHDANGER(uppertext("[execution_target] WAS EXECUTED!")), \ - SPAN_HIGHDANGER("You WERE EXECUTED!")) - - user.count_niche_stat(STATISTICS_NICHE_EXECUTION, 1, firing_projectile.weapon_cause_data?.cause_name) - - var/area/execution_area = get_area(execution_target) - - msg_admin_attack(FONT_SIZE_HUGE("[key_name(usr)] has battlefield executed [key_name(execution_target)] in [get_area(usr)] ([usr.loc.x],[usr.loc.y],[usr.loc.z])."), usr.loc.x, usr.loc.y, usr.loc.z) - log_attack("[key_name(usr)] battlefield executed [key_name(execution_target)] at [execution_area.name].") - - if(flags_ammo_behavior & AMMO_EXPLOSIVE) - execution_target.gib() - - -/* -//====== - Pistol Ammo -//====== -*/ - -// Used by M4A3, M4A3 Custom and B92FS -/datum/ammo/bullet/pistol - name = "pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - damage = 40 - penetration= ARMOR_PENETRATION_TIER_2 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pistol/tiny - name = "light pistol bullet" - -/datum/ammo/bullet/pistol/tranq - name = "tranquilizer bullet" - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST - stamina_damage = 30 - damage = 15 - -//2020 rebalance: is supposed to counter runners and lurkers, dealing high damage to the only castes with no armor. -//Limited by its lack of versatility and lower supply, so marines finally have an answer for flanker castes that isn't just buckshot. - -/datum/ammo/bullet/pistol/hollow - name = "hollowpoint pistol bullet" - - damage = 55 //hollowpoint is strong - penetration = 0 //hollowpoint can't pierce armor! - shrapnel_chance = SHRAPNEL_CHANCE_TIER_3 //hollowpoint causes shrapnel - -// Used by M4A3 AP and mod88 -/datum/ammo/bullet/pistol/ap - name = "armor-piercing pistol bullet" - - damage = 25 - accuracy = HIT_ACCURACY_TIER_2 - penetration= ARMOR_PENETRATION_TIER_8 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pistol/ap/penetrating - name = "wall-penetrating pistol bullet" - shrapnel_chance = 0 - - damage = 30 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/pistol/ap/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/pistol/ap/toxin - name = "toxic pistol bullet" - var/acid_per_hit = 10 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/pistol/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/pistol/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/le - name = "armor-shredding pistol bullet" - - damage = 15 - penetration = ARMOR_PENETRATION_TIER_4 - pen_armor_punch = 3 - -/datum/ammo/bullet/pistol/rubber - name = "rubber pistol bullet" - sound_override = 'sound/weapons/gun_c99.ogg' - - damage = 0 - stamina_damage = 25 - shrapnel_chance = 0 - -// Reskinned rubber bullet used for the ES-4 CL pistol. -/datum/ammo/bullet/pistol/rubber/stun - name = "stun pistol bullet" - sound_override = null - -// Used by M1911, Deagle and KT-42 -/datum/ammo/bullet/pistol/heavy - name = "heavy pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - damage = 55 - penetration = ARMOR_PENETRATION_TIER_3 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pistol/heavy/super //Commander's variant - name = ".50 heavy pistol bullet" - damage = 60 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/pistol/heavy/super/highimpact - name = ".50 high-impact pistol bullet" - penetration = ARMOR_PENETRATION_TIER_1 - debilitate = list(0,1.5,0,0,0,1,0,0) - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/pistol/heavy/super/highimpact/ap - name = ".50 high-impact armor piercing pistol bullet" - penetration = ARMOR_PENETRATION_TIER_10 - damage = 45 - -/datum/ammo/bullet/pistol/heavy/super/highimpact/upp - name = "high-impact pistol bullet" - sound_override = 'sound/weapons/gun_DE50.ogg' - penetration = ARMOR_PENETRATION_TIER_6 - debilitate = list(0,1.5,0,0,0,1,0,0) - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/pistol/heavy/super/highimpact/New() - ..() - RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) - -/datum/ammo/bullet/pistol/heavy/super/highimpact/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) - -/datum/ammo/bullet/pistol/deagle - name = ".50 heavy pistol bullet" - damage = 45 - headshot_state = HEADSHOT_OVERLAY_HEAVY - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_5 - -/datum/ammo/bullet/pistol/incendiary - name = "incendiary pistol bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = HIT_ACCURACY_TIER_3 - damage = 20 - -/datum/ammo/bullet/pistol/incendiary/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -// Used by the hipower -// I know that the 'high power' in the name is supposed to mean its 'impressive' magazine capacity -// but this is CM, half our guns have baffling misconceptions and mistakes (how do you grab the type-71?) so it's on-brand. -// maybe in the far flung future of 2280 someone screwed up the design. - -/datum/ammo/bullet/pistol/highpower - name = "high-powered pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = HIT_ACCURACY_TIER_3 - damage = 36 - penetration = ARMOR_PENETRATION_TIER_5 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - -// Used by VP78 and Auto 9 -/datum/ammo/bullet/pistol/squash - name = "squash-head pistol bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - debilitate = list(0,0,0,0,0,0,0,2) - - accuracy = HIT_ACCURACY_TIER_4 - damage = 45 - penetration= ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_6 //"VP78 - the only pistol viable as a primary."-Vampmare, probably. - -/datum/ammo/bullet/pistol/squash/toxin - name = "toxic squash-head pistol bullet" - var/acid_per_hit = 10 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/pistol/squash/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/pistol/squash/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/squash/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/pistol/squash/penetrating - name = "wall-penetrating squash-head pistol bullet" - shrapnel_chance = 0 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/pistol/squash/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/pistol/squash/incendiary - name = "incendiary squash-head pistol bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - accuracy = HIT_ACCURACY_TIER_3 - damage = 35 - -/datum/ammo/bullet/pistol/squash/incendiary/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - - -/datum/ammo/bullet/pistol/mankey - name = "live monkey" - icon_state = "monkey1" - ping = null //no bounce off. - damage_type = BURN - debilitate = list(4,4,0,0,0,0,0,0) - flags_ammo_behavior = AMMO_IGNORE_ARMOR - - damage = 15 - damage_var_high = PROJECTILE_VARIANCE_TIER_5 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/bullet/pistol/mankey/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/pistol/mankey/on_hit_mob(mob/M,obj/projectile/P) - if(P && P.loc && !M.stat && !istype(M,/mob/living/carbon/human/monkey)) - P.visible_message(SPAN_DANGER("The [src] chimpers furiously!")) - new /mob/living/carbon/human/monkey(P.loc) - -/datum/ammo/bullet/pistol/smart - name = "smartpistol bullet" - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = HIT_ACCURACY_TIER_8 - damage = 30 - penetration = 20 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/* -//====== - Revolver Ammo -//====== -*/ - -/datum/ammo/bullet/revolver - name = "revolver bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - damage = 55 - penetration = ARMOR_PENETRATION_TIER_1 - accuracy = HIT_ACCURACY_TIER_1 - -/datum/ammo/bullet/revolver/marksman - name = "marksman revolver bullet" - - shrapnel_chance = 0 - damage_falloff = 0 - accurate_range = 12 - penetration = ARMOR_PENETRATION_TIER_7 - -/datum/ammo/bullet/revolver/heavy - name = "heavy revolver bullet" - - damage = 35 - penetration = ARMOR_PENETRATION_TIER_4 - accuracy = HIT_ACCURACY_TIER_3 - -/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) - -/datum/ammo/bullet/revolver/incendiary - name = "incendiary revolver bullet" - damage = 40 - -/datum/ammo/bullet/revolver/incendiary/set_bullet_traits() - ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/revolver/marksman/toxin - name = "toxic revolver bullet" - var/acid_per_hit = 10 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/revolver/marksman/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/revolver/penetrating - name = "wall-penetrating revolver bullet" - shrapnel_chance = 0 - - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/revolver/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/revolver/upp - name = "heavy revolver bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - penetration = ARMOR_PENETRATION_TIER_4 - damage = 70 - - -/datum/ammo/bullet/revolver/upp/shrapnel - name = "shrapnel shot" - headshot_state = HEADSHOT_OVERLAY_HEAVY //Gol-dang shotgun blow your fething head off. - debilitate = list(0,0,0,0,0,0,0,0) - icon_state = "shrapnelshot" - handful_state = "shrapnel" - bonus_projectiles_type = /datum/ammo/bullet/revolver/upp/shrapnel_bits - - max_range = 6 - damage = 40 // + TIER_4 * 3 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - penetration = ARMOR_PENETRATION_TIER_8 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - shrapnel_chance = 100 - shrapnel_type = /obj/item/shard/shrapnel/upp - //roughly 90 or so damage with the additional shrapnel, around 130 in total with primary round - -/datum/ammo/bullet/revolver/upp/shrapnel/on_hit_mob(mob/M, obj/projectile/P) - pushback(M, P, 1) - -/datum/ammo/bullet/revolver/upp/shrapnel_bits - name = "small shrapnel" - icon_state = "shrapnelshot_bit" - - max_range = 6 - damage = 30 - penetration = ARMOR_PENETRATION_TIER_4 - scatter = SCATTER_AMOUNT_TIER_1 - bonus_projectiles_amount = 0 - shrapnel_type = /obj/item/shard/shrapnel/upp/bits - -/datum/ammo/bullet/revolver/small - name = "small revolver bullet" - headshot_state = HEADSHOT_OVERLAY_LIGHT - - damage = 45 - - penetration = ARMOR_PENETRATION_TIER_3 - -/datum/ammo/bullet/revolver/small/hollowpoint - name = "small hollowpoint revolver bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - damage = 75 // way too strong because it's hard to make a good balance between HP and normal with this system, but the damage falloff is really strong - penetration = 0 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - -/datum/ammo/bullet/revolver/mateba - name = ".454 heavy revolver bullet" - - damage = 60 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/revolver/mateba/highimpact - name = ".454 heavy high-impact revolver bullet" - debilitate = list(0,2,0,0,0,1,0,0) - penetration = ARMOR_PENETRATION_TIER_1 - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/revolver/mateba/highimpact/ap - name = ".454 heavy high-impact armor piercing revolver bullet" - penetration = ARMOR_PENETRATION_TIER_10 - damage = 45 - -/datum/ammo/bullet/revolver/mateba/highimpact/New() - ..() - RegisterSignal(src, COMSIG_AMMO_POINT_BLANK, PROC_REF(handle_battlefield_execution)) - -/datum/ammo/bullet/revolver/mateba/highimpact/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive //if you ever put this in normal gameplay, i am going to scream - name = ".454 heavy explosive revolver bullet" - damage = 100 - damage_var_low = PROJECTILE_VARIANCE_TIER_10 - damage_var_high = PROJECTILE_VARIANCE_TIER_1 - penetration = ARMOR_PENETRATION_TIER_10 - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_BALLISTIC - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_mob(mob/M, obj/projectile/P) - ..() - cell_explosion(get_turf(M), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_obj(obj/O, obj/projectile/P) - ..() - cell_explosion(get_turf(O), 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/revolver/mateba/highimpact/explosive/on_hit_turf(turf/T, obj/projectile/P) - ..() - cell_explosion(T, 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/revolver/webley //Mateba round without the knockdown. - name = ".455 Webley bullet" - damage = 60 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_2 - -/* -//====== - SMG Ammo -//====== -*/ -//2020 SMG/ammo rebalance. default ammo actually has penetration so it can be useful, by 4khan: should be meh against t3s, better under 15 armor. Perfectly does this right now (oct 2020) -//has reduced falloff compared to the m39. this means it is best for kiting castes (mostly t2s and below admittedly) -//while the m39 ap is better for shredding them at close range, but has reduced velocity, so it's better for just running in and erasing armor-centric castes (defender, crusher) -// which i think is really interesting and good balance, giving both ammo types a reason to exist even against ravagers. -//i feel it is necessary to reflavor the default bullet, because otherwise, people won't be able to notice it has less falloff and faster bullet speed. even with a changelog, -//way too many people don't read the changelog, and after one or two months the changelog entry is all but archive, so there needs to be an ingame description of what the ammo does -//in comparison to armor-piercing rounds. - -/datum/ammo/bullet/smg - name = "submachinegun bullet" - damage = 34 - accurate_range = 4 - effective_range_max = 4 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_6 - damage_falloff = DAMAGE_FALLOFF_TIER_5 - scatter = SCATTER_AMOUNT_TIER_6 - accuracy = HIT_ACCURACY_TIER_3 - -/datum/ammo/bullet/smg/m39 - name = "high-velocity submachinegun bullet" //i don't want all smgs to inherit 'high velocity' - -/datum/ammo/bullet/smg/ap - name = "armor-piercing submachinegun bullet" - - damage = 26 - penetration = ARMOR_PENETRATION_TIER_6 - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/smg/heap - name = "high-explosive armor-piercing submachinegun bullet" - - damage = 45 - headshot_state = HEADSHOT_OVERLAY_MEDIUM - penetration = ARMOR_PENETRATION_TIER_6 - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/smg/ap/toxin - name = "toxic submachinegun bullet" - var/acid_per_hit = 5 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/smg/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/smg/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/smg/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/smg/nail - name = "7x45mm plasteel nail" - icon_state = "nail-projectile" - - damage = 25 - penetration = ARMOR_PENETRATION_TIER_5 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - accurate_range = 5 - shell_speed = AMMO_SPEED_TIER_4 - -/datum/ammo/bullet/smg/incendiary - name = "incendiary submachinegun bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 25 - accuracy = -HIT_ACCURACY_TIER_2 - -/datum/ammo/bullet/smg/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/smg/ap/penetrating - name = "wall-penetrating submachinegun bullet" - shrapnel_chance = 0 - - damage = 30 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/smg/ap/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/smg/le - name = "armor-shredding submachinegun bullet" - - scatter = SCATTER_AMOUNT_TIER_10 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_4 - shell_speed = AMMO_SPEED_TIER_3 - damage_falloff = DAMAGE_FALLOFF_TIER_10 - pen_armor_punch = 4 - -/datum/ammo/bullet/smg/rubber - name = "rubber submachinegun bullet" - sound_override = 'sound/weapons/gun_c99.ogg' - - damage = 0 - stamina_damage = 10 - shrapnel_chance = 0 - -/datum/ammo/bullet/smg/mp27 - name = "simple submachinegun bullet" - damage = 40 - accurate_range = 5 - effective_range_max = 7 - penetration = 0 - shell_speed = AMMO_SPEED_TIER_6 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - scatter = SCATTER_AMOUNT_TIER_6 - accuracy = HIT_ACCURACY_TIER_2 - -// less damage than the m39, but better falloff, range, and AP - -/datum/ammo/bullet/smg/ppsh - name = "crude submachinegun bullet" - damage = 26 - accurate_range = 7 - effective_range_max = 7 - penetration = ARMOR_PENETRATION_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - scatter = SCATTER_AMOUNT_TIER_5 - -/datum/ammo/bullet/smg/pps43 - name = "simple submachinegun bullet" - damage = 35 - accurate_range = 7 - effective_range_max = 10 - penetration = ARMOR_PENETRATION_TIER_4 - damage_falloff = DAMAGE_FALLOFF_TIER_6 - scatter = SCATTER_AMOUNT_TIER_6 - -/* -//====== - Rifle Ammo -//====== -*/ - -/datum/ammo/bullet/rifle - name = "rifle bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - damage = 40 - penetration = ARMOR_PENETRATION_TIER_1 - accurate_range = 16 - accuracy = HIT_ACCURACY_TIER_4 - scatter = SCATTER_AMOUNT_TIER_10 - shell_speed = AMMO_SPEED_TIER_6 - effective_range_max = 7 - damage_falloff = DAMAGE_FALLOFF_TIER_7 - max_range = 24 //So S8 users don't have their bullets magically disappaer at 22 tiles (S8 can see 24 tiles) - -/datum/ammo/bullet/rifle/holo_target - name = "holo-targeting rifle bullet" - damage = 30 - var/holo_stacks = 10 - -/datum/ammo/bullet/rifle/holo_target/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) - -/datum/ammo/bullet/rifle/holo_target/hunting - name = "holo-targeting hunting bullet" - damage = 25 - holo_stacks = 15 - -/datum/ammo/bullet/rifle/explosive - name = "explosive rifle bullet" - - damage = 25 - accurate_range = 22 - accuracy = 0 - shell_speed = AMMO_SPEED_TIER_4 - damage_falloff = DAMAGE_FALLOFF_TIER_9 - -/datum/ammo/bullet/rifle/explosive/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(get_turf(M), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/rifle/explosive/on_hit_obj(obj/O, obj/projectile/P) - cell_explosion(get_turf(O), 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/rifle/explosive/on_hit_turf(turf/T, obj/projectile/P) - if(T.density) - cell_explosion(T, 80, 40, EXPLOSION_FALLOFF_SHAPE_LINEAR, P.dir, P.weapon_cause_data) - -/datum/ammo/bullet/rifle/ap - name = "armor-piercing rifle bullet" - - damage = 30 - penetration = ARMOR_PENETRATION_TIER_8 - -// Basically AP but better. Focused at taking out armour temporarily -/datum/ammo/bullet/rifle/ap/toxin - name = "toxic rifle bullet" - var/acid_per_hit = 7 - var/organic_damage_mult = 3 - -/datum/ammo/bullet/rifle/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) - -/datum/ammo/bullet/rifle/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) - . = ..() - if(T.flags_turf & TURF_ORGANIC) - P.damage *= organic_damage_mult - -/datum/ammo/bullet/rifle/ap/toxin/on_hit_obj(obj/O, obj/projectile/P) - . = ..() - if(O.flags_obj & OBJ_ORGANIC) - P.damage *= organic_damage_mult - - -/datum/ammo/bullet/rifle/ap/penetrating - name = "wall-penetrating rifle bullet" - shrapnel_chance = 0 - - damage = 35 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/rifle/ap/penetrating/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/rifle/le - name = "armor-shredding rifle bullet" - - damage = 20 - penetration = ARMOR_PENETRATION_TIER_4 - pen_armor_punch = 5 - -/datum/ammo/bullet/rifle/heap - name = "high-explosive armor-piercing rifle bullet" - - headshot_state = HEADSHOT_OVERLAY_HEAVY - damage = 55//big damage, doesn't actually blow up because thats stupid. - penetration = ARMOR_PENETRATION_TIER_8 - -/datum/ammo/bullet/rifle/rubber - name = "rubber rifle bullet" - sound_override = 'sound/weapons/gun_c99.ogg' - - damage = 0 - stamina_damage = 15 - shrapnel_chance = 0 - -/datum/ammo/bullet/rifle/incendiary - name = "incendiary rifle bullet" - damage_type = BURN - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 30 - shell_speed = AMMO_SPEED_TIER_4 - accuracy = -HIT_ACCURACY_TIER_2 - damage_falloff = DAMAGE_FALLOFF_TIER_10 - -/datum/ammo/bullet/rifle/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/rifle/m4ra - name = "A19 high velocity bullet" - shrapnel_chance = 0 - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC - accurate_range_min = 4 - - damage = 55 - scatter = -SCATTER_AMOUNT_TIER_8 - penetration= ARMOR_PENETRATION_TIER_7 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/rifle/m4ra/incendiary - name = "A19 high velocity incendiary bullet" - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 40 - accuracy = HIT_ACCURACY_TIER_4 - scatter = -SCATTER_AMOUNT_TIER_8 - penetration= ARMOR_PENETRATION_TIER_5 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/rifle/m4ra/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/rifle/m4ra/impact - name = "A19 high velocity impact bullet" - flags_ammo_behavior = AMMO_BALLISTIC - - damage = 40 - accuracy = -HIT_ACCURACY_TIER_2 - scatter = -SCATTER_AMOUNT_TIER_8 - penetration = ARMOR_PENETRATION_TIER_10 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/rifle/m4ra/impact/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 32) // Can knockback basically at max range - -/datum/ammo/bullet/rifle/m4ra/impact/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(2, SUPERSLOW) - target.apply_effect(5, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/rifle/mar40 - name = "heavy rifle bullet" - - damage = 55 - -/datum/ammo/bullet/rifle/type71 - name = "heavy rifle bullet" - - damage = 55 - penetration = ARMOR_PENETRATION_TIER_3 - -/datum/ammo/bullet/rifle/type71/ap - name = "heavy armor-piercing rifle bullet" - - damage = 40 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/rifle/type71/heap - name = "heavy high-explosive armor-piercing rifle bullet" - - headshot_state = HEADSHOT_OVERLAY_HEAVY - damage = 65 - penetration = ARMOR_PENETRATION_TIER_10 - -/* -//====== - Shotgun Ammo -//====== -*/ - -/datum/ammo/bullet/shotgun - headshot_state = HEADSHOT_OVERLAY_HEAVY - -/datum/ammo/bullet/shotgun/slug - name = "shotgun slug" - handful_state = "slug_shell" - - accurate_range = 6 - max_range = 8 - damage = 70 - penetration = ARMOR_PENETRATION_TIER_4 - damage_armor_punch = 2 - handful_state = "slug_shell" - -/datum/ammo/bullet/shotgun/slug/on_hit_mob(mob/M,obj/projectile/P) - knockback(M, P, 6) - -/datum/ammo/bullet/shotgun/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(1, SUPERSLOW) - target.apply_effect(3, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/shotgun/beanbag - name = "beanbag slug" - headshot_state = HEADSHOT_OVERLAY_LIGHT //It's not meant to kill people... but if you put it in your mouth, it will. - handful_state = "beanbag_slug" - icon_state = "beanbag" - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST - sound_override = 'sound/weapons/gun_shotgun_riot.ogg' - - max_range = 12 - shrapnel_chance = 0 - damage = 0 - stamina_damage = 45 - accuracy = HIT_ACCURACY_TIER_3 - shell_speed = AMMO_SPEED_TIER_3 - handful_state = "beanbag_slug" - -/datum/ammo/bullet/shotgun/beanbag/on_hit_mob(mob/M, obj/projectile/P) - if(!M || M == P.firer) return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - shake_camera(H, 2, 1) - - -/datum/ammo/bullet/shotgun/incendiary - name = "incendiary slug" - handful_state = "incendiary_slug" - damage_type = BURN - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = -HIT_ACCURACY_TIER_2 - max_range = 12 - damage = 55 - penetration= ARMOR_PENETRATION_TIER_1 - handful_state = "incendiary_slug" - -/datum/ammo/bullet/shotgun/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shotgun/incendiary/on_hit_mob(mob/M,obj/projectile/P) - burst(get_turf(M),P,damage_type) - knockback(M,P) - -/datum/ammo/bullet/shotgun/incendiary/on_hit_obj(obj/O,obj/projectile/P) - burst(get_turf(P),P,damage_type) - -/datum/ammo/bullet/shotgun/incendiary/on_hit_turf(turf/T,obj/projectile/P) - burst(get_turf(T),P,damage_type) - - -/datum/ammo/bullet/shotgun/flechette - name = "flechette shell" - icon_state = "flechette" - handful_state = "flechette_shell" - bonus_projectiles_type = /datum/ammo/bullet/shotgun/flechette_spread - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - max_range = 12 - damage = 30 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_7 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - handful_state = "flechette_shell" - multiple_handful_name = TRUE - -/datum/ammo/bullet/shotgun/flechette_spread - name = "additional flechette" - icon_state = "flechette" - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - max_range = 12 - damage = 30 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_7 - scatter = SCATTER_AMOUNT_TIER_5 - -/datum/ammo/bullet/shotgun/buckshot - name = "buckshot shell" - icon_state = "buckshot" - handful_state = "buckshot_shell" - multiple_handful_name = TRUE - bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_5 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_5 - accurate_range = 4 - max_range = 4 - damage = 65 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_1 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - shell_speed = AMMO_SPEED_TIER_2 - damage_armor_punch = 0 - pen_armor_punch = 0 - handful_state = "buckshot_shell" - multiple_handful_name = TRUE - -/datum/ammo/bullet/shotgun/buckshot/incendiary - name = "incendiary buckshot shell" - handful_state = "incen_buckshot" - handful_type = /obj/item/ammo_magazine/handful/shotgun/buckshot/incendiary - -/datum/ammo/bullet/shotgun/buckshot/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shotgun/buckshot/on_hit_mob(mob/M,obj/projectile/P) - knockback(M,P) - -//buckshot variant only used by the masterkey shotgun attachment. -/datum/ammo/bullet/shotgun/buckshot/masterkey - bonus_projectiles_type = /datum/ammo/bullet/shotgun/spread/masterkey - - damage = 55 - -/datum/ammo/bullet/shotgun/spread - name = "additional buckshot" - icon_state = "buckshot" - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 4 - max_range = 6 - damage = 65 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_2 - scatter = SCATTER_AMOUNT_TIER_1 - damage_armor_punch = 0 - pen_armor_punch = 0 - -/datum/ammo/bullet/shotgun/spread/masterkey - damage = 20 - -/* - 8 GAUGE SHOTGUN AMMO -*/ - -/datum/ammo/bullet/shotgun/heavy/buckshot - name = "heavy buckshot shell" - icon_state = "buckshot" - handful_state = "heavy_buckshot" - multiple_handful_name = TRUE - bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/spread - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_3 - accurate_range = 3 - max_range = 3 - damage = 75 - penetration = 0 - shell_speed = AMMO_SPEED_TIER_2 - damage_armor_punch = 0 - pen_armor_punch = 0 - -/datum/ammo/bullet/shotgun/heavy/buckshot/on_hit_mob(mob/M,obj/projectile/P) - knockback(M,P) - -/datum/ammo/bullet/shotgun/heavy/buckshot/spread - name = "additional heavy buckshot" - max_range = 4 - scatter = SCATTER_AMOUNT_TIER_1 - bonus_projectiles_amount = 0 - -//basically the same -/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath - name = "dragon's breath shell" - handful_state = "heavy_dragonsbreath" - multiple_handful_name = TRUE - damage_type = BURN - damage = 60 - accurate_range = 3 - max_range = 4 - bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread - -/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shotgun/heavy/buckshot/dragonsbreath/spread - name = "additional dragon's breath" - bonus_projectiles_amount = 0 - accurate_range = 4 - max_range = 5 //make use of the ablaze property - shell_speed = AMMO_SPEED_TIER_4 // so they hit before the main shell stuns - - -/datum/ammo/bullet/shotgun/heavy/slug - name = "heavy shotgun slug" - handful_state = "heavy_slug" - - accurate_range = 7 - max_range = 8 - damage = 90 //ouch. - penetration = ARMOR_PENETRATION_TIER_6 - damage_armor_punch = 2 - -/datum/ammo/bullet/shotgun/heavy/slug/on_hit_mob(mob/M,obj/projectile/P) - knockback(M, P, 7) - -/datum/ammo/bullet/shotgun/heavy/slug/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(2, SUPERSLOW) - target.apply_effect(5, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/shotgun/heavy/beanbag - name = "heavy beanbag slug" - icon_state = "beanbag" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - handful_state = "heavy_beanbag" - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_RESIST - sound_override = 'sound/weapons/gun_shotgun_riot.ogg' - - max_range = 7 - shrapnel_chance = 0 - damage = 0 - stamina_damage = 100 - accuracy = HIT_ACCURACY_TIER_2 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/bullet/shotgun/heavy/beanbag/on_hit_mob(mob/M, obj/projectile/P) - if(!M || M == P.firer) - return - if(ishuman(M)) - var/mob/living/carbon/human/H = M - shake_camera(H, 2, 1) - -/datum/ammo/bullet/shotgun/heavy/flechette - name = "heavy flechette shell" - icon_state = "flechette" - handful_state = "heavy_flechette" - multiple_handful_name = TRUE - bonus_projectiles_type = /datum/ammo/bullet/shotgun/heavy/flechette_spread - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_3 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_3 - max_range = 12 - damage = 45 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_10 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_2 - -/datum/ammo/bullet/shotgun/heavy/flechette_spread - name = "additional heavy flechette" - icon_state = "flechette" - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - max_range = 12 - damage = 45 - damage_var_low = PROJECTILE_VARIANCE_TIER_8 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_10 - scatter = SCATTER_AMOUNT_TIER_4 - -//Enormous shell for Van Bandolier's superheavy double-barreled hunting gun. -/datum/ammo/bullet/shotgun/twobore - name = "two bore bullet" - icon_state = "autocannon" - handful_state = "twobore" - - accurate_range = 8 //Big low-velocity projectile; this is for blasting dangerous game at close range. - max_range = 14 //At this range, it's lost all its damage anyway. - damage = 300 //Hits like a buckshot PB. - penetration = ARMOR_PENETRATION_TIER_3 - damage_falloff = DAMAGE_FALLOFF_TIER_1 * 3 //It has a lot of energy, but the 26mm bullet drops off fast. - effective_range_max = EFFECTIVE_RANGE_MAX_TIER_2 //Full damage up to this distance, then falloff for each tile beyond. - var/hit_messages = list() - -/datum/ammo/bullet/shotgun/twobore/on_hit_mob(mob/living/M, obj/projectile/P) - var/mob/shooter = P.firer - if(shooter && ismob(shooter) && HAS_TRAIT(shooter, TRAIT_TWOBORE_TRAINING) && M.stat != DEAD && prob(40)) //Death is handled by periodic life() checks so this should have a chance to fire on a killshot. - if(!length(hit_messages)) //Pick and remove lines, refill on exhaustion. - hit_messages = list("Got you!", "Aha!", "Bullseye!", "It's curtains for you, Sonny Jim!", "Your head will look fantastic on my wall!", "I have you now!", "You miserable coward! Come and fight me like a man!", "Tally ho!") - var/message = pick_n_take(hit_messages) - shooter.say(message) - - if(P.distance_travelled > 8) - knockback(M, P, 12) - - else if(!M || M == P.firer || M.lying) //These checks are included in knockback and would be redundant above. - return - - shake_camera(M, 3, 4) - M.apply_effect(2, WEAKEN) - M.apply_effect(4, SLOW) - if(iscarbonsizexeno(M)) - to_chat(M, SPAN_XENODANGER("The impact knocks you off your feet!")) - else //This will hammer a Yautja as hard as a human. - to_chat(M, SPAN_HIGHDANGER("The impact knocks you off your feet!")) - - step(M, get_dir(P.firer, M)) - -/datum/ammo/bullet/shotgun/twobore/knockback_effects(mob/living/living_mob, obj/projectile/fired_projectile) - if(iscarbonsizexeno(living_mob)) - var/mob/living/carbon/xenomorph/target = living_mob - to_chat(target, SPAN_XENODANGER("You are shaken and slowed by the sudden impact!")) - target.apply_effect(0.5, WEAKEN) - target.apply_effect(2, SUPERSLOW) - target.apply_effect(5, SLOW) - else - if(!isyautja(living_mob)) //Not predators. - living_mob.apply_effect(1, SUPERSLOW) - living_mob.apply_effect(2, SLOW) - to_chat(living_mob, SPAN_HIGHDANGER("The impact knocks you off-balance!")) - living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) - -/datum/ammo/bullet/lever_action - name = "lever-action bullet" - - damage = 80 - penetration = 0 - accuracy = HIT_ACCURACY_TIER_1 - shell_speed = AMMO_SPEED_TIER_6 - accurate_range = 14 - handful_state = "lever_action_bullet" - -//unused and not working. need to refactor MD code. Unobtainable. -//intended mechanic is to have xenos hit with it show up very frequently on any MDs around -/datum/ammo/bullet/lever_action/tracker - name = "tracking lever-action bullet" - icon_state = "redbullet" - damage = 70 - penetration = ARMOR_PENETRATION_TIER_3 - accuracy = HIT_ACCURACY_TIER_1 - handful_state = "tracking_lever_action_bullet" - -/datum/ammo/bullet/lever_action/tracker/on_hit_mob(mob/M, obj/projectile/P, mob/user) - //SEND_SIGNAL(user, COMSIG_BULLET_TRACKING, user, M) - M.visible_message(SPAN_DANGER("You hear a faint beep under [M]'s [M.mob_size > MOB_SIZE_HUMAN ? "chitin" : "skin"].")) - -/datum/ammo/bullet/lever_action/training - name = "lever-action blank" - icon_state = "blank" - damage = 70 //blanks CAN hurt you if shot very close - penetration = 0 - accuracy = HIT_ACCURACY_TIER_1 - damage_falloff = DAMAGE_FALLOFF_BLANK //not much, though (comparatively) - shell_speed = AMMO_SPEED_TIER_5 - handful_state = "training_lever_action_bullet" - -//unused, and unobtainable... for now -/datum/ammo/bullet/lever_action/marksman - name = "marksman lever-action bullet" - shrapnel_chance = 0 - damage_falloff = 0 - accurate_range = 12 - damage = 70 - penetration = ARMOR_PENETRATION_TIER_6 - shell_speed = AMMO_SPEED_TIER_6 - handful_state = "marksman_lever_action_bullet" - -/datum/ammo/bullet/lever_action/xm88 - name = ".458 SOCOM round" - - damage = 80 - penetration = ARMOR_PENETRATION_TIER_2 - accuracy = HIT_ACCURACY_TIER_1 - shell_speed = AMMO_SPEED_TIER_6 - accurate_range = 14 - handful_state = "boomslang_bullet" - -/datum/ammo/bullet/lever_action/xm88/pen20 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/lever_action/xm88/pen30 - penetration = ARMOR_PENETRATION_TIER_6 - -/datum/ammo/bullet/lever_action/xm88/pen40 - penetration = ARMOR_PENETRATION_TIER_8 - -/datum/ammo/bullet/lever_action/xm88/pen50 - penetration = ARMOR_PENETRATION_TIER_10 - -/* -//====== - Sniper Ammo -//====== -*/ - -/datum/ammo/bullet/sniper - name = "sniper bullet" - headshot_state = HEADSHOT_OVERLAY_HEAVY - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER - accurate_range_min = 4 - - accuracy = HIT_ACCURACY_TIER_8 - accurate_range = 32 - max_range = 32 - scatter = 0 - damage = 70 - penetration= ARMOR_PENETRATION_TIER_10 - shell_speed = AMMO_SPEED_TIER_6 - damage_falloff = 0 - -/datum/ammo/bullet/sniper/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - L.apply_armoured_damage(damage*2, ARMOR_BULLET, BRUTE, null, penetration) - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/sniper/incendiary - name = "incendiary sniper bullet" - damage_type = BRUTE - shrapnel_chance = 0 - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER - - //Removed accuracy = 0, accuracy_var_high = Variance Tier 6, and scatter = 0. -Kaga - damage = 60 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/sniper/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/sniper/incendiary/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - var/blind_duration = 5 - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_BIG) - blind_duration = 2 - L.AdjustEyeBlur(blind_duration) - L.adjust_fire_stacks(10) - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/sniper/flak - name = "flak sniper bullet" - damage_type = BRUTE - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER - - accuracy = HIT_ACCURACY_TIER_8 - scatter = SCATTER_AMOUNT_TIER_8 - damage = 55 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 //Documenting old code: This converts to a variance of 96-109% damage. -Kaga - penetration = 0 - -/datum/ammo/bullet/sniper/flak/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/slow_duration = 7 - var/mob/living/L = M - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_BIG) - slow_duration = 4 - M.adjust_effect(slow_duration, SUPERSLOW) - L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - else - burst(get_turf(M),P,damage_type, 2 , 2) - burst(get_turf(M),P,damage_type, 1 , 2 , 0) - -/datum/ammo/bullet/sniper/flak/on_near_target(turf/T, obj/projectile/P) - burst(T,P,damage_type, 2 , 2) - burst(T,P,damage_type, 1 , 2, 0) - return 1 - -/datum/ammo/bullet/sniper/crude - name = "crude sniper bullet" - damage = 42 - penetration = ARMOR_PENETRATION_TIER_6 - -/datum/ammo/bullet/sniper/crude/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - pushback(M, P, 3) - -/datum/ammo/bullet/sniper/upp - name = "armor-piercing sniper bullet" - damage = 80 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/bullet/sniper/anti_materiel - name = "anti-materiel sniper bullet" - - shrapnel_chance = 0 // This isn't leaving any shrapnel. - accuracy = HIT_ACCURACY_TIER_8 - damage = 125 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/sniper/anti_materiel/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - var/size_damage_mod = 0.8 - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_XENO) - size_damage_mod += 0.6 - if(target.mob_size >= MOB_SIZE_BIG) - size_damage_mod += 0.6 - L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) - // 180% damage to all targets (225), 240% (300) against non-Runner xenos, and 300% against Big xenos (375). -Kaga - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/sniper/anti_materiel/vulture - damage = 400 // Fully intended to vaporize anything smaller than a mini cooper - accurate_range_min = 10 - handful_state = "vulture_bullet" - sound_hit = 'sound/bullets/bullet_vulture_impact.ogg' - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_SNIPER|AMMO_IGNORE_COVER|AMMO_ANTIVEHICLE - -/datum/ammo/bullet/sniper/anti_materiel/vulture/on_hit_mob(mob/hit_mob, obj/projectile/bullet) - . = ..() - knockback(hit_mob, bullet, 30) - hit_mob.apply_effect(3, SLOW) - -/datum/ammo/bullet/sniper/anti_materiel/vulture/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating/heavy) - )) - -/datum/ammo/bullet/sniper/elite - name = "supersonic sniper bullet" - - shrapnel_chance = 0 // This isn't leaving any shrapnel. - accuracy = HIT_ACCURACY_TIER_8 - damage = 150 - shell_speed = AMMO_SPEED_TIER_6 + AMMO_SPEED_TIER_2 - -/datum/ammo/bullet/sniper/elite/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_penetrating) - )) - -/datum/ammo/bullet/sniper/elite/on_hit_mob(mob/M,obj/projectile/P) - if((P.projectile_flags & PROJECTILE_BULLSEYE) && M == P.original) - var/mob/living/L = M - var/size_damage_mod = 0.5 - if(isxeno(M)) - var/mob/living/carbon/xenomorph/target = M - if(target.mob_size >= MOB_SIZE_XENO) - size_damage_mod += 0.5 - if(target.mob_size >= MOB_SIZE_BIG) - size_damage_mod += 1 - L.apply_armoured_damage(damage*size_damage_mod, ARMOR_BULLET, BRUTE, null, penetration) - else - L.apply_armoured_damage(damage, ARMOR_BULLET, BRUTE, null, penetration) - // 150% damage to runners (225), 300% against Big xenos (450), and 200% against all others (300). -Kaga - to_chat(P.firer, SPAN_WARNING("Bullseye!")) - -/datum/ammo/bullet/tank/flak - name = "flak autocannon bullet" - icon_state = "autocannon" - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC - accurate_range_min = 4 - - accuracy = HIT_ACCURACY_TIER_8 - scatter = 0 - damage = 60 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_6 - accurate_range = 32 - max_range = 32 - shell_speed = AMMO_SPEED_TIER_6 - -/datum/ammo/bullet/tank/flak/on_hit_mob(mob/M,obj/projectile/P) - burst(get_turf(M),P,damage_type, 2 , 3) - burst(get_turf(M),P,damage_type, 1 , 3 , 0) - -/datum/ammo/bullet/tank/flak/on_near_target(turf/T, obj/projectile/P) - burst(get_turf(T),P,damage_type, 2 , 3) - burst(get_turf(T),P,damage_type, 1 , 3, 0) - return 1 - -/datum/ammo/bullet/tank/flak/on_hit_obj(obj/O,obj/projectile/P) - burst(get_turf(P),P,damage_type, 2 , 3) - burst(get_turf(P),P,damage_type, 1 , 3 , 0) - -/datum/ammo/bullet/tank/flak/on_hit_turf(turf/T,obj/projectile/P) - burst(get_turf(T),P,damage_type, 2 , 3) - burst(get_turf(T),P,damage_type, 1 , 3 , 0) - -/datum/ammo/bullet/tank/dualcannon - name = "dualcannon bullet" - icon_state = "autocannon" - damage_falloff = 0 - flags_ammo_behavior = AMMO_BALLISTIC - - accuracy = HIT_ACCURACY_TIER_8 - scatter = 0 - damage = 50 - damage_var_high = PROJECTILE_VARIANCE_TIER_8 - penetration = ARMOR_PENETRATION_TIER_3 - accurate_range = 10 - max_range = 12 - shell_speed = AMMO_SPEED_TIER_5 - -/datum/ammo/bullet/tank/dualcannon/on_hit_mob(mob/M,obj/projectile/P) - for(var/mob/living/carbon/L in get_turf(M)) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - -/datum/ammo/bullet/tank/dualcannon/on_near_target(turf/T, obj/projectile/P) - for(var/mob/living/carbon/L in T) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - return 1 - -/datum/ammo/bullet/tank/dualcannon/on_hit_obj(obj/O,obj/projectile/P) - for(var/mob/living/carbon/L in get_turf(O)) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - -/datum/ammo/bullet/tank/dualcannon/on_hit_turf(turf/T,obj/projectile/P) - for(var/mob/living/carbon/L in T) - if(L.stat == CONSCIOUS && L.mob_size <= MOB_SIZE_XENO) - shake_camera(L, 1, 1) - -/* -//====== - Special Ammo -//====== -*/ - -/datum/ammo/bullet/smartgun - name = "smartgun bullet" - icon_state = "redbullet" - flags_ammo_behavior = AMMO_BALLISTIC - - max_range = 12 - accuracy = HIT_ACCURACY_TIER_4 - damage = 30 - penetration = 0 - -/datum/ammo/bullet/smartgun/armor_piercing - name = "armor-piercing smartgun bullet" - icon_state = "bullet" - - accurate_range = 12 - accuracy = HIT_ACCURACY_TIER_2 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_8 - damage_armor_punch = 1 - -/datum/ammo/bullet/smartgun/dirty - name = "irradiated smartgun bullet" - debilitate = list(0,0,0,3,0,0,0,1) - - shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 - accurate_range = 32 - accuracy = HIT_ACCURACY_TIER_3 - damage = 40 - penetration = 0 - -/datum/ammo/bullet/smartgun/dirty/armor_piercing - debilitate = list(0,0,0,3,0,0,0,1) - - accurate_range = 22 - accuracy = HIT_ACCURACY_TIER_3 - damage = 30 - penetration = ARMOR_PENETRATION_TIER_7 - damage_armor_punch = 3 - -/datum/ammo/bullet/smartgun/holo_target //Royal marines smartgun bullet has only diff between regular ammo is this one does holostacks - name = "holo-targeting smartgun bullet" - damage = 30 -///Stuff for the HRP holotargetting stacks - var/holo_stacks = 15 - -/datum/ammo/bullet/smartgun/holo_target/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/bonus_damage_stack, holo_stacks, world.time) - -/datum/ammo/bullet/smartgun/holo_target/ap - name = "armor-piercing smartgun bullet" - icon_state = "bullet" - - accurate_range = 12 - accuracy = HIT_ACCURACY_TIER_2 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_8 - damage_armor_punch = 1 - -/datum/ammo/bullet/smartgun/m56_fpw - name = "\improper M56 FPW bullet" - icon_state = "redbullet" - flags_ammo_behavior = AMMO_BALLISTIC - - max_range = 7 - accuracy = HIT_ACCURACY_TIER_7 - damage = 35 - penetration = ARMOR_PENETRATION_TIER_1 - -/datum/ammo/bullet/turret - name = "autocannon bullet" - icon_state = "redbullet" //Red bullets to indicate friendly fire restriction - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_IGNORE_COVER - - accurate_range = 22 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 - max_range = 22 - damage = 30 - penetration = ARMOR_PENETRATION_TIER_7 - damage_armor_punch = 0 - pen_armor_punch = 0 - shell_speed = 2*AMMO_SPEED_TIER_6 - accuracy = HIT_ACCURACY_TIER_5 - -/datum/ammo/bullet/turret/dumb - icon_state = "bullet" - flags_ammo_behavior = AMMO_BALLISTIC - -/datum/ammo/bullet/machinegun //Adding this for the MG Nests (~Art) - name = "machinegun bullet" - icon_state = "bullet" // Keeping it bog standard with the turret but allows it to be changed - - accurate_range = 12 - damage = 35 - penetration= ARMOR_PENETRATION_TIER_10 //Bumped the penetration to serve a different role from sentries, MGs are a bit more offensive - accuracy = HIT_ACCURACY_TIER_3 - -/datum/ammo/bullet/machinegun/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff) - )) - -/datum/ammo/bullet/machinegun/auto // for M2C, automatic variant for M56D, stats for bullet should always be moderately overtuned to fulfill its ultra-offense + flank-push purpose - name = "heavy machinegun bullet" - - accurate_range = 10 - damage = 50 - penetration = ARMOR_PENETRATION_TIER_6 - accuracy = -HIT_ACCURACY_TIER_2 // 75 accuracy - shell_speed = AMMO_SPEED_TIER_2 - max_range = 15 - effective_range_max = 7 - damage_falloff = DAMAGE_FALLOFF_TIER_8 - -/datum/ammo/bullet/machinegun/auto/set_bullet_traits() - return - -/datum/ammo/bullet/minigun - name = "minigun bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = -HIT_ACCURACY_TIER_3 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 12 - damage = 35 - penetration = ARMOR_PENETRATION_TIER_6 - -/datum/ammo/bullet/minigun/New() - ..() - if(SSticker.mode && MODE_HAS_FLAG(MODE_FACTION_CLASH)) - damage = 15 - else if(SSticker.current_state < GAME_STATE_PLAYING) - RegisterSignal(SSdcs, COMSIG_GLOB_MODE_PRESETUP, PROC_REF(setup_hvh_damage)) - -/datum/ammo/bullet/minigun/proc/setup_hvh_damage() - if(MODE_HAS_FLAG(MODE_FACTION_CLASH)) - damage = 15 - -/datum/ammo/bullet/minigun/tank - accuracy = -HIT_ACCURACY_TIER_1 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_8 - accurate_range = 12 - -/datum/ammo/bullet/m60 - name = "M60 bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = HIT_ACCURACY_TIER_2 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 12 - damage = 45 //7.62x51 is scary - penetration= ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/datum/ammo/bullet/pkp - name = "machinegun bullet" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - - accuracy = HIT_ACCURACY_TIER_1 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_8 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 14 - damage = 35 - penetration= ARMOR_PENETRATION_TIER_6 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - -/* -//====== - Rocket Ammo -//====== -*/ - -/datum/ammo/rocket - name = "high explosive rocket" - icon_state = "missile" - ping = null //no bounce off. - sound_bounce = "rocket_bounce" - damage_falloff = 0 - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE - var/datum/effect_system/smoke_spread/smoke - - accuracy = HIT_ACCURACY_TIER_2 - accurate_range = 7 - max_range = 7 - damage = 15 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/rocket/New() - ..() - smoke = new() - -/datum/ammo/rocket/Destroy() - qdel(smoke) - smoke = null - . = ..() - -/datum/ammo/rocket/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(get_turf(M), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, get_turf(M)) - if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. - M.ex_act(350, P.dir, P.weapon_cause_data, 100) - smoke.start() - -/datum/ammo/rocket/on_hit_obj(obj/O, obj/projectile/P) - cell_explosion(get_turf(O), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, get_turf(O)) - smoke.start() - -/datum/ammo/rocket/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(T, 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 150, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, get_turf(P)) - smoke.start() - -/datum/ammo/rocket/ap - name = "anti-armor rocket" - damage_falloff = 0 - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET - - accuracy = HIT_ACCURACY_TIER_8 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_9 - accurate_range = 6 - max_range = 6 - damage = 10 - penetration= ARMOR_PENETRATION_TIER_10 - -/datum/ammo/rocket/ap/on_hit_mob(mob/M, obj/projectile/P) - var/turf/T = get_turf(M) - M.ex_act(150, P.dir, P.weapon_cause_data, 100) - M.apply_effect(2, WEAKEN) - M.apply_effect(2, PARALYZE) - if(ishuman_strict(M)) // No yautya or synths. Makes humans gib on direct hit. - M.ex_act(300, P.dir, P.weapon_cause_data, 100) - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/on_hit_obj(obj/O, obj/projectile/P) - var/turf/T = get_turf(O) - O.ex_act(150, P.dir, P.weapon_cause_data, 100) - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/on_hit_turf(turf/T, obj/projectile/P) - var/hit_something = 0 - for(var/mob/M in T) - M.ex_act(150, P.dir, P.weapon_cause_data, 100) - M.apply_effect(4, WEAKEN) - M.apply_effect(4, PARALYZE) - hit_something = 1 - continue - if(!hit_something) - for(var/obj/O in T) - if(O.density) - O.ex_act(150, P.dir, P.weapon_cause_data, 100) - hit_something = 1 - continue - if(!hit_something) - T.ex_act(150, P.dir, P.weapon_cause_data, 200) - - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/do_at_max_range(obj/projectile/P) - var/turf/T = get_turf(P) - var/hit_something = 0 - for(var/mob/M in T) - M.ex_act(250, P.dir, P.weapon_cause_data, 100) - M.apply_effect(2, WEAKEN) - M.apply_effect(2, PARALYZE) - hit_something = 1 - continue - if(!hit_something) - for(var/obj/O in T) - if(O.density) - O.ex_act(250, P.dir, P.weapon_cause_data, 100) - hit_something = 1 - continue - if(!hit_something) - T.ex_act(250, P.dir, P.weapon_cause_data) - cell_explosion(T, 100, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - smoke.set_up(1, T) - smoke.start() - -/datum/ammo/rocket/ap/anti_tank - name = "anti-tank rocket" - damage = 100 - var/vehicle_slowdown_time = 5 SECONDS - shrapnel_chance = 5 - shrapnel_type = /obj/item/large_shrapnel/at_rocket_dud - -/datum/ammo/rocket/ap/anti_tank/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/vehicle/multitile)) - var/obj/vehicle/multitile/M = O - M.next_move = world.time + vehicle_slowdown_time - playsound(M, 'sound/effects/meteorimpact.ogg', 35) - M.at_munition_interior_explosion_effect(cause_data = create_cause_data("Anti-Tank Rocket")) - M.interior_crash_effect() - var/turf/T = get_turf(M.loc) - M.ex_act(150, P.dir, P.weapon_cause_data, 100) - smoke.set_up(1, T) - smoke.start() - return - return ..() - - -/datum/ammo/rocket/ltb - name = "cannon round" - icon_state = "ltb" - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_ROCKET|AMMO_STRIKES_SURFACE - - accuracy = HIT_ACCURACY_TIER_3 - accurate_range = 32 - max_range = 32 - damage = 25 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/rocket/ltb/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(get_turf(M), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(M), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/ltb/on_hit_obj(obj/O, obj/projectile/P) - cell_explosion(get_turf(O), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(O), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/ltb/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(get_turf(T), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(T), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/ltb/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 220, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - cell_explosion(get_turf(P), 200, 100, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/rocket/wp - name = "white phosphorous rocket" - flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE - damage_type = BURN - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 8 - damage = 90 - max_range = 8 - -/datum/ammo/rocket/wp/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/rocket/wp/drop_flame(turf/T, datum/cause_data/cause_data) - playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) - if(!istype(T)) return - smoke.set_up(1, T) - smoke.start() - var/datum/reagent/napalm/blue/R = new() - new /obj/flamer_fire(T, cause_data, R, 3) - - var/datum/effect_system/smoke_spread/phosphorus/landingSmoke = new /datum/effect_system/smoke_spread/phosphorus - landingSmoke.set_up(3, 0, T, null, 6, cause_data) - landingSmoke.start() - landingSmoke = null - -/datum/ammo/rocket/wp/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - -/datum/ammo/rocket/wp/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - -/datum/ammo/rocket/wp/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - -/datum/ammo/rocket/wp/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp - name = "extreme-intensity incendiary rocket" - flags_ammo_behavior = AMMO_ROCKET|AMMO_EXPLOSIVE|AMMO_STRIKES_SURFACE - damage_type = BURN - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 8 - damage = 150 - max_range = 10 - -/datum/ammo/rocket/wp/upp/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/rocket/wp/upp/drop_flame(turf/T, datum/cause_data/cause_data) - playsound(T, 'sound/weapons/gun_flamethrower3.ogg', 75, 1, 7) - if(!istype(T)) return - smoke.set_up(1, T) - smoke.start() - var/datum/reagent/napalm/upp/R = new() - new /obj/flamer_fire(T, cause_data, R, 3) - -/datum/ammo/rocket/wp/upp/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - -/datum/ammo/rocket/wp/upp/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad - name = "thermobaric rocket" - flags_ammo_behavior = AMMO_ROCKET|AMMO_STRIKES_SURFACE - - damage = 100 - max_range = 32 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/rocket/wp/quad/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/wp/quad/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - explosion(P.loc, -1, 2, 4, 5, , , ,P.weapon_cause_data) - -/datum/ammo/rocket/custom - name = "custom rocket" - -/datum/ammo/rocket/custom/proc/prime(atom/A, obj/projectile/P) - var/obj/item/weapon/gun/launcher/rocket/launcher = P.shot_from - var/obj/item/ammo_magazine/rocket/custom/rocket = launcher.current_mag - if(rocket.locked && rocket.warhead && rocket.warhead.detonator) - if(rocket.fuel && rocket.fuel.reagents.get_reagent_amount(rocket.fuel_type) >= rocket.fuel_requirement) - rocket.forceMove(P.loc) - rocket.warhead.cause_data = P.weapon_cause_data - rocket.warhead.prime() - qdel(rocket) - smoke.set_up(1, get_turf(A)) - smoke.start() - -/datum/ammo/rocket/custom/on_hit_mob(mob/M, obj/projectile/P) - prime(M, P) - -/datum/ammo/rocket/custom/on_hit_obj(obj/O, obj/projectile/P) - prime(O, P) - -/datum/ammo/rocket/custom/on_hit_turf(turf/T, obj/projectile/P) - prime(T, P) - -/datum/ammo/rocket/custom/do_at_max_range(obj/projectile/P) - prime(null, P) - -/* -//====== - Energy Ammo -//====== -*/ - -/datum/ammo/energy - ping = null //no bounce off. We can have one later. - sound_hit = "energy_hit" - sound_miss = "energy_miss" - sound_bounce = "energy_bounce" - - damage_type = BURN - flags_ammo_behavior = AMMO_ENERGY - - accuracy = HIT_ACCURACY_TIER_4 - -/datum/ammo/energy/emitter //Damage is determined in emitter.dm - name = "emitter bolt" - icon_state = "emitter" - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_ARMOR - - accurate_range = 6 - max_range = 6 - -/datum/ammo/energy/taser - name = "taser bolt" - icon_state = "stun" - damage_type = OXY - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_ALWAYS_FF //Not that ignoring will do much right now. - - stamina_damage = 45 - accuracy = HIT_ACCURACY_TIER_8 - shell_speed = AMMO_SPEED_TIER_1 // Slightly faster - hit_effect_color = "#FFFF00" - -/datum/ammo/energy/taser/on_hit_mob(mob/M, obj/projectile/P) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.disable_special_items() // Disables scout cloak - -/datum/ammo/energy/taser/precise - name = "precise taser bolt" - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST|AMMO_MP - -/datum/ammo/energy/rxfm_eva - name = "laser blast" - icon_state = "laser_new" - flags_ammo_behavior = AMMO_LASER - accurate_range = 14 - max_range = 22 - damage = 45 - stamina_damage = 25 //why not - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/energy/rxfm_eva/on_hit_mob(mob/living/M, obj/projectile/P) - ..() - if(prob(10)) //small chance for one to ignite on hit - M.fire_act() - -/datum/ammo/energy/laz_uzi - name = "laser bolt" - icon_state = "laser_new" - flags_ammo_behavior = AMMO_ENERGY - damage = 40 - accurate_range = 5 - effective_range_max = 7 - max_range = 10 - shell_speed = AMMO_SPEED_TIER_4 - scatter = SCATTER_AMOUNT_TIER_6 - accuracy = HIT_ACCURACY_TIER_3 - damage_falloff = DAMAGE_FALLOFF_TIER_8 - -/datum/ammo/energy/yautja - headshot_state = HEADSHOT_OVERLAY_MEDIUM - accurate_range = 12 - shell_speed = AMMO_SPEED_TIER_3 - damage_type = BURN - flags_ammo_behavior = AMMO_IGNORE_RESIST - -/datum/ammo/energy/yautja/pistol - name = "plasma pistol bolt" - icon_state = "ion" - - damage = 40 - shell_speed = AMMO_SPEED_TIER_2 - -/datum/ammo/energy/yautja/pistol/incendiary - damage = 10 - -/datum/ammo/energy/yautja/pistol/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shrapnel/plasma - name = "plasma wave" - shrapnel_chance = 0 - penetration = ARMOR_PENETRATION_TIER_10 - accuracy = HIT_ACCURACY_TIER_MAX - damage = 15 - icon_state = "shrapnel_plasma" - damage_type = BURN - -/datum/ammo/bullet/shrapnel/plasma/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) - hit_mob.apply_effect(2, WEAKEN) - -/datum/ammo/energy/yautja/caster - name = "root caster bolt" - icon_state = "ion" - -/datum/ammo/energy/yautja/caster/stun - name = "low power stun bolt" - debilitate = list(2,2,0,0,0,1,0,0) - - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - -/datum/ammo/energy/yautja/caster/bolt - name = "plasma bolt" - icon_state = "pulse1" - flags_ammo_behavior = AMMO_IGNORE_RESIST - shell_speed = AMMO_SPEED_TIER_6 - damage = 35 - -/datum/ammo/energy/yautja/caster/bolt/stun - name = "high power stun bolt" - var/stun_time = 2 - - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - -/datum/ammo/energy/yautja/caster/bolt/stun/on_hit_mob(mob/M, obj/projectile/P) - var/mob/living/carbon/C = M - var/stun_time = src.stun_time - if(istype(C)) - if(isyautja(C) || ispredalien(C)) - return - to_chat(C, SPAN_DANGER("An electric shock ripples through your body, freezing you in place!")) - log_attack("[key_name(C)] was stunned by a high power stun bolt from [key_name(P.firer)] at [get_area(P)]") - - if(ishuman(C)) - var/mob/living/carbon/human/H = C - stun_time++ - H.apply_effect(stun_time, WEAKEN) - else - M.apply_effect(stun_time, WEAKEN) - - C.apply_effect(stun_time, STUN) - ..() - -/datum/ammo/energy/yautja/caster/sphere - name = "plasma eradicator" - icon_state = "bluespace" - flags_ammo_behavior = AMMO_EXPLOSIVE|AMMO_HITS_TARGET_TURF - shell_speed = AMMO_SPEED_TIER_4 - accuracy = HIT_ACCURACY_TIER_8 - - damage = 55 - - accurate_range = 8 - max_range = 8 - - var/vehicle_slowdown_time = 5 SECONDS - -/datum/ammo/energy/yautja/caster/sphere/on_hit_mob(mob/M, obj/projectile/P) - cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/on_hit_turf(turf/T, obj/projectile/P) - cell_explosion(P, 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/vehicle/multitile)) - var/obj/vehicle/multitile/multitile_vehicle = O - multitile_vehicle.next_move = world.time + vehicle_slowdown_time - playsound(multitile_vehicle, 'sound/effects/meteorimpact.ogg', 35) - multitile_vehicle.at_munition_interior_explosion_effect(cause_data = create_cause_data("Plasma Eradicator", P.firer)) - multitile_vehicle.interior_crash_effect() - multitile_vehicle.ex_act(150, P.dir, P.weapon_cause_data, 100) - cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - -/datum/ammo/energy/yautja/caster/sphere/do_at_max_range(obj/projectile/P) - cell_explosion(get_turf(P), 170, 50, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, P.weapon_cause_data) - - -/datum/ammo/energy/yautja/caster/sphere/stun - name = "plasma immobilizer" - damage = 0 - flags_ammo_behavior = AMMO_ENERGY|AMMO_IGNORE_RESIST - accurate_range = 20 - max_range = 20 - - var/stun_range = 4 // Big - var/stun_time = 6 - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_mob(mob/M, obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_turf(turf/T,obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/on_hit_obj(obj/O,obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/do_at_max_range(obj/projectile/P) - do_area_stun(P) - -/datum/ammo/energy/yautja/caster/sphere/stun/proc/do_area_stun(obj/projectile/P) - playsound(P, 'sound/weapons/wave.ogg', 75, 1, 25) - for (var/mob/living/carbon/M in view(src.stun_range, get_turf(P))) - var/stun_time = src.stun_time - log_attack("[key_name(M)] was stunned by a plasma immobilizer from [key_name(P.firer)] at [get_area(P)]") - if (isyautja(M)) - stun_time -= 2 - if(ispredalien(M)) - continue - to_chat(M, SPAN_DANGER("A powerful electric shock ripples through your body, freezing you in place!")) - M.apply_effect(stun_time, STUN) - - if (ishuman(M)) - var/mob/living/carbon/human/H = M - H.apply_effect(stun_time, WEAKEN) - else - M.apply_effect(stun_time, WEAKEN) - -/datum/ammo/energy/yautja/rifle/bolt - name = "plasma rifle bolt" - icon_state = "ion" - damage_type = BURN - debilitate = list(0,2,0,0,0,0,0,0) - flags_ammo_behavior = AMMO_IGNORE_RESIST - - damage = 55 - penetration = ARMOR_PENETRATION_TIER_10 - -/datum/ammo/energy/yautja/rifle/bolt/on_hit_mob(mob/hit_mob, obj/projectile/hit_projectile) - if(isxeno(hit_mob)) - var/mob/living/carbon/xenomorph/xeno = hit_mob - xeno.apply_damage(damage * 0.75, BURN) - xeno.interference = 30 - -/* -//====== - Xeno Spits -//====== -*/ -/datum/ammo/xeno - icon_state = "neurotoxin" - ping = "ping_x" - damage_type = TOX - flags_ammo_behavior = AMMO_XENO - - ///used to make cooldown of the different spits vary. - var/added_spit_delay = 0 - var/spit_cost - - /// Should there be a windup for this spit? - var/spit_windup = FALSE - - /// Should there be an additional warning while winding up? (do not put to true if there is not a windup) - var/pre_spit_warn = FALSE - accuracy = HIT_ACCURACY_TIER_8*2 - max_range = 12 - -/datum/ammo/xeno/toxin - name = "neurotoxic spit" - damage_falloff = 0 - flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST - spit_cost = 25 - var/effect_power = XENO_NEURO_TIER_4 - var/datum/callback/neuro_callback - - shell_speed = AMMO_SPEED_TIER_3 - max_range = 7 - -/datum/ammo/xeno/toxin/New() - ..() - - neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_neuro)) - -/proc/apply_neuro(mob/M, power, insta_neuro) - if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX) && !insta_neuro) - M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) - return //endurance 5 makes you immune to weak neurotoxin - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) - H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) - return //species like zombies or synths are immune to neurotoxin - - if(!isxeno(M)) - if(insta_neuro) - if(M.knocked_down < 3) - M.adjust_effect(1 * power, WEAKEN) - return - - if(ishuman(M)) - M.apply_effect(2.5, SUPERSLOW) - M.visible_message(SPAN_DANGER("[M]'s movements are slowed.")) - - var/no_clothes_neuro = FALSE - - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.wear_suit || H.wear_suit.slowdown == 0) - no_clothes_neuro = TRUE - - if(no_clothes_neuro) - if(M.knocked_down < 5) - M.adjust_effect(1 * power, WEAKEN) // KD them a bit more - M.visible_message(SPAN_DANGER("[M] falls prone.")) - -/proc/apply_scatter_neuro(mob/M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(skillcheck(M, SKILL_ENDURANCE, SKILL_ENDURANCE_MAX)) - M.visible_message(SPAN_DANGER("[M] withstands the neurotoxin!")) - return //endurance 5 makes you immune to weak neuro - if(H.chem_effect_flags & CHEM_EFFECT_RESIST_NEURO || H.species.flags & NO_NEURO) - H.visible_message(SPAN_DANGER("[M] shrugs off the neurotoxin!")) - return - - if(M.knocked_down < 0.7) // apply knockdown only if current knockdown is less than 0.7 second - M.apply_effect(0.7, WEAKEN) - M.visible_message(SPAN_DANGER("[M] falls prone.")) - -/datum/ammo/xeno/toxin/on_hit_mob(mob/M,obj/projectile/P) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.status_flags & XENO_HOST) - neuro_callback.Invoke(H, effect_power, TRUE) - return - - neuro_callback.Invoke(M, effect_power, FALSE) - -/datum/ammo/xeno/toxin/medium //Spitter - name = "neurotoxic spatter" - spit_cost = 50 - effect_power = 1 - - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/xeno/toxin/queen - name = "neurotoxic spit" - spit_cost = 50 - effect_power = 2 - - accuracy = HIT_ACCURACY_TIER_5*2 - max_range = 6 - 1 - -/datum/ammo/xeno/toxin/queen/on_hit_mob(mob/M,obj/projectile/P) - neuro_callback.Invoke(M, effect_power, TRUE) - -/datum/ammo/xeno/toxin/shotgun - name = "neurotoxic droplet" - flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST - bonus_projectiles_type = /datum/ammo/xeno/toxin/shotgun/additional - - accuracy_var_low = PROJECTILE_VARIANCE_TIER_6 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_6 - accurate_range = 5 - max_range = 5 - scatter = SCATTER_AMOUNT_NEURO - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_4 - -/datum/ammo/xeno/toxin/shotgun/New() - ..() - - neuro_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(apply_scatter_neuro)) - -/datum/ammo/xeno/toxin/shotgun/additional - name = "additional neurotoxic droplets" - - bonus_projectiles_amount = 0 - -/*proc/neuro_flak(turf/T, obj/projectile/P, datum/callback/CB, power, insta_neuro, radius) - if(!T) return FALSE - var/firer = P.firer - var/hit_someone = FALSE - for(var/mob/living/carbon/M in orange(radius,T)) - if(isxeno(M) && isxeno(firer) && M:hivenumber == firer:hivenumber) - continue - - if(HAS_TRAIT(M, TRAIT_NESTED)) - continue - - hit_someone = TRUE - CB.Invoke(M, power, insta_neuro) - - P.play_hit_effect(M) - - return hit_someone - -/datum/ammo/xeno/toxin/burst //sentinel burst - name = "neurotoxic air splash" - effect_power = XENO_NEURO_TIER_1 - spit_cost = 50 - flags_ammo_behavior = AMMO_XENO|AMMO_IGNORE_RESIST - -/datum/ammo/xeno/toxin/burst/on_hit_mob(mob/M, obj/projectile/P) - if(isxeno(M) && isxeno(P.firer) && M:hivenumber == P.firer:hivenumber) - neuro_callback.Invoke(M, effect_power*1.5, TRUE) - - neuro_flak(get_turf(M), P, neuro_callback, effect_power, FALSE, 1) - -/datum/ammo/xeno/toxin/burst/on_near_target(turf/T, obj/projectile/P) - return neuro_flak(T, P, neuro_callback, effect_power, FALSE, 1) - -/datum/ammo/xeno/sticky - name = "sticky resin spit" - icon_state = "sticky" - ping = null - flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE - added_spit_delay = 5 - spit_cost = 40 - - shell_speed = AMMO_SPEED_TIER_3 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 - max_range = 32 - -/datum/ammo/xeno/sticky/on_hit_mob(mob/M,obj/projectile/P) - drop_resin(get_turf(P)) - -/datum/ammo/xeno/sticky/on_hit_obj(obj/O,obj/projectile/P) - drop_resin(get_turf(P)) - -/datum/ammo/xeno/sticky/on_hit_turf(turf/T,obj/projectile/P) - drop_resin(T) - -/datum/ammo/xeno/sticky/do_at_max_range(obj/projectile/P) - drop_resin(get_turf(P)) - -/datum/ammo/xeno/sticky/proc/drop_resin(turf/T) - if(T.density) - return - - for(var/obj/O in T.contents) - if(istype(O, /obj/item/clothing/mask/facehugger)) - return - if(istype(O, /obj/effect/alien/egg)) - return - if(istype(O, /obj/structure/mineral_door) || istype(O, /obj/effect/alien/resin) || istype(O, /obj/structure/bed)) - return - if(O.density && !(O.flags_atom & ON_BORDER)) - return - - new /obj/effect/alien/resin/sticky/thin(T) */ - -/datum/ammo/xeno/acid - name = "acid spit" - icon_state = "xeno_acid" - sound_hit = "acid_hit" - sound_bounce = "acid_bounce" - damage_type = BURN - spit_cost = 25 - flags_ammo_behavior = AMMO_ACIDIC|AMMO_XENO - accuracy = HIT_ACCURACY_TIER_5 - damage = 20 - max_range = 8 // 7 will disappear on diagonals. i love shitcode - penetration = ARMOR_PENETRATION_TIER_2 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/xeno/acid/on_shield_block(mob/M, obj/projectile/P) - burst(M,P,damage_type) - -/datum/ammo/xeno/acid/on_hit_mob(mob/M, obj/projectile/P) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(C.status_flags & XENO_HOST && HAS_TRAIT(C, TRAIT_NESTED) || C.stat == DEAD) - return FALSE - ..() - -/datum/ammo/xeno/acid/spatter - name = "acid spatter" - - damage = 30 - max_range = 6 - -/datum/ammo/xeno/acid/spatter/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - if(. == FALSE) - return - - new /datum/effects/acid(M, P.firer) - -/datum/ammo/xeno/acid/praetorian - name = "acid splash" - - accuracy = HIT_ACCURACY_TIER_10 + HIT_ACCURACY_TIER_5 - max_range = 8 - damage = 30 - shell_speed = AMMO_SPEED_TIER_2 - added_spit_delay = 0 - -/datum/ammo/xeno/acid/dot - name = "acid spit" - -/datum/ammo/xeno/acid/prae_nade // Used by base prae's acid nade - name = "acid scatter" - - flags_ammo_behavior = AMMO_STOPPED_BY_COVER - accuracy = HIT_ACCURACY_TIER_5 - accurate_range = 32 - max_range = 4 - damage = 25 - shell_speed = AMMO_SPEED_TIER_1 - scatter = SCATTER_AMOUNT_TIER_6 - - apply_delegate = FALSE - -/datum/ammo/xeno/acid/prae_nade/on_hit_mob(mob/M, obj/projectile/P) - if (!ishuman(M)) - return - - var/mob/living/carbon/human/H = M - - var/datum/effects/prae_acid_stacks/PAS = null - for (var/datum/effects/prae_acid_stacks/prae_acid_stacks in H.effects_list) - PAS = prae_acid_stacks - break - - if (PAS == null) - PAS = new /datum/effects/prae_acid_stacks(H) - else - PAS.increment_stack_count() - -/*datum/ammo/xeno/prae_skillshot - name = "blob of acid" - icon_state = "boiler_gas2" - ping = "ping_x" - flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE|AMMO_IGNORE_RESIST - - accuracy = HIT_ACCURACY_TIER_5 - accurate_range = 32 - max_range = 8 - damage = 20 - damage_falloff = DAMAGE_FALLOFF_TIER_10 - shell_speed = AMMO_SPEED_TIER_1 - scatter = SCATTER_AMOUNT_TIER_10 - -/datum/ammo/xeno/prae_skillshot/on_hit_mob(mob/M, obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/on_hit_obj(obj/O, obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/on_hit_turf(turf/T, obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/do_at_max_range(obj/projectile/P) - acid_stacks_aoe(get_turf(P)) - -/datum/ammo/xeno/prae_skillshot/proc/acid_stacks_aoe(turf/T) - - if (!istype(T)) - return - - for (var/mob/living/carbon/human/H in orange(1, T)) - to_chat(H, SPAN_XENODANGER("You are spattered with acid!")) - animation_flash_color(H) - var/datum/effects/prae_acid_stacks/PAS = null - for (var/datum/effects/prae_acid_stacks/prae_acid_stacks in H.effects_list) - PAS = prae_acid_stacks - break - - if (PAS == null) - PAS = new /datum/effects/prae_acid_stacks(H) - PAS.increment_stack_count() - else - PAS.increment_stack_count() - PAS.increment_stack_count() */ - -/datum/ammo/xeno/boiler_gas - name = "glob of neuro gas" - icon_state = "neuro_glob" - ping = "ping_x" - debilitate = list(2,2,0,1,11,12,1,10) // Stun,knockdown,knockout,irradiate,stutter,eyeblur,drowsy,agony - flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_EXPLOSIVE|AMMO_IGNORE_RESIST|AMMO_HITS_TARGET_TURF|AMMO_ACIDIC - var/datum/effect_system/smoke_spread/smoke_system - spit_cost = 200 - pre_spit_warn = TRUE - spit_windup = 5 SECONDS - accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_4 - accuracy = HIT_ACCURACY_TIER_2 - scatter = SCATTER_AMOUNT_TIER_4 - shell_speed = 0.75 - max_range = 16 - /// range on the smoke in tiles from center - var/smokerange = 4 - var/lifetime_mult = 1.0 - -/datum/ammo/xeno/boiler_gas/New() - ..() - set_xeno_smoke() - -/datum/ammo/xeno/boiler_gas/Destroy() - qdel(smoke_system) - smoke_system = null - . = ..() - -/datum/ammo/xeno/boiler_gas/on_hit_mob(mob/moob, obj/projectile/proj) - if(iscarbon(moob)) - var/mob/living/carbon/carbon = moob - if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) - return - var/datum/effects/neurotoxin/neuro_effect = locate() in moob.effects_list - if(!neuro_effect) - neuro_effect = new /datum/effects/neurotoxin(moob, proj.firer) - neuro_effect.duration += 5 - moob.apply_effect(3, DAZE) - to_chat(moob, SPAN_HIGHDANGER("Neurotoxic liquid spreads all over you and immediately soaks into your pores and orifices! Oh fuck!")) // Fucked up but have a chance to escape rather than being game-ended - drop_nade(get_turf(proj), proj,TRUE) - -/datum/ammo/xeno/boiler_gas/on_hit_obj(obj/outbacksteakhouse, obj/projectile/proj) - drop_nade(get_turf(proj), proj) - -/datum/ammo/xeno/boiler_gas/on_hit_turf(turf/Turf, obj/projectile/proj) - if(Turf.density && isturf(proj.loc)) - drop_nade(proj.loc, proj) //we don't want the gas globs to land on dense turfs, they block smoke expansion. - else - drop_nade(Turf, proj) - -/datum/ammo/xeno/boiler_gas/do_at_max_range(obj/projectile/proj) - drop_nade(get_turf(proj), proj) - -/datum/ammo/xeno/boiler_gas/proc/set_xeno_smoke(obj/projectile/proj) - smoke_system = new /datum/effect_system/smoke_spread/xeno_weaken() - -/datum/ammo/xeno/boiler_gas/proc/drop_nade(turf/turf, obj/projectile/proj) - var/lifetime_mult = 1.0 - var/datum/cause_data - if(isboiler(proj.firer)) - cause_data = proj.weapon_cause_data - smoke_system.set_up(smokerange, 0, turf, new_cause_data = cause_data) - smoke_system.lifetime = 12 * lifetime_mult - smoke_system.start() - turf.visible_message(SPAN_DANGER("A glob of acid lands with a splat and explodes into noxious fumes!")) - - -/datum/ammo/xeno/boiler_gas/acid - name = "glob of acid gas" - icon_state = "acid_glob" - ping = "ping_x" - accuracy_var_high = PROJECTILE_VARIANCE_TIER_4 - smokerange = 3 - - -/datum/ammo/xeno/boiler_gas/acid/set_xeno_smoke(obj/projectile/proj) - smoke_system = new /datum/effect_system/smoke_spread/xeno_acid() - -/datum/ammo/xeno/boiler_gas/acid/on_hit_mob(mob/moob, obj/projectile/proj) - if(iscarbon(moob)) - var/mob/living/carbon/carbon = moob - if(carbon.status_flags & XENO_HOST && HAS_TRAIT(carbon, TRAIT_NESTED) || carbon.stat == DEAD) - return - to_chat(moob,SPAN_HIGHDANGER("Acid covers your body! Oh fuck!")) - playsound(moob,"acid_strike",75,1) - INVOKE_ASYNC(moob, TYPE_PROC_REF(/mob, emote), "pain") // why do I need this bullshit - new /datum/effects/acid(moob, proj.firer) - drop_nade(get_turf(proj), proj,TRUE) - -/datum/ammo/xeno/bone_chips - name = "bone chips" - icon_state = "shrapnel_light" - ping = null - flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR - damage_type = BRUTE - bonus_projectiles_type = /datum/ammo/xeno/bone_chips/spread - - damage = 8 - max_range = 6 - accuracy = HIT_ACCURACY_TIER_8 - accuracy_var_low = PROJECTILE_VARIANCE_TIER_7 - accuracy_var_high = PROJECTILE_VARIANCE_TIER_7 - bonus_projectiles_amount = EXTRA_PROJECTILES_TIER_7 - shrapnel_type = /obj/item/shard/shrapnel/bone_chips - shrapnel_chance = 60 - -/datum/ammo/xeno/bone_chips/on_hit_mob(mob/M, obj/projectile/P) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) - return - if(ishuman_strict(M) || isxeno(M)) - playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) - if(M.slowed < 3) - M.apply_effect(3, SLOW) - -/datum/ammo/xeno/bone_chips/spread - name = "small bone chips" - - scatter = 30 // We want a wild scatter angle - max_range = 5 - bonus_projectiles_amount = 0 - -/datum/ammo/xeno/bone_chips/spread/short_range - name = "small bone chips" - - max_range = 3 // Very short range - -/datum/ammo/xeno/bone_chips/spread/runner_skillshot - name = "bone chips" - - scatter = 0 - max_range = 5 - damage = 10 - shrapnel_chance = 0 - -/datum/ammo/xeno/bone_chips/spread/runner/on_hit_mob(mob/M, obj/projectile/P) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if((HAS_FLAG(C.status_flags, XENO_HOST) && HAS_TRAIT(C, TRAIT_NESTED)) || C.stat == DEAD) - return - if(ishuman_strict(M) || isxeno(M)) - playsound(M, 'sound/effects/spike_hit.ogg', 25, 1, 1) - if(M.slowed < 6) - M.apply_effect(6, SLOW) - -/datum/ammo/xeno/oppressor_tail - name = "tail hook" - icon_state = "none" - ping = null - flags_ammo_behavior = AMMO_XENO|AMMO_SKIPS_ALIENS|AMMO_STOPPED_BY_COVER|AMMO_IGNORE_ARMOR - damage_type = BRUTE - - damage = XENO_DAMAGE_TIER_5 - max_range = 4 - accuracy = HIT_ACCURACY_TIER_MAX - -/datum/ammo/xeno/oppressor_tail/on_bullet_generation(obj/projectile/generated_projectile, mob/bullet_generator) - //The projectile has no icon, so the overlay shows up in FRONT of the projectile, and the beam connects to it in the middle. - var/image/hook_overlay = new(icon = 'icons/effects/beam.dmi', icon_state = "oppressor_tail_hook", layer = BELOW_MOB_LAYER) - generated_projectile.overlays += hook_overlay - -/datum/ammo/xeno/oppressor_tail/on_hit_mob(mob/target, obj/projectile/fired_proj) - var/mob/living/carbon/xenomorph/xeno_firer = fired_proj.firer - if(xeno_firer.can_not_harm(target)) - return - - shake_camera(target, 5, 0.1 SECONDS) - var/obj/effect/beam/tail_beam = fired_proj.firer.beam(target, "oppressor_tail", 'icons/effects/beam.dmi', 0.5 SECONDS, 5) - var/image/tail_image = image('icons/effects/status_effects.dmi', "hooked") - target.overlays += tail_image - - new /datum/effects/xeno_slow(target, fired_proj.firer, ttl = 0.5 SECONDS) - target.apply_effect(0.5, STUN) - INVOKE_ASYNC(target, TYPE_PROC_REF(/atom/movable, throw_atom), fired_proj.firer, get_dist(fired_proj.firer, target)-1, SPEED_VERY_FAST) - - qdel(tail_beam) - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/ammo/xeno/oppressor_tail, remove_tail_overlay), target, tail_image), 0.5 SECONDS) //needed so it can actually be seen as it gets deleted too quickly otherwise. - -/datum/ammo/xeno/oppressor_tail/proc/remove_tail_overlay(mob/overlayed_mob, image/tail_image) - overlayed_mob.overlays -= tail_image - -/* -//====== - Shrapnel -//====== -*/ -/datum/ammo/bullet/shrapnel - name = "shrapnel" - icon_state = "buckshot" - accurate_range_min = 5 - flags_ammo_behavior = AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER - - accuracy = HIT_ACCURACY_TIER_3 - accurate_range = 32 - max_range = 8 - damage = 25 - damage_var_low = -PROJECTILE_VARIANCE_TIER_6 - damage_var_high = PROJECTILE_VARIANCE_TIER_6 - penetration = ARMOR_PENETRATION_TIER_4 - shell_speed = AMMO_SPEED_TIER_2 - shrapnel_chance = 5 - -/datum/ammo/bullet/shrapnel/on_hit_obj(obj/O, obj/projectile/P) - if(istype(O, /obj/structure/barricade)) - var/obj/structure/barricade/B = O - B.health -= rand(2, 5) - B.update_health(1) - -/datum/ammo/bullet/shrapnel/rubber - name = "rubber pellets" - icon_state = "rubber_pellets" - flags_ammo_behavior = AMMO_STOPPED_BY_COVER - - damage = 0 - stamina_damage = 25 - shrapnel_chance = 0 - - -/datum/ammo/bullet/shrapnel/hornet_rounds - name = ".22 hornet round" - icon_state = "hornet_round" - flags_ammo_behavior = AMMO_BALLISTIC - damage = 20 - shrapnel_chance = 0 - shell_speed = AMMO_SPEED_TIER_3//she fast af boi - penetration = ARMOR_PENETRATION_TIER_5 - -/datum/ammo/bullet/shrapnel/hornet_rounds/on_hit_mob(mob/M, obj/projectile/P) - . = ..() - M.AddComponent(/datum/component/bonus_damage_stack, 10, world.time) - -/datum/ammo/bullet/shrapnel/incendiary - name = "flaming shrapnel" - icon_state = "beanbag" // looks suprisingly a lot like flaming shrapnel chunks - flags_ammo_behavior = AMMO_STOPPED_BY_COVER - - shell_speed = AMMO_SPEED_TIER_1 - damage = 20 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/shrapnel/incendiary/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/bullet/shrapnel/metal - name = "metal shrapnel" - icon_state = "shrapnelshot_bit" - flags_ammo_behavior = AMMO_STOPPED_BY_COVER|AMMO_BALLISTIC - shell_speed = AMMO_SPEED_TIER_1 - damage = 30 - shrapnel_chance = 15 - accuracy = HIT_ACCURACY_TIER_8 - penetration = ARMOR_PENETRATION_TIER_4 - -/datum/ammo/bullet/shrapnel/light // weak shrapnel - name = "light shrapnel" - icon_state = "shrapnel_light" - - damage = 10 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_1 - shrapnel_chance = 0 - -/datum/ammo/bullet/shrapnel/light/human - name = "human bone fragments" - icon_state = "shrapnel_human" - - shrapnel_chance = 50 - shrapnel_type = /obj/item/shard/shrapnel/bone_chips/human - -/datum/ammo/bullet/shrapnel/light/human/var1 // sprite variants - icon_state = "shrapnel_human1" - -/datum/ammo/bullet/shrapnel/light/human/var2 // sprite variants - icon_state = "shrapnel_human2" - -/datum/ammo/bullet/shrapnel/light/xeno - name = "alien bone fragments" - icon_state = "shrapnel_xeno" - - shrapnel_chance = 50 - shrapnel_type = /obj/item/shard/shrapnel/bone_chips/xeno - -/datum/ammo/bullet/shrapnel/spall // weak shrapnel - name = "spall" - icon_state = "shrapnel_light" - - damage = 10 - penetration = ARMOR_PENETRATION_TIER_1 - shell_speed = AMMO_SPEED_TIER_1 - shrapnel_chance = 0 - -/datum/ammo/bullet/shrapnel/light/glass - name = "glass shrapnel" - icon_state = "shrapnel_glass" - -/datum/ammo/bullet/shrapnel/light/effect/ // no damage, but looks bright and neat - name = "sparks" - - damage = 1 // Tickle tickle - -/datum/ammo/bullet/shrapnel/light/effect/ver1 - icon_state = "shrapnel_bright1" - -/datum/ammo/bullet/shrapnel/light/effect/ver2 - icon_state = "shrapnel_bright2" - -/datum/ammo/bullet/shrapnel/jagged - shrapnel_chance = SHRAPNEL_CHANCE_TIER_2 - accuracy = HIT_ACCURACY_TIER_MAX - -/datum/ammo/bullet/shrapnel/jagged/on_hit_mob(mob/M, obj/projectile/P) - if(isxeno(M)) - M.apply_effect(0.4, SLOW) - -/* -//======== - CAS 30mm impacters -//======== -*/ -/datum/ammo/bullet/shrapnel/gau //for the GAU to have a impact bullet instead of firecrackers - name = "30mm Multi-Purpose shell" - - damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. - damage_type = BRUTE - penetration = ARMOR_PENETRATION_TIER_2 - accuracy = HIT_ACCURACY_TIER_MAX - max_range = 0 - shrapnel_chance = 100 //the least of your problems - -/datum/ammo/bullet/shrapnel/gau/at - name = "30mm Anti-Tank shell" - - damage = 1 // ALL DAMAGE IS IN dropship_ammo SO WE CAN DEAL DAMAGE TO RESTING MOBS, these will still remain however so that we can get cause_data and status effects. - penetration = ARMOR_PENETRATION_TIER_8 - accuracy = HIT_ACCURACY_TIER_MAX -/* -//====== - Misc Ammo -//====== -*/ - -/datum/ammo/alloy_spike - name = "alloy spike" - headshot_state = HEADSHOT_OVERLAY_MEDIUM - ping = "ping_s" - icon_state = "MSpearFlight" - sound_hit = "alloy_hit" - sound_armor = "alloy_armor" - sound_bounce = "alloy_bounce" - - accuracy = HIT_ACCURACY_TIER_8 - accurate_range = 12 - max_range = 12 - damage = 30 - penetration= ARMOR_PENETRATION_TIER_10 - shrapnel_chance = SHRAPNEL_CHANCE_TIER_7 - shrapnel_type = /obj/item/shard/shrapnel - -/datum/ammo/flamethrower - name = "flame" - icon_state = "pulse0" - damage_type = BURN - flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_HITS_TARGET_TURF - - max_range = 6 - damage = 35 - -/datum/ammo/flamethrower/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/flamethrower/on_hit_mob(mob/M, obj/projectile/P) - drop_flame(get_turf(M), P.weapon_cause_data) - -/datum/ammo/flamethrower/on_hit_obj(obj/O, obj/projectile/P) - drop_flame(get_turf(O), P.weapon_cause_data) - -/datum/ammo/flamethrower/on_hit_turf(turf/T, obj/projectile/P) - drop_flame(T, P.weapon_cause_data) - -/datum/ammo/flamethrower/do_at_max_range(obj/projectile/P) - drop_flame(get_turf(P), P.weapon_cause_data) - -/datum/ammo/flamethrower/tank_flamer - flamer_reagent_type = /datum/reagent/napalm/blue - -/datum/ammo/flamethrower/sentry_flamer - flags_ammo_behavior = AMMO_IGNORE_ARMOR|AMMO_IGNORE_COVER|AMMO_FLAME - flamer_reagent_type = /datum/reagent/napalm/blue - - accuracy = HIT_ACCURACY_TIER_8 - accurate_range = 6 - max_range = 12 - shell_speed = AMMO_SPEED_TIER_3 - -/datum/ammo/flamethrower/sentry_flamer/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/flamethrower/sentry_flamer/glob - max_range = 14 - accurate_range = 10 - var/datum/effect_system/smoke_spread/phosphorus/smoke - -/datum/ammo/flamethrower/sentry_flamer/glob/New() - . = ..() - smoke = new() - -/datum/ammo/flamethrower/sentry_flamer/glob/drop_flame(turf/T, datum/cause_data/cause_data) - if(!istype(T)) - return - smoke.set_up(1, 0, T, new_cause_data = cause_data) - smoke.start() - -/datum/ammo/flamethrower/sentry_flamer/glob/Destroy() - qdel(smoke) - return ..() - -/datum/ammo/flamethrower/sentry_flamer/mini - name = "normal fire" - -/datum/ammo/flamethrower/sentry_flamer/mini/drop_flame(turf/T, datum/cause_data/cause_data) - if(!istype(T)) - return - var/datum/reagent/napalm/ut/R = new() - R.durationfire = BURN_TIME_INSTANT - new /obj/flamer_fire(T, cause_data, R, 0) - -/datum/ammo/flare - name = "flare" - ping = null //no bounce off. - damage_type = BURN - flags_ammo_behavior = AMMO_HITS_TARGET_TURF - icon_state = "flare" - - damage = 15 - accuracy = HIT_ACCURACY_TIER_3 - max_range = 14 - shell_speed = AMMO_SPEED_TIER_3 - - var/flare_type = /obj/item/device/flashlight/flare/on/gun - handful_type = /obj/item/device/flashlight/flare - -/datum/ammo/flare/set_bullet_traits() - . = ..() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/flare/on_hit_mob(mob/M,obj/projectile/P) - drop_flare(get_turf(M), P, P.firer) - -/datum/ammo/flare/on_hit_obj(obj/O,obj/projectile/P) - drop_flare(get_turf(P), P, P.firer) - -/datum/ammo/flare/on_hit_turf(turf/T, obj/projectile/P) - if(T.density && isturf(P.loc)) - drop_flare(P.loc, P, P.firer) - else - drop_flare(T, P, P.firer) - -/datum/ammo/flare/do_at_max_range(obj/projectile/P, mob/firer) - drop_flare(get_turf(P), P, P.firer) - -/datum/ammo/flare/proc/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) - var/obj/item/device/flashlight/flare/G = new flare_type(T) - var/matrix/rotation = matrix() - rotation.Turn(fired_projectile.angle - 90) - G.apply_transform(rotation) - G.visible_message(SPAN_WARNING("\A [G] bursts into brilliant light nearby!")) - return G - -/datum/ammo/flare/signal - name = "signal flare" - icon_state = "flare_signal" - flare_type = /obj/item/device/flashlight/flare/signal/gun - handful_type = /obj/item/device/flashlight/flare/signal - -/datum/ammo/flare/signal/drop_flare(turf/T, obj/projectile/fired_projectile, mob/firer) - var/obj/item/device/flashlight/flare/signal/gun/signal_flare = ..() - signal_flare.activate_signal(firer) - if(istype(fired_projectile.shot_from, /obj/item/weapon/gun/flare)) - var/obj/item/weapon/gun/flare/flare_gun_fired_from = fired_projectile.shot_from - flare_gun_fired_from.last_signal_flare_name = signal_flare.name - -/datum/ammo/flare/starshell - name = "starshell ash" - icon_state = "starshell_bullet" - max_range = 5 - flare_type = /obj/item/device/flashlight/flare/on/starshell_ash - -/datum/ammo/flare/starshell/set_bullet_traits() - LAZYADD(traits_to_give, list( - BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_iff, /datum/element/bullet_trait_incendiary) - )) - -/datum/ammo/souto - name = "Souto Can" - ping = null //no bounce off. - damage_type = BRUTE - shrapnel_type = /obj/item/reagent_container/food/drinks/cans/souto/classic - flags_ammo_behavior = AMMO_SKIPS_ALIENS|AMMO_IGNORE_ARMOR|AMMO_IGNORE_RESIST|AMMO_BALLISTIC|AMMO_STOPPED_BY_COVER|AMMO_SPECIAL_EMBED - var/obj/item/reagent_container/food/drinks/cans/souto/can_type - icon_state = "souto_classic" - - max_range = 12 - shrapnel_chance = 10 - accuracy = HIT_ACCURACY_TIER_8 + HIT_ACCURACY_TIER_8 - accurate_range = 12 - shell_speed = AMMO_SPEED_TIER_1 - -/datum/ammo/souto/on_embed(mob/embedded_mob, obj/limb/target_organ) - if(ishuman(embedded_mob) && !isyautja(embedded_mob)) - if(istype(target_organ)) - target_organ.embed(new can_type) - -/datum/ammo/souto/on_hit_mob(mob/M, obj/projectile/P) - if(!M || M == P.firer) return - if(M.throw_mode && !M.get_active_hand()) //empty active hand and we're in throw mode. If so we catch the can. - if(!M.is_mob_incapacitated()) // People who are not able to catch cannot catch. - if(P.contents.len == 1) - for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents) - M.put_in_active_hand(S) - for(var/mob/O in viewers(world_view_size, P)) //find all people in view. - O.show_message(SPAN_DANGER("[M] catches the [S]!"), SHOW_MESSAGE_VISIBLE) //Tell them the can was caught. - return //Can was caught. - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.species.name == "Human") //no effect on synths or preds. - H.apply_effect(6, STUN) - H.apply_effect(8, WEAKEN) - H.apply_effect(15, DAZE) - H.apply_effect(15, SLOW) - shake_camera(H, 2, 1) - if(P.contents.len) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/on_hit_obj(obj/O,obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/on_hit_turf(turf/T, obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/do_at_max_range(obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/on_shield_block(mob/M, obj/projectile/P) - drop_can(P.loc, P) //We make a can at the location. - -/datum/ammo/souto/proc/drop_can(loc, obj/projectile/P) - if(P.contents.len) - for(var/obj/item/I in P.contents) - I.forceMove(loc) - randomize_projectile(P) - -/datum/ammo/souto/proc/randomize_projectile(obj/projectile/P) - shrapnel_type = pick(typesof(/obj/item/reagent_container/food/drinks/cans/souto)-/obj/item/reagent_container/food/drinks/cans/souto) - -/datum/ammo/grenade_container - name = "grenade shell" - ping = null - damage_type = BRUTE - var/nade_type = /obj/item/explosive/grenade/high_explosive - icon_state = "grenade" - flags_ammo_behavior = AMMO_IGNORE_COVER|AMMO_SKIPS_ALIENS - - damage = 15 - accuracy = HIT_ACCURACY_TIER_3 - max_range = 6 - -/datum/ammo/grenade_container/on_hit_mob(mob/M,obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/on_hit_obj(obj/O,obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/on_hit_turf(turf/T,obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/do_at_max_range(obj/projectile/P) - drop_nade(P) - -/datum/ammo/grenade_container/proc/drop_nade(obj/projectile/P) - var/turf/T = get_turf(P) - var/obj/item/explosive/grenade/G = new nade_type(T) - G.visible_message(SPAN_WARNING("\A [G] lands on [T]!")) - G.det_time = 10 - G.cause_data = P.weapon_cause_data - G.activate() - -/datum/ammo/grenade_container/rifle - flags_ammo_behavior = NO_FLAGS - -/datum/ammo/grenade_container/smoke - name = "smoke grenade shell" - nade_type = /obj/item/explosive/grenade/smokebomb - icon_state = "smoke_shell" - -/datum/ammo/hugger_container - name = "hugger shell" - ping = null - damage_type = BRUTE - var/hugger_hive = XENO_HIVE_NORMAL - icon_state = "smoke_shell" - - damage = 15 - accuracy = HIT_ACCURACY_TIER_3 - max_range = 6 - -/datum/ammo/hugger_container/on_hit_mob(mob/M,obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/on_hit_obj(obj/O,obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/on_hit_turf(turf/T,obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/do_at_max_range(obj/projectile/P) - spawn_hugger(get_turf(P)) - -/datum/ammo/hugger_container/proc/spawn_hugger(turf/T) - var/obj/item/clothing/mask/facehugger/child = new(T) - child.hivenumber = hugger_hive - INVOKE_ASYNC(child, TYPE_PROC_REF(/obj/item/clothing/mask/facehugger, leap_at_nearest_target)) diff --git a/colonialmarines.dme b/colonialmarines.dme index 094abc940d70..6c62448b54fb 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -354,6 +354,22 @@ s// DM Environment file for colonialmarines.dme. #include "code\datums\agents\tools\toolbox.dm" #include "code\datums\agents\tools\tracker.dm" #include "code\datums\agents\tools\tranq_gun.dm" +#include "code\datums\ammo\ammo.dm" +#include "code\datums\ammo\energy.dm" +#include "code\datums\ammo\misc.dm" +#include "code\datums\ammo\rocket.dm" +#include "code\datums\ammo\shrapnel.dm" +#include "code\datums\ammo\xeno.dm" +#include "code\datums\ammo\bullet\bullet.dm" +#include "code\datums\ammo\bullet\lever_action.dm" +#include "code\datums\ammo\bullet\pistol.dm" +#include "code\datums\ammo\bullet\revolver.dm" +#include "code\datums\ammo\bullet\rifle.dm" +#include "code\datums\ammo\bullet\shotgun.dm" +#include "code\datums\ammo\bullet\smg.dm" +#include "code\datums\ammo\bullet\sniper.dm" +#include "code\datums\ammo\bullet\special_ammo.dm" +#include "code\datums\ammo\bullet\tank.dm" #include "code\datums\autocells\auto_cell.dm" #include "code\datums\autocells\explosion.dm" #include "code\datums\autocells\vomit_wave.dm" @@ -2123,7 +2139,6 @@ s// DM Environment file for colonialmarines.dme. #include "code\modules\power\smes_construction.dm" #include "code\modules\power\terminal.dm" #include "code\modules\power\turbine.dm" -#include "code\modules\projectiles\ammo_datums.dm" #include "code\modules\projectiles\ammunition.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\gun_attachables.dm" From b070f76115c136f5dcde54cad509c24fd0d31d01 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 20:43:37 +0100 Subject: [PATCH 063/199] Automatic changelog for PR #4682 [ci skip] --- html/changelogs/AutoChangeLog-pr-4682.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4682.yml diff --git a/html/changelogs/AutoChangeLog-pr-4682.yml b/html/changelogs/AutoChangeLog-pr-4682.yml new file mode 100644 index 000000000000..1bd340ab86c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4682.yml @@ -0,0 +1,4 @@ +author: "Huffie56" +delete-after: True +changes: + - refactor: "refactor ammo_datums file." \ No newline at end of file From 219e819676d0363c6bb9610f85da3dd520d5c8d3 Mon Sep 17 00:00:00 2001 From: Cark <44718209+neeshacark@users.noreply.github.com> Date: Wed, 18 Oct 2023 12:36:05 -0700 Subject: [PATCH 064/199] Allows MT, CT, and Nurse to take the "Bad Leg" trait. (#4704) # About the pull request This does as the title says, allowing Maintenance Techs, Cargo Techs, and Nurses to take the Bad Leg trait. # Explain why it's good for the game The reason that these roles *specifically* couldn't take this trait was due to them being "too rookie" which I think is a bit silly to say. Even if we take all three of these to be roles only new players play (they aren't, definitely not MT or CT) - the player still intentionally had to go in and take the trait and therefore is assumed to accept the traits mechanics. If they have an issue with the trait or handling it because they are new then that is an issue that can be resolved by them not taking detrimental traits. Forgive me if the cl tagging is wrong, this is not my codebase this just annoyed me enough to PR it. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: MT, CT, and Nurses can now take the bad leg trait. /:cl: --- code/modules/character_traits/biology_traits.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/character_traits/biology_traits.dm b/code/modules/character_traits/biology_traits.dm index 87fb0b70ec36..a269aabede9f 100644 --- a/code/modules/character_traits/biology_traits.dm +++ b/code/modules/character_traits/biology_traits.dm @@ -85,14 +85,14 @@ /datum/character_trait/biology/bad_leg/New() . = ..() // Not on definition as several lists are added - inapplicable_roles = list(JOB_NURSE, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_INTEL, JOB_MAINT_TECH, JOB_ORDNANCE_TECH, JOB_CARGO_TECH, JOB_MARINE) + JOB_SQUAD_ROLES_LIST + JOB_MARINE_RAIDER_ROLES_LIST + JOB_ERT_GRUNT_LIST + inapplicable_roles = list(JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_INTEL, JOB_ORDNANCE_TECH, JOB_MARINE) + JOB_SQUAD_ROLES_LIST + JOB_MARINE_RAIDER_ROLES_LIST + JOB_ERT_GRUNT_LIST bad_cane_roles = list(JOB_SURVIVOR, JOB_STOWAWAY) fancy_cane_roles = list(JOB_CO_SURVIVOR, CORPORATE_SURVIVOR, JOB_CMO, JOB_CORPORATE_LIAISON, JOB_SEA, JOB_CHIEF_ENGINEER) + JOB_COMMAND_ROLES_LIST inapplicable_species = list(SPECIES_SYNTHETIC, SPECIES_YAUTJA) /datum/character_trait/biology/bad_leg/apply_trait(mob/living/carbon/human/target, datum/equipment_preset/preset) if(target.job in inapplicable_roles) - to_chat(target, SPAN_WARNING("Your office is too combat-geared or starter for you to be able to recieve the bad leg trait.")) + to_chat(target, SPAN_WARNING("Your office is too combat-geared for you to be able to recieve the bad leg trait.")) return if(target.species.group in inapplicable_species) to_chat(target, SPAN_WARNING("Your species is too sophisticated for you be able to recieve the bad leg trait.")) From 75f2a95a40563b3081af71d2463e33b239af793a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:00:01 +0100 Subject: [PATCH 065/199] Automatic changelog for PR #4704 [ci skip] --- html/changelogs/AutoChangeLog-pr-4704.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4704.yml diff --git a/html/changelogs/AutoChangeLog-pr-4704.yml b/html/changelogs/AutoChangeLog-pr-4704.yml new file mode 100644 index 000000000000..979d0cbec3f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4704.yml @@ -0,0 +1,4 @@ +author: "neeshacark" +delete-after: True +changes: + - qol: "MT, CT, and Nurses can now take the bad leg trait." \ No newline at end of file From e4a35d976219c5695ab4badebfa0e0d3a9016fa2 Mon Sep 17 00:00:00 2001 From: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com> Date: Wed, 18 Oct 2023 15:39:30 -0400 Subject: [PATCH 066/199] Handheld Beacon Refactor (#4676) # About the pull request Makes it much easier to add new handheld beacons and edit in-game # Explain why it's good for the game Lessens the amount of work you need to do across various files to have a functional handheld beacon # Changelog :cl: refactor: Refactored handheld beacons and related code /:cl: --- .../objects/items/handheld_distress_beacon.dm | 77 ++++++++----------- code/modules/admin/topic/topic.dm | 57 ++++---------- code/modules/gear_presets/cmb.dm | 2 +- 3 files changed, 45 insertions(+), 91 deletions(-) diff --git a/code/game/objects/items/handheld_distress_beacon.dm b/code/game/objects/items/handheld_distress_beacon.dm index 699c45c256b2..c11a7a57c350 100644 --- a/code/game/objects/items/handheld_distress_beacon.dm +++ b/code/game/objects/items/handheld_distress_beacon.dm @@ -1,12 +1,21 @@ ///handheld distress beacons used by goon chem retrieval team to call for PMC back up /obj/item/handheld_distress_beacon - name = "handheld distress beacon" + name = "\improper PMC handheld distress beacon" desc = "A standard handheld distress beacon. Generally used by teams who may be out of regular communications range but must signal for assistance. This one is branded with a Weyland Yutani symbol and sold en masse to colonies across the Neroid Sector." icon = 'icons/obj/items/handheld_distress_beacon.dmi' icon_state = "beacon_inactive" w_class = SIZE_SMALL + ///The beacons faction that will be sent in message_admins + var/beacon_type = "PMC beacon" + ///Tells the user who the beacon will be sent to IC + var/recipient = "the USCSS Royce" + ///The name of the ERT that will be passed to get_specific_call + var/list/ert_full_name = list("Weyland-Yutani PMC (Chemical Investigation Squad)") + ///The clickable version that will be sent in message_admins + var/list/ert_short_name = list("SEND PMCs") + ///Whether beacon can be used, or has already been used var/active = FALSE /obj/item/handheld_distress_beacon/get_examine_text(mob/user) @@ -20,8 +29,8 @@ if(active) icon_state = "beacon_active" - else - icon_state = initial(icon_state) + return + icon_state = initial(icon_state) /obj/item/handheld_distress_beacon/attack_self(mob/user) . = ..() @@ -29,53 +38,29 @@ if(active) to_chat(user, "[src] is already active!") return - - for(var/client/C in GLOB.admins) - if((R_ADMIN|R_MOD) & C.admin_holder.rights) - playsound_client(C,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(user)] has requested a PMC Distress Beacon! [CC_MARK(user)] (SEND) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") - to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to the USCSS Royce.")) - active = TRUE update_icon() -/// CMB distress beacon held by CMB Marshal for signalling distress to Anchorpoint Station -/obj/item/handheld_distress_beacon_CMB - name = "\improper CMB handheld distress beacon" - desc = "An emergency beacon. This one is branded with a Colonial Marshal Bureau star and 'ANCHORPOINT STATION' is etched in stencil on the side. This device is issued to CMB Marshals and features an extended relay antenna." - icon = 'icons/obj/items/handheld_distress_beacon.dmi' - icon_state = "beacon_inactive" - w_class = SIZE_SMALL - -/// whether or not the beacon is turned on, when activated sends message to admins requesting Anchorpoint ERT and changes sprite - var/active = FALSE - -/obj/item/handheld_distress_beacon_CMB/get_examine_text(mob/user) - . = ..() - - if(active) - . += "The beacon has been activated!" - -/obj/item/handheld_distress_beacon_CMB/update_icon() - . = ..() + if(!ert_full_name || !ert_short_name || (length(ert_full_name) != length(ert_short_name))) //Make sure they are greater than 0, and both are same length + to_chat(user, SPAN_BOLDWARNING("[src] is broken!")) + CRASH("[src] was improperly set, and has been disabled.") //For the runtime logs - if(active) - icon_state = "beacon_active" - else - icon_state = initial(icon_state) + var/beacon_call_buttons + for(var/current_ert_num in 1 to length(ert_full_name)) + beacon_call_buttons += "([ert_short_name[current_ert_num]]) " -/obj/item/handheld_distress_beacon_CMB/attack_self(mob/user) - . = ..() + for(var/client/admin_client in GLOB.admins) + if((R_ADMIN|R_MOD) & admin_client.admin_holder.rights) + playsound_client(admin_client,'sound/effects/sos-morse-code.ogg',10) + message_admins("[key_name(user)] has used a [beacon_type]! [CC_MARK(user)] [beacon_call_buttons](DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") + to_chat(user, SPAN_NOTICE("A distress beacon request has been sent to [recipient].")) - if(active) - to_chat(user, "[src] is already active!") - return - - for(var/client/client in GLOB.admins) - if((R_ADMIN|R_MOD) & client.admin_holder.rights) - playsound_client(client,'sound/effects/sos-morse-code.ogg',10) - message_admins("[key_name(user)] has signalled CMB in distress, and requests reinforcements! [CC_MARK(user)] (SEND MARINE QRF) (SEND CMB TEAM) (DENY) [ADMIN_JMP_USER(user)] [CC_REPLY(user)]") - to_chat(user, SPAN_NOTICE("The CMB distress beacon flashes red, indicating that the device has been activated and is transmitting.")) +/// CMB distress beacon held by CMB Marshal for signalling distress to Anchorpoint Station +/obj/item/handheld_distress_beacon/cmb + name = "\improper CMB handheld distress beacon" + desc = "An emergency beacon. This one is branded with a Colonial Marshal Bureau star and 'ANCHORPOINT STATION' is etched in stencil on the side. This device is issued to CMB Marshals and features an extended relay antenna." - active = TRUE - update_icon() + beacon_type = "CMB beacon" + recipient = "Anchorpoint Station" + ert_full_name = list("CMB - Patrol Team - Marshals in Distress (Friendly)", "CMB - Anchorpoint Station Colonial Marine QRF (Friendly)") + ert_short_name = list("SEND CMB", "SEND QRF") diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index ed0d67198af3..8bbc99925239 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -1903,32 +1903,18 @@ addtimer(CALLBACK(src, PROC_REF(accept_ert), usr, locate(href_list["distress"])), 10 SECONDS) //unanswered_distress -= ref_person - if(href_list["distress_cmb"]) //CMB distress signal, activates Anchorpoint Marine QRF to assist/rescue Colonial Marshals in distress + if(href_list["distress_handheld"]) //Prepares to call and logs accepted handheld distress beacons + var/mob/ref_person = href_list["distress_handheld"] + var/ert_name = href_list["ert_name"] distress_cancel = FALSE - message_admins("[key_name_admin(usr)] has opted to SEND the Anchorpoint Station Colonial Marine QRF to assist the CMB! Launching in 10 seconds... (CANCEL)") - addtimer(CALLBACK(src, PROC_REF(accept_cmb_ert), usr, locate(href_list["distress"])), 10 SECONDS) + message_admins("[key_name_admin(usr)] has opted to SEND [ert_name]! Launching in 10 seconds... (CANCEL)") + addtimer(CALLBACK(src, PROC_REF(accept_handheld_ert), usr, ref_person, ert_name), 10 SECONDS) - if(href_list["distress_cmb_alt"]) //CMB distress signal, activates a nearby CMB Patrol Team to assist/rescue Colonial Marshals in distress - distress_cancel = FALSE - message_admins("[key_name_admin(usr)] has opted to SEND a nearby CMB Patrol Team to assist the CMB! Launching in 10 seconds... (CANCEL)") - addtimer(CALLBACK(src, PROC_REF(accept_cmb_alt_ert), usr, locate(href_list["distress"])), 10 SECONDS) - - if(href_list["deny_cmb"]) // Anchorpoint-deny. The distress call is denied, citing unavailable forces - var/mob/ref_person = locate(href_list["deny_cmb"]) - to_chat(ref_person, "A voice barely crackles through the static: CMB Team, this is Anchorpoint Station. No can do, QRF currently dispatched elsewhere, relaying distress. Sorry. Good luck, out.") - log_game("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]", 1) - - if(href_list["distress_pmc"]) //Wey-Yu specific PMC distress signal for chem retrieval ERT - distress_cancel = FALSE - message_admins("[key_name_admin(usr)] has opted to SEND the distress beacon! Launching in 10 seconds... (CANCEL)") - addtimer(CALLBACK(src, PROC_REF(accept_pmc_ert), usr, locate(href_list["distress"])), 10 SECONDS) - - if(href_list["ccdeny_pmc"]) // CentComm-deny. The distress call is denied, without any further conditions - var/mob/ref_person = locate(href_list["ccdeny_pmc"]) + if(href_list["deny_distress_handheld"]) //Logs denied handheld distress beacons + var/mob/ref_person = href_list["deny_distress_handheld"] to_chat(ref_person, "The distress signal has not received a response.") log_game("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]", 1) + message_admins("[key_name_admin(usr)] has denied a distress beacon, requested by [key_name_admin(ref_person)]") if(href_list["destroyship"]) //Distress Beacon, sends a random distress beacon when pressed destroy_cancel = FALSE @@ -2107,31 +2093,14 @@ log_game("[key_name_admin(approver)] has sent a randomized distress beacon, requested by [key_name_admin(ref_person)]") message_admins("[key_name_admin(approver)] has sent a randomized distress beacon, requested by [key_name_admin(ref_person)]") -/// tells admins which admin has sent the Anchorpoint ERT in response to CMB distress -/datum/admins/proc/accept_cmb_ert(mob/approver, mob/ref_person) - if(distress_cancel) - return - distress_cancel = TRUE - SSticker.mode.get_specific_call("CMB - Anchorpoint Station Colonial Marine QRF (Friendly)", FALSE, FALSE) - log_game("[key_name_admin(approver)] has sent an Anchorpoint Station Colonial Marine QRF response, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(approver)] has sent an Anchorpoint Station Colonial Marine QRF response, requested by [key_name_admin(ref_person)]") - -/// tells admins which admin has sent the CMB ERT in response to CMB distress -/datum/admins/proc/accept_cmb_alt_ert(mob/approver, mob/ref_person) - if(distress_cancel) - return - distress_cancel = TRUE - SSticker.mode.get_specific_call("CMB - Patrol Team - Marshals in Distress (Friendly)", FALSE, FALSE) - log_game("[key_name_admin(approver)] has sent a CMB Patrol Team distress response, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(approver)] has sent a CMB Patrol Team distress response, requested by [key_name_admin(ref_person)]") - -/datum/admins/proc/accept_pmc_ert(mob/approver, mob/ref_person) +///Handles calling the ERT sent by handheld distress beacons +/datum/admins/proc/accept_handheld_ert(mob/approver, mob/ref_person, ert_called) if(distress_cancel) return distress_cancel = TRUE - SSticker.mode.get_specific_call("Weyland-Yutani PMC (Chemical Investigation Squad)", TRUE, FALSE, FALSE) - log_game("[key_name_admin(approver)] has sent a PMC distress beacon, requested by [key_name_admin(ref_person)]") - message_admins("[key_name_admin(approver)] has sent a PMC distress beacon, requested by [key_name_admin(ref_person)]") + SSticker.mode.get_specific_call("[ert_called]", TRUE, FALSE, FALSE) + log_game("[key_name_admin(approver)] has sent [ert_called], requested by [key_name_admin(ref_person)]") + message_admins("[key_name_admin(approver)] has sent [ert_called], requested by [key_name_admin(ref_person)]") /datum/admins/proc/generate_job_ban_list(mob/M, datum/entity/player/P, list/roles, department, color = "ccccff") var/counter = 0 diff --git a/code/modules/gear_presets/cmb.dm b/code/modules/gear_presets/cmb.dm index 3ce7a6ec281d..756e3f5d9647 100644 --- a/code/modules/gear_presets/cmb.dm +++ b/code/modules/gear_presets/cmb.dm @@ -185,7 +185,7 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec, WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/pistol/holdout, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive/m15/rubber, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon_CMB, WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon/cmb, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/radio, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/flashlight, WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/camera, WEAR_IN_BACK) From fb2b136eaab430c47e930afaf9fecca7aaf73434 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:21:40 +0100 Subject: [PATCH 067/199] Automatic changelog for PR #4676 [ci skip] --- html/changelogs/AutoChangeLog-pr-4676.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4676.yml diff --git a/html/changelogs/AutoChangeLog-pr-4676.yml b/html/changelogs/AutoChangeLog-pr-4676.yml new file mode 100644 index 000000000000..5b7d7c98edab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4676.yml @@ -0,0 +1,4 @@ +author: "BeagleGaming1" +delete-after: True +changes: + - refactor: "Refactored handheld beacons and related code" \ No newline at end of file From f95fcf39f87b3ce7e88bfc6992c982d6ba5cec7a Mon Sep 17 00:00:00 2001 From: Vile Beggar Date: Wed, 18 Oct 2023 21:40:07 +0200 Subject: [PATCH 068/199] Combines standard apparel into one button for every squad prep vendor (#4710) # About the pull request condenses the "uniform, helmet, boots..." choices into one button for every squad role, just like how the rifleman has it. ![123](https://github.com/cmss13-devs/cmss13/assets/17518895/d3953b93-71ad-4924-9361-0382c21ca52d) # Explain why it's good for the game less button clicking is good. the riflemen vendors are the only one that have this, and i don't see a reason why the other squad roles should be left in the dust # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: All squad uniform vendors have had their standard apparel condensed into one button. /:cl: --- .../vending/vendor_types/squad_prep/squad_engineer.dm | 6 +----- .../vending/vendor_types/squad_prep/squad_leader.dm | 8 ++------ .../vending/vendor_types/squad_prep/squad_medic.dm | 6 +----- .../vending/vendor_types/squad_prep/squad_smartgunner.dm | 6 +----- .../vending/vendor_types/squad_prep/squad_specialist.dm | 5 +---- .../machinery/vending/vendor_types/squad_prep/squad_tl.dm | 6 +----- 6 files changed, 7 insertions(+), 30 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm index c0daad04f0ce..65397570511c 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_engineer.dm @@ -98,11 +98,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_engi, list( GLOBAL_LIST_INIT(cm_vending_clothing_engi, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine/engineer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/tech, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/engineer, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/tech), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm index 9845ff9cb610..81c1941c3423 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm @@ -114,12 +114,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list( GLOBAL_LIST_INIT(cm_vending_clothing_leader, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Armor", 0, /obj/item/clothing/suit/storage/marine/leader, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/leader, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/leader), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), + list("B12 Pattern Armor", 0, /obj/item/clothing/suit/storage/marine/leader, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_ATTACHMENT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm index 1b634335f5d2..69399cfb1eb5 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm @@ -116,11 +116,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list( GLOBAL_LIST_INIT(cm_vending_clothing_medic, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine/medic, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/medic, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine/medic, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/medic), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm index 0691dfcee371..41710b477769 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_smartgunner.dm @@ -66,11 +66,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_smartgun, list( GLOBAL_LIST_INIT(cm_vending_clothing_smartgun, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm index 38c74481205d..e800fc1efd56 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm @@ -56,10 +56,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list( GLOBAL_LIST_INIT(cm_vending_clothing_specialist, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index 875f84264c0a..7bd45cb46a60 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -78,12 +78,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( GLOBAL_LIST_INIT(cm_vending_clothing_tl, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), - list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), - list("Uniform", 0, /obj/item/clothing/under/marine, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), - list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("Standard Marine Apparel", 0, list(/obj/item/clothing/under/marine, /obj/item/clothing/shoes/marine/knife, /obj/item/clothing/gloves/marine, /obj/item/device/radio/headset/almayer/marine, /obj/item/clothing/head/helmet/marine/rto), MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY), list("M4 Pattern Armor", 0, /obj/item/clothing/suit/storage/marine/rto, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), - list("Headset", 0, /obj/item/device/radio/headset/almayer/marine, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/rto, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY), list("Essential Fireteam Leader Utilities", 0, /obj/effect/essentials_set/tl, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), From 586b62d1c515b948bfe9feca32fdaab7af484ef8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:38:37 +0100 Subject: [PATCH 069/199] Automatic changelog for PR #4710 [ci skip] --- html/changelogs/AutoChangeLog-pr-4710.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4710.yml diff --git a/html/changelogs/AutoChangeLog-pr-4710.yml b/html/changelogs/AutoChangeLog-pr-4710.yml new file mode 100644 index 000000000000..aee2b701a511 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4710.yml @@ -0,0 +1,4 @@ +author: "VileBeggar" +delete-after: True +changes: + - qol: "All squad uniform vendors have had their standard apparel condensed into one button." \ No newline at end of file From 9b655b519a1728058b3b2712971b44650f0537c5 Mon Sep 17 00:00:00 2001 From: fira Date: Wed, 18 Oct 2023 21:41:41 +0200 Subject: [PATCH 070/199] Fixes minor runtime in CAS Guidance system (#4705) # About the pull request Recurring runtime on live server due to lack of unregistering the signal handler ``` proc name: stack trace (/proc/stack_trace) source file: code/__HELPERS/unsorted.dm,1893 usr: CKEY (/mob/living/carbon/human) src: null usr.loc: the floor (135,75,4) (/turf/open/shuttle/dropship) call stack: stack trace("mob_resist overridden. Use ove...") /datum/cas_fire_envelope/uscm_... (/datum/cas_fire_envelope/uscm_dropship): RegisterSignal(CKEY (/mob/living/carbon/human), "mob_resist", "exit_cam_resist", 0) /datum/cas_fire_envelope/uscm_... (/datum/cas_fire_envelope/uscm_dropship): add user to tracking(CKEY (/mob/living/carbon/human)) ... ``` # Explain why it's good for the game Less runtimes in log # Testing Photographs and Procedure Untested # Changelog No user facing changes --- code/game/cas_manager/datums/cas_fire_envelope.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/cas_manager/datums/cas_fire_envelope.dm b/code/game/cas_manager/datums/cas_fire_envelope.dm index d7c939b76e16..330521f34e36 100644 --- a/code/game/cas_manager/datums/cas_fire_envelope.dm +++ b/code/game/cas_manager/datums/cas_fire_envelope.dm @@ -181,7 +181,7 @@ apply_upgrade(user) if(!(user in guidance.users)) guidance.users += user - RegisterSignal(usr, COMSIG_MOB_RESISTED, PROC_REF(exit_cam_resist)) + RegisterSignal(user, COMSIG_MOB_RESISTED, PROC_REF(exit_cam_resist)) /datum/cas_fire_envelope/proc/apply_upgrade(user) @@ -220,6 +220,7 @@ M.reset_view() remove_upgrades(user) guidance.users -= user + UnregisterSignal(user, COMSIG_MOB_RESISTED) /datum/cas_fire_envelope/proc/exit_cam_resist(mob/user) SIGNAL_HANDLER From 114fe8d5dec9cb9abe290c021f8c137b1b447374 Mon Sep 17 00:00:00 2001 From: fira Date: Wed, 18 Oct 2023 21:45:21 +0200 Subject: [PATCH 071/199] Fixes a typo causing caps to display contained items when not worn (#4689) # About the pull request A small oopsie made it so caps still displayed contained items when they were held and not worn. This fixes that. Thanks to joooks for reporting # Explain why it's good for the game Consistency # Testing Photographs and Procedure spawn in as SO, with mgoggles, switch between hand and equipped # Changelog :cl: fix: Fixed caps displaying contained items on character even without being worn. /:cl: --- code/modules/clothing/head/head.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm index f16b6ff42c9d..4871a008dd6d 100644 --- a/code/modules/clothing/head/head.dm +++ b/code/modules/clothing/head/head.dm @@ -308,8 +308,8 @@ /obj/item/clothing/head/cmcap/get_mob_overlay(mob/user_mob, slot) var/image/return_image = ..() - if(!slot == WEAR_HEAD) - return + if(slot != WEAR_HEAD) + return return_image if(length(pockets.contents) && (flags_marine_hat & HAT_GARB_OVERLAY)) for(var/obj/garb_object in pockets.contents) From bf7f1ef7aadca4d37cfbababa7e11f4351be3823 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:03:32 +0100 Subject: [PATCH 072/199] Automatic changelog for PR #4689 [ci skip] --- html/changelogs/AutoChangeLog-pr-4689.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4689.yml diff --git a/html/changelogs/AutoChangeLog-pr-4689.yml b/html/changelogs/AutoChangeLog-pr-4689.yml new file mode 100644 index 000000000000..873e11d638ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4689.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed caps displaying contained items on character even without being worn." \ No newline at end of file From 163f692f48773c390343e628393d0bf9778c9f90 Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:55:13 -0500 Subject: [PATCH 073/199] Equipped squad presets start with full stomachs (#4671) # About the pull request Makes the equipped marine presets spawn with full food # Explain why it's good for the game Equipped presets should be ready for combat on spawn(hence the equipped status) # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Equipped marine presets spawn with full food on spawn /:cl: --- code/modules/gear_presets/uscm.dm | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm index ec0195e928c5..d4d10f7452e9 100644 --- a/code/modules/gear_presets/uscm.dm +++ b/code/modules/gear_presets/uscm.dm @@ -464,6 +464,9 @@ minimap_icon = "private" +/datum/equipment_preset/uscm/private_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + /datum/equipment_preset/uscm/private_equipped/load_rank(mob/living/carbon/human/new_human) if(new_human.client) if(get_job_playtime(new_human.client, rank) < JOB_PLAYTIME_TIER_1) @@ -500,6 +503,9 @@ name = "USCM Squad Leader (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/leader_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP) assignment = JOB_SQUAD_LEADER rank = JOB_SQUAD_LEADER @@ -539,6 +545,9 @@ name = "USCM Squad Smartgunner (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/smartgunner_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SMARTPREP) assignment = JOB_SQUAD_SMARTGUN rank = JOB_SQUAD_SMARTGUN @@ -573,6 +582,9 @@ name = "USCM Squad Combat Technician (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/engineer_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_ENGPREP, ACCESS_CIVILIAN_ENGINEERING) assignment = JOB_SQUAD_ENGI rank = JOB_SQUAD_ENGI @@ -616,6 +628,9 @@ name = "USCM Squad Hospital Corpsman (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/medic_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_MEDPREP, ACCESS_MARINE_MEDBAY) assignment = JOB_SQUAD_MEDIC rank = JOB_SQUAD_MEDIC @@ -667,6 +682,9 @@ name = "USCM Squad Weapons Specialist (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/specialist_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_SPECPREP) assignment = JOB_SQUAD_SPECIALIST rank = JOB_SQUAD_SPECIALIST @@ -734,6 +752,9 @@ name = "USCM Fireteam Leader (Equipped)" flags = EQUIPMENT_PRESET_EXTRA|EQUIPMENT_PRESET_MARINE +/datum/equipment_preset/uscm/tl_equipped/load_status(mob/living/carbon/human/new_human) + new_human.nutrition = NUTRITION_NORMAL + access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_TL_PREP) assignment = JOB_SQUAD_TEAM_LEADER rank = JOB_SQUAD_TEAM_LEADER From 059ccf57592e6afa1d724001707de4a75c64d834 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:21:50 +0100 Subject: [PATCH 074/199] Automatic changelog for PR #4671 [ci skip] --- html/changelogs/AutoChangeLog-pr-4671.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4671.yml diff --git a/html/changelogs/AutoChangeLog-pr-4671.yml b/html/changelogs/AutoChangeLog-pr-4671.yml new file mode 100644 index 000000000000..70abc2a9e692 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4671.yml @@ -0,0 +1,4 @@ +author: "CapCamIII" +delete-after: True +changes: + - bugfix: "Equipped marine presets spawn with full food on spawn" \ No newline at end of file From 5a794961516acb91cadbd1cfd0073294cca5f947 Mon Sep 17 00:00:00 2001 From: Julian56 <117036822+Huffie56@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:56:31 +0200 Subject: [PATCH 075/199] refactor skill.dm into multiple file inside skills folder (#4633) # About the pull request intend to make the code more organized. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: refactor: refactored some code /:cl: Co-authored-by: Julien --- code/datums/skills.dm | 2199 ------------------------------ code/datums/skills/civilian.dm | 213 +++ code/datums/skills/clf.dm | 92 ++ code/datums/skills/cmb.dm | 60 + code/datums/skills/commando.dm | 116 ++ code/datums/skills/contractor.dm | 90 ++ code/datums/skills/dutch.dm | 46 + code/datums/skills/forecon.dm | 102 ++ code/datums/skills/freelancer.dm | 40 + code/datums/skills/gladiator.dm | 33 + code/datums/skills/mercenary.dm | 85 ++ code/datums/skills/misc.dm | 86 ++ code/datums/skills/pmc.dm | 171 +++ code/datums/skills/rmc.dm | 71 + code/datums/skills/skills.dm | 267 ++++ code/datums/skills/synthetic.dm | 90 ++ code/datums/skills/upp.dm | 218 +++ code/datums/skills/uscm.dm | 410 ++++++ colonialmarines.dme | 18 +- 19 files changed, 2207 insertions(+), 2200 deletions(-) delete mode 100644 code/datums/skills.dm create mode 100644 code/datums/skills/civilian.dm create mode 100644 code/datums/skills/clf.dm create mode 100644 code/datums/skills/cmb.dm create mode 100644 code/datums/skills/commando.dm create mode 100644 code/datums/skills/contractor.dm create mode 100644 code/datums/skills/dutch.dm create mode 100644 code/datums/skills/forecon.dm create mode 100644 code/datums/skills/freelancer.dm create mode 100644 code/datums/skills/gladiator.dm create mode 100644 code/datums/skills/mercenary.dm create mode 100644 code/datums/skills/misc.dm create mode 100644 code/datums/skills/pmc.dm create mode 100644 code/datums/skills/rmc.dm create mode 100644 code/datums/skills/skills.dm create mode 100644 code/datums/skills/synthetic.dm create mode 100644 code/datums/skills/upp.dm create mode 100644 code/datums/skills/uscm.dm diff --git a/code/datums/skills.dm b/code/datums/skills.dm deleted file mode 100644 index 9178e6f7a1b1..000000000000 --- a/code/datums/skills.dm +++ /dev/null @@ -1,2199 +0,0 @@ -// Individual skill -/datum/skill - /// Name of the skill - var/skill_name = null - /// used for the view UI - var/readable_skill_name = null - /// Level of skill in this... skill - var/skill_level = 0 - /// the max level this skill can be, used for tgui - var/max_skill_level = 0 - -/datum/skill/proc/get_skill_level() - return skill_level - -/datum/skill/proc/set_skill(new_level, mob/owner) - skill_level = new_level - -/datum/skill/proc/is_skilled(req_level, is_explicit = FALSE) - if(is_explicit) - return (skill_level == req_level) - return (skill_level >= req_level) - -// Lots of defines here. See #define/skills.dm - -/datum/skill/cqc - skill_name = SKILL_CQC - readable_skill_name = "CQC" - skill_level = SKILL_CQC_DEFAULT - max_skill_level = SKILL_CQC_MAX - -/datum/skill/melee_weapons - skill_name = SKILL_MELEE_WEAPONS - readable_skill_name = "melee weapons" - skill_level = SKILL_MELEE_DEFAULT - max_skill_level = SKILL_MELEE_MAX - -/datum/skill/firearms - skill_name = SKILL_FIREARMS - skill_level = SKILL_FIREARMS_TRAINED - max_skill_level = SKILL_FIREARMS_MAX - -/datum/skill/spec_weapons - skill_name = SKILL_SPEC_WEAPONS - readable_skill_name = "specialist weapons" - skill_level = SKILL_SPEC_DEFAULT - max_skill_level = SKILL_SPEC_ALL - -/datum/skill/endurance - skill_name = SKILL_ENDURANCE - skill_level = SKILL_ENDURANCE_WEAK - max_skill_level = SKILL_ENDURANCE_MAX - -/datum/skill/engineer - skill_name = SKILL_ENGINEER - skill_level = SKILL_ENGINEER_DEFAULT - max_skill_level = SKILL_ENGINEER_MAX - -/datum/skill/construction - skill_name = SKILL_CONSTRUCTION - skill_level = SKILL_CONSTRUCTION_DEFAULT - max_skill_level = SKILL_CONSTRUCTION_MAX - -/datum/skill/leadership - skill_name = SKILL_LEADERSHIP - skill_level = SKILL_LEAD_NOVICE - max_skill_level = SKILL_LEAD_MAX - -/datum/skill/leadership/set_skill(new_level, mob/living/owner) - ..() - if(!owner) - return - - if(!ishuman(owner)) - return - - // Give/remove issue order actions - if(is_skilled(SKILL_LEAD_TRAINED)) - ADD_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) - else - REMOVE_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) - -/datum/skill/overwatch - skill_name = SKILL_OVERWATCH - skill_level = SKILL_OVERWATCH_DEFAULT - max_skill_level = SKILL_OVERWATCH_MAX - -/datum/skill/medical - skill_name = SKILL_MEDICAL - skill_level = SKILL_MEDICAL_DEFAULT - max_skill_level = SKILL_MEDICAL_MAX - -/datum/skill/surgery - skill_name = SKILL_SURGERY - skill_level = SKILL_SURGERY_DEFAULT - max_skill_level = SKILL_SURGERY_MAX - -/datum/skill/surgery/set_skill(new_level, mob/living/owner) - ..() - if(!owner) - return - - if(!ishuman(owner)) - return - - // Give/remove surgery toggle action - var/datum/action/surgery_toggle/surgery_action = locate() in owner.actions - if(is_skilled(SKILL_SURGERY_NOVICE)) - if(!surgery_action) - give_action(owner, /datum/action/surgery_toggle) - else - surgery_action.update_surgery_skill() - else - if(surgery_action) - surgery_action.remove_from(owner) - -/datum/skill/research - skill_name = SKILL_RESEARCH - skill_level = SKILL_RESEARCH_DEFAULT - max_skill_level = SKILL_RESEARCH_MAX - -/datum/skill/antag - skill_name = SKILL_ANTAG - readable_skill_name = "illegal technology" - skill_level = SKILL_ANTAG_DEFAULT - max_skill_level = SKILL_ANTAG_MAX - -/datum/skill/pilot - skill_name = SKILL_PILOT - skill_level = SKILL_PILOT_DEFAULT - max_skill_level = SKILL_PILOT_MAX - -/datum/skill/navigations - skill_name = SKILL_NAVIGATIONS - skill_level = SKILL_NAVIGATIONS_DEFAULT - max_skill_level = SKILL_NAVIGATIONS_MAX - -/datum/skill/police - skill_name = SKILL_POLICE - skill_level = SKILL_POLICE_DEFAULT - max_skill_level = SKILL_POLICE_MAX - -/datum/skill/powerloader - skill_name = SKILL_POWERLOADER - skill_level = SKILL_POWERLOADER_DEFAULT - max_skill_level = SKILL_POWERLOADER_MAX - -/datum/skill/vehicles - skill_name = SKILL_VEHICLE - skill_level = SKILL_VEHICLE_DEFAULT - max_skill_level = SKILL_VEHICLE_MAX - -/datum/skill/jtac - skill_name = SKILL_JTAC - readable_skill_name = "JTAC" - skill_level = SKILL_JTAC_NOVICE - max_skill_level = SKILL_JTAC_MAX - -/datum/skill/execution - skill_name = SKILL_EXECUTION - skill_level = SKILL_EXECUTION_DEFAULT - max_skill_level = SKILL_EXECUTION_MAX - -/datum/skill/intel - skill_name = SKILL_INTEL - skill_level = SKILL_INTEL_NOVICE - max_skill_level = SKILL_INTEL_MAX - -/datum/skill/domestic - skill_name = SKILL_DOMESTIC - skill_level = SKILL_DOMESTIC_NONE - max_skill_level = SKILL_DOMESTIC_MAX - -/datum/skill/fireman - skill_name = SKILL_FIREMAN - readable_skill_name = "fireman carrying" - skill_level = SKILL_FIREMAN_DEFAULT - max_skill_level = SKILL_FIREMAN_MAX - -/// Skill with an extra S at the end is a collection of multiple skills. Basically a skillSET -/// This is to organize and provide a common interface to the huge heap of skills there are -/datum/skills - /// The name of the skillset - var/name - // The mob that has this skillset - var/mob/owner - - // List of skill datums. - // Also, if this is populated when the datum is created, it will set the skill levels automagically - var/list/skills = list() - // Same as above, but for children of parents that just add a lil something else - var/list/additional_skills = list() - -/datum/skills/New(mob/skillset_owner) - owner = skillset_owner - - // Setup every single skill - for(var/skill_type in subtypesof(/datum/skill)) - var/datum/skill/S = new skill_type() - - // Fancy hack to convert a list of desired skill levels in each named skill into a skill level in the actual skill datum - // Lets the skills list be used multipurposely for both storing skill datums and choosing skill levels for different skillsets - var/predetermined_skill_level = additional_skills[S.skill_name] ? additional_skills[S.skill_name] : skills[S.skill_name] - skills[S.skill_name] = S - - if(!isnull(predetermined_skill_level)) - S.set_skill(predetermined_skill_level, owner) - -/datum/skills/Destroy() - owner = null - skills = null // Don't need to delete, /datum/skill should softdel - SStgui.close_uis(src) - return ..() - -// Checks if the given skill is contained in this skillset at all -/datum/skills/proc/has_skill(skill) - return isnull(skills[skill]) - -// Returns the skill DATUM for the given skill -/datum/skills/proc/get_skill(skill) - if(!skills) - return null - return skills[skill] - -// Returns the skill level for the given skill -/datum/skills/proc/get_skill_level(skill) - var/datum/skill/S = get_skill(skill) - if(!S) - return -1 - if(QDELETED(S)) - return -1 - return S.get_skill_level() - -// Sets the skill LEVEL for a given skill -/datum/skills/proc/set_skill(skill, new_level) - var/datum/skill/S = skills[skill] - if(!S) - return - return S.set_skill(new_level, owner) - -/datum/skills/proc/increment_skill(skill, increment, cap) - var/datum/skill/S = skills[skill] - if(!S || skillcheck(owner, skill, cap)) - return - return S.set_skill(min(cap,S.skill_level+increment), owner) - -/datum/skills/proc/decrement_skill(skill, increment) - var/datum/skill/S = skills[skill] - if(!S) - return - return S.set_skill(max(0,S.skill_level-increment), owner) - -// Checks if the skillset is AT LEAST skilled enough to pass a skillcheck for the given skill level -/datum/skills/proc/is_skilled(skill, req_level, is_explicit = FALSE) - var/datum/skill/S = get_skill(skill) - if(QDELETED(S)) - return FALSE - return S.is_skilled(req_level, is_explicit) - -// Adjusts the full skillset to a new type of skillset. Pass the datum type path for the desired skillset -/datum/skills/proc/set_skillset(skillset_type) - var/datum/skills/skillset = new skillset_type() - var/list/skill_levels = initial(skillset.skills) - - name = skillset.name - for(var/skill in skill_levels) - set_skill(skill, skill_levels[skill]) - qdel(skillset) - -/* ---------------------- -CIVILIAN ---------------------- -*/ - -/datum/skills/civilian - name = "Civilian" - skills = list( - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_ENDURANCE = SKILL_ENDURANCE_NONE, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/manager - name = "Weyland-Yutani Manager" // Semi-competent leader with basic knowledge in most things. - skills = list( - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/datum/skills/civilian/icc_investigation - name = "ICC CL - Black Market ERT" - skills = list( - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //The ASRS consoles - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_POLICE = SKILL_POLICE_SKILLED, //The CMB Tradeband Compliance Device - ) - -/datum/skills/civilian/manager/director - name = "Weyland-Yutani Director" - skills = list( - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/datum/skills/civilian/survivor - name = "Survivor" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - ) - -/datum/skills/civilian/survivor/manager - name = "Weyland-Yutani Manager" - skills = list( - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/datum/skills/civilian/survivor/goon - name = "Survivor Goon" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/pmc - name = "Survivor PMC" - additional_skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/pmc/medic - name = "Survivor PMC Medic" - additional_skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/pmc/engineer - name = "Survivor PMC Engineer" - additional_skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/civilian/survivor/doctor - name = "Survivor Doctor" - additional_skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/civilian/survivor/clf - name = "Survivor CLF" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - ) - -/datum/skills/civilian/survivor/scientist - name = "Survivor Scientist" - additional_skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - ) - -/datum/skills/civilian/survivor/chef - name = "Survivor Chef" - additional_skills = list( - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, - ) - -/datum/skills/civilian/survivor/miner - name = "Survivor Miner" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/trucker - name = "Survivor Trucker" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - ) - -/datum/skills/civilian/survivor/engineer - name = "Survivor Engineer" - additional_skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/chaplain - name = "Survivor Chaplain" - additional_skills = list( - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - ) - -/datum/skills/civilian/survivor/marshal - name = "Survivor Marshal" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - ) - -/datum/skills/civilian/survivor/prisoner - name = "Survivor Prisoner" - additional_skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/civilian/survivor/gangleader - name = "Survivor Gang Leader" - additional_skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - ) - -/* ---------------------- -MILITARY SURVIVORS ---------------------- -*/ -//Hardcore survivors with poor equipment and skills, prove you're the best of the best. - -/datum/skills/military/survivor/forecon_standard - name = "Reconnaissance Rifleman" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_techician - name = "Reconnaissance Support Technician" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_marksman - name = "Reconnaissance Designated Marksman" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SCOUT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_smartgunner - name = "Reconnaissance Smartgunner" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_sniper - name = "Reconnaissance Sniper" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SNIPER, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/forecon_squad_leader - name = "Reconnaissance Squad Leader" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/* ---------------------- -COMMAND STAFF ---------------------- -*/ - -/datum/skills/general - name = "General" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people - SKILL_INTEL = SKILL_INTEL_EXPERT - ) - -/datum/skills/commander - name = "Commanding Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED //can change ship alt - ) - -/datum/skills/XO - name = "Executive Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //to fix CIC apc. - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - ) - -/datum/skills/SO - name = "Staff Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/SEA - name = "Senior Enlisted Advisor" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/SEA/New(mob/skillset_owner) - ..() - give_action(skillset_owner, /datum/action/looc_toggle) - -/datum/skills/SEA/Destroy() - remove_action(owner, /datum/action/looc_toggle) - return ..() - -/datum/skills/CMO - name = "CMO" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/CMP - name = "Chief MP" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/auxiliary_officer - name = "Auxiliary Support Officer" - skills = list( - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - ) - -/datum/skills/CE - name = "Chief Engineer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_INTEL = SKILL_INTEL_TRAINED, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - ) - -/datum/skills/RO - name = "Requisition Officer" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/* ---------------------- -MILITARY NONCOMBATANT ---------------------- -*/ - -/datum/skills/doctor - name = "Doctor" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/nurse - name = "Nurse" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - ) - -/datum/skills/researcher - name = "Researcher" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/pilot - name = "Pilot Officer" - skills = list( - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/crew_chief - name = "Dropship Crew Chief" - skills = list( - SKILL_PILOT = SKILL_PILOT_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - ) - -/datum/skills/MP - name = "Military Police" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/MW - name = "Military Warden" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - ) - -/datum/skills/provost - name = "Provost" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - ) - -/datum/skills/OT - name = "Ordnance Technician" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/MT - name = "Maintenance Technician" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, - ) - -/datum/skills/mess_technician - name = "Mess Technician" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, // need to hunt food somehow - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER - ) - -/datum/skills/CT - name = "Cargo Technician" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/* ---------------------- -SYNTHETIC ---------------------- -*/ - -/datum/skills/synthetic - name = "Synthetic" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MASTER, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, - ) - -/datum/skills/colonial_synthetic - name = SYNTH_COLONY - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_INTEL = SKILL_INTEL_TRAINED, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - ) - -/datum/skills/working_joe - name = SYNTH_WORKING_JOE - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, //So they can fully use the Maintenance Jack - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - ) - -/datum/skills/infiltrator_synthetic - name = SYNTH_INFILTRATOR - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MASTER, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, - SKILL_ANTAG = SKILL_ANTAG_AGENT, - ) - -/* ------------------------------- -United States Colonial Marines ------------------------------- -*/ - -/datum/skills/pfc - name = "Private" - //same as default - -/datum/skills/pfc/crafty - name = "Crafty Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - ) - -/datum/skills/combat_medic - name = "Combat Medic" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/combat_medic/crafty - name = "Crafty Combat Medic" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - ) - -/datum/skills/combat_engineer - name = "Combat Engineer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/smartgunner - name = "Squad Smartgunner" - skills = list( - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/specialist - name = "Squad Weapons Specialist" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. - SKILL_SPEC_WEAPONS = SKILL_SPEC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER - ) - -/datum/skills/tl - name = "Fireteam Leader" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/SL - name = "Squad Leader" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_INTEL = SKILL_INTEL_TRAINED, - ) - -/datum/skills/intel - name = "Intelligence Officer" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_INTEL = SKILL_INTEL_EXPERT, - ) - -/* -------------------------- -COLONIAL LIBERATION FRONT -------------------------- -*/ - -/datum/skills/clf - name = "CLF Soldier" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/clf/combat_engineer - name = "CLF Engineer" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/clf/combat_medic - name = "CLF Medic" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/clf/specialist - name = "CLF Specialist" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED - ) - -/datum/skills/clf/leader - name = "CLF Leader" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, // to use their C4 - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI - ) - -/datum/skills/clf/commander - name = "CLF Cell Commander" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - ) - -/* ------------ -FREELANCERS ------------ -*/ - -//NOTE: Freelancer training is similar to the USCM's, but with additional construction skills - -/datum/skills/freelancer - name = "Freelancer Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/freelancer/combat_medic - name = "Freelancer Medic" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/freelancer/SL - name = "Freelancer Leader" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/* --------------------------- -UNITED PROGRESSIVE PEOPLES --------------------------- -*/ - -//NOTE: UPP make up for their subpar gear with extreme training. - -/datum/skills/upp - name = "UPP Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - ) - -/datum/skills/upp/combat_engineer - name = "UPP Sapper" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - ) - -/datum/skills/upp/combat_medic - name = "UPP Medic" - skills = list( - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_DEFAULT, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - ) - -/datum/skills/upp/specialist - name = "UPP Specialist" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - ) - -/datum/skills/upp/SL - name = "UPP Squad Leader" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/upp/military_police - name = "UPP Military Police" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - ) - -/datum/skills/upp/officer - name = "UPP Officer" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POLICE = SKILL_POLICE_FLASH, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/upp/kapitan - name = "UPP Kapitan" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/upp/commander - name = "UPP Command Officer" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - ) -/datum/skills/upp/conscript - name = "UPP Conscript" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - ) - -/* ----------------------------- -Private Military Contractors ----------------------------- -*/ - -//NOTE: Compared to the USCM, PMCs have additional firearms training, construction skills and policing skills - -/datum/skills/pmc - name = "PMC Private" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - ) - -/datum/skills/pmc/medic - name = "PMC Medic" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - ) - -/datum/skills/pmc/medic/chem - name = "PMC Medical Investigator" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - ) - -/datum/skills/pmc/smartgunner - name = "PMC Smartgunner" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/pmc/specialist - name = "PMC Specialist" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/pmc/SL - name = "PMC Leader" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/pmc/SL/chem - name = "PMC Lead Investigator" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/pmc/tank_crew - name = "Vehicle Crewman" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/pmc/doctor - name = "PMC Triage Doctor" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, //trained in medicine more than combat - SKILL_CQC = SKILL_CQC_TRAINED - ) - -/datum/skills/pmc/engineer - name = "PMC Corporate Technician" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - ) - -/datum/skills/pmc/director - name = "PMC Site Director" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, - ) - -/* ---------------------- -CONTRACTORS ---------------------- -*/ -/datum/skills/contractor - name = "Contractor Standard" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/datum/skills/contractor/leader - name = "Contractor Leader" - skills = list( - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - SKILL_JTAC = SKILL_JTAC_MASTER, - ) - -/datum/skills/contractor/medic - name = "Contractor Medic" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/contractor/engi - name = "Contractor Engi" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_MAX, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, - ) - -/datum/skills/contractor/heavy - name = "Contractor Machinegunner" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - ) - -/* ---------------------- -COLONIAL MARSHALS ---------------------- -*/ -/datum/skills/cmb - name = "CMB Deputy" - skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - ) - -/datum/skills/cmb/leader - name = "CMB Marshal" - skills = list( - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_FIREMAN = SKILL_FIREMAN_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/synthetic/cmb - name = "CMB Investigative Synthetic" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, // incase the synth needs to use consoles for investigations or tracking - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, // Not a medical Synthetic, but operate if absolutely needed. - SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_PILOT = SKILL_PILOT_TRAINED, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_INTEL = SKILL_INTEL_EXPERT, - SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER - ) - -/datum/skills/military/survivor/upp_private - name = "UPP Private" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/upp_sapper - name = "UPP Sapper" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/upp_medic - name = "UPP Medic" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/military/survivor/upp_spec - name = "UPP Specialist" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - ) - -/datum/skills/military/survivor/upp_sl - name = "UPP Squad Leader" - skills = list( - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, - SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_VEHICLE = SKILL_VEHICLE_LARGE, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/* ---------------------- -SPEC-OPS ---------------------- -*/ - -/datum/skills/commando - name = "Commando" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/medic - name = "Commando Medic" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/leader - name = "Commando Leader" - skills = list( - SKILL_CQC = SKILL_CQC_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/commando/deathsquad - name = "Deathsquad" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/deathsquad/leader - name = "Deathsquad Leader" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/commando/deathsquad/officer - name = "Deathsquad Officer" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/spy - name = "Spy" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/ninja - name = "Ninja" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/* ---------------------- -MISCELLANEOUS ---------------------- -*/ - -/datum/skills/mercenary - name = "Mercenary" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/mercenary/elite - name = "Elite Mercenary" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - ) - -/datum/skills/mercenary/elite/medic - name = "Elite Mercenary Medic" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_SURGERY = SKILL_SURGERY_TRAINED, - ) - -/datum/skills/mercenary/elite/engineer - name = "Elite Mercenary Engineer" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_PILOT = SKILL_PILOT_EXPERT, - ) - -/datum/skills/mercenary/elite/heavy - name = "Elite Mercenary Heavy" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - ) - -/datum/skills/mercenary/elite/leader - name = "Elite Mercenary Leader" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_MASTER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_PILOT = SKILL_PILOT_EXPERT, - ) - -/datum/skills/dutchmerc - name = "Dutch's Dozen Mercenary" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - ) - -/datum/skills/dutchmedic - name = "Dutch's Dozen Medic" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, - ) - -/datum/skills/tank_crew - name = "Vehicle Crewman" - skills = list( - SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, - SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_JTAC = SKILL_JTAC_EXPERT, - ) - -/datum/skills/gladiator - name = "Gladiator" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - ) - -/datum/skills/gladiator/champion - name = "Gladiator Champion" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_TRAINED, - ) - -/datum/skills/gladiator/champion/leader - name = "Gladiator Leader" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, //Spartacus! - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - ) - -/datum/skills/yautja/warrior - name = "Yautja Warrior" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_ANTAG = SKILL_ANTAG_HUNTER, - ) - -/datum/skills/dutch - name = "Dutch" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_EXPERT, - SKILL_ANTAG = SKILL_ANTAG_HUNTER, - ) - -/datum/skills/cultist_leader - name = "Cultist Leader" - skills = list( - SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_LEADERSHIP = SKILL_LEAD_MASTER, - SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_JTAC = SKILL_JTAC_MASTER, - ) - -/datum/skills/souto - name = "Souto Man" - skills = list( - SKILL_CQC = SKILL_CQC_MASTER, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - ) - -/datum/skills/everything //max it out - name = "Ultra" - skills = list( - SKILL_CQC = SKILL_CQC_MAX, - SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, - SKILL_FIREARMS = SKILL_FIREARMS_MAX, - SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, - SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, - SKILL_ENGINEER = SKILL_ENGINEER_MAX, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, - SKILL_LEADERSHIP = SKILL_LEAD_MAX, - SKILL_OVERWATCH = SKILL_OVERWATCH_MAX, - SKILL_MEDICAL = SKILL_MEDICAL_MAX, - SKILL_SURGERY = SKILL_SURGERY_MAX, - SKILL_RESEARCH = SKILL_RESEARCH_MAX, - SKILL_ANTAG = SKILL_ANTAG_MAX, - SKILL_PILOT = SKILL_PILOT_MAX, - SKILL_POLICE = SKILL_POLICE_MAX, - SKILL_FIREMAN = SKILL_FIREMAN_MAX, - SKILL_POWERLOADER = SKILL_POWERLOADER_MAX, - SKILL_VEHICLE = SKILL_VEHICLE_MAX, - SKILL_JTAC = SKILL_JTAC_MAX, - SKILL_EXECUTION = SKILL_EXECUTION_MAX, - SKILL_INTEL = SKILL_INTEL_MAX, - ) - -/* ----------------------------- -Royal Marines Commando ----------------------------- -*/ - -//NOTE: Skills take heavy from PMCs - -/datum/skills/rmc - name = "Royal Marines Commando" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - ) - -/datum/skills/rmc/specialist - name = "Royal Marines Commando Specialist" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - ) - -/datum/skills/rmc/smartgun - name = "Royal Marines Commando Smartgunner" - skills = list( - SKILL_CQC = SKILL_CQC_TRAINED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_BEGINNER, - SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, - ) - -/datum/skills/rmc/leader - name = "Royal Marines Commando Leader" - skills = list( - SKILL_CQC = SKILL_CQC_SKILLED, - SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, - SKILL_POLICE = SKILL_POLICE_SKILLED, - SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, - SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, - SKILL_ENGINEER = SKILL_ENGINEER_ENGI, - SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, - SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, - SKILL_SURGERY = SKILL_SURGERY_NOVICE, - SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, - SKILL_JTAC = SKILL_JTAC_TRAINED, - SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, - ) diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm new file mode 100644 index 000000000000..9b55adc9b1f4 --- /dev/null +++ b/code/datums/skills/civilian.dm @@ -0,0 +1,213 @@ +/* +--------------------- +CIVILIAN +--------------------- +*/ + +/datum/skills/civilian + name = "Civilian" + skills = list( + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_ENDURANCE = SKILL_ENDURANCE_NONE, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/manager + name = "Weyland-Yutani Manager" // Semi-competent leader with basic knowledge in most things. + skills = list( + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +/datum/skills/civilian/icc_investigation + name = "ICC CL - Black Market ERT" + skills = list( + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //The ASRS consoles + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_POLICE = SKILL_POLICE_SKILLED, //The CMB Tradeband Compliance Device + ) + +/datum/skills/civilian/manager/director + name = "Weyland-Yutani Director" + skills = list( + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +//civilian that are survivor could be in is own file maybe + +/datum/skills/civilian/survivor + name = "Survivor" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + ) + +/datum/skills/civilian/survivor/manager + name = "Weyland-Yutani Manager" + skills = list( + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +/datum/skills/civilian/survivor/goon + name = "Survivor Goon" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/pmc + name = "Survivor PMC" + additional_skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/pmc/medic + name = "Survivor PMC Medic" + additional_skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/pmc/engineer + name = "Survivor PMC Engineer" + additional_skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/civilian/survivor/doctor + name = "Survivor Doctor" + additional_skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/civilian/survivor/clf + name = "Survivor CLF" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + ) + +/datum/skills/civilian/survivor/scientist + name = "Survivor Scientist" + additional_skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + ) + +/datum/skills/civilian/survivor/chef + name = "Survivor Chef" + additional_skills = list( + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, + ) + +/datum/skills/civilian/survivor/miner + name = "Survivor Miner" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/trucker + name = "Survivor Trucker" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + ) + +/datum/skills/civilian/survivor/engineer + name = "Survivor Engineer" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/chaplain + name = "Survivor Chaplain" + additional_skills = list( + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) + +/datum/skills/civilian/survivor/marshal + name = "Survivor Marshal" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + ) + +/datum/skills/civilian/survivor/prisoner + name = "Survivor Prisoner" + additional_skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/gangleader + name = "Survivor Gang Leader" + additional_skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) diff --git a/code/datums/skills/clf.dm b/code/datums/skills/clf.dm new file mode 100644 index 000000000000..6042febb6b48 --- /dev/null +++ b/code/datums/skills/clf.dm @@ -0,0 +1,92 @@ +/* +------------------------- +COLONIAL LIBERATION FRONT +------------------------- +*/ + +/datum/skills/clf + name = "CLF Soldier" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/clf/combat_engineer + name = "CLF Engineer" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/clf/combat_medic + name = "CLF Medic" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_WEAK, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/clf/specialist + name = "CLF Specialist" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED + ) + +/datum/skills/clf/leader + name = "CLF Leader" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, // to use their C4 + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI + ) + +/datum/skills/clf/commander + name = "CLF Cell Commander" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + ) diff --git a/code/datums/skills/cmb.dm b/code/datums/skills/cmb.dm new file mode 100644 index 000000000000..b29a4c314567 --- /dev/null +++ b/code/datums/skills/cmb.dm @@ -0,0 +1,60 @@ +/* +--------------------- +COLONIAL MARSHALS +--------------------- +*/ +/datum/skills/cmb + name = "CMB Deputy" + skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + ) + +/datum/skills/cmb/leader + name = "CMB Marshal" + skills = list( + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_FIREMAN = SKILL_FIREMAN_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/synthetic/cmb + name = "CMB Investigative Synthetic" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, // incase the synth needs to use consoles for investigations or tracking + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, // Not a medical Synthetic, but operate if absolutely needed. + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER + ) diff --git a/code/datums/skills/commando.dm b/code/datums/skills/commando.dm new file mode 100644 index 000000000000..dabae682bd0b --- /dev/null +++ b/code/datums/skills/commando.dm @@ -0,0 +1,116 @@ +/* +--------------------- +SPEC-OPS +--------------------- +*/ + +/datum/skills/commando + name = "Commando" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/medic + name = "Commando Medic" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/leader + name = "Commando Leader" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/commando/deathsquad + name = "Deathsquad" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/deathsquad/leader + name = "Deathsquad Leader" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/commando/deathsquad/officer + name = "Deathsquad Officer" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/spy + name = "Spy" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/ninja + name = "Ninja" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) diff --git a/code/datums/skills/contractor.dm b/code/datums/skills/contractor.dm new file mode 100644 index 000000000000..183e95c941f5 --- /dev/null +++ b/code/datums/skills/contractor.dm @@ -0,0 +1,90 @@ +/* +--------------------- +CONTRACTORS +--------------------- +*/ +/datum/skills/contractor + name = "Contractor Standard" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/contractor/leader + name = "Contractor Leader" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_JTAC = SKILL_JTAC_MASTER, + ) + +/datum/skills/contractor/medic + name = "Contractor Medic" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/contractor/engi + name = "Contractor Engi" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_MAX, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + ) + +/datum/skills/contractor/heavy + name = "Contractor Machinegunner" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) diff --git a/code/datums/skills/dutch.dm b/code/datums/skills/dutch.dm new file mode 100644 index 000000000000..5c2c63a8c463 --- /dev/null +++ b/code/datums/skills/dutch.dm @@ -0,0 +1,46 @@ +/datum/skills/dutch + name = "Dutch" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_ANTAG = SKILL_ANTAG_HUNTER, + ) + +/datum/skills/dutchmerc + name = "Dutch's Dozen Mercenary" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + ) + +/datum/skills/dutchmedic + name = "Dutch's Dozen Medic" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_EXPERT, + ) diff --git a/code/datums/skills/forecon.dm b/code/datums/skills/forecon.dm new file mode 100644 index 000000000000..4799dd68d617 --- /dev/null +++ b/code/datums/skills/forecon.dm @@ -0,0 +1,102 @@ +/* +--------------------- +MILITARY SURVIVORS +--------------------- +*/ +//Hardcore survivors with poor equipment and skills, prove you're the best of the best. + +/datum/skills/military/survivor/forecon_standard + name = "Reconnaissance Rifleman" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_techician + name = "Reconnaissance Support Technician" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_marksman + name = "Reconnaissance Designated Marksman" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SCOUT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_smartgunner + name = "Reconnaissance Smartgunner" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_sniper + name = "Reconnaissance Sniper" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SNIPER, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/forecon_squad_leader + name = "Reconnaissance Squad Leader" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_DEFAULT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) diff --git a/code/datums/skills/freelancer.dm b/code/datums/skills/freelancer.dm new file mode 100644 index 000000000000..7f7256318edb --- /dev/null +++ b/code/datums/skills/freelancer.dm @@ -0,0 +1,40 @@ +/* +----------- +FREELANCERS +----------- +*/ + +//NOTE: Freelancer training is similar to the USCM's, but with additional construction skills + +/datum/skills/freelancer + name = "Freelancer Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/freelancer/combat_medic + name = "Freelancer Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/freelancer/SL + name = "Freelancer Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + + diff --git a/code/datums/skills/gladiator.dm b/code/datums/skills/gladiator.dm new file mode 100644 index 000000000000..7ba2c9eff455 --- /dev/null +++ b/code/datums/skills/gladiator.dm @@ -0,0 +1,33 @@ +/datum/skills/gladiator + name = "Gladiator" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_LEADERSHIP = SKILL_LEAD_NOVICE, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + ) + +/datum/skills/gladiator/champion + name = "Gladiator Champion" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/gladiator/champion/leader + name = "Gladiator Leader" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, //Spartacus! + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + ) diff --git a/code/datums/skills/mercenary.dm b/code/datums/skills/mercenary.dm new file mode 100644 index 000000000000..8d842ea30dd2 --- /dev/null +++ b/code/datums/skills/mercenary.dm @@ -0,0 +1,85 @@ +/datum/skills/mercenary + name = "Mercenary" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/mercenary/elite + name = "Elite Mercenary" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/mercenary/elite/medic + name = "Elite Mercenary Medic" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/mercenary/elite/engineer + name = "Elite Mercenary Engineer" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_PILOT = SKILL_PILOT_EXPERT, + ) + +/datum/skills/mercenary/elite/heavy + name = "Elite Mercenary Heavy" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + ) + +/datum/skills/mercenary/elite/leader + name = "Elite Mercenary Leader" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_PILOT = SKILL_PILOT_EXPERT, + ) diff --git a/code/datums/skills/misc.dm b/code/datums/skills/misc.dm new file mode 100644 index 000000000000..e4f78219b5c6 --- /dev/null +++ b/code/datums/skills/misc.dm @@ -0,0 +1,86 @@ +/* +--------------------- +MISCELLANEOUS +--------------------- +*/ + +/datum/skills/tank_crew + name = "Vehicle Crewman" + skills = list( + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/yautja/warrior + name = "Yautja Warrior" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_ANTAG = SKILL_ANTAG_HUNTER, + ) + +/datum/skills/cultist_leader + name = "Cultist Leader" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + ) + +/datum/skills/souto + name = "Souto Man" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + ) + +/datum/skills/everything //max it out + name = "Ultra" + skills = list( + SKILL_CQC = SKILL_CQC_MAX, + SKILL_MELEE_WEAPONS = SKILL_MELEE_MAX, + SKILL_FIREARMS = SKILL_FIREARMS_MAX, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_ENGINEER = SKILL_ENGINEER_MAX, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MAX, + SKILL_LEADERSHIP = SKILL_LEAD_MAX, + SKILL_OVERWATCH = SKILL_OVERWATCH_MAX, + SKILL_MEDICAL = SKILL_MEDICAL_MAX, + SKILL_SURGERY = SKILL_SURGERY_MAX, + SKILL_RESEARCH = SKILL_RESEARCH_MAX, + SKILL_ANTAG = SKILL_ANTAG_MAX, + SKILL_PILOT = SKILL_PILOT_MAX, + SKILL_POLICE = SKILL_POLICE_MAX, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MAX, + SKILL_VEHICLE = SKILL_VEHICLE_MAX, + SKILL_JTAC = SKILL_JTAC_MAX, + SKILL_EXECUTION = SKILL_EXECUTION_MAX, + SKILL_INTEL = SKILL_INTEL_MAX, + ) diff --git a/code/datums/skills/pmc.dm b/code/datums/skills/pmc.dm new file mode 100644 index 000000000000..df7027e2a7ab --- /dev/null +++ b/code/datums/skills/pmc.dm @@ -0,0 +1,171 @@ +/* +---------------------------- +Private Military Contractors +---------------------------- +*/ + +//NOTE: Compared to the USCM, PMCs have additional firearms training, construction skills and policing skills + +/datum/skills/pmc + name = "PMC Private" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + ) + +/datum/skills/pmc/medic + name = "PMC Medic" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + ) + +/datum/skills/pmc/medic/chem + name = "PMC Medical Investigator" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + ) + +/datum/skills/pmc/smartgunner + name = "PMC Smartgunner" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/pmc/specialist + name = "PMC Specialist" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/pmc/SL + name = "PMC Leader" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/pmc/SL/chem + name = "PMC Lead Investigator" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/pmc/tank_crew + name = "Vehicle Crewman" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/pmc/doctor + name = "PMC Triage Doctor" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, //trained in medicine more than combat + SKILL_CQC = SKILL_CQC_TRAINED + ) + +/datum/skills/pmc/engineer + name = "PMC Corporate Technician" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/pmc/director + name = "PMC Site Director" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + ) diff --git a/code/datums/skills/rmc.dm b/code/datums/skills/rmc.dm new file mode 100644 index 000000000000..89aa39b154ad --- /dev/null +++ b/code/datums/skills/rmc.dm @@ -0,0 +1,71 @@ +/* +---------------------------- +Royal Marines Commando +---------------------------- +*/ + +//NOTE: Skills take heavy from PMCs + +/datum/skills/rmc + name = "Royal Marines Commando" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + ) + +/datum/skills/rmc/specialist + name = "Royal Marines Commando Specialist" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/rmc/smartgun + name = "Royal Marines Commando Smartgunner" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + ) + +/datum/skills/rmc/leader + name = "Royal Marines Commando Leader" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) diff --git a/code/datums/skills/skills.dm b/code/datums/skills/skills.dm new file mode 100644 index 000000000000..5d1a69e174ed --- /dev/null +++ b/code/datums/skills/skills.dm @@ -0,0 +1,267 @@ +// Individual skill +/datum/skill + /// Name of the skill + var/skill_name = null + /// used for the view UI + var/readable_skill_name = null + /// Level of skill in this... skill + var/skill_level = 0 + /// the max level this skill can be, used for tgui + var/max_skill_level = 0 + +/datum/skill/proc/get_skill_level() + return skill_level + +/datum/skill/proc/set_skill(new_level, mob/owner) + skill_level = new_level + +/datum/skill/proc/is_skilled(req_level, is_explicit = FALSE) + if(is_explicit) + return (skill_level == req_level) + return (skill_level >= req_level) + +// Lots of defines here. See #define/skills.dm + +/datum/skill/cqc + skill_name = SKILL_CQC + readable_skill_name = "CQC" + skill_level = SKILL_CQC_DEFAULT + max_skill_level = SKILL_CQC_MAX + +/datum/skill/melee_weapons + skill_name = SKILL_MELEE_WEAPONS + readable_skill_name = "melee weapons" + skill_level = SKILL_MELEE_DEFAULT + max_skill_level = SKILL_MELEE_MAX + +/datum/skill/firearms + skill_name = SKILL_FIREARMS + skill_level = SKILL_FIREARMS_TRAINED + max_skill_level = SKILL_FIREARMS_MAX + +/datum/skill/spec_weapons + skill_name = SKILL_SPEC_WEAPONS + readable_skill_name = "specialist weapons" + skill_level = SKILL_SPEC_DEFAULT + max_skill_level = SKILL_SPEC_ALL + +/datum/skill/endurance + skill_name = SKILL_ENDURANCE + skill_level = SKILL_ENDURANCE_WEAK + max_skill_level = SKILL_ENDURANCE_MAX + +/datum/skill/engineer + skill_name = SKILL_ENGINEER + skill_level = SKILL_ENGINEER_DEFAULT + max_skill_level = SKILL_ENGINEER_MAX + +/datum/skill/construction + skill_name = SKILL_CONSTRUCTION + skill_level = SKILL_CONSTRUCTION_DEFAULT + max_skill_level = SKILL_CONSTRUCTION_MAX + +/datum/skill/leadership + skill_name = SKILL_LEADERSHIP + skill_level = SKILL_LEAD_NOVICE + max_skill_level = SKILL_LEAD_MAX + +/datum/skill/leadership/set_skill(new_level, mob/living/owner) + ..() + if(!owner) + return + + if(!ishuman(owner)) + return + + // Give/remove issue order actions + if(is_skilled(SKILL_LEAD_TRAINED)) + ADD_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) + else + REMOVE_TRAIT(owner, TRAIT_LEADERSHIP, TRAIT_SOURCE_SKILL(skill_name)) + +/datum/skill/overwatch + skill_name = SKILL_OVERWATCH + skill_level = SKILL_OVERWATCH_DEFAULT + max_skill_level = SKILL_OVERWATCH_MAX + +/datum/skill/medical + skill_name = SKILL_MEDICAL + skill_level = SKILL_MEDICAL_DEFAULT + max_skill_level = SKILL_MEDICAL_MAX + +/datum/skill/surgery + skill_name = SKILL_SURGERY + skill_level = SKILL_SURGERY_DEFAULT + max_skill_level = SKILL_SURGERY_MAX + +/datum/skill/surgery/set_skill(new_level, mob/living/owner) + ..() + if(!owner) + return + + if(!ishuman(owner)) + return + + // Give/remove surgery toggle action + var/datum/action/surgery_toggle/surgery_action = locate() in owner.actions + if(is_skilled(SKILL_SURGERY_NOVICE)) + if(!surgery_action) + give_action(owner, /datum/action/surgery_toggle) + else + surgery_action.update_surgery_skill() + else + if(surgery_action) + surgery_action.remove_from(owner) + +/datum/skill/research + skill_name = SKILL_RESEARCH + skill_level = SKILL_RESEARCH_DEFAULT + max_skill_level = SKILL_RESEARCH_MAX + +/datum/skill/antag + skill_name = SKILL_ANTAG + readable_skill_name = "illegal technology" + skill_level = SKILL_ANTAG_DEFAULT + max_skill_level = SKILL_ANTAG_MAX + +/datum/skill/pilot + skill_name = SKILL_PILOT + skill_level = SKILL_PILOT_DEFAULT + max_skill_level = SKILL_PILOT_MAX + +/datum/skill/navigations + skill_name = SKILL_NAVIGATIONS + skill_level = SKILL_NAVIGATIONS_DEFAULT + max_skill_level = SKILL_NAVIGATIONS_MAX + +/datum/skill/police + skill_name = SKILL_POLICE + skill_level = SKILL_POLICE_DEFAULT + max_skill_level = SKILL_POLICE_MAX + +/datum/skill/powerloader + skill_name = SKILL_POWERLOADER + skill_level = SKILL_POWERLOADER_DEFAULT + max_skill_level = SKILL_POWERLOADER_MAX + +/datum/skill/vehicles + skill_name = SKILL_VEHICLE + skill_level = SKILL_VEHICLE_DEFAULT + max_skill_level = SKILL_VEHICLE_MAX + +/datum/skill/jtac + skill_name = SKILL_JTAC + readable_skill_name = "JTAC" + skill_level = SKILL_JTAC_NOVICE + max_skill_level = SKILL_JTAC_MAX + +/datum/skill/execution + skill_name = SKILL_EXECUTION + skill_level = SKILL_EXECUTION_DEFAULT + max_skill_level = SKILL_EXECUTION_MAX + +/datum/skill/intel + skill_name = SKILL_INTEL + skill_level = SKILL_INTEL_NOVICE + max_skill_level = SKILL_INTEL_MAX + +/datum/skill/domestic + skill_name = SKILL_DOMESTIC + skill_level = SKILL_DOMESTIC_NONE + max_skill_level = SKILL_DOMESTIC_MAX + +/datum/skill/fireman + skill_name = SKILL_FIREMAN + readable_skill_name = "fireman carrying" + skill_level = SKILL_FIREMAN_DEFAULT + max_skill_level = SKILL_FIREMAN_MAX + +/// Skill with an extra S at the end is a collection of multiple skills. Basically a skillSET +/// This is to organize and provide a common interface to the huge heap of skills there are +/datum/skills + /// The name of the skillset + var/name + // The mob that has this skillset + var/mob/owner + + // List of skill datums. + // Also, if this is populated when the datum is created, it will set the skill levels automagically + var/list/skills = list() + // Same as above, but for children of parents that just add a lil something else + var/list/additional_skills = list() + +/datum/skills/New(mob/skillset_owner) + owner = skillset_owner + + // Setup every single skill + for(var/skill_type in subtypesof(/datum/skill)) + var/datum/skill/S = new skill_type() + + // Fancy hack to convert a list of desired skill levels in each named skill into a skill level in the actual skill datum + // Lets the skills list be used multipurposely for both storing skill datums and choosing skill levels for different skillsets + var/predetermined_skill_level = additional_skills[S.skill_name] ? additional_skills[S.skill_name] : skills[S.skill_name] + skills[S.skill_name] = S + + if(!isnull(predetermined_skill_level)) + S.set_skill(predetermined_skill_level, owner) + +/datum/skills/Destroy() + owner = null + skills = null // Don't need to delete, /datum/skill should softdel + SStgui.close_uis(src) + return ..() + +// Checks if the given skill is contained in this skillset at all +/datum/skills/proc/has_skill(skill) + return isnull(skills[skill]) + +// Returns the skill DATUM for the given skill +/datum/skills/proc/get_skill(skill) + if(!skills) + return null + return skills[skill] + +// Returns the skill level for the given skill +/datum/skills/proc/get_skill_level(skill) + var/datum/skill/S = get_skill(skill) + if(!S) + return -1 + if(QDELETED(S)) + return -1 + return S.get_skill_level() + +// Sets the skill LEVEL for a given skill +/datum/skills/proc/set_skill(skill, new_level) + var/datum/skill/S = skills[skill] + if(!S) + return + return S.set_skill(new_level, owner) + +/datum/skills/proc/increment_skill(skill, increment, cap) + var/datum/skill/S = skills[skill] + if(!S || skillcheck(owner, skill, cap)) + return + return S.set_skill(min(cap,S.skill_level+increment), owner) + +/datum/skills/proc/decrement_skill(skill, increment) + var/datum/skill/S = skills[skill] + if(!S) + return + return S.set_skill(max(0,S.skill_level-increment), owner) + +// Checks if the skillset is AT LEAST skilled enough to pass a skillcheck for the given skill level +/datum/skills/proc/is_skilled(skill, req_level, is_explicit = FALSE) + var/datum/skill/S = get_skill(skill) + if(QDELETED(S)) + return FALSE + return S.is_skilled(req_level, is_explicit) + +// Adjusts the full skillset to a new type of skillset. Pass the datum type path for the desired skillset +/datum/skills/proc/set_skillset(skillset_type) + var/datum/skills/skillset = new skillset_type() + var/list/skill_levels = initial(skillset.skills) + + name = skillset.name + for(var/skill in skill_levels) + set_skill(skill, skill_levels[skill]) + qdel(skillset) diff --git a/code/datums/skills/synthetic.dm b/code/datums/skills/synthetic.dm new file mode 100644 index 000000000000..3925dd9605b3 --- /dev/null +++ b/code/datums/skills/synthetic.dm @@ -0,0 +1,90 @@ +/* +--------------------- +SYNTHETIC +--------------------- +*/ + +/datum/skills/synthetic + name = "Synthetic" + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MASTER, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + ) + +/datum/skills/colonial_synthetic + name = SYNTH_COLONY + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + SKILL_INTEL = SKILL_INTEL_TRAINED, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + ) + +/datum/skills/working_joe + name = SYNTH_WORKING_JOE + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, //So they can fully use the Maintenance Jack + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + ) + +/datum/skills/infiltrator_synthetic + name = SYNTH_INFILTRATOR + skills = list( + SKILL_CQC = SKILL_CQC_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MASTER, + SKILL_SURGERY = SKILL_SURGERY_EXPERT, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_SUPER, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_MAX, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER, + SKILL_ANTAG = SKILL_ANTAG_AGENT, + ) diff --git a/code/datums/skills/upp.dm b/code/datums/skills/upp.dm new file mode 100644 index 000000000000..77401ab62878 --- /dev/null +++ b/code/datums/skills/upp.dm @@ -0,0 +1,218 @@ +/* +-------------------------- +UNITED PROGRESSIVE PEOPLES +-------------------------- +*/ + +//NOTE: UPP make up for their subpar gear with extreme training. + +/datum/skills/upp + name = "UPP Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + ) + +/datum/skills/upp/combat_engineer + name = "UPP Sapper" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + ) + +/datum/skills/upp/combat_medic + name = "UPP Medic" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_DEFAULT, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + ) + +/datum/skills/upp/specialist + name = "UPP Specialist" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + ) + +/datum/skills/upp/SL + name = "UPP Squad Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/upp/military_police + name = "UPP Military Police" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + ) + +/datum/skills/upp/officer + name = "UPP Officer" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/upp/kapitan + name = "UPP Kapitan" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/upp/commander + name = "UPP Command Officer" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, + ) +/datum/skills/upp/conscript + name = "UPP Conscript" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + ) + + +//Survivor + +/datum/skills/military/survivor/upp_private + name = "UPP Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_sapper + name = "UPP Sapper" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_medic + name = "UPP Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_DEFAULT, + SKILL_JTAC = SKILL_JTAC_TRAINED, + ) + +/datum/skills/military/survivor/upp_spec + name = "UPP Specialist" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + ) + +/datum/skills/military/survivor/upp_sl + name = "UPP Squad Leader" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_UPP, + SKILL_FIREARMS = SKILL_FIREARMS_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm new file mode 100644 index 000000000000..8a6d2fd2c8c2 --- /dev/null +++ b/code/datums/skills/uscm.dm @@ -0,0 +1,410 @@ +/* +------------------------------ +United States Colonial Marines +------------------------------ +*/ + +/datum/skills/pfc + name = "Private" + //same as default + +/datum/skills/pfc/crafty + name = "Crafty Private" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + ) + +/datum/skills/combat_medic + name = "Combat Medic" + skills = list( + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/combat_medic/crafty + name = "Crafty Combat Medic" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + ) + +/datum/skills/combat_engineer + name = "Combat Engineer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/smartgunner + name = "Squad Smartgunner" + skills = list( + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_JTAC = SKILL_JTAC_BEGINNER, + ) + +/datum/skills/specialist + name = "Squad Weapons Specialist" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, //to use c4 in demo set. + SKILL_SPEC_WEAPONS = SKILL_SPEC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_BEGINNER + ) + +/datum/skills/tl + name = "Fireteam Leader" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_JTAC = SKILL_JTAC_EXPERT, + ) + +/datum/skills/SL + name = "Squad Leader" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/intel + name = "Intelligence Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_INTEL = SKILL_INTEL_EXPERT, + ) + +/* +--------------------- +MILITARY NONCOMBATANT +--------------------- +*/ + +/datum/skills/doctor + name = "Doctor" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + ) + +/datum/skills/nurse + name = "Nurse" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + ) + +/datum/skills/researcher + name = "Researcher" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/pilot + name = "Pilot Officer" + skills = list( + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/crew_chief + name = "Dropship Crew Chief" + skills = list( + SKILL_PILOT = SKILL_PILOT_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + ) + +/datum/skills/MP + name = "Military Police" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/MW + name = "Military Warden" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + ) + +/datum/skills/provost + name = "Provost" + skills = list( + SKILL_CQC = SKILL_CQC_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_ENDURANCE = SKILL_ENDURANCE_MASTER, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + ) + +/datum/skills/OT + name = "Ordnance Technician" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/datum/skills/MT + name = "Maintenance Technician" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_DOMESTIC = SKILL_DOMESTIC_TRAINED, + ) + +/datum/skills/mess_technician + name = "Mess Technician" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, // need to hunt food somehow + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_DOMESTIC = SKILL_DOMESTIC_MASTER + ) + +/datum/skills/CT + name = "Cargo Technician" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + ) + +/* +--------------------- +COMMAND STAFF +--------------------- +*/ + +/datum/skills/general + name = "General" + skills = list( + SKILL_CQC = SKILL_CQC_TRAINED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_MAX, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_SPEC_WEAPONS = SKILL_SPEC_ALL, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people + SKILL_INTEL = SKILL_INTEL_EXPERT + ) + +/datum/skills/commander + name = "Commanding Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_SPEC_WEAPONS = SKILL_SPEC_SMARTGUN, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_EXECUTION = SKILL_EXECUTION_TRAINED, //can BE people + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED //can change ship alt + ) + +/datum/skills/XO + name = "Executive Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, //to fix CIC apc. + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + ) + +/datum/skills/SO + name = "Staff Officer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_POWERLOADER = SKILL_POWERLOADER_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/SEA + name = "Senior Enlisted Advisor" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_FIREARMS = SKILL_FIREARMS_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_VEHICLE = SKILL_VEHICLE_LARGE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + ) + +/datum/skills/SEA/New(mob/skillset_owner) + ..() + give_action(skillset_owner, /datum/action/looc_toggle) + +/datum/skills/SEA/Destroy() + remove_action(owner, /datum/action/looc_toggle) + return ..() + +/datum/skills/CMO + name = "CMO" + skills = list( + SKILL_FIREARMS = SKILL_FIREARMS_CIVILIAN, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_RESEARCH = SKILL_RESEARCH_TRAINED, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/CMP + name = "Chief MP" + skills = list( + SKILL_CQC = SKILL_CQC_SKILLED, + SKILL_POLICE = SKILL_POLICE_SKILLED, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_MELEE_WEAPONS = SKILL_MELEE_TRAINED, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) + +/datum/skills/auxiliary_officer + name = "Auxiliary Support Officer" + skills = list( + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_MEDIC, + SKILL_SURGERY = SKILL_SURGERY_NOVICE, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_EXPERT, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + ) + +/datum/skills/CE + name = "Chief Engineer" + skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_MASTER, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_MASTER, + SKILL_LEADERSHIP = SKILL_LEAD_MASTER, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_JTAC = SKILL_JTAC_MASTER, + SKILL_INTEL = SKILL_INTEL_TRAINED, + SKILL_NAVIGATIONS = SKILL_NAVIGATIONS_TRAINED, + ) + +/datum/skills/RO + name = "Requisition Officer" + skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, + SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, + SKILL_OVERWATCH = SKILL_OVERWATCH_TRAINED, + SKILL_POWERLOADER = SKILL_POWERLOADER_MASTER, + SKILL_POLICE = SKILL_POLICE_FLASH, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_JTAC = SKILL_JTAC_EXPERT, + SKILL_INTEL = SKILL_INTEL_TRAINED, + ) diff --git a/colonialmarines.dme b/colonialmarines.dme index 6c62448b54fb..ee6bcd1a0aab 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -335,7 +335,6 @@ s// DM Environment file for colonialmarines.dme. #include "code\datums\quadtree.dm" #include "code\datums\recipe.dm" #include "code\datums\shuttles.dm" -#include "code\datums\skills.dm" #include "code\datums\soundOutput.dm" #include "code\datums\tgs_event_handler.dm" #include "code\datums\vehicles.dm" @@ -585,6 +584,23 @@ s// DM Environment file for colonialmarines.dme. #include "code\datums\redis\redis_message.dm" #include "code\datums\redis\callbacks\_redis_callback.dm" #include "code\datums\redis\callbacks\asay.dm" +#include "code\datums\skills\civilian.dm" +#include "code\datums\skills\clf.dm" +#include "code\datums\skills\cmb.dm" +#include "code\datums\skills\commando.dm" +#include "code\datums\skills\contractor.dm" +#include "code\datums\skills\dutch.dm" +#include "code\datums\skills\forecon.dm" +#include "code\datums\skills\freelancer.dm" +#include "code\datums\skills\gladiator.dm" +#include "code\datums\skills\mercenary.dm" +#include "code\datums\skills\misc.dm" +#include "code\datums\skills\pmc.dm" +#include "code\datums\skills\rmc.dm" +#include "code\datums\skills\skills.dm" +#include "code\datums\skills\synthetic.dm" +#include "code\datums\skills\upp.dm" +#include "code\datums\skills\uscm.dm" #include "code\datums\stamina\_stamina.dm" #include "code\datums\stamina\none.dm" #include "code\datums\statistics\cause_data.dm" From 36f77792f82ce36a171cf1cb6a6c64871e05d568 Mon Sep 17 00:00:00 2001 From: spartanbobby <71467726+spartanbobby@users.noreply.github.com> Date: Wed, 18 Oct 2023 21:23:34 +0100 Subject: [PATCH 076/199] Almayer Maintenance, Fixes for the USS Almayers recent change(s) (#4701) # About the pull request This PR attempts to fix, inconsistencies with floortile detailing, bugs, and other issues with the USS Almayer # Explain why it's good for the game Mostly some things were missed and some detailing consistencies should be maintained # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl:SpartanBobby maptweak: fixes lack of warning stripes under doors in squad briefing areas and newly added maint doors onboard USS Almayer maptweak: fixes incorrect tiles used under window frames in new squad briefing areas onboard USS Almayer maptweak: fixes pipe sections under window frames in new squad briefing areas onboard USS Almayer maptweak: fixes pipes that lead nowhere in new squad briefing areas onboard USS Almayer maptweak: fixes button that was being hidden by light due to recent USS Almayer changes maptweak: corrects strangely laid out vent sections due to recent USS Almayer changes maptweak: makes USS Almayer Bunks consistent with the rest of the ship's shower and bathrooms maptweak: updates "Dusty Beret" prop item to now be the RMC Beret it was originally referencing (now that the RMC are ingame) /:cl: --- maps/map_files/USS_Almayer/USS_Almayer.dmm | 820 +++++++++++---------- 1 file changed, 425 insertions(+), 395 deletions(-) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index e77f1db95b95..85d8ff3ea87e 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -10929,7 +10929,9 @@ dir = 1; name = "\improper Tool Closet" }, -/turf/open/floor/plating/plating_catwalk, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/living/port_emb) "aKN" = ( /obj/structure/surface/table/reinforced/almayer_B, @@ -12018,11 +12020,11 @@ /area/almayer/medical/upper_medical) "aQD" = ( /obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; dir = 2; name = "\improper Security Checkpoint"; req_access = null; - req_one_access_txt = "3;19"; - access_modified = 1 + req_one_access_txt = "3;19" }, /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -14286,10 +14288,10 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) "bbJ" = ( -/obj/structure/pipes/standard/manifold/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "green" +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 }, +/turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) "bbL" = ( /turf/open/floor/almayer{ @@ -22992,10 +22994,10 @@ /area/almayer/squads/req) "bRS" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + access_modified = 1; dir = 1; name = "\improper Kitchen Hydroponics"; - req_one_access_txt = "30;19"; - access_modified = 1 + req_one_access_txt = "30;19" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -27136,7 +27138,7 @@ /area/almayer/squads/delta) "cmc" = ( /obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 + dir = 5 }, /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ pixel_y = -30 @@ -31820,6 +31822,7 @@ /area/almayer/shipboard/brig/general_equipment) "eai" = ( /obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, /turf/open/floor/almayer, /area/almayer/living/port_emb) "ean" = ( @@ -32092,7 +32095,17 @@ pixel_x = -7; pixel_y = -6 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "efh" = ( /obj/structure/surface/table/almayer, @@ -33151,7 +33164,9 @@ pixel_x = -21; pixel_y = -14 }, -/turf/open/floor/plating/plating_catwalk, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/port_emb) "ezQ" = ( /obj/structure/sign/safety/restrictedarea{ @@ -33187,7 +33202,12 @@ /obj/structure/machinery/light{ dir = 4 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "ezX" = ( /obj/structure/bed/chair/wood/normal, @@ -33825,14 +33845,10 @@ }, /area/almayer/hull/lower_hull/l_f_p) "eOs" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer{ - icon_state = "plate" + icon_state = "dark_sterile" }, -/area/almayer/hallways/starboard_hallway) +/area/almayer/living/port_emb) "eOM" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ dir = 2; @@ -34179,6 +34195,9 @@ /turf/open/floor/almayer, /area/almayer/living/offices) "eXE" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, /turf/open/floor/almayer{ dir = 9; icon_state = "green" @@ -34212,8 +34231,14 @@ }, /area/almayer/living/briefing) "eYv" = ( -/obj/structure/machinery/power/apc/almayer{ - dir = 8 +/obj/structure/machinery/disposal, +/obj/item/reagent_container/food/drinks/cans/beer{ + layer = 3.3; + pixel_x = -4; + pixel_y = 15 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) @@ -35384,9 +35409,9 @@ icon_state = "therapyred"; layer = 4.1; name = "Sergeant Huggs"; + pixel_x = 7; pixel_y = -1; - throwforce = 15; - pixel_x = 7 + throwforce = 15 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -35514,7 +35539,17 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "fBD" = ( /obj/effect/decal/warning_stripes{ @@ -36258,11 +36293,14 @@ /turf/closed/wall/almayer, /area/almayer/hull/upper_hull/u_m_p) "fQQ" = ( -/turf/open/floor/almayer_hull{ - dir = 8; - icon_state = "outerhull_dir" +/obj/structure/platform{ + dir = 1 }, -/area/almayer/hull/lower_hull/l_m_p) +/obj/structure/pipes/vents/pump{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "fRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -36319,7 +36357,12 @@ pixel_y = 5 }, /obj/item/tool/soap/syndie, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "fTi" = ( /obj/structure/largecrate/supply/floodlights, @@ -37597,7 +37640,12 @@ pixel_x = 23; specialfunctions = 4 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "gwR" = ( /obj/item/device/flashlight/lamp/green, @@ -37889,13 +37937,10 @@ }, /area/almayer/squads/bravo) "gBg" = ( -/obj/item/reagent_container/food/drinks/cans/beer{ - layer = 3.1; - pixel_x = -7; - pixel_y = 16 - }, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating/plating_catwalk, +/turf/open/floor/almayer{ + icon_state = "plate" + }, /area/almayer/living/port_emb) "gBi" = ( /obj/structure/pipes/vents/pump{ @@ -38271,6 +38316,10 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, /turf/open/floor/almayer, /area/almayer/living/port_emb) "gLz" = ( @@ -38610,9 +38659,9 @@ "gSZ" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/door/window/eastright{ + access_modified = 1; dir = 8; - req_access_txt = "19"; - access_modified = 1 + req_access_txt = "19" }, /obj/effect/landmark/map_item, /obj/structure/machinery/door/window/eastleft{ @@ -38886,9 +38935,9 @@ /area/almayer/hull/upper_hull/u_m_p) "gZj" = ( /obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; name = "Kitchen"; - req_one_access_txt = "30;19"; - access_modified = 1 + req_one_access_txt = "30;19" }, /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -39012,10 +39061,14 @@ }, /area/almayer/living/auxiliary_officer_office) "hbx" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "hbI" = ( /obj/item/ammo_magazine/shotgun/buckshot, /obj/item/ammo_magazine/shotgun/buckshot, @@ -40250,10 +40303,10 @@ /area/almayer/hallways/hangar) "hBL" = ( /obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; name = "\improper Security Checkpoint"; req_access = null; - req_one_access_txt = "3;19"; - access_modified = 1 + req_one_access_txt = "3;19" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -40417,12 +40470,12 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) "hGI" = ( -/obj/structure/bed/chair/comfy/delta, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 }, +/obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer{ - icon_state = "bluefull" + icon_state = "orangefull" }, /area/almayer/living/briefing) "hGN" = ( @@ -40690,9 +40743,9 @@ }, /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; id = "laddersoutheast"; - name = "\improper South East Ladders Shutters"; - dir = 8 + name = "\improper South East Ladders Shutters" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -41473,7 +41526,9 @@ /area/almayer/living/port_emb) "iew" = ( /obj/structure/bed/chair/comfy/charlie, -/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, /obj/item/trash/uscm_mre, /turf/open/floor/almayer{ icon_state = "emeraldfull" @@ -41946,10 +42001,10 @@ /area/almayer/squads/req) "ipb" = ( /obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; dir = 1; req_one_access = null; - req_one_access_txt = "30;19"; - access_modified = 1 + req_one_access_txt = "30;19" }, /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -42484,11 +42539,16 @@ }, /area/almayer/squads/delta) "iza" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "izk" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -42585,12 +42645,14 @@ /turf/open/floor/plating, /area/almayer/hull/upper_hull/u_m_p) "iBx" = ( -/obj/structure/window/framed/almayer, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 }, /turf/open/floor/almayer{ - icon_state = "redfull" + icon_state = "orangefull" }, /area/almayer/living/briefing) "iBE" = ( @@ -42611,14 +42673,12 @@ }, /area/almayer/hull/lower_hull/l_m_p) "iBT" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "orangefull" +/obj/structure/pipes/standard/manifold/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/almayer/living/briefing) +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "iBY" = ( /obj/structure/machinery/vending/snack, /turf/open/floor/almayer{ @@ -42928,7 +42988,9 @@ density = 0; pixel_x = 26 }, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "iKb" = ( /obj/structure/surface/table/almayer, @@ -44098,11 +44160,11 @@ /area/almayer/living/offices) "jhz" = ( /obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; dir = 2; name = "\improper Security Checkpoint"; req_access = null; - req_one_access_txt = "3;19"; - access_modified = 1 + req_one_access_txt = "3;19" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -44747,15 +44809,12 @@ }, /area/almayer/hull/lower_hull/l_m_s) "jwI" = ( -/obj/structure/window/framed/almayer, -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "orangefull" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/almayer/living/briefing) +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "jwK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -45159,9 +45218,7 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/living/offices) "jKl" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 - }, +/obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ icon_state = "green" @@ -45728,7 +45785,7 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 }, -/turf/open/floor/plating/plating_catwalk, +/turf/open/floor/almayer, /area/almayer/hallways/port_hallway) "jUW" = ( /obj/effect/step_trigger/clone_cleaner, @@ -46170,15 +46227,11 @@ }, /area/almayer/medical/lower_medical_lobby) "keO" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "test_floor4" +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 }, -/area/almayer/hallways/port_hallway) +/turf/open/floor/almayer, +/area/almayer/living/briefing) "keR" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -46498,15 +46551,9 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/north2) "kmH" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/almayer{ - icon_state = "orangefull" - }, +/obj/structure/platform, +/obj/structure/pipes/vents/pump, +/turf/open/floor/almayer, /area/almayer/living/briefing) "kmK" = ( /obj/structure/platform{ @@ -46552,8 +46599,8 @@ "knG" = ( /obj/structure/surface/table/almayer, /obj/effect/landmark/map_item{ - pixel_x = 7; layer = 3.03; + pixel_x = 7; pixel_y = 4 }, /obj/item/prop/helmetgarb/spacejam_tickets{ @@ -47702,7 +47749,10 @@ /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 }, -/turf/open/floor/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/living/briefing) "kLp" = ( /obj/structure/sign/safety/stairs{ @@ -47723,11 +47773,11 @@ dir = 2 }, /obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; dir = 2; name = "\improper Security Checkpoint"; req_access = null; - req_one_access_txt = "3;19"; - access_modified = 1 + req_one_access_txt = "3;19" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -47898,6 +47948,9 @@ }, /area/almayer/hallways/aft_hallway) "kOH" = ( +/obj/structure/machinery/power/apc/almayer{ + dir = 4 + }, /turf/open/floor/almayer{ dir = 5; icon_state = "blue" @@ -48018,12 +48071,12 @@ "kRm" = ( /obj/structure/surface/table/almayer, /obj/item/reagent_container/food/snacks/mre_pack/xmas2{ - pixel_y = 9; - pixel_x = 5 + pixel_x = 5; + pixel_y = 9 }, /obj/effect/landmark/map_item{ - pixel_x = -7; layer = 3.03; + pixel_x = -7; pixel_y = 4 }, /obj/item/reagent_container/food/snacks/mre_pack/xmas3{ @@ -48238,9 +48291,7 @@ }, /area/almayer/lifeboat_pumps/south2) "kVm" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 5 - }, +/obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer{ dir = 1; icon_state = "green" @@ -48292,8 +48343,8 @@ /obj/structure/bed/chair/comfy/alpha{ dir = 1 }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 +/obj/structure/pipes/vents/scrubber{ + dir = 4 }, /turf/open/floor/almayer{ icon_state = "redfull" @@ -48425,13 +48476,11 @@ }, /area/almayer/living/offices) "kZf" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "redfull" +/obj/structure/platform, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 }, +/turf/open/floor/almayer, /area/almayer/living/briefing) "kZA" = ( /turf/open/floor/almayer{ @@ -49057,7 +49106,9 @@ pixel_x = 23; specialfunctions = 4 }, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "lne" = ( /obj/structure/bed/chair, @@ -49630,7 +49681,12 @@ pixel_x = -1; pixel_y = 24 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "lwC" = ( /obj/structure/desertdam/decals/road_edge{ @@ -49876,12 +49932,21 @@ }, /area/almayer/squads/charlie) "lBz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 }, -/obj/structure/pipes/standard/manifold/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/hallways/starboard_hallway) +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "lBF" = ( /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, @@ -50049,6 +50114,10 @@ layer = 2.9; name = "Richard the tiger" }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, /turf/open/floor/almayer{ dir = 9; icon_state = "emerald" @@ -50702,7 +50771,10 @@ /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 }, -/turf/open/floor/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/living/briefing) "lSD" = ( /obj/structure/closet/firecloset, @@ -50717,9 +50789,9 @@ /obj/structure/machinery/door_control{ id = "laddersoutheast"; name = "South East Ladders Shutters"; + pixel_y = 25; req_one_access_txt = "2;3;12;19"; - throw_range = 15; - pixel_y = 25 + throw_range = 15 }, /turf/open/floor/almayer{ dir = 1; @@ -50750,14 +50822,14 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) "lUB" = ( -/obj/structure/bed/chair/comfy/charlie, -/obj/structure/pipes/standard/manifold/hidden/supply{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 }, -/area/almayer/living/briefing) +/turf/open/floor/almayer, +/area/almayer/hallways/port_hallway) "lVl" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer, @@ -51795,7 +51867,9 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 }, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "mtX" = ( /obj/structure/closet/secure_closet/guncabinet/red, @@ -52950,7 +53024,7 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 }, -/obj/structure/disposalpipe/junction{ +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plating/plating_catwalk, @@ -53208,9 +53282,9 @@ /obj/structure/machinery/door_control{ id = "laddersoutheast"; name = "South East Ladders Shutters"; + pixel_y = 25; req_one_access_txt = "2;3;12;19"; - throw_range = 15; - pixel_y = 25 + throw_range = 15 }, /turf/open/floor/almayer{ dir = 1; @@ -53905,15 +53979,24 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) "nob" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 4 +/obj/structure/sink{ + dir = 1; + pixel_y = -10 }, -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" +/obj/structure/pipes/vents/scrubber{ + dir = 1 }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "noj" = ( /obj/structure/largecrate, /obj/structure/prop/server_equipment/laptop{ @@ -54419,9 +54502,9 @@ /area/almayer/hallways/starboard_hallway) "nyO" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; id = "laddernortheast"; - name = "\improper North East Ladders Shutters"; - dir = 8 + name = "\improper North East Ladders Shutters" }, /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -54722,9 +54805,9 @@ dir = 4 }, /obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; id = "laddernortheast"; - name = "\improper North East Ladders Shutters"; - dir = 8 + name = "\improper North East Ladders Shutters" }, /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -54812,6 +54895,7 @@ /obj/structure/machinery/light{ dir = 4 }, +/obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/living/briefing) "nHg" = ( @@ -55236,9 +55320,7 @@ /obj/structure/bed/chair/comfy/alpha{ dir = 1 }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, +/obj/structure/pipes/vents/pump, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -55460,9 +55542,9 @@ /obj/structure/machinery/door_control{ id = "laddernortheast"; name = "North East Ladders Shutters"; + pixel_y = -25; req_one_access_txt = "2;3;12;19"; - throw_range = 15; - pixel_y = -25 + throw_range = 15 }, /turf/open/floor/almayer{ icon_state = "green" @@ -56036,11 +56118,21 @@ }, /area/almayer/medical/medical_science) "oiZ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, /obj/structure/machinery/door/airlock/almayer/maint{ dir = 8; name = "\improper Tool Closet" }, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/living/port_emb) "ojF" = ( /obj/structure/machinery/cm_vending/clothing/tl/charlie{ @@ -56360,12 +56452,14 @@ "oqc" = ( /obj/structure/disposalpipe/segment, /obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; dir = 1; req_one_access = null; - req_one_access_txt = "30;19"; - access_modified = 1 + req_one_access_txt = "30;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" }, -/turf/open/floor/plating/plating_catwalk, /area/almayer/living/port_emb) "oqu" = ( /obj/structure/machinery/disposal, @@ -57264,9 +57358,9 @@ "oJq" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; id = "laddersoutheast"; - name = "\improper South East Ladders Shutters"; - dir = 8 + name = "\improper South East Ladders Shutters" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -57511,16 +57605,6 @@ icon_state = "plating" }, /area/almayer/medical/upper_medical) -"oNO" = ( -/obj/structure/window/framed/almayer, -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "redfull" - }, -/area/almayer/living/briefing) "oOO" = ( /obj/structure/sign/safety/debark_lounge{ pixel_x = 15; @@ -57532,8 +57616,8 @@ /area/almayer/command/lifeboat) "oPa" = ( /obj/structure/sign/safety/storage{ - pixel_y = -32; - pixel_x = 8 + pixel_x = 8; + pixel_y = -32 }, /turf/open/floor/almayer{ icon_state = "plate" @@ -57648,9 +57732,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 4 - }, +/obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/port_hallway) "oRj" = ( @@ -57976,11 +58058,11 @@ /area/almayer/medical/lower_medical_medbay) "oZX" = ( /obj/structure/machinery/door/airlock/almayer/medical/glass{ + access_modified = 1; dir = 2; name = "\improper Field Surgery Equipment"; req_access_txt = "20"; - req_one_access = null; - access_modified = 1 + req_one_access = null }, /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 1 @@ -58508,16 +58590,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) -"pon" = ( -/obj/structure/bed/chair/comfy/charlie, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/obj/item/trash/uscm_mre, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" - }, -/area/almayer/living/briefing) "pop" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -59383,7 +59455,7 @@ /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) "pIX" = ( -/obj/structure/pipes/standard/manifold/hidden/supply, +/obj/structure/pipes/standard/manifold/fourway/hidden/supply, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -60104,10 +60176,10 @@ /area/almayer/squads/req) "pXW" = ( /obj/structure/bed/chair/comfy/delta, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 9 - }, /obj/item/trash/popcorn, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, /turf/open/floor/almayer{ icon_state = "bluefull" }, @@ -60340,7 +60412,10 @@ /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 }, -/turf/open/floor/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/living/briefing) "qdk" = ( /obj/structure/surface/table/almayer, @@ -60884,15 +60959,6 @@ icon_state = "test_floor4" }, /area/almayer/living/pilotbunks) -"qnM" = ( -/obj/structure/window/framed/almayer, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "orangefull" - }, -/area/almayer/living/briefing) "qnP" = ( /obj/structure/prop/invuln/overhead_pipe{ pixel_x = 12 @@ -61159,15 +61225,6 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) -"quJ" = ( -/obj/structure/window/framed/almayer, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" - }, -/area/almayer/living/briefing) "quT" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ layer = 1.9 @@ -61203,8 +61260,8 @@ }, /area/almayer/shipboard/brig/cryo) "qvy" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 }, /obj/structure/disposalpipe/segment{ dir = 2; @@ -62242,9 +62299,6 @@ /obj/structure/bed/chair/comfy/bravo{ dir = 1 }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 4 - }, /obj/item/stack/folding_barricade, /obj/item/stack/sheet/mineral/uranium{ layer = 2.99 @@ -62655,6 +62709,7 @@ icon_state = "poster2"; pixel_x = -27 }, +/obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/living/briefing) "rbp" = ( @@ -63357,15 +63412,6 @@ icon_state = "plate" }, /area/almayer/command/cichallway) -"rpN" = ( -/obj/structure/bed/chair/comfy/charlie, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 5 - }, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" - }, -/area/almayer/living/briefing) "rpW" = ( /obj/structure/prop/invuln/overhead_pipe{ pixel_x = 12 @@ -63638,7 +63684,12 @@ /obj/structure/machinery/light{ dir = 4 }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "rvo" = ( /obj/structure/machinery/power/apc/almayer{ @@ -63791,13 +63842,6 @@ icon_state = "bluecorner" }, /area/almayer/living/briefing) -"rAt" = ( -/obj/structure/bed/chair/comfy/delta, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "bluefull" - }, -/area/almayer/living/briefing) "rAv" = ( /obj/structure/toilet{ dir = 8 @@ -64295,16 +64339,6 @@ icon_state = "test_floor4" }, /area/almayer/medical/lower_medical_lobby) -"rIm" = ( -/obj/structure/window/framed/almayer, -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" - }, -/area/almayer/living/briefing) "rID" = ( /turf/open/floor/almayer{ dir = 6; @@ -64432,6 +64466,7 @@ /obj/structure/sign/poster/safety{ pixel_x = 27 }, +/obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/living/briefing) "rKy" = ( @@ -64484,9 +64519,9 @@ }, /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; id = "laddersoutheast"; - name = "\improper South East Ladders Shutters"; - dir = 8 + name = "\improper South East Ladders Shutters" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -64740,7 +64775,9 @@ /obj/structure/machinery/light{ dir = 8 }, -/turf/open/floor/almayer, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "rTk" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ @@ -65204,13 +65241,11 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_s) "sfT" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 4 - }, /obj/structure/sign/poster{ icon_state = "poster14"; pixel_x = -27 }, +/obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/living/briefing) "sfU" = ( @@ -66029,12 +66064,6 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) -"sxH" = ( -/turf/open/floor/almayer_hull{ - dir = 10; - icon_state = "outerhull_dir" - }, -/area/almayer/hull/lower_hull/l_m_p) "syH" = ( /obj/structure/machinery/firealarm{ pixel_y = -28 @@ -66274,8 +66303,8 @@ dir = 8 }, /turf/open/floor/almayer{ - dir = 1; - icon_state = "emeraldcorner" + dir = 8; + icon_state = "emerald" }, /area/almayer/hallways/port_hallway) "sEa" = ( @@ -68064,12 +68093,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_p) -"tpY" = ( -/turf/open/floor/almayer_hull{ - dir = 9; - icon_state = "outerhull_dir" - }, -/area/almayer/hull/lower_hull/l_m_s) "tqe" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -68341,12 +68364,6 @@ /obj/item/bedsheet/purple{ pixel_y = 13 }, -/obj/item/clothing/head/beret/centcom/captain{ - color = "#4b5320"; - desc = "Dusty beret bearing the logo of the royal marines. How did this get here?"; - name = "dusty beret"; - pixel_y = -6 - }, /obj/structure/window/reinforced{ dir = 4; pixel_x = -2; @@ -68365,6 +68382,8 @@ layer = 3.5; pixel_y = 13 }, +/obj/item/clothing/head/beret/royal_marine, +/obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ dir = 10; icon_state = "emerald" @@ -68749,7 +68768,10 @@ /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 }, -/turf/open/floor/almayer, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, /area/almayer/living/briefing) "tDA" = ( /obj/item/tool/weldpack{ @@ -68964,6 +68986,9 @@ /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/almayer{ dir = 1; icon_state = "emerald" @@ -70334,13 +70359,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) -"uoc" = ( -/obj/structure/bed/chair/comfy/charlie, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" - }, -/area/almayer/living/briefing) "uoi" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -71207,6 +71225,7 @@ /obj/structure/machinery/light{ dir = 8 }, +/obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/living/briefing) "uDn" = ( @@ -72145,15 +72164,6 @@ dir = 8 }, /area/almayer/medical/containment/cell) -"uXu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/turf/open/floor/almayer, -/area/almayer/hallways/port_hallway) "uXL" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -72415,9 +72425,9 @@ /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" +/obj/structure/disposalpipe/junction{ + dir = 2; + icon_state = "pipe-j2" }, /turf/open/floor/almayer, /area/almayer/living/port_emb) @@ -73009,12 +73019,12 @@ /area/almayer/hull/lower_hull/l_m_p) "voW" = ( /obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; dir = 8; - req_one_access = list(2,34,30); - access_modified = 1 + req_one_access = list(2,34,30) }, /turf/open/floor/almayer{ - icon_state = "plate" + icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_m_s) "vpn" = ( @@ -75288,7 +75298,17 @@ icon_state = "tube-broken"; name = "broken light fixture" }, -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "whA" = ( /turf/open/floor/almayer/uscm/directional, @@ -76238,11 +76258,6 @@ icon_state = "redcorner" }, /area/almayer/living/briefing) -"wCK" = ( -/turf/open/floor/almayer_hull{ - icon_state = "outerhull_dir" - }, -/area/almayer/hull/lower_hull/l_m_p) "wCM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -76589,11 +76604,19 @@ /turf/closed/wall/almayer/research/containment/wall/east, /area/almayer/medical/containment/cell/cl) "wKd" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, /obj/structure/machinery/door/airlock/almayer/maint{ dir = 8 }, /turf/open/floor/almayer{ - icon_state = "plate" + icon_state = "test_floor4" }, /area/almayer/living/port_emb) "wKn" = ( @@ -77198,7 +77221,17 @@ }, /area/almayer/hull/lower_hull/l_f_s) "wVK" = ( -/turf/open/floor/almayer, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, /area/almayer/living/port_emb) "wVP" = ( /obj/structure/pipes/standard/simple/hidden/supply, @@ -78253,6 +78286,9 @@ dir = 1; icon_state = "p_stair_full" }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, /turf/open/floor/almayer, /area/almayer/living/briefing) "xtD" = ( @@ -79222,12 +79258,6 @@ dir = 6 }, /area/almayer/command/cic) -"xMK" = ( -/turf/open/floor/almayer{ - dir = 8; - icon_state = "emeraldcorner" - }, -/area/almayer/hallways/port_hallway) "xML" = ( /obj/structure/machinery/computer/cameras/wooden_tv/prop{ pixel_x = -4; @@ -79347,9 +79377,9 @@ /obj/structure/machinery/door_control{ id = "laddernortheast"; name = "North East Ladders Shutters"; + pixel_y = -25; req_one_access_txt = "2;3;12;19"; - throw_range = 15; - pixel_y = -25 + throw_range = 15 }, /turf/open/floor/almayer{ icon_state = "green" @@ -79562,9 +79592,9 @@ /area/almayer/shipboard/brig/lobby) "xSE" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + access_modified = 1; name = "\improper Main Kitchen"; - req_one_access_txt = "30;19"; - access_modified = 1 + req_one_access_txt = "30;19" }, /turf/open/floor/prison{ icon_state = "kitchen" @@ -114329,7 +114359,7 @@ bdH bdH bdH bdH -tpY +aac aKW aKW aKW @@ -114405,7 +114435,7 @@ yhQ yhQ yhQ yhQ -sxH +ajY aaa aaa aaa @@ -114759,7 +114789,7 @@ aSh ccF tGG tGG -iBx +bdg aLG awb aLG @@ -114787,7 +114817,7 @@ bdg buH hOR buH -quJ +bdg sNI wAU diw @@ -114962,7 +114992,7 @@ tGG tGG tGG tGG -iBx +bdg aLG aYO aLG @@ -114990,7 +115020,7 @@ bdg buH bHL buH -quJ +bdg sNI sNI sNI @@ -115165,7 +115195,7 @@ tGG tGG tGG tGG -iBx +bdg aLG aYO aLG @@ -115193,7 +115223,7 @@ bdg buH bHL buH -quJ +bdg sNI csG sNI @@ -115353,7 +115383,7 @@ wVK viu nsY iIP -wVK +eOs dDt nsY xiz @@ -115365,12 +115395,12 @@ bDQ kbV tGG kWF -kZf +tGG nQd -kZf -oNO -crW -eOs +tGG +bdg +beB +aYT beB bCx bqZ @@ -115394,15 +115424,15 @@ beH bqZ bCx buH -jUT -bFu -rIm -rAt -rAt -hGI -rAt +bHL +buH +bdg +sNI +sNI +sNI +sNI pXW -wNT +kmH udV bdd hTf @@ -115567,13 +115597,13 @@ bdd bqZ qgw beH -duv +qMR nGZ -rJK +dRT rKw qcN -aLG -aZi +tBF +iBT aLG nyw bqZ @@ -115598,13 +115628,13 @@ vKe eVv bFu pIX -buH +bFu lSh -beH -beH -rJK -beH -beH +eBg +eBg +eBg +eBg +fOk epq bqZ bdd @@ -115614,12 +115644,12 @@ wGb gUf nsY gwO -mtS +lBz ezW nsY lwA -mtS -iKa +lBz +nob nsY oDf oed @@ -115827,8 +115857,8 @@ nsY oDf uqH yhQ -fQQ -fQQ +aaf +aaf ajY aaa aaa @@ -115972,14 +116002,14 @@ aLf bdd bqZ kKL -beH -fcf +aLJ +eBg uCX sfT -beH +eBg tDz -aLG -awb +tBF +jwI aLG iuy bqZ @@ -116003,13 +116033,13 @@ beH bqZ bdg buH -hOR -buH +jUT +bFu kLo -beH -beH -duv -beH +eBg +keO +eBg +eBg rbl xtc bqZ @@ -116032,7 +116062,7 @@ oDf yhQ yhQ yhQ -wCK +ajZ aaa aaa aaa @@ -116174,15 +116204,15 @@ lQu aSm bdd bDQ -kbV +fQQ +hGI +wmz wmz -kmH -iBT qRp -iBT -jwI -tBF -lBz +wmz +bdg +aLG +awb aLG bdg bqZ @@ -116206,15 +116236,15 @@ bqZ bqZ bdg buH -uXu -bFu -rIm -uoc +hOR +buH +bdg +wLV iew -lUB -uoc -rpN -wNT +wLV +wLV +wLV +kZf bqZ bdd gKB @@ -116378,12 +116408,12 @@ vUi bdd vTt kbV -wmz +iza vEn wmz wmz wmz -qnM +bdg aLG aYO bad @@ -116411,12 +116441,12 @@ bdd bGe bHL buH -quJ +bdg wLV wLV wLV wLV -pon +gKH ldj cab bdd @@ -116580,13 +116610,13 @@ qce aSm bdd bqZ -kbV -wmz +hbx +iBx wmz wmz wmz wmz -qnM +bdg beB aYT beB @@ -116614,7 +116644,7 @@ bJz bJz bHT bJz -quJ +bdg wLV wLV wLV @@ -116789,7 +116819,7 @@ vpt kQU wmz wmz -qnM +bdg aLG aYO aLG @@ -116817,7 +116847,7 @@ buH buH bHL buH -quJ +bdg gKH cgz vyU @@ -117227,8 +117257,8 @@ buH cbD iZH sDQ -hOR -xMK +njL +njL njL njL cbD @@ -117240,7 +117270,7 @@ rdY bUM cbD eXE -hOR +lUB kJV fiq fiq @@ -117425,12 +117455,12 @@ bdg buH bHa mTk -hbx -hvp -keO -hbx -hbx -nob +buI +bFu +cbE +buI +buI +buI buI buI buI @@ -117443,7 +117473,7 @@ buI buI rpd kVm -bHL +bHY kro bGb uaa @@ -117584,8 +117614,8 @@ nHF nHF aLB csl -iza -bbJ +gjn +jJs bBh aMM aMM @@ -117787,7 +117817,7 @@ nHF nHF jUx aLG -aNO +bbJ cmc jeb jeb From 6598660de6879a490a240d36b9589801a131d6a8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:48:34 +0100 Subject: [PATCH 077/199] Automatic changelog for PR #4701 [ci skip] --- html/changelogs/AutoChangeLog-pr-4701.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4701.yml diff --git a/html/changelogs/AutoChangeLog-pr-4701.yml b/html/changelogs/AutoChangeLog-pr-4701.yml new file mode 100644 index 000000000000..4b499f0501ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4701.yml @@ -0,0 +1,11 @@ +author: "SpartanBobby" +delete-after: True +changes: + - maptweak: "fixes lack of warning stripes under doors in squad briefing areas and newly added maint doors onboard USS Almayer" + - maptweak: "fixes incorrect tiles used under window frames in new squad briefing areas onboard USS Almayer" + - maptweak: "fixes pipe sections under window frames in new squad briefing areas onboard USS Almayer" + - maptweak: "fixes pipes that lead nowhere in new squad briefing areas onboard USS Almayer" + - maptweak: "fixes button that was being hidden by light due to recent USS Almayer changes" + - maptweak: "corrects strangely laid out vent sections due to recent USS Almayer changes" + - maptweak: "makes USS Almayer Bunks consistent with the rest of the ship's shower and bathrooms" + - maptweak: "updates \"Dusty Beret\" prop item to now be the RMC Beret it was originally referencing (now that the RMC are ingame)" \ No newline at end of file From a7fc9259ac67b551da07cb7d4f4f266ddeffa2d7 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 19 Oct 2023 01:08:02 +0000 Subject: [PATCH 078/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4671.yml | 4 --- html/changelogs/AutoChangeLog-pr-4676.yml | 4 --- html/changelogs/AutoChangeLog-pr-4682.yml | 4 --- html/changelogs/AutoChangeLog-pr-4689.yml | 4 --- html/changelogs/AutoChangeLog-pr-4701.yml | 11 -------- html/changelogs/AutoChangeLog-pr-4704.yml | 4 --- html/changelogs/AutoChangeLog-pr-4710.yml | 4 --- html/changelogs/archive/2023-10.yml | 32 +++++++++++++++++++++++ 8 files changed, 32 insertions(+), 35 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4671.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4676.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4682.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4689.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4701.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4704.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4710.yml diff --git a/html/changelogs/AutoChangeLog-pr-4671.yml b/html/changelogs/AutoChangeLog-pr-4671.yml deleted file mode 100644 index 70abc2a9e692..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4671.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - bugfix: "Equipped marine presets spawn with full food on spawn" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4676.yml b/html/changelogs/AutoChangeLog-pr-4676.yml deleted file mode 100644 index 5b7d7c98edab..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4676.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BeagleGaming1" -delete-after: True -changes: - - refactor: "Refactored handheld beacons and related code" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4682.yml b/html/changelogs/AutoChangeLog-pr-4682.yml deleted file mode 100644 index 1bd340ab86c2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4682.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - refactor: "refactor ammo_datums file." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4689.yml b/html/changelogs/AutoChangeLog-pr-4689.yml deleted file mode 100644 index 873e11d638ad..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4689.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed caps displaying contained items on character even without being worn." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4701.yml b/html/changelogs/AutoChangeLog-pr-4701.yml deleted file mode 100644 index 4b499f0501ba..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4701.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "fixes lack of warning stripes under doors in squad briefing areas and newly added maint doors onboard USS Almayer" - - maptweak: "fixes incorrect tiles used under window frames in new squad briefing areas onboard USS Almayer" - - maptweak: "fixes pipe sections under window frames in new squad briefing areas onboard USS Almayer" - - maptweak: "fixes pipes that lead nowhere in new squad briefing areas onboard USS Almayer" - - maptweak: "fixes button that was being hidden by light due to recent USS Almayer changes" - - maptweak: "corrects strangely laid out vent sections due to recent USS Almayer changes" - - maptweak: "makes USS Almayer Bunks consistent with the rest of the ship's shower and bathrooms" - - maptweak: "updates \"Dusty Beret\" prop item to now be the RMC Beret it was originally referencing (now that the RMC are ingame)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4704.yml b/html/changelogs/AutoChangeLog-pr-4704.yml deleted file mode 100644 index 979d0cbec3f9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4704.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "neeshacark" -delete-after: True -changes: - - qol: "MT, CT, and Nurses can now take the bad leg trait." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4710.yml b/html/changelogs/AutoChangeLog-pr-4710.yml deleted file mode 100644 index aee2b701a511..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4710.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VileBeggar" -delete-after: True -changes: - - qol: "All squad uniform vendors have had their standard apparel condensed into one button." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 7f83b35154e2..8991d866377a 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -237,3 +237,35 @@ - rscadd: Added ares_can_log checks to all the places I could find missing them. - bugfix: Fixed missing rejection button for access tickets. - rscdel: Removed claim ticket button from Access Tickets. +2023-10-19: + BeagleGaming1: + - refactor: Refactored handheld beacons and related code + CapCamIII: + - bugfix: Equipped marine presets spawn with full food on spawn + Huffie56: + - refactor: refactor ammo_datums file. + SpartanBobby: + - maptweak: fixes lack of warning stripes under doors in squad briefing areas and + newly added maint doors onboard USS Almayer + - maptweak: fixes incorrect tiles used under window frames in new squad briefing + areas onboard USS Almayer + - maptweak: fixes pipe sections under window frames in new squad briefing areas + onboard USS Almayer + - maptweak: fixes pipes that lead nowhere in new squad briefing areas onboard USS + Almayer + - maptweak: fixes button that was being hidden by light due to recent USS Almayer + changes + - maptweak: corrects strangely laid out vent sections due to recent USS Almayer + changes + - maptweak: makes USS Almayer Bunks consistent with the rest of the ship's shower + and bathrooms + - maptweak: updates "Dusty Beret" prop item to now be the RMC Beret it was originally + referencing (now that the RMC are ingame) + VileBeggar: + - qol: All squad uniform vendors have had their standard apparel condensed into + one button. + fira: + - bugfix: Fixed caps displaying contained items on character even without being + worn. + neeshacark: + - qol: MT, CT, and Nurses can now take the bad leg trait. From 69aeafa1c5054f46aed762be9bb08313433c86b8 Mon Sep 17 00:00:00 2001 From: IsProbablyCatto <87884807+IsProbablyCatto@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:20:09 +0100 Subject: [PATCH 079/199] Medbelts pull from pillbottles as default (#4621) # About the pull request Changes the medical belts to pull pills from bottles by default, rather than pulling the entire bottle out. Tested as it just changes a single variable # Explain why it's good for the game Waking up and forgetting to swap your belt mode as doctor or CMO is frustrating, this fixes that. # Testing Photographs and Procedure Tested and works fine. # Changelog :cl: qol: Medbelts pull from pillbottles as default /:cl: --- code/game/objects/items/storage/belt.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 301f6de2bc70..71edc21e29f9 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -151,7 +151,7 @@ storage_slots = 14 max_w_class = SIZE_MEDIUM max_storage_space = 28 - var/mode = 0 //Pill picking mode + var/mode = 1 //Picking from pill bottle mode can_hold = list( /obj/item/device/healthanalyzer, From 65018570158cb92a22fba5139cf291165e95d275 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:28:18 +0100 Subject: [PATCH 080/199] Automatic changelog for PR #4621 [ci skip] --- html/changelogs/AutoChangeLog-pr-4621.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4621.yml diff --git a/html/changelogs/AutoChangeLog-pr-4621.yml b/html/changelogs/AutoChangeLog-pr-4621.yml new file mode 100644 index 000000000000..8227ca2d1327 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4621.yml @@ -0,0 +1,4 @@ +author: "IsProbablyCatto" +delete-after: True +changes: + - qol: "Medbelts pull from pillbottles as default" \ No newline at end of file From b6d25b0fac3b3fdbbf2e0883ffdbe78013d98f01 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 19 Oct 2023 00:00:13 -0700 Subject: [PATCH 081/199] Bandaid the null clients in GLOB.clients (#4700) # About the pull request Apparently we are somehow getting nulls into GLOB.clients now, and I don't know why. Stat panel is the most egregious spammer about this fact, but a rather slow subsystem will also periodically check too. # Explain why it's good for the game We don't need tens of thousands of runtimes. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Drathek fix: Bandaided a problem with nulls in GLOB.clients /:cl: --- code/controllers/subsystem/inactivity.dm | 30 ++++++++++++++---------- code/controllers/subsystem/statpanel.dm | 3 +++ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/code/controllers/subsystem/inactivity.dm b/code/controllers/subsystem/inactivity.dm index dd547e1f406b..5edd4e8c5294 100644 --- a/code/controllers/subsystem/inactivity.dm +++ b/code/controllers/subsystem/inactivity.dm @@ -1,20 +1,26 @@ -#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.) +#define INACTIVITY_KICK 10 MINUTES SUBSYSTEM_DEF(inactivity) name = "Inactivity" - wait = INACTIVITY_KICK + wait = 1 MINUTES flags = SS_NO_INIT | SS_BACKGROUND priority = SS_PRIORITY_INACTIVITY runlevels = RUNLEVELS_DEFAULT|RUNLEVEL_LOBBY /datum/controller/subsystem/inactivity/fire(resumed = FALSE) - if (CONFIG_GET(flag/kick_inactive)) - for(var/i in GLOB.clients) - var/client/C = i - if(C.admin_holder && C.admin_holder.rights & R_ADMIN) //Skip admins. - continue - if (C.is_afk(INACTIVITY_KICK)) - if (!istype(C.mob, /mob/dead)) - log_access("AFK: [key_name(C)]") - to_chat(C, SPAN_WARNING("You have been inactive for more than 10 minutes and have been disconnected.")) - qdel(C) + if(list_clear_nulls(GLOB.clients)) + debug_log("Removed nulls from GLOB.clients!") + if(list_clear_nulls(GLOB.player_list)) + debug_log("Removed nulls from GLOB.player_list!") + + if (!CONFIG_GET(flag/kick_inactive)) + return + + for(var/client/current as anything in GLOB.clients) + if(current.admin_holder && current.admin_holder.rights & R_ADMIN) //Skip admins. + continue + if(current.is_afk(INACTIVITY_KICK)) + if(!istype(current.mob, /mob/dead)) + log_access("AFK: [key_name(current)]") + to_chat(current, SPAN_WARNING("You have been inactive for more than [INACTIVITY_KICK / 600] minutes and have been disconnected.")) + qdel(current) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 1f94e67a8c33..7dbb9cd8181d 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -44,6 +44,9 @@ SUBSYSTEM_DEF(statpanels) var/client/target = currentrun[length(currentrun)] currentrun.len-- + if(!target) + continue + if(!target.stat_panel.is_ready()) continue From 89ff345ee9e1e2af617af006bf747a5f474ccf3e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 08:11:20 +0100 Subject: [PATCH 082/199] Automatic changelog for PR #4700 [ci skip] --- html/changelogs/AutoChangeLog-pr-4700.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4700.yml diff --git a/html/changelogs/AutoChangeLog-pr-4700.yml b/html/changelogs/AutoChangeLog-pr-4700.yml new file mode 100644 index 000000000000..258d657914f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4700.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Bandaided a problem with nulls in GLOB.clients" \ No newline at end of file From 38c18e6022a2e095b63c74ea8c8d2bc533c9a473 Mon Sep 17 00:00:00 2001 From: spartanbobby <71467726+spartanbobby@users.noreply.github.com> Date: Thu, 19 Oct 2023 08:13:54 +0100 Subject: [PATCH 083/199] Removes Stunprod from LV522 (#4712) # About the pull request Removes stunprod from LV522 Chances Claim # Explain why it's good for the game I've been getting DM'd about this stunprod for over a week and since the synth council doesn't believe a synth stunning xenos on the frontline to be combat synthing I'm just going to remove it Edit for the sake of a better explanation. Realistically this item should have never been on LV522 I had placed it before not knowing its fully power and I'll take responsibility for that no map should have an item with the power to stun every xeno on it regardless if it only has 6 charges or not # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl:SpartanBobby maptweak: Removes stunprod from LV522 /:cl: --- maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm index d000153afd71..429f3a446c7b 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -20717,7 +20717,7 @@ /area/lv522/atmos/cargo_intake) "iFe" = ( /obj/structure/closet/crate, -/obj/item/weapon/stunprod, +/obj/item/weapon/classic_baton, /turf/open/floor/prison{ icon_state = "darkbrownfull2" }, @@ -48141,10 +48141,7 @@ pixel_y = 6 }, /obj/item/handcuffs, -/obj/item/weapon/baton{ - pixel_x = -2; - pixel_y = 10 - }, +/obj/item/weapon/classic_baton, /turf/open/floor/prison{ icon_state = "darkredfull2" }, From 1279c77fcf3a25a226fd4011fe4b5516375c7234 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 08:22:29 +0100 Subject: [PATCH 084/199] Automatic changelog for PR #4712 [ci skip] --- html/changelogs/AutoChangeLog-pr-4712.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4712.yml diff --git a/html/changelogs/AutoChangeLog-pr-4712.yml b/html/changelogs/AutoChangeLog-pr-4712.yml new file mode 100644 index 000000000000..1cbad672fbd1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4712.yml @@ -0,0 +1,4 @@ +author: "SpartanBobby" +delete-after: True +changes: + - maptweak: "Removes stunprod from LV522" \ No newline at end of file From 15b3132b7c478d41ceb43260e5014b8ca9732fb5 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 19 Oct 2023 12:39:54 -0700 Subject: [PATCH 085/199] Fix a source of bad icon operations (#4720) # About the pull request This PR updates the stat panel examine of human mobs to use a dummy copy of the examined mob to fix runtimes related to a bad icon operation from a workaround in icon2html for humans. It is not a perfect copy to limit the upper end of cost for rendering humans, but should be fairly accurate visually and forced to face south. Initial testing seems to report 0 to 0.2 seconds per mob. This PR doesn't eliminate the possibility of an icon2html of a human, but I am unsure if its wise to just remove that workaround. Even if it was just removed for this situation, the resulting icon would be empty for the human mob. # Explain why it's good for the game Fixes an issue that can result in tens of thousands of runtimes. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/8f715e79-f4f2-48c7-b59a-1a6ec9e71d6d) ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/fce430b1-9c76-42ea-ba80-447d30a99651)
# Changelog :cl: Drathek fix: Fixed a cause of bad icon operations /:cl: --- code/__HELPERS/icons.dm | 81 +++++++++++++++++++++++-- code/controllers/subsystem/statpanel.dm | 35 +++++++++-- 2 files changed, 106 insertions(+), 10 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 60d2681a1d1a..edc711d25bc1 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -876,22 +876,93 @@ world return image_to_center //For creating consistent icons for human looking simple animals -/proc/get_flat_human_icon(icon_id, datum/equipment_preset/preset, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override) +/proc/get_flat_human_icon(icon_id, equipment_preset_dresscode, datum/preferences/prefs, dummy_key, showDirs = GLOB.cardinals, outfit_override) var/static/list/humanoid_icon_cache = list() if(!icon_id || !humanoid_icon_cache[icon_id]) var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(dummy_key) + if(prefs) prefs.copy_all_to(body) - arm_equipment(body, preset) + body.update_body() + body.update_hair() + + // Assumption: Is a list + if(outfit_override) + for(var/obj/item/cur_item as anything in outfit_override) + body.equip_to_appropriate_slot(cur_item) + + // Assumption: Is a string or path + if(equipment_preset_dresscode) + arm_equipment(body, equipment_preset_dresscode) var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") - for(var/D in showDirs) - body.setDir(D) + for(var/dir in showDirs) + body.setDir(dir) var/icon/partial = getFlatIcon(body) - out_icon.Insert(partial, dir = D) + out_icon.Insert(partial, dir = dir) humanoid_icon_cache[icon_id] = out_icon dummy_key ? unset_busy_human_dummy(dummy_key) : qdel(body) return out_icon else return humanoid_icon_cache[icon_id] + +/proc/get_flat_human_copy_icon(mob/living/carbon/human/original, equipment_preset_dresscode, showDirs = GLOB.cardinals, outfit_override) + var/mob/living/carbon/human/dummy/body = generate_or_wait_for_human_dummy(null) + + if(original) + // From /datum/preferences/proc/copy_appearance_to + body.age = original.age + body.gender = original.gender + body.ethnicity = original.ethnicity + body.body_type = original.body_type + + body.r_eyes = original.r_eyes + body.g_eyes = original.g_eyes + body.b_eyes = original.b_eyes + + body.r_hair = original.r_hair + body.g_hair = original.g_hair + body.b_hair = original.b_hair + + body.r_gradient = original.r_gradient + body.g_gradient = original.g_gradient + body.b_gradient = original.b_gradient + body.grad_style = original.grad_style + + body.r_facial = original.r_facial + body.g_facial = original.g_facial + body.b_facial = original.b_facial + + body.r_skin = original.r_skin + body.g_skin = original.g_skin + body.b_skin = original.b_skin + + body.h_style = original.h_style + body.f_style = original.f_style + + body.underwear = original.underwear + body.undershirt = original.undershirt + + body.update_body() + body.update_hair() + + // Assumption: Is a list + if(outfit_override) + for(var/obj/item/cur_item as anything in outfit_override) + body.equip_to_appropriate_slot(cur_item) + + // Assumption: Is a string or path + if(equipment_preset_dresscode) + arm_equipment(body, equipment_preset_dresscode) + + var/icon/out_icon = icon('icons/effects/effects.dmi', "nothing") + for(var/dir in showDirs) + body.setDir(dir) + var/icon/partial = getFlatIcon(body) + out_icon.Insert(partial, dir = dir) + + // log_debug("get_flat_human_copy_icon called on ref=[REF(original)], instance=[original], type=[original.type], with [length(original.overlays)] overlays reduced to [length(body.overlays)] overlays") + + qdel(body) + return out_icon diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 7dbb9cd8181d..b65ca1e758a2 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -316,14 +316,39 @@ SUBSYSTEM_DEF(statpanels) for(index in 1 to length(to_make)) var/atom/thing = to_make[index] + // var/start_time = REALTIMEOFDAY var/generated_string - /* We're cheap and won't render all overlays. It's expensive and updates with onmob changes! - if(ismob(thing) || length(thing.overlays) > 2) - generated_string = costly_icon2html(thing, parent, sourceonly=TRUE) + // We're cheap and won't render all overlays. It's expensive and updates with onmob changes! + //if(ismob(thing) || length(thing.overlays) > 2) + //generated_string = costly_icon2html(thing, parent, sourceonly=TRUE) + if(ishuman(thing)) + var/mob/living/carbon/human/human_thing = thing + var/icon + + // Ensure they have their armor since its going to be the majority of their appearance + var/list/armor = list() + var/obj/item/uniform = human_thing.get_item_by_slot(WEAR_BODY) + if(uniform) + armor += new uniform.type + var/obj/item/hat = human_thing.get_item_by_slot(WEAR_HEAD) + if(hat) + armor += new hat.type + var/obj/item/suit = human_thing.get_item_by_slot(WEAR_JACKET) + if(suit) + armor += new suit.type + var/obj/item/gloves = human_thing.get_item_by_slot(WEAR_HANDS) + if(gloves) + armor += new gloves.type + var/obj/item/shoes = human_thing.get_item_by_slot(WEAR_FEET) + if(shoes) + armor += new shoes.type + + // If we don't succeed making a flat human icon below, allowing the human to pass into icon2html will throw a bad icon operation because of a workaround in icon2html for humans... + icon = get_flat_human_copy_icon(human_thing, showDirs = list(SOUTH), outfit_override = armor) + generated_string = icon2html(icon, parent, sourceonly=TRUE) + // log_debug("object_window_info called on ref=[REF(thing)], instance=[thing], type=[thing.type], finished in [(REALTIMEOFDAY-start_time) / 10]s") else generated_string = icon2html(thing, parent, sourceonly=TRUE) - */ - generated_string = icon2html(thing, parent, sourceonly=TRUE) newly_seen[thing] = generated_string if(TICK_CHECK) From daa24b7189dd914b5c9ae1f045fe7a506b38bab1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:53:37 +0100 Subject: [PATCH 086/199] Automatic changelog for PR #4720 [ci skip] --- html/changelogs/AutoChangeLog-pr-4720.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4720.yml diff --git a/html/changelogs/AutoChangeLog-pr-4720.yml b/html/changelogs/AutoChangeLog-pr-4720.yml new file mode 100644 index 000000000000..724bbf0eaaa9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4720.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed a cause of bad icon operations" \ No newline at end of file From 5925cad99196a51230af0174325dd7d6ba1e5cf5 Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 19 Oct 2023 21:40:01 +0200 Subject: [PATCH 087/199] Remove SSearlyruntimes (#4718) # About the pull request SSearlyruntimes and its PR were introduced to monitor runtimes that would occur before either the logging globals were ready, or in development, before the debugger was attached These have proven to be few and far between, and we now have proper TGS side server logging to address it. Keeping it only serves the sole case of local developpers runing into such issues, which is extremely rare. # Explain why it's good for the game Trimming out unneeded moving parts # Testing Photographs and Procedure Untested # Changelog No user facing changes --- code/__DEFINES/subsystems.dm | 1 - code/controllers/subsystem/init/earlyruntimes.dm | 14 -------------- code/game/runtimes.dm | 4 ---- colonialmarines.dme | 1 - 4 files changed, 20 deletions(-) delete mode 100644 code/controllers/subsystem/init/earlyruntimes.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8a65a4b961ff..158c59aff327 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -166,7 +166,6 @@ #define SS_INIT_MINIMAP -34 #define SS_INIT_STATPANELS -98 #define SS_INIT_CHAT -100 //Should be last to ensure chat remains smooth during init. -#define SS_INIT_EARLYRUNTIMES -500 // Post-init notifier // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) diff --git a/code/controllers/subsystem/init/earlyruntimes.dm b/code/controllers/subsystem/init/earlyruntimes.dm deleted file mode 100644 index 8e43b94a0735..000000000000 --- a/code/controllers/subsystem/init/earlyruntimes.dm +++ /dev/null @@ -1,14 +0,0 @@ -/// Just messages the unwary coder to tell them there are errors that likely escaped their debugguer. -SUBSYSTEM_DEF(earlyruntimes) - name = "Early Runtimes" - init_order = SS_INIT_EARLYRUNTIMES - flags = SS_NO_FIRE - -/datum/controller/subsystem/earlyruntimes/stat_entry(msg) - msg = " Early Runtimes: [init_runtimes_count || 0] | All runtimes: [total_runtimes || 0]" - return ..() - -/datum/controller/subsystem/earlyruntimes/Initialize() - if(init_runtimes_count) - return SS_INIT_FAILURE - return SS_INIT_SUCCESS diff --git a/code/game/runtimes.dm b/code/game/runtimes.dm index 1332309168a3..2cdc955aa426 100644 --- a/code/game/runtimes.dm +++ b/code/game/runtimes.dm @@ -11,7 +11,6 @@ GLOBAL_REAL(stui_init_runtimes, /list) //! Shorthand of Static Initializer errors only, for use in STUI GLOBAL_REAL(full_init_runtimes, /list) //! Full text of all Static Initializer + World Init errors, for log backfilling GLOBAL_REAL_VAR(runtime_logging_ready) //! Truthy when init is done and we don't need these shenanigans anymore -GLOBAL_REAL_VAR(init_runtimes_count) //! Count of runtimes that occured before logging is ready, for in-game reporting // Deduplication of errors via hash to reduce spamming GLOBAL_REAL(runtime_hashes, /list) @@ -24,8 +23,6 @@ GLOBAL_REAL_VAR(total_runtimes) if(!total_runtimes) total_runtimes = 0 total_runtimes += 1 - if(!init_runtimes_count) - init_runtimes_count = 0 if(!stui_init_runtimes) stui_init_runtimes = list() if(!full_init_runtimes) @@ -33,7 +30,6 @@ GLOBAL_REAL_VAR(total_runtimes) // If this occured during early init, we store the full error to write it to world.log when it's available if(!runtime_logging_ready) - init_runtimes_count += 1 full_init_runtimes += E.desc // Runtime was already reported once, dedup it for STUI diff --git a/colonialmarines.dme b/colonialmarines.dme index ee6bcd1a0aab..be463ce8a289 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -292,7 +292,6 @@ s// DM Environment file for colonialmarines.dme. #include "code\controllers\subsystem\x_evolution.dm" #include "code\controllers\subsystem\xeno.dm" #include "code\controllers\subsystem\xenocon.dm" -#include "code\controllers\subsystem\init\earlyruntimes.dm" #include "code\controllers\subsystem\init\landmarks.dm" #include "code\controllers\subsystem\init\law.dm" #include "code\controllers\subsystem\init\lobby_art.dm" From 315d287446bc399710370a95b2299b356c527d20 Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 19 Oct 2023 21:40:43 +0200 Subject: [PATCH 088/199] Fixes deleted mobs not unbuckling (#4717) # About the pull request This makes mobs unbuckle on deletion. Why this matters: - Leftover references as buckled_mob on the buckled object - The object cannot be used by someone else, since someone is still buckled to it - In most extreme case eg. shuttle chairs, the shuttle will pull the deleted mob out of nullspace and back to chair when traveling # Explain why it's good for the game Less bugs and less confused admins having to re-spawn an entire tank over it # Testing Photographs and Procedure Tested buckling/deleting without errors --- code/game/objects/objs.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 184fc51bd507..3fa16af05875 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -226,9 +226,14 @@ /obj/proc/afterbuckle(mob/M as mob) // Called after somebody buckled / unbuckled handle_rotation() SEND_SIGNAL(src, COSMIG_OBJ_AFTER_BUCKLE, buckled_mob) + if(!buckled_mob) + UnregisterSignal(M, COMSIG_PARENT_QDELETING) + else + RegisterSignal(buckled_mob, COMSIG_PARENT_QDELETING, PROC_REF(unbuckle)) return buckled_mob /obj/proc/unbuckle() + SIGNAL_HANDLER if(buckled_mob && buckled_mob.buckled == src) buckled_mob.buckled = null buckled_mob.anchored = initial(buckled_mob.anchored) From ca95ec35252b118ef17d6c635e03a1ab4f93edd3 Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Thu, 19 Oct 2023 15:40:56 -0400 Subject: [PATCH 089/199] TL Removal (#4715) # About the pull request Removes the TL tag after an FTL is demoted from SL. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: fixed FTLs being demoted from SL erroneously having the tag TL in chat. /:cl: --- code/game/jobs/job/marine/squads.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm index 80f00c540383..d984aaa72c8a 100644 --- a/code/game/jobs/job/marine/squads.dm +++ b/code/game/jobs/job/marine/squads.dm @@ -604,7 +604,7 @@ if(JOB_SQUAD_MEDIC) old_lead.comm_title = "HM" if(JOB_SQUAD_TEAM_LEADER) - old_lead.comm_title = "TL" + old_lead.comm_title = "FTL" if(JOB_SQUAD_SMARTGUN) old_lead.comm_title = "SG" if(JOB_SQUAD_LEADER) From dba4afdf15179109b3770b18a8061f262e1708db Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:26:09 +0100 Subject: [PATCH 090/199] Automatic changelog for PR #4715 [ci skip] --- html/changelogs/AutoChangeLog-pr-4715.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4715.yml diff --git a/html/changelogs/AutoChangeLog-pr-4715.yml b/html/changelogs/AutoChangeLog-pr-4715.yml new file mode 100644 index 000000000000..2720d275acfe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4715.yml @@ -0,0 +1,4 @@ +author: "Kitsunemitsu" +delete-after: True +changes: + - bugfix: "fixed FTLs being demoted from SL erroneously having the tag TL in chat." \ No newline at end of file From 199b6954bcaca19089526bceb81a141dad68dfbc Mon Sep 17 00:00:00 2001 From: MrDas <62486730+Das15@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:42:12 +0200 Subject: [PATCH 091/199] Allows deconstruction of wide airlocks and cleans up the airlock code a bit (#4690) # About the pull request Allows disassembly of wide airlocks and fixes the bugs which... caused it to be disabled in the first place. Since moving multi-tile objects is a bit... inconsistent at best, unwrenching of wide airlock assemblies is disabled. Also renamed a lot of single-letter variables and added sprites to wide airlock assembly and generic solid wide airlock since for some reason I couldn't find it. And fixes #4638. # Explain why it's good for the game Inconsistent behavior bad. Unable to disassemble wide airlocks bad. Able to disassemble all airlocks good. # Testing Photographs and Procedure
Screenshots & Videos https://media.discordapp.net/attachments/703724778825187332/1163117987943944242/wide_airlock.mp4 https://cdn.discordapp.com/attachments/703724778825187332/1163151828251324536/wide_airlock_solid_v2.mp4
# Changelog :cl: MrDas fix: You can now disassemble wide airlocks. (You can't unwrench them though) spellcheck: Fixed a few typos in airlock assembly. imageadd: Added wide airlock assembly and generic solid wide airlock sprites. /:cl: --- code/game/machinery/doors/airlock.dm | 82 +++++----- code/game/machinery/doors/multi_tile.dm | 50 +++--- .../objects/structures/airlock_assembly.dm | 151 +++++++++--------- .../obj/structures/doors/2x1generic_solid.dmi | Bin 0 -> 15237 bytes .../structures/doors/airlock_assembly2x1.dmi | Bin 24741 -> 29549 bytes 5 files changed, 146 insertions(+), 137 deletions(-) create mode 100644 icons/obj/structures/doors/2x1generic_solid.dmi diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index dc28cdca6f5c..b7257ff4e7d3 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -550,13 +550,13 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( add_fingerprint(usr) update_icon() -/obj/structure/machinery/door/airlock/attackby(obj/item/C, mob/user) - if(SEND_SIGNAL(C, COMSIG_ITEM_ATTACK_AIRLOCK, src, user) & COMPONENT_CANCEL_AIRLOCK_ATTACK) +/obj/structure/machinery/door/airlock/attackby(obj/item/attacking_item, mob/user) + if(SEND_SIGNAL(attacking_item, COMSIG_ITEM_ATTACK_AIRLOCK, src, user) & COMPONENT_CANCEL_AIRLOCK_ATTACK) return - if(istype(C, /obj/item/clothing/mask/cigarette)) + if(istype(attacking_item, /obj/item/clothing/mask/cigarette)) if(isElectrified()) - var/obj/item/clothing/mask/cigarette/L = C + var/obj/item/clothing/mask/cigarette/L = attacking_item L.light(SPAN_NOTICE("[user] lights their [L] on an electrical arc from the [src]")) return @@ -567,7 +567,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( add_fingerprint(user) - if(istype(C, /obj/item/weapon/zombie_claws) && (welded || locked)) + if(istype(attacking_item, /obj/item/weapon/zombie_claws) && (welded || locked)) user.visible_message(SPAN_NOTICE("[user] starts tearing into the door on the [src]!"), \ SPAN_NOTICE("You start prying your hand into the gaps of the door with your fingers... This will take about 30 seconds."), \ SPAN_NOTICE("You hear tearing noises!")) @@ -584,8 +584,8 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( return - if((iswelder(C) && !operating && density)) - var/obj/item/tool/weldingtool/W = C + if((iswelder(attacking_item) && !operating && density)) + var/obj/item/tool/weldingtool/W = attacking_item var/weldtime = 50 if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) weldtime = 70 @@ -609,7 +609,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( update_icon() return - else if(HAS_TRAIT(C, TRAIT_TOOL_SCREWDRIVER)) + else if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER)) if(no_panel) to_chat(user, SPAN_WARNING("\The [src] has no panel to open!")) return @@ -619,17 +619,17 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( update_icon() return - else if(HAS_TRAIT(C, TRAIT_TOOL_WIRECUTTERS)) + else if(HAS_TRAIT(attacking_item, TRAIT_TOOL_WIRECUTTERS)) return attack_hand(user) - else if(HAS_TRAIT(C, TRAIT_TOOL_MULTITOOL)) + else if(HAS_TRAIT(attacking_item, TRAIT_TOOL_MULTITOOL)) return attack_hand(user) - else if(isgun(C)) - var/obj/item/weapon/gun/G = C - for(var/slot in G.attachments) - if(istype(G.attachments[slot], /obj/item/attachable/bayonet)) - var/obj/item/attachable/bayonet/a_bayonet = G.attachments[slot] + else if(isgun(attacking_item)) + var/obj/item/weapon/gun/gun_item = attacking_item + for(var/slot in gun_item.attachments) + if(istype(gun_item.attachments[slot], /obj/item/attachable/bayonet)) + var/obj/item/attachable/bayonet/a_bayonet = gun_item.attachments[slot] if(arePowerSystemsOn()) to_chat(user, SPAN_WARNING("The airlock's motors resist your efforts to force it.")) else if(locked) @@ -647,50 +647,48 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( if(do_after(user, a_bayonet.pry_delay, INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) close(1) - else if(C.pry_capable) - if(C.pry_capable == IS_PRY_CAPABLE_CROWBAR && panel_open && welded) + else if(attacking_item.pry_capable) + if(attacking_item.pry_capable == IS_PRY_CAPABLE_CROWBAR && panel_open && welded) if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI)) to_chat(user, SPAN_WARNING("You don't seem to know how to deconstruct machines.")) return - if(width > 1) - to_chat(user, SPAN_WARNING("Large doors seem impossible to disassemble.")) - return playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) user.visible_message("[user] starts removing the electronics from the airlock assembly.", "You start removing electronics from the airlock assembly.") if(do_after(user, 40, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) to_chat(user, SPAN_NOTICE(" You removed the airlock electronics!")) - var/obj/structure/airlock_assembly/da = new assembly_type(loc) - if(istype(da, /obj/structure/airlock_assembly/multi_tile)) - da.setDir(dir) + var/obj/structure/airlock_assembly/doors_assembly = new assembly_type(loc) + if(istype(doors_assembly, /obj/structure/airlock_assembly/multi_tile)) + doors_assembly.setDir(dir) + doors_assembly.update_collision_box() - da.anchored = TRUE + doors_assembly.anchored = TRUE if(mineral) - da.glass = mineral + doors_assembly.glass = mineral //else if(glass) - else if(glass && !da.glass) - da.glass = 1 - da.state = 0 - da.created_name = name - da.update_icon() + else if(glass && !doors_assembly.glass) + doors_assembly.glass = TRUE + doors_assembly.state = 0 + doors_assembly.created_name = name + doors_assembly.update_icon() - var/obj/item/circuitboard/airlock/ae + var/obj/item/circuitboard/airlock/airlock_electronics if(!electronics) - ae = new/obj/item/circuitboard/airlock( loc ) + airlock_electronics = new/obj/item/circuitboard/airlock(loc) if(!req_access || !req_one_access) check_access() if(req_access.len) - ae.conf_access = req_access + airlock_electronics.conf_access = req_access else if(req_one_access.len) - ae.conf_access = req_one_access - ae.one_access = 1 + airlock_electronics.conf_access = req_one_access + airlock_electronics.one_access = TRUE else - ae = electronics + airlock_electronics = electronics electronics = null - ae.forceMove(loc) + airlock_electronics.forceMove(loc) if(operating == -1) - ae.fried = TRUE - ae.update_icon() + airlock_electronics.fried = TRUE + airlock_electronics.update_icon() operating = 0 msg_admin_niche("[key_name(user)] deconstructed [src] in [get_area(user)] ([user.loc.x],[user.loc.y],[user.loc.z])") @@ -698,7 +696,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( deconstruct() return - else if(arePowerSystemsOn() && C.pry_capable != IS_PRY_CAPABLE_FORCE) + else if(arePowerSystemsOn() && attacking_item.pry_capable != IS_PRY_CAPABLE_FORCE) to_chat(user, SPAN_WARNING("The airlock's motors resist your efforts to force it.")) else if(locked) @@ -707,7 +705,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( else if(welded) to_chat(user, SPAN_WARNING("The airlock is welded shut.")) - else if(C.pry_capable == IS_PRY_CAPABLE_FORCE) + else if(attacking_item.pry_capable == IS_PRY_CAPABLE_FORCE) return FALSE //handled by the item's afterattack else if(!operating) @@ -719,7 +717,7 @@ GLOBAL_LIST_INIT(airlock_wire_descriptions, list( return TRUE //no afterattack call - if(istype(C, /obj/item/large_shrapnel)) + if(istype(attacking_item, /obj/item/large_shrapnel)) return FALSE //trigger afterattack call else return ..() diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 6123d56b8f23..65ecd67a438e 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -2,19 +2,25 @@ /obj/structure/machinery/door/airlock/multi_tile width = 2 damage_cap = 650 // Bigger = more endurable + assembly_type = /obj/structure/airlock_assembly/multi_tile /obj/structure/machinery/door/airlock/multi_tile/close() //Nasty as hell O(n^2) code but unfortunately necessary - for(var/turf/T in locs) - for(var/obj/vehicle/multitile/M in T) - if(M) return 0 + for(var/turf/turf_tile in locs) + for(var/obj/vehicle/multitile/vehicle_tile in turf_tile) + if(vehicle_tile) return 0 return ..() +/obj/structure/machinery/door/airlock/multi_tile/Initialize() + . = ..() + handle_multidoor() + update_icon() + /obj/structure/machinery/door/airlock/multi_tile/glass name = "Glass Airlock" icon = 'icons/obj/structures/doors/Door2x1glass.dmi' opacity = FALSE - glass = 1 + glass = TRUE assembly_type = /obj/structure/airlock_assembly/multi_tile /obj/structure/machinery/door/airlock/multi_tile/glass/colony @@ -25,7 +31,7 @@ name = "Security Airlock" icon = 'icons/obj/structures/doors/Door2x1security.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/security/colony req_access = null @@ -35,7 +41,7 @@ name = "Command Airlock" icon = 'icons/obj/structures/doors/Door2x1command.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/command/colony req_access = null @@ -45,7 +51,7 @@ name = "Medical Airlock" icon = 'icons/obj/structures/doors/Door2x1medbay.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/medical/colony req_access = null @@ -55,7 +61,7 @@ name = "Engineering Airlock" icon = 'icons/obj/structures/doors/Door2x1engine.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/engineering/colony req_access = null @@ -65,7 +71,7 @@ name = "Research Airlock" icon = 'icons/obj/structures/doors/Door2x1research.dmi' opacity = FALSE - glass = 1 + glass = TRUE req_one_access = list(ACCESS_MARINE_RESEARCH, ACCESS_WY_RESEARCH, ACCESS_WY_EXEC) /obj/structure/machinery/door/airlock/multi_tile/research/colony @@ -103,7 +109,7 @@ name = "Secure Airlock" icon = 'icons/obj/structures/doors/Door2x1_secure2_glass.dmi' opacity = FALSE - glass = 1 + glass = TRUE openspeed = 31 req_access = null @@ -141,10 +147,10 @@ . = ..() relativewall_neighbours() -/obj/structure/machinery/door/airlock/multi_tile/almayer/take_damage(dam, mob/M) - var/damage_check = max(0, damage + dam) - if(damage_check >= damage_cap && M && is_mainship_level(z)) - SSclues.create_print(get_turf(M), M, "The fingerprint contains bits of wire and metal specks.") +/obj/structure/machinery/door/airlock/multi_tile/almayer/take_damage(taken_damage, mob/damaging_mob) + var/damage_check = max(0, damage + taken_damage) + if(damage_check >= damage_cap && damaging_mob && is_mainship_level(z)) + SSclues.create_print(get_turf(damaging_mob), damaging_mob, "The fingerprint contains bits of wire and metal specks.") ..() /obj/structure/machinery/door/airlock/multi_tile/almayer/generic @@ -156,6 +162,11 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/generic/autoname autoname = TRUE +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic/solid + icon = 'icons/obj/structures/doors/2x1generic_solid.dmi' + opacity = TRUE + glass = FALSE + /obj/structure/machinery/door/airlock/multi_tile/almayer/medidoor name = "\improper Medical Airlock" icon = 'icons/obj/structures/doors/2x1medidoor.dmi' @@ -223,15 +234,10 @@ req_one_access = list(ACCESS_CIVILIAN_BRIG, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) /obj/structure/machinery/door/airlock/multi_tile/almayer/handle_multidoor() + . = ..() if(!(width > 1)) return //Bubblewrap update_filler_turfs() - if(dir in list(NORTH, SOUTH)) - bound_height = world.icon_size * width - bound_width = world.icon_size - else if(dir in list(EAST, WEST)) - bound_width = world.icon_size * width - bound_height = world.icon_size //We have to find these again since these doors are used on shuttles a lot so the turfs changes /obj/structure/machinery/door/airlock/multi_tile/almayer/proc/update_filler_turfs() @@ -427,7 +433,7 @@ /obj/structure/machinery/door/airlock/multi_tile/elevator/access icon = 'icons/obj/structures/doors/4x1_elevator_access.dmi' opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/elevator/access/research name = "\improper Research Elevator Hatch" @@ -547,7 +553,7 @@ icon = 'icons/obj/structures/doors/prepdoor.dmi' req_one_access = list(ACCESS_MARINE_PREP, ACCESS_MARINE_DATABASE, ACCESS_MARINE_CARGO, ACCESS_MARINE_ALPHA, ACCESS_MARINE_BRAVO, ACCESS_MARINE_CHARLIE, ACCESS_MARINE_DELTA) opacity = FALSE - glass = 1 + glass = TRUE /obj/structure/machinery/door/airlock/multi_tile/almayer/marine/shared/alpha_bravo name = "\improper Alpha-Bravo Squads Preparations" diff --git a/code/game/objects/structures/airlock_assembly.dm b/code/game/objects/structures/airlock_assembly.dm index 0679e1287ff7..d9e55e868016 100644 --- a/code/game/objects/structures/airlock_assembly.dm +++ b/code/game/objects/structures/airlock_assembly.dm @@ -22,9 +22,11 @@ var/airlock_type = "generic" //the type path of the airlock once completed var/glass = AIRLOCK_NOGLASS // see defines var/created_name = null + /// Used for multitile assemblies + var/width = 1 + /obj/structure/airlock_assembly/Initialize(mapload, ...) . = ..() - update_icon() /obj/structure/airlock_assembly/get_examine_text(mob/user) @@ -35,23 +37,26 @@ switch(state) if(STATE_STANDARD) if(anchored) - helpmessage += "It looks like a [SPAN_HELPFUL("wrench")] will unsecure it. Insert a [SPAN_HELPFUL("airlock circuit")]." + var/temp = "" + if(width == 1) + temp += "It looks like a [SPAN_HELPFUL("wrench")] will unsecure it. " + helpmessage += "[temp]You can insert an [SPAN_HELPFUL("airlock circuit")]. " if(!glass) - helpmessage += "Insert some [SPAN_HELPFUL("glass sheets")] to add windows to it." + helpmessage += "Insert some [SPAN_HELPFUL("glass sheets")] to add windows to it. " else if(glass == AIRLOCK_GLASSIN) - helpmessage += "You can take out the windows with a [SPAN_HELPFUL("screwdriver")]." + helpmessage += "You can take out the windows with a [SPAN_HELPFUL("screwdriver")]. " else - helpmessage += "It looks like a [SPAN_HELPFUL("wrench")] will secure it." + helpmessage += "It looks like a [SPAN_HELPFUL("wrench")] will secure it. " if(STATE_CIRCUIT) - helpmessage += "Add [SPAN_HELPFUL("cable coil")] to the circuit." + helpmessage += "Add [SPAN_HELPFUL("cable coil")] to the circuit. " if(STATE_WIRES) - helpmessage += "Secure the circuit with a [SPAN_HELPFUL("screwdriver")]." + helpmessage += "Secure the circuit with a [SPAN_HELPFUL("screwdriver")]. " if(STATE_SCREWDRIVER) - helpmessage += "[SPAN_HELPFUL("Weld")] it all in place." + helpmessage += "[SPAN_HELPFUL("Weld")] it all in place. " helpmessage += "You can name it with a [SPAN_HELPFUL("pen")]." . += SPAN_NOTICE(helpmessage) -/obj/structure/airlock_assembly/attackby(obj/item/W as obj, mob/user as mob) +/obj/structure/airlock_assembly/attackby(obj/item/attacking_item as obj, mob/user as mob) if(user.action_busy) return TRUE //no afterattack @@ -59,16 +64,16 @@ to_chat(user, SPAN_WARNING("You are not trained to configure \the [src]...")) return - if(HAS_TRAIT(W, TRAIT_TOOL_PEN)) - var/t = copytext(stripped_input(user, "Enter the name for the airlock.", name, created_name), 1, MAX_NAME_LEN) - if(!t || !in_range(src, usr) && loc != usr) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_PEN)) + var/input_text = copytext(stripped_input(user, "Enter the name for the airlock.", name, created_name), 1, MAX_NAME_LEN) + if(!input_text || !in_range(src, usr) && loc != usr) return - created_name = t + created_name = input_text playsound(src, "paper_writing", 15, TRUE) return - if(istype(W, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = W + if(istype(attacking_item, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_sheet = attacking_item if(!anchored) to_chat(user, SPAN_NOTICE("The airlock is not secured!")) return @@ -83,7 +88,7 @@ return if(!do_after(user, 20 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(G.use(5)) + if(glass_sheet.use(5)) playsound(loc, 'sound/items/Deconstruct.ogg', 25, 1) glass = AIRLOCK_GLASSIN to_chat(user, SPAN_NOTICE("You insert some glass into \the [src], adding windows to it.")) @@ -93,7 +98,7 @@ to_chat(user, SPAN_WARNING("You need five sheets of glass to add windows to \the [src]!")) return - if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_CROWBAR)) to_chat(user, SPAN_NOTICE("You start pulling \the [src] apart.")) playsound(loc, 'sound/items/Crowbar.ogg', 25, 1) if(!do_after(user, 20 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) @@ -108,10 +113,14 @@ switch(state) if(STATE_STANDARD) - if(HAS_TRAIT(W, TRAIT_TOOL_WRENCH)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_WRENCH)) + //Moving wide doors is wonky and doesn't work properly, if it's fixed we could make it unwrenchable again + if(width > 1 && anchored) + to_chat(user, SPAN_WARNING("[src] cannot be unwrenched.")) + return if(!anchored) - var/turf/open/T = loc - if(!(istype(T) && T.allow_construction)) + var/turf/open/checked_turf = loc + if(!(istype(checked_turf) && checked_turf.allow_construction)) to_chat(user, SPAN_WARNING("\The [src] cannot be secured here!")) return playsound(loc, 'sound/items/Ratchet.ogg', 25, 1) @@ -127,10 +136,10 @@ to_chat(user, SPAN_NOTICE("The airlock is not secured!")) return ..() - if(istype(W, /obj/item/circuitboard/airlock)) - var/obj/item/circuitboard/airlock/C = W - if(C.fried) // guess what this used to check? ICON STATE!! - to_chat(user, SPAN_WARNING("\The [C] are totally broken!")) + if(istype(attacking_item, /obj/item/circuitboard/airlock)) + var/obj/item/circuitboard/airlock/airlock_circuit = attacking_item + if(airlock_circuit.fried) // guess what this used to check? ICON STATE!! + to_chat(user, SPAN_WARNING("\The [airlock_circuit] are totally broken!")) return playsound(loc, 'sound/items/Screwdriver.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You start installing the airlock electronics.")) @@ -138,14 +147,14 @@ return playsound(loc, 'sound/items/Screwdriver.ogg', 25, 1) user.drop_held_item() - W.forceMove(src) + attacking_item.forceMove(src) to_chat(user, SPAN_NOTICE("You installed the airlock electronics!")) state = STATE_CIRCUIT - electronics = W + electronics = attacking_item update_icon() return - if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER)) if(!anchored) to_chat(user, SPAN_NOTICE("The airlock is not secured!")) return @@ -163,22 +172,22 @@ if(STATE_CIRCUIT) - if(istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W - if (C.get_amount() < 1) + if(istype(attacking_item, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/airlock_circuit = attacking_item + if (airlock_circuit.get_amount() < 1) to_chat(user, SPAN_WARNING("You need one length of coil to wire the airlock assembly.")) return to_chat(user, SPAN_NOTICE("You start to wire the circuit.")) if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) return - if(C.use(1)) + if(airlock_circuit.use(1)) state = STATE_WIRES to_chat(user, SPAN_NOTICE("You wire the circuit.")) update_icon() return if(STATE_WIRES) - if(HAS_TRAIT(W, TRAIT_TOOL_SCREWDRIVER)) + if(HAS_TRAIT(attacking_item, TRAIT_TOOL_SCREWDRIVER)) playsound(loc, 'sound/items/Screwdriver.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You start securing the circuit")) if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) @@ -190,27 +199,23 @@ return if(STATE_SCREWDRIVER) - if(iswelder(W)) - if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH)) + if(iswelder(attacking_item)) + if(!HAS_TRAIT(attacking_item, TRAIT_TOOL_BLOWTORCH)) to_chat(user, SPAN_WARNING("You need a stronger blowtorch!")) return - var/obj/item/tool/weldingtool/WT = W - if(!WT.remove_fuel(5, user)) + var/obj/item/tool/weldingtool/welder = attacking_item + if(!welder.remove_fuel(5, user)) return playsound(loc, 'sound/items/Welder2.ogg', 25, 1) to_chat(user, SPAN_NOTICE("Now finishing the airlock.")) if(!do_after(user, 40 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD)) - WT.remove_fuel(-5) + welder.remove_fuel(-5) return playsound(loc, 'sound/items/Welder2.ogg', 25, 1) to_chat(user, SPAN_NOTICE("You finish the airlock!")) - var/path - if (glass == AIRLOCK_GLASSIN) - path = text2path("/obj/structure/machinery/door/airlock/almayer/[airlock_type]/glass") - else - path = text2path("/obj/structure/machinery/door/airlock/almayer/[airlock_type]") + var/path = get_airlock_path() var/obj/structure/machinery/door/airlock/door = new path(loc) door.assembly_type = type door.electronics = electronics @@ -225,7 +230,7 @@ door.name = created_name else door.name = base_name - + door.handle_multidoor() electronics.forceMove(door) qdel(src) return @@ -238,107 +243,107 @@ else icon_state = "door_as_[base_icon_state][state]" +/obj/structure/airlock_assembly/proc/get_airlock_path() + //For some reason multi_tile doors have different paths... can't say it isn't annoying + if (width > 1) + return "/obj/structure/machinery/door/airlock/multi_tile/almayer/[airlock_type][glass ? "" : "/solid"]" + return "/obj/structure/machinery/door/airlock/almayer/[airlock_type][glass ? "/glass" : ""]" + +/// Used for overloading proc in multi_tile +/obj/structure/airlock_assembly/proc/update_collision_box() + return + /obj/structure/airlock_assembly/airlock_assembly_com base_icon_state = "com" base_name = "Command Airlock" - airlock_type = "/command" + airlock_type = "command" /obj/structure/airlock_assembly/airlock_assembly_sec base_icon_state = "sec" base_name = "Security Airlock" - airlock_type = "/security" + airlock_type = "security" /obj/structure/airlock_assembly/airlock_assembly_eng base_icon_state = "eng" base_name = "Engineering Airlock" - airlock_type = "/engineering" + airlock_type = "engineering" /obj/structure/airlock_assembly/airlock_assembly_min base_icon_state = "min" base_name = "Mining Airlock" - airlock_type = "/mining" + airlock_type = "mining" /obj/structure/airlock_assembly/airlock_assembly_atmo base_icon_state = "atmo" base_name = "Atmospherics Airlock" - airlock_type = "/atmos" + airlock_type = "atmos" /obj/structure/airlock_assembly/airlock_assembly_research base_icon_state = "res" base_name = "Research Airlock" - airlock_type = "/research" + airlock_type = "research" /obj/structure/airlock_assembly/airlock_assembly_science base_icon_state = "sci" base_name = "Science Airlock" - airlock_type = "/science" + airlock_type = "science" /obj/structure/airlock_assembly/airlock_assembly_med base_icon_state = "med" base_name = "Medical Airlock" - airlock_type = "/medical" + airlock_type = "medical" /obj/structure/airlock_assembly/airlock_assembly_mai base_icon_state = "mai" base_name = "Maintenance Airlock" - airlock_type = "/maintenance" + airlock_type = "maintenance" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_ext base_icon_state = "ext" base_name = "External Airlock" - airlock_type = "/external" + airlock_type = "external" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_fre base_icon_state = "fre" base_name = "Freezer Airlock" - airlock_type = "/freezer" + airlock_type = "freezer" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_hatch base_icon_state = "hatch" base_name = "Airtight Hatch" - airlock_type = "/hatch" + airlock_type = "hatch" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_mhatch base_icon_state = "mhatch" base_name = "Maintenance Hatch" - airlock_type = "/maintenance_hatch" + airlock_type = "maintenance_hatch" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/airlock_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly base_icon_state = "highsec" base_name = "High Security Airlock" - airlock_type = "/highsecurity" + airlock_type = "highsecurity" glass = AIRLOCK_CANTGLASS /obj/structure/airlock_assembly/multi_tile icon = 'icons/obj/structures/doors/airlock_assembly2x1.dmi' - icon_state = "door_as_g0" - dir = EAST - var/width = 1 - -/*Temporary until we get sprites. - airlock_type = "/multi_tile/maint" - glass = 1*/ - base_icon_state = "g" //Remember to delete this line when reverting "glass" var to 1. - airlock_type = "/multi_tile/glass" - glass = AIRLOCK_CANTGLASS //To prevent bugs in deconstruction process. + icon_state = "door_as_0" + width = 2 /obj/structure/airlock_assembly/multi_tile/Initialize(mapload, ...) . = ..() - if(dir in list(EAST, WEST)) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size + update_collision_box() update_icon() /obj/structure/airlock_assembly/multi_tile/Move() . = ..() + update_collision_box() + +/obj/structure/airlock_assembly/multi_tile/update_collision_box() if(dir in list(EAST, WEST)) bound_width = width * world.icon_size bound_height = world.icon_size diff --git a/icons/obj/structures/doors/2x1generic_solid.dmi b/icons/obj/structures/doors/2x1generic_solid.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9c00b7b3277d6755bbef19d2d4ddbe66fc5cbbe6 GIT binary patch literal 15237 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 literal 0 HcmV?d00001 diff --git a/icons/obj/structures/doors/airlock_assembly2x1.dmi b/icons/obj/structures/doors/airlock_assembly2x1.dmi index a8d69b6f6a2d463fea644f713c662821068e5beb..cafd5c415b89749ef8e8f7ce7665fcd7c373458f 100644 GIT binary patch literal 29549 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%0A(~lCUkw@=8ACslA(WCOKT#k4tAh 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 YC&D}CB=W)E&xEdAym6u6Z=1*e1)07wdH?_b literal 24741 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 From afe9ecf6020bf35e4e45748d76466f384d9933dd Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:40:43 +0100 Subject: [PATCH 092/199] Automatic changelog for PR #4690 [ci skip] --- html/changelogs/AutoChangeLog-pr-4690.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4690.yml diff --git a/html/changelogs/AutoChangeLog-pr-4690.yml b/html/changelogs/AutoChangeLog-pr-4690.yml new file mode 100644 index 000000000000..11450390dc56 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4690.yml @@ -0,0 +1,6 @@ +author: "MrDas" +delete-after: True +changes: + - bugfix: "You can now disassemble wide airlocks. (You can't unwrench them though)" + - spellcheck: "Fixed a few typos in airlock assembly." + - imageadd: "Added wide airlock assembly and generic solid wide airlock sprites." \ No newline at end of file From d23a25446be85d695f04a391d2cf4c9d4b8933cf Mon Sep 17 00:00:00 2001 From: Vile Beggar Date: Thu, 19 Oct 2023 21:47:49 +0200 Subject: [PATCH 093/199] Makes dartboards functional (#4677) # About the pull request adds basic functionality to dartboards and makes them craftable with cardboard. fixes a bug where some signs lose their icon when deconstructed. # Explain why it's good for the game the dartboard's been sitting there, looking pretty and doing nothing else for a good while. more intractability with props is always fun to see. # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/17518895/4496198d-5a7d-4511-a5bf-894c4df98588
# Changelog :cl: add: Dartboards are now functional and can be crafted with cardboard. fix: Fixed an issue with some deconstructed signs losing their icon. /:cl: --------- Co-authored-by: harryob --- .../items/stacks/sheets/sheet_types.dm | 1 + code/game/objects/structures/misc.dm | 123 + code/game/objects/structures/signs.dm | 8 +- maps/map_files/USS_Almayer/USS_Almayer.dmm | 2453 ++++++++--------- 4 files changed, 1352 insertions(+), 1233 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 98a7ab036f06..f6a8d02c3e9d 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -208,6 +208,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \ new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ + new/datum/stack_recipe("dartboard", /obj/item/dartboard), \ null, \ new/datum/stack_recipe_list("folders",list( \ new/datum/stack_recipe("blue folder", /obj/item/folder/blue), \ diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm index d290925d4cdf..89bc3da6ab23 100644 --- a/code/game/objects/structures/misc.dm +++ b/code/game/objects/structures/misc.dm @@ -189,3 +189,126 @@ /obj/structure/computer3frame/laptop name = "laptop frame" + +// Dartboard +#define DOUBLE_BAND 2 +#define TRIPLE_BAND 3 + +/obj/structure/dartboard + name = "dartboard" + desc = "A dartboard, loosely secured." + icon = 'icons/obj/structures/props/props.dmi' + icon_state = "dart_board" + density = TRUE + unslashable = TRUE + +/obj/structure/dartboard/get_examine_text() + . = ..() + if(length(contents)) + var/is_are = "is" + if(length(contents) != 1) + is_are = "are" + + . += SPAN_NOTICE("There [is_are] [length(contents)] item\s embedded into [src].") + +/obj/structure/dartboard/initialize_pass_flags(datum/pass_flags_container/pass_flags) + ..() + if(pass_flags) + pass_flags.flags_can_pass_all = PASS_MOB_IS + +/obj/structure/dartboard/get_projectile_hit_boolean(obj/projectile/projectile) + . = ..() + visible_message(SPAN_DANGER("[projectile] hits [src], collapsing it!")) + collapse() + +/obj/structure/dartboard/proc/flush_contents() + for(var/atom/movable/embedded_items as anything in contents) + embedded_items.forceMove(loc) + +/obj/structure/dartboard/proc/collapse() + playsound(src, 'sound/effects/thud1.ogg', 50) + new /obj/item/dartboard/(loc) + qdel(src) + +/obj/structure/dartboard/attack_hand(mob/user) + if(length(contents)) + user.visible_message(SPAN_NOTICE("[user] starts recovering items from [src]..."), SPAN_NOTICE("You start recovering items from [src]...")) + if(do_after(user, 1 SECONDS, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, user, INTERRUPT_MOVED, BUSY_ICON_GENERIC)) + flush_contents() + else + to_chat(user, SPAN_WARNING("[src] has nothing embedded!")) + +/obj/structure/dartboard/Destroy() + flush_contents() + . = ..() + +/obj/structure/dartboard/hitby(obj/item/thrown_item) + if(thrown_item.sharp != IS_SHARP_ITEM_ACCURATE && !istype(thrown_item, /obj/item/weapon/dart)) + visible_message(SPAN_DANGER("[thrown_item] hits [src], collapsing it!")) + collapse() + return + + contents += thrown_item + playsound(src, 'sound/weapons/tablehit1.ogg', 50) + var/score = rand(1,21) + if(score == 21) + visible_message(SPAN_DANGER("[thrown_item] embeds into [src], striking the bullseye! 50 points.")) + return + + var/band = "single" + var/band_number = rand(1,3) + score *= band_number + switch(band_number) + if(DOUBLE_BAND) + band = "double" + if(TRIPLE_BAND) + band = "triple" + visible_message(SPAN_DANGER("[thrown_item] embeds into [src], striking [band] for [score] point\s.")) + +/obj/structure/dartboard/attackby(obj/item/item, mob/user) + user.visible_message(SPAN_DANGER("[user] hits [src] with [item], collapsing it!"), SPAN_DANGER("You collapse [src] with [item]!")) + collapse() + +/obj/structure/dartboard/MouseDrop(over_object, src_location, over_location) + . = ..() + if(over_object != usr || !Adjacent(usr)) + return + + if(!ishuman(usr)) + return + + visible_message(SPAN_NOTICE("[usr] unsecures [src].")) + var/obj/item/dartboard/unsecured_board = new(loc) + usr.put_in_hands(unsecured_board) + qdel(src) + +/obj/item/dartboard + name = "dartboard" + desc = "A dartboard for darts." + icon = 'icons/obj/structures/props/props.dmi' + icon_state = "dart_board" + +/obj/item/dartboard/attack_self(mob/user) + . = ..() + + var/turf_ahead = get_step(user, user.dir) + if(!istype(turf_ahead, /turf/closed)) + to_chat(user, SPAN_WARNING("[src] needs a wall to be secured to!")) + return + + var/obj/structure/dartboard/secured_board = new(user.loc) + switch(user.dir) + if(NORTH) + secured_board.pixel_y = 32 + if(EAST) + secured_board.pixel_x = 32 + if(SOUTH) + secured_board.pixel_y = -32 + if(WEST) + secured_board.pixel_x = -32 + + to_chat(user, SPAN_NOTICE("You secure [secured_board] to [turf_ahead].")) + qdel(src) + +#undef DOUBLE_BAND +#undef TRIPLE_BAND diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index fbd6920875ad..ec277929facb 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -17,6 +17,7 @@ S.desc = desc S.icon_state = icon_state S.sign_state = icon_state + S.icon = icon deconstruct(FALSE) else ..() @@ -45,6 +46,7 @@ S.name = name S.desc = desc S.icon_state = sign_state + S.icon = icon to_chat(user, "You fasten \the [S] with your [tool].") qdel(src) else ..() @@ -592,9 +594,3 @@ desc = "An unbelievably creepy cat clock that surveys the room with every tick and every tock." icon = 'icons/obj/structures/props/catclock.dmi' icon_state = "cat_clock_motion" - -/obj/structure/sign/dartboard - name = "dartboard" - desc = "A dartboard, secured with a nail and a string. It has bullet holes and knife stab marks over and around it." - icon = 'icons/obj/structures/props/props.dmi' - icon_state = "dart_board" diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 85d8ff3ea87e..d1897fc176df 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -567,6 +567,18 @@ icon_state = "tcomms" }, /area/almayer/shipboard/weapon_room) +"acc" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "acf" = ( /turf/closed/wall/almayer/outer, /area/almayer/living/starboard_garden) @@ -10924,15 +10936,6 @@ allow_construction = 0 }, /area/almayer/hallways/aft_hallway) -"aKK" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - dir = 1; - name = "\improper Tool Closet" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/port_emb) "aKN" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/clothing/accessory/red, @@ -12018,21 +12021,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/upper_medical) -"aQD" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "aQF" = ( /turf/closed/wall/almayer, /area/almayer/living/offices) @@ -14287,12 +14275,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) -"bbJ" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "bbL" = ( /turf/open/floor/almayer{ dir = 8; @@ -18309,6 +18291,22 @@ /obj/effect/landmark/late_join/alpha, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) +"bxC" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "bxD" = ( /obj/structure/machinery/status_display{ pixel_y = 30 @@ -22992,17 +22990,6 @@ icon_state = "test_floor4" }, /area/almayer/squads/req) -"bRS" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - access_modified = 1; - dir = 1; - name = "\improper Kitchen Hydroponics"; - req_one_access_txt = "30;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "bRU" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -24125,6 +24112,24 @@ icon_state = "test_floor4" }, /area/almayer/engineering/engineering_workshop) +"bXc" = ( +/obj/structure/surface/table/almayer, +/obj/item/reagent_container/food/snacks/mre_pack/xmas2{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/effect/landmark/map_item{ + layer = 3.03; + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/reagent_container/food/snacks/mre_pack/xmas3{ + pixel_x = 5 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "bXe" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) @@ -27136,17 +27141,6 @@ icon_state = "plate" }, /area/almayer/squads/delta) -"cmc" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 5 - }, -/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ - pixel_y = -30 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "cmd" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -27756,6 +27750,15 @@ icon_state = "greencorner" }, /area/almayer/squads/req) +"crK" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/vents/pump, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "crP" = ( /obj/item/tool/kitchen/utensil/pfork, /turf/open/floor/almayer{ @@ -27960,6 +27963,20 @@ icon_state = "blue" }, /area/almayer/hallways/aft_hallway) +"cwQ" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "cwS" = ( /obj/structure/blocker/invisible_wall, /turf/open/floor/almayer/no_build{ @@ -28374,6 +28391,14 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/charlie) +"cEG" = ( +/obj/structure/sign/poster{ + icon_state = "poster14"; + pixel_x = -27 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "cEO" = ( /obj/structure/largecrate/supply/floodlights, /turf/open/floor/almayer{ @@ -29354,6 +29379,20 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"dac" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddernortheast"; + name = "\improper North East Ladders Shutters" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "daj" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/almayer{ @@ -29556,6 +29595,18 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/port_hallway) +"deT" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "emerald" + }, +/area/almayer/living/port_emb) "dfa" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, @@ -30640,6 +30691,17 @@ icon_state = "orange" }, /area/almayer/engineering/ce_room) +"dzF" = ( +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddernortheast"; + name = "\improper North East Ladders Shutters" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/starboard_hallway) "dAb" = ( /obj/structure/largecrate/random/barrel/blue, /turf/open/floor/almayer{ @@ -30658,6 +30720,13 @@ icon_state = "test_floor4" }, /area/almayer/squads/bravo) +"dAO" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "dAX" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -31611,6 +31680,16 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_f_p) +"dVs" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "dVu" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -31786,6 +31865,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/grunt_rnr) +"dYX" = ( +/obj/structure/machinery/door/airlock/almayer/marine/bravo{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "dZd" = ( /turf/open/floor/almayer{ dir = 10; @@ -31820,11 +31911,6 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/general_equipment) -"eai" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "ean" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -32087,26 +32173,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) -"efa" = ( -/obj/item/frame/camera{ - desc = "The Staff Officer insisted he needed to monitor everyone at all times."; - layer = 2.9; - name = "broken camera"; - pixel_x = -7; - pixel_y = -6 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S"; - pixel_y = -1 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "efh" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/door_control{ @@ -33158,16 +33224,6 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lockerroom) -"ezO" = ( -/obj/item/tool/screwdriver{ - layer = 2.9; - pixel_x = -21; - pixel_y = -14 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "ezQ" = ( /obj/structure/sign/safety/restrictedarea{ pixel_x = 8; @@ -33190,25 +33246,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/lobby) -"ezW" = ( -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/item/tool/soap, -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "ezX" = ( /obj/structure/bed/chair/wood/normal, /turf/open/floor/wood/ship, @@ -33352,6 +33389,16 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south2) +"eCS" = ( +/obj/structure/bed/chair/comfy/delta, +/obj/item/trash/popcorn, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "bluefull" + }, +/area/almayer/living/briefing) "eDo" = ( /obj/effect/decal/warning_stripes{ icon_state = "W"; @@ -33844,11 +33891,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) -"eOs" = ( -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "eOM" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ dir = 2; @@ -34194,15 +34236,6 @@ /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, /area/almayer/living/offices) -"eXE" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 6 - }, -/turf/open/floor/almayer{ - dir = 9; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "eYr" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -34230,18 +34263,6 @@ icon_state = "plate" }, /area/almayer/living/briefing) -"eYv" = ( -/obj/structure/machinery/disposal, -/obj/item/reagent_container/food/drinks/cans/beer{ - layer = 3.3; - pixel_x = -4; - pixel_y = 15 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/living/port_emb) "eYz" = ( /obj/structure/machinery/camera/autoname/almayer/containment/ares{ dir = 1 @@ -34768,6 +34789,13 @@ icon_state = "red" }, /area/almayer/shipboard/brig/main_office) +"fkO" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "fkW" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34854,6 +34882,21 @@ icon_state = "redcorner" }, /area/almayer/shipboard/brig/execution) +"fnx" = ( +/obj/structure/surface/table/reinforced/almayer_B, +/obj/structure/machinery/door/window/eastright{ + access_modified = 1; + dir = 8; + req_access_txt = "19" + }, +/obj/effect/landmark/map_item, +/obj/structure/machinery/door/window/eastleft{ + req_access_txt = "19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "fnA" = ( /obj/structure/surface/rack, /obj/item/tool/crowbar, @@ -35398,25 +35441,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) -"fxR" = ( -/obj/structure/surface/table/almayer, -/obj/effect/landmark/map_item{ - pixel_x = -8 - }, -/obj/item/toy/farwadoll{ - desc = "A USCM approved plush doll. It's not soft and hardly comforting!"; - force = 15; - icon_state = "therapyred"; - layer = 4.1; - name = "Sergeant Huggs"; - pixel_x = 7; - pixel_y = -1; - throwforce = 15 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/briefing) "fxW" = ( /obj/structure/platform_decoration{ dir = 1 @@ -35534,23 +35558,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_a_s) -"fBA" = ( -/obj/item/device/assembly/mousetrap/armed, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "SW-out"; - pixel_y = -1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "NW-out"; - pixel_y = 1 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "fBD" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -36292,15 +36299,6 @@ /obj/effect/step_trigger/clone_cleaner, /turf/closed/wall/almayer, /area/almayer/hull/upper_hull/u_m_p) -"fQQ" = ( -/obj/structure/platform{ - dir = 1 - }, -/obj/structure/pipes/vents/pump{ - dir = 4 - }, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "fRr" = ( /obj/structure/machinery/light{ dir = 1 @@ -36340,30 +36338,13 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/north1) -"fSF" = ( -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/obj/structure/bedsheetbin{ - pixel_x = 26; - pixel_y = 5 - }, -/obj/item/tool/soap/syndie, -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" +"fSK" = ( +/obj/structure/pipes/standard/manifold/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/almayer/living/port_emb) +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "fTi" = ( /obj/structure/largecrate/supply/floodlights, /turf/open/floor/almayer{ @@ -36615,6 +36596,17 @@ /obj/effect/landmark/late_join/bravo, /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/bravo) +"gac" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "gai" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -37159,6 +37151,12 @@ /obj/structure/largecrate/random/secure, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"gkJ" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "gkK" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/surface/table/reinforced/almayer_B, @@ -37421,6 +37419,31 @@ icon_state = "plating" }, /area/almayer/hull/lower_hull/l_a_p) +"gsg" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/structure/machinery/door_control{ + id = "Alpha_1"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "gsm" = ( /obj/structure/machinery/status_display{ pixel_x = -32 @@ -37620,7 +37643,7 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_s) -"gwO" = ( +"gwM" = ( /obj/structure/pipes/vents/pump, /obj/structure/mirror{ pixel_y = 32 @@ -37936,12 +37959,6 @@ icon_state = "plate" }, /area/almayer/squads/bravo) -"gBg" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/port_emb) "gBi" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -38312,16 +38329,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/medical/hydroponics) -"gLu" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "gLz" = ( /obj/structure/machinery/cryopod{ layer = 3.1; @@ -38656,21 +38663,6 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) -"gSZ" = ( -/obj/structure/surface/table/reinforced/almayer_B, -/obj/structure/machinery/door/window/eastright{ - access_modified = 1; - dir = 8; - req_access_txt = "19" - }, -/obj/effect/landmark/map_item, -/obj/structure/machinery/door/window/eastleft{ - req_access_txt = "19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "gTl" = ( /obj/structure/pipes/vents/pump{ dir = 8 @@ -38933,17 +38925,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_m_p) -"gZj" = ( -/obj/structure/machinery/door/airlock/almayer/generic{ - access_modified = 1; - name = "Kitchen"; - req_one_access_txt = "30;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "gZr" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/device/camera_film{ @@ -39060,15 +39041,6 @@ icon_state = "silver" }, /area/almayer/living/auxiliary_officer_office) -"hbx" = ( -/obj/structure/platform{ - dir = 1 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 4 - }, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "hbI" = ( /obj/item/ammo_magazine/shotgun/buckshot, /obj/item/ammo_magazine/shotgun/buckshot, @@ -39256,6 +39228,15 @@ icon_state = "test_floor4" }, /area/almayer/lifeboat_pumps/north1) +"heK" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 1; + name = "\improper Tool Closet" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "heQ" = ( /obj/structure/bed/chair, /obj/structure/extinguisher_cabinet{ @@ -39526,6 +39507,17 @@ icon_state = "red" }, /area/almayer/shipboard/port_missiles) +"hjB" = ( +/obj/structure/machinery/door/airlock/almayer/generic{ + access_modified = 1; + name = "Kitchen"; + req_one_access_txt = "30;19" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "hki" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer{ @@ -39933,6 +39925,21 @@ icon_state = "silver" }, /area/almayer/command/computerlab) +"huU" = ( +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "huX" = ( /obj/structure/largecrate/random/barrel/yellow, /obj/structure/machinery/light{ @@ -40301,17 +40308,6 @@ /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) -"hBL" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "hBU" = ( /obj/structure/largecrate/random/secure, /obj/effect/decal/warning_stripes{ @@ -40469,15 +40465,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) -"hGI" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/structure/pipes/standard/manifold/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "orangefull" - }, -/area/almayer/living/briefing) "hGN" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -40687,6 +40674,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"hLS" = ( +/obj/structure/machinery/door/airlock/almayer/marine/delta{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "hMi" = ( /obj/structure/pipes/vents/scrubber, /turf/open/floor/almayer, @@ -40737,20 +40736,6 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/main_office) -"hNL" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 8; - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "hNM" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/stack/sheet/metal{ @@ -41524,16 +41509,6 @@ icon_state = "plate" }, /area/almayer/living/port_emb) -"iew" = ( -/obj/structure/bed/chair/comfy/charlie, -/obj/structure/pipes/vents/scrubber{ - dir = 4 - }, -/obj/item/trash/uscm_mre, -/turf/open/floor/almayer{ - icon_state = "emeraldfull" - }, -/area/almayer/living/briefing) "iey" = ( /obj/structure/surface/table/almayer, /obj/item/roller, @@ -41999,20 +41974,6 @@ }, /turf/open/floor/almayer, /area/almayer/squads/req) -"ipb" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 1; - req_one_access = null; - req_one_access_txt = "30;19" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/grunt_rnr) "ipe" = ( /obj/item/toy/crayon{ name = "chewed crayon"; @@ -42538,17 +42499,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"iza" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "orangefull" - }, -/area/almayer/living/briefing) "izk" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -42644,17 +42594,6 @@ "iBt" = ( /turf/open/floor/plating, /area/almayer/hull/upper_hull/u_m_p) -"iBx" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 9 - }, -/turf/open/floor/almayer{ - icon_state = "orangefull" - }, -/area/almayer/living/briefing) "iBE" = ( /obj/effect/landmark/yautja_teleport, /turf/open/floor/almayer{ @@ -42672,13 +42611,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_p) -"iBT" = ( -/obj/structure/pipes/standard/manifold/hidden/supply, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "iBY" = ( /obj/structure/machinery/vending/snack, /turf/open/floor/almayer{ @@ -42751,6 +42683,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_a_s) +"iDN" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 2; + icon_state = "pipe-c" + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "iDT" = ( /obj/structure/surface/table/almayer, /obj/item/reagent_container/spray/cleaner{ @@ -42976,22 +42918,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"iKa" = ( -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "iKb" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer{ @@ -43313,6 +43239,52 @@ /obj/item/trash/chips, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"iSm" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + desc = "Do you remember who you are?"; + icon_state = "mirror_broke"; + name = "broken mirror"; + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/item/device/cassette_tape/nam{ + layer = 2.9; + pixel_x = -6; + pixel_y = 11 + }, +/obj/structure/machinery/door_control{ + id = "Delta_2"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/obj/item/prop{ + desc = "A handful of rounds to reload on the go."; + icon = 'icons/obj/items/weapons/guns/handful.dmi'; + icon_state = "bullet_2"; + name = "handful of pistol bullets (9mm)"; + pixel_x = -8; + pixel_y = 29 + }, +/obj/item/prop{ + desc = "A bunch of tiny bits of shattered metal."; + icon = 'icons/obj/items/shards.dmi'; + icon_state = "shrapnelsmall"; + name = "piece of shrapnel"; + pixel_x = -1; + pixel_y = 24 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "iSZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -43387,6 +43359,18 @@ }, /turf/open/floor/plating, /area/almayer/hull/lower_hull/l_f_p) +"iUk" = ( +/obj/structure/machinery/door/airlock/almayer/marine/charlie{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "iUo" = ( /obj/structure/sign/safety/terminal{ pixel_x = 7; @@ -43499,6 +43483,15 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/hangar) +"iWE" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/pipes/vents/pump{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "iWL" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -44158,18 +44151,6 @@ icon_state = "green" }, /area/almayer/living/offices) -"jhz" = ( -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "jhA" = ( /obj/structure/bed/chair{ dir = 8; @@ -44209,6 +44190,25 @@ icon_state = "plate" }, /area/almayer/hallways/port_hallway) +"jiU" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "jiX" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -44349,6 +44349,25 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/perma) +"jlj" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + pixel_x = -8 + }, +/obj/item/toy/farwadoll{ + desc = "A USCM approved plush doll. It's not soft and hardly comforting!"; + force = 15; + icon_state = "therapyred"; + layer = 4.1; + name = "Sergeant Huggs"; + pixel_x = 7; + pixel_y = -1; + throwforce = 15 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "jlA" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -44808,13 +44827,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) -"jwI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/manifold/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/hallways/starboard_hallway) "jwK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -45194,6 +45206,15 @@ icon_state = "green" }, /area/almayer/hallways/port_hallway) +"jJk" = ( +/obj/structure/machinery/power/apc/almayer{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "blue" + }, +/area/almayer/living/port_emb) "jJq" = ( /obj/structure/surface/rack, /obj/item/storage/firstaid/regular, @@ -45217,13 +45238,6 @@ /obj/effect/landmark/start/doctor, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/offices) -"jKl" = ( -/obj/structure/pipes/standard/simple/hidden/supply, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "jKn" = ( /turf/open/floor/almayer{ dir = 5; @@ -45729,6 +45743,15 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engineering_workshop/hangar) +"jUo" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "jUs" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -45778,15 +45801,6 @@ icon_state = "dark_sterile" }, /area/almayer/medical/medical_science) -"jUT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/turf/open/floor/almayer, -/area/almayer/hallways/port_hallway) "jUW" = ( /obj/effect/step_trigger/clone_cleaner, /obj/effect/decal/warning_stripes{ @@ -46032,6 +46046,16 @@ icon_state = "test_floor4" }, /area/almayer/hallways/aft_hallway) +"kam" = ( +/obj/item/tool/screwdriver{ + layer = 2.9; + pixel_x = -21; + pixel_y = -14 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "kan" = ( /turf/closed/wall/almayer/white, /area/almayer/medical/lower_medical_medbay) @@ -46226,12 +46250,6 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) -"keO" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "keR" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -46550,11 +46568,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/north2) -"kmH" = ( -/obj/structure/platform, -/obj/structure/pipes/vents/pump, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "kmK" = ( /obj/structure/platform{ dir = 1 @@ -46596,25 +46609,6 @@ icon_state = "plate" }, /area/almayer/living/pilotbunks) -"knG" = ( -/obj/structure/surface/table/almayer, -/obj/effect/landmark/map_item{ - layer = 3.03; - pixel_x = 7; - pixel_y = 4 - }, -/obj/item/prop/helmetgarb/spacejam_tickets{ - pixel_x = -8; - pixel_y = 5 - }, -/obj/item/prop/helmetgarb/spacejam_tickets{ - pixel_x = -8; - pixel_y = -3 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/briefing) "knH" = ( /obj/structure/machinery/vending/coffee, /obj/structure/sign/safety/coffee{ @@ -47069,6 +47063,19 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_s) +"kxd" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "kxo" = ( /obj/structure/machinery/washing_machine, /obj/structure/machinery/washing_machine{ @@ -47742,18 +47749,6 @@ icon_state = "orange" }, /area/almayer/squads/bravo) -"kLo" = ( -/obj/structure/machinery/door/airlock/almayer/marine/charlie{ - dir = 1 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "kLp" = ( /obj/structure/sign/safety/stairs{ pixel_x = -17; @@ -47768,21 +47763,6 @@ icon_state = "red" }, /area/almayer/hallways/starboard_hallway) -"kLv" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/machinery/door/airlock/almayer/security{ - access_modified = 1; - dir = 2; - name = "\improper Security Checkpoint"; - req_access = null; - req_one_access_txt = "3;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "kLP" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47865,6 +47845,16 @@ icon_state = "mono" }, /area/almayer/medical/medical_science) +"kNC" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 2; + icon_state = "pipe-j2" + }, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "kNO" = ( /obj/structure/desertdam/decals/road_edge{ icon_state = "road_edge_decal3"; @@ -47947,15 +47937,6 @@ icon_state = "test_floor4" }, /area/almayer/hallways/aft_hallway) -"kOH" = ( -/obj/structure/machinery/power/apc/almayer{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "blue" - }, -/area/almayer/living/port_emb) "kPo" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -48068,24 +48049,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/operating_room_three) -"kRm" = ( -/obj/structure/surface/table/almayer, -/obj/item/reagent_container/food/snacks/mre_pack/xmas2{ - pixel_x = 5; - pixel_y = 9 - }, -/obj/effect/landmark/map_item{ - layer = 3.03; - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/reagent_container/food/snacks/mre_pack/xmas3{ - pixel_x = 5 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/living/briefing) "kRu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48203,6 +48166,16 @@ icon_state = "tcomms" }, /area/almayer/command/telecomms) +"kTx" = ( +/obj/structure/stairs/perspective{ + dir = 1; + icon_state = "p_stair_full" + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "kTM" = ( /obj/item/frame/rack{ layer = 3.1; @@ -48290,13 +48263,6 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south2) -"kVm" = ( -/obj/structure/pipes/standard/manifold/hidden/supply, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "kVX" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -48339,17 +48305,6 @@ icon_state = "silvercorner" }, /area/almayer/command/cichallway) -"kWF" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "redfull" - }, -/area/almayer/living/briefing) "kWT" = ( /turf/open/floor/almayer{ dir = 9; @@ -48441,6 +48396,12 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_f_s) +"kYv" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/port_emb) "kYP" = ( /obj/structure/sign/safety/maint{ pixel_x = 32 @@ -48475,13 +48436,6 @@ icon_state = "plate" }, /area/almayer/living/offices) -"kZf" = ( -/obj/structure/platform, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "kZA" = ( /turf/open/floor/almayer{ dir = 4; @@ -49091,25 +49045,6 @@ "lmK" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/command/securestorage) -"lmW" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/machinery/door_control{ - id = "Alpha_2"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "lne" = ( /obj/structure/bed/chair, /turf/open/floor/almayer{ @@ -49642,52 +49577,6 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/aft_hallway) -"lwA" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - desc = "Do you remember who you are?"; - icon_state = "mirror_broke"; - name = "broken mirror"; - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/item/device/cassette_tape/nam{ - layer = 2.9; - pixel_x = -6; - pixel_y = 11 - }, -/obj/structure/machinery/door_control{ - id = "Delta_2"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/obj/item/prop{ - desc = "A handful of rounds to reload on the go."; - icon = 'icons/obj/items/weapons/guns/handful.dmi'; - icon_state = "bullet_2"; - name = "handful of pistol bullets (9mm)"; - pixel_x = -8; - pixel_y = 29 - }, -/obj/item/prop{ - desc = "A bunch of tiny bits of shattered metal."; - icon = 'icons/obj/items/shards.dmi'; - icon_state = "shrapnelsmall"; - name = "piece of shrapnel"; - pixel_x = -1; - pixel_y = 24 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "lwC" = ( /obj/structure/desertdam/decals/road_edge{ icon_state = "road_edge_decal3"; @@ -49932,21 +49821,12 @@ }, /area/almayer/squads/charlie) "lBz" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "NW-out"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "SW-out"; - pixel_y = -1 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/area/almayer/living/port_emb) +/obj/structure/pipes/standard/manifold/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/hallways/starboard_hallway) "lBF" = ( /obj/structure/surface/table/almayer, /obj/effect/spawner/random/toolbox, @@ -50104,25 +49984,6 @@ }, /turf/open/floor/almayer, /area/almayer/living/chapel) -"lEL" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/prop/ice_colony/tiger_rug{ - desc = "A beat up beer stained, incredibly garish, polyester tiger rug. No one knows how it got here. Written on the wash tag are the words 'From Thedus, with love <3', in Sharpie."; - icon_state = "HotlineAlt"; - layer = 2.9; - name = "Richard the tiger" - }, -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/turf/open/floor/almayer{ - dir = 9; - icon_state = "emerald" - }, -/area/almayer/living/port_emb) "lEO" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -50291,6 +50152,20 @@ icon_state = "greencorner" }, /area/almayer/living/grunt_rnr) +"lHG" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; + dir = 1; + req_one_access = null; + req_one_access_txt = "30;19" + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "lIa" = ( /obj/item/robot_parts/arm/l_arm, /obj/item/robot_parts/leg/l_leg, @@ -50764,40 +50639,12 @@ icon_state = "redcorner" }, /area/almayer/living/briefing) -"lSh" = ( -/obj/structure/machinery/door/airlock/almayer/marine/delta{ - dir = 1 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "lSD" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_p) -"lSO" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_y = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "lTt" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -50821,15 +50668,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_p) -"lUB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 9 - }, -/turf/open/floor/almayer, -/area/almayer/hallways/port_hallway) "lVl" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer, @@ -51863,14 +51701,6 @@ icon_state = "silver" }, /area/almayer/command/cichallway) -"mtS" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "mtX" = ( /obj/structure/closet/secure_closet/guncabinet/red, /obj/item/ammo_magazine/rifle/m41aMK1/ap, @@ -52269,6 +52099,22 @@ icon_state = "emerald" }, /area/almayer/living/briefing) +"mEb" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door_control{ + id = "laddersoutheast"; + name = "South East Ladders Shutters"; + pixel_y = 25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "mEE" = ( /obj/structure/platform{ dir = 4; @@ -53020,15 +52866,6 @@ icon_state = "cargo" }, /area/almayer/living/offices) -"mTk" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "mTm" = ( /turf/open/floor/almayer{ dir = 4; @@ -53150,6 +52987,15 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"mVZ" = ( +/obj/structure/sign/poster{ + desc = "It says DRUG."; + icon_state = "poster2"; + pixel_x = -27 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "mWe" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 8; @@ -53275,22 +53121,6 @@ icon_state = "plating" }, /area/almayer/hallways/vehiclehangar) -"mYZ" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 10 - }, -/obj/structure/machinery/door_control{ - id = "laddersoutheast"; - name = "South East Ladders Shutters"; - pixel_y = 25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "green" - }, -/area/almayer/hallways/port_hallway) "mZb" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22"; @@ -53693,6 +53523,22 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) +"nik" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "nim" = ( /obj/structure/machinery/door/airlock/almayer/engineering{ access_modified = 1; @@ -53913,6 +53759,11 @@ icon_state = "silver" }, /area/almayer/command/securestorage) +"nna" = ( +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "nnc" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -53978,25 +53829,6 @@ /obj/structure/largecrate/random/barrel/white, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) -"nob" = ( -/obj/structure/sink{ - dir = 1; - pixel_y = -10 - }, -/obj/structure/pipes/vents/scrubber{ - dir = 1 - }, -/obj/structure/surface/rack{ - density = 0; - pixel_x = 26 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "noj" = ( /obj/structure/largecrate, /obj/structure/prop/server_equipment/laptop{ @@ -54059,6 +53891,22 @@ icon_state = "dark_sterile" }, /area/almayer/medical/containment) +"npB" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "nqx" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -54500,20 +54348,19 @@ icon_state = "green" }, /area/almayer/hallways/starboard_hallway) -"nyO" = ( -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 8; - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) "nyQ" = ( /turf/open/floor/almayer, /area/almayer/squads/charlie_delta_shared) +"nza" = ( +/obj/structure/bed/chair/comfy/charlie, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/obj/item/trash/uscm_mre, +/turf/open/floor/almayer{ + icon_state = "emeraldfull" + }, +/area/almayer/living/briefing) "nzv" = ( /obj/structure/filingcabinet/filingcabinet, /obj/item/clipboard, @@ -54800,20 +54647,6 @@ icon_state = "plate" }, /area/almayer/shipboard/starboard_point_defense) -"nFy" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 8; - id = "laddernortheast"; - name = "\improper North East Ladders Shutters" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/starboard_hallway) "nFI" = ( /obj/structure/surface/table/almayer, /obj/structure/disposalpipe/segment{ @@ -54891,13 +54724,6 @@ icon_state = "plate" }, /area/almayer/shipboard/port_point_defense) -"nGZ" = ( -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "nHg" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -54991,6 +54817,17 @@ }, /turf/open/floor/almayer, /area/almayer/living/basketball) +"nIW" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "nJo" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -55100,6 +54937,21 @@ /obj/structure/machinery/cm_vending/sorted/marine_food, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"nLZ" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/door_control{ + id = "laddernortheast"; + name = "North East Ladders Shutters"; + pixel_y = -25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "nMc" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 @@ -55316,15 +55168,6 @@ icon_state = "plate" }, /area/almayer/squads/req) -"nQd" = ( -/obj/structure/bed/chair/comfy/alpha{ - dir = 1 - }, -/obj/structure/pipes/vents/pump, -/turf/open/floor/almayer{ - icon_state = "redfull" - }, -/area/almayer/living/briefing) "nQg" = ( /obj/structure/sink{ pixel_y = 24 @@ -55535,21 +55378,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"nVU" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_y = -25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "nVX" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/blastdoor{ id_tag = "Boat2-D1"; @@ -56117,23 +55945,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) -"oiZ" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "SE-out"; - pixel_y = -1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "NE-out"; - pixel_y = 1 - }, -/obj/structure/machinery/door/airlock/almayer/maint{ - dir = 8; - name = "\improper Tool Closet" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/port_emb) "ojF" = ( /obj/structure/machinery/cm_vending/clothing/tl/charlie{ density = 0; @@ -56144,6 +55955,22 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) +"ojR" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/machinery/door_control{ + id = "laddersoutheast"; + name = "South East Ladders Shutters"; + pixel_y = 25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "ojZ" = ( /obj/structure/window/framed/almayer/white, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -56194,6 +56021,17 @@ icon_state = "plating" }, /area/almayer/engineering/engine_core) +"okB" = ( +/obj/structure/bed/chair/comfy/alpha{ + dir = 1 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/living/briefing) "okD" = ( /obj/structure/prop/almayer/name_stencil{ icon_state = "almayer6" @@ -56333,6 +56171,13 @@ icon_state = "orange" }, /area/almayer/hallways/hangar) +"omW" = ( +/obj/structure/pipes/standard/manifold/fourway/hidden/supply, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "onN" = ( /obj/structure/surface/table/almayer, /obj/structure/disposalpipe/segment{ @@ -56449,18 +56294,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/processing) -"oqc" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 1; - req_one_access = null; - req_one_access_txt = "30;19" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/port_emb) "oqu" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -57096,6 +56929,18 @@ icon_state = "red" }, /area/almayer/living/gym) +"oDx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; + dir = 1; + req_one_access = null; + req_one_access_txt = "30;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "oDE" = ( /obj/structure/surface/rack, /obj/item/reagent_container/spray/cleaner{ @@ -57355,20 +57200,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/hangar) -"oJq" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 8; - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "oJR" = ( /obj/effect/projector{ name = "Almayer_AresDown"; @@ -57614,15 +57445,6 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) -"oPa" = ( -/obj/structure/sign/safety/storage{ - pixel_x = 8; - pixel_y = -32 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_m_s) "oPf" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -57684,6 +57506,21 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) +"oQj" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/obj/structure/machinery/door_control{ + id = "laddernortheast"; + name = "North East Ladders Shutters"; + pixel_y = -25; + req_one_access_txt = "2;3;12;19"; + throw_range = 15 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "oQo" = ( /obj/item/stool, /obj/effect/landmark/yautja_teleport, @@ -57728,13 +57565,6 @@ icon_state = "silver" }, /area/almayer/living/auxiliary_officer_office) -"oRc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "oRj" = ( /obj/structure/stairs{ icon_state = "ramptop" @@ -58056,21 +57886,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) -"oZX" = ( -/obj/structure/machinery/door/airlock/almayer/medical/glass{ - access_modified = 1; - dir = 2; - name = "\improper Field Surgery Equipment"; - req_access_txt = "20"; - req_one_access = null - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/medical/lower_medical_medbay) "paa" = ( /obj/structure/machinery/iv_drip, /turf/open/floor/almayer{ @@ -58558,6 +58373,18 @@ icon_state = "cargo_arrow" }, /area/almayer/squads/delta) +"pmv" = ( +/obj/structure/machinery/door/airlock/almayer/marine/alpha{ + dir = 1 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "pmH" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 @@ -59454,13 +59281,6 @@ }, /turf/open/floor/almayer, /area/almayer/lifeboat_pumps/south1) -"pIX" = ( -/obj/structure/pipes/standard/manifold/fourway/hidden/supply, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/port_hallway) "pJi" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -59468,6 +59288,25 @@ icon_state = "red" }, /area/almayer/shipboard/brig/general_equipment) +"pJD" = ( +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/item/tool/soap, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "pJE" = ( /obj/structure/closet/secure_closet{ name = "\improper Execution Firearms" @@ -59738,6 +59577,25 @@ icon_state = "red" }, /area/almayer/shipboard/port_missiles) +"pPV" = ( +/obj/structure/pipes/vents/pump, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + pixel_y = 24 + }, +/obj/structure/machinery/door_control{ + id = "Alpha_2"; + name = "Door Lock"; + normaldoorcontrol = 1; + pixel_x = 23; + specialfunctions = 4 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "pQq" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -59841,6 +59699,23 @@ icon_state = "silvercorner" }, /area/almayer/shipboard/brig/cic_hallway) +"pRT" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/obj/structure/machinery/door/airlock/almayer/maint{ + dir = 8; + name = "\improper Tool Closet" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/port_emb) "pRX" = ( /obj/structure/machinery/portable_atmospherics/hydroponics, /turf/open/floor/almayer{ @@ -60174,16 +60049,6 @@ icon_state = "plating" }, /area/almayer/squads/req) -"pXW" = ( -/obj/structure/bed/chair/comfy/delta, -/obj/item/trash/popcorn, -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/turf/open/floor/almayer{ - icon_state = "bluefull" - }, -/area/almayer/living/briefing) "pXZ" = ( /obj/effect/landmark/start/marine/spec/charlie, /obj/effect/landmark/late_join/charlie, @@ -60405,18 +60270,6 @@ icon_state = "plate" }, /area/almayer/living/auxiliary_officer_office) -"qcN" = ( -/obj/structure/machinery/door/airlock/almayer/marine/alpha{ - dir = 1 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "qdk" = ( /obj/structure/surface/table/almayer, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -60435,6 +60288,38 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"qdv" = ( +/obj/item/bedsheet/purple{ + layer = 3.2 + }, +/obj/item/bedsheet/purple{ + pixel_y = 13 + }, +/obj/structure/window/reinforced{ + dir = 4; + pixel_x = -2; + pixel_y = 4 + }, +/obj/structure/window/reinforced{ + dir = 8; + layer = 3.3; + pixel_y = 4 + }, +/obj/structure/bed{ + can_buckle = 0 + }, +/obj/structure/bed{ + buckling_y = 13; + layer = 3.5; + pixel_y = 13 + }, +/obj/item/clothing/head/beret/royal_marine, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "emerald" + }, +/area/almayer/living/port_emb) "qdz" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -60472,6 +60357,21 @@ icon_state = "test_floor4" }, /area/almayer/engineering/laundry) +"qep" = ( +/obj/structure/machinery/door/airlock/almayer/medical/glass{ + access_modified = 1; + dir = 2; + name = "\improper Field Surgery Equipment"; + req_access_txt = "20"; + req_one_access = null + }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/medical/lower_medical_medbay) "qer" = ( /obj/structure/machinery/cryopod/right{ pixel_y = 6 @@ -60684,10 +60584,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull) -"qif" = ( -/obj/structure/sign/dartboard, -/turf/closed/wall/almayer, -/area/almayer/hallways/hangar) "qih" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1; @@ -60707,6 +60603,13 @@ icon_state = "dark_sterile" }, /area/almayer/medical/lower_medical_lobby) +"qin" = ( +/obj/structure/sign/poster/safety{ + pixel_x = 27 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "qit" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/light{ @@ -60780,6 +60683,26 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_s) +"qkP" = ( +/obj/item/frame/light_fixture{ + anchored = 1; + desc = "A broken fluorescent tube light."; + dir = 8; + icon_state = "tube-broken"; + name = "broken light fixture" + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "qld" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -60901,6 +60824,12 @@ icon_state = "red" }, /area/almayer/shipboard/brig/perma) +"qmL" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 10 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/starboard_hallway) "qmP" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/faxmachine/uscm, @@ -61169,6 +61098,15 @@ /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, /area/almayer/engineering/ce_room) +"qtn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 9 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/port_hallway) "qtv" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer{ @@ -61259,16 +61197,6 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/cryo) -"qvy" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 2; - icon_state = "pipe-c" - }, -/turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/starboard_hallway) "qvC" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -62295,18 +62223,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/general_equipment) -"qRp" = ( -/obj/structure/bed/chair/comfy/bravo{ - dir = 1 - }, -/obj/item/stack/folding_barricade, -/obj/item/stack/sheet/mineral/uranium{ - layer = 2.99 - }, -/turf/open/floor/almayer{ - icon_state = "orangefull" - }, -/area/almayer/living/briefing) "qRT" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -62703,15 +62619,6 @@ icon_state = "emerald" }, /area/almayer/squads/charlie) -"rbl" = ( -/obj/structure/sign/poster{ - desc = "It says DRUG."; - icon_state = "poster2"; - pixel_x = -27 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "rbp" = ( /obj/structure/largecrate/random/case/small, /turf/open/floor/almayer{ @@ -62942,6 +62849,26 @@ icon_state = "plate" }, /area/almayer/shipboard/port_point_defense) +"rfT" = ( +/obj/item/frame/camera{ + desc = "The Staff Officer insisted he needed to monitor everyone at all times."; + layer = 2.9; + name = "broken camera"; + pixel_x = -7; + pixel_y = -6 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "S"; + pixel_y = -1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "rgy" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -63666,31 +63593,6 @@ icon_state = "cargo" }, /area/almayer/hallways/hangar) -"ruP" = ( -/obj/structure/pipes/vents/pump, -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/machinery/door_control{ - id = "Alpha_1"; - name = "Door Lock"; - normaldoorcontrol = 1; - pixel_x = 23; - specialfunctions = 4 - }, -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "rvo" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -64227,6 +64129,15 @@ icon_state = "orange" }, /area/almayer/hallways/stern_hallway) +"rGg" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 6 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "green" + }, +/area/almayer/hallways/port_hallway) "rGj" = ( /turf/open/floor/almayer{ icon_state = "red" @@ -64462,13 +64373,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/upper_hull/u_m_s) -"rKw" = ( -/obj/structure/sign/poster/safety{ - pixel_x = 27 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "rKy" = ( /obj/structure/machinery/firealarm{ dir = 1; @@ -64513,20 +64417,6 @@ icon_state = "containment_window_h" }, /area/almayer/medical/containment/cell/cl) -"rLF" = ( -/obj/structure/machinery/status_display{ - pixel_y = -30 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer, -/obj/structure/machinery/door/poddoor/shutters/almayer{ - dir = 8; - id = "laddersoutheast"; - name = "\improper South East Ladders Shutters" - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hallways/port_hallway) "rLU" = ( /turf/open/floor/almayer/research/containment/floor2{ dir = 8 @@ -64771,14 +64661,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_p) -"rSW" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "rTk" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -64987,6 +64869,17 @@ icon_state = "plate" }, /area/almayer/living/offices/flight) +"rZz" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_y = -30 + }, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "rZB" = ( /obj/structure/pipes/standard/simple/visible{ dir = 9 @@ -65240,14 +65133,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_s) -"sfT" = ( -/obj/structure/sign/poster{ - icon_state = "poster14"; - pixel_x = -27 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "sfU" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 8 @@ -66298,15 +66183,6 @@ icon_state = "blue" }, /area/almayer/squads/delta) -"sDQ" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "emerald" - }, -/area/almayer/hallways/port_hallway) "sEa" = ( /turf/open/floor/almayer{ icon_state = "redcorner" @@ -66406,6 +66282,13 @@ icon_state = "cargo" }, /area/almayer/shipboard/starboard_missiles) +"sFh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "sFC" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ @@ -67362,6 +67245,11 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"tat" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer, +/area/almayer/living/port_emb) "taA" = ( /obj/structure/machinery/light{ dir = 4 @@ -67435,6 +67323,21 @@ icon_state = "test_floor4" }, /area/almayer/shipboard/brig/perma) +"tda" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/obj/structure/machinery/door/airlock/almayer/security{ + access_modified = 1; + dir = 2; + name = "\improper Security Checkpoint"; + req_access = null; + req_one_access_txt = "3;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/briefing) "tdc" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -67732,6 +67635,13 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/port) +"tit" = ( +/obj/structure/pipes/standard/simple/hidden/supply, +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + icon_state = "green" + }, +/area/almayer/hallways/starboard_hallway) "tiw" = ( /obj/structure/machinery/constructable_frame{ icon_state = "box_2" @@ -68357,38 +68267,6 @@ icon_state = "green" }, /area/almayer/living/grunt_rnr) -"tuv" = ( -/obj/item/bedsheet/purple{ - layer = 3.2 - }, -/obj/item/bedsheet/purple{ - pixel_y = 13 - }, -/obj/structure/window/reinforced{ - dir = 4; - pixel_x = -2; - pixel_y = 4 - }, -/obj/structure/window/reinforced{ - dir = 8; - layer = 3.3; - pixel_y = 4 - }, -/obj/structure/bed{ - can_buckle = 0 - }, -/obj/structure/bed{ - buckling_y = 13; - layer = 3.5; - pixel_y = 13 - }, -/obj/item/clothing/head/beret/royal_marine, -/obj/structure/disposalpipe/segment, -/turf/open/floor/almayer{ - dir = 10; - icon_state = "emerald" - }, -/area/almayer/living/port_emb) "tuA" = ( /turf/closed/wall/almayer/outer, /area/almayer/shipboard/port_missiles) @@ -68761,18 +68639,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_f_s) -"tDz" = ( -/obj/structure/machinery/door/airlock/almayer/marine/bravo{ - dir = 1 - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/briefing) "tDA" = ( /obj/item/tool/weldpack{ pixel_y = 15 @@ -68982,18 +68848,6 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/shipboard/brig/cells) -"tIb" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 1; - icon_state = "emerald" - }, -/area/almayer/living/port_emb) "tIp" = ( /obj/structure/machinery/door/airlock/almayer/generic{ name = "\improper Dorms" @@ -69314,6 +69168,20 @@ }, /turf/open/floor/almayer, /area/almayer/living/briefing) +"tQo" = ( +/obj/structure/machinery/status_display{ + pixel_y = -30 + }, +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "tQE" = ( /obj/item/clothing/head/welding, /turf/open/floor/almayer{ @@ -70118,6 +69986,15 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_s) +"uig" = ( +/obj/structure/sign/safety/storage{ + pixel_x = 8; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/l_m_s) "uim" = ( /obj/structure/largecrate/random/secure, /turf/open/floor/almayer{ @@ -70206,6 +70083,13 @@ /obj/structure/window/framed/almayer/hull/hijack_bustable, /turf/open/floor/plating, /area/almayer/engineering/engineering_workshop/hangar) +"ukA" = ( +/obj/structure/platform, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "ukS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70268,6 +70152,16 @@ icon_state = "rasputin15" }, /area/almayer/powered/agent) +"umv" = ( +/obj/structure/machinery/door/airlock/almayer/maint{ + access_modified = 1; + dir = 8; + req_one_access = list(2,34,30) + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hull/lower_hull/l_m_s) "umy" = ( /obj/structure/machinery/light{ dir = 1 @@ -70309,6 +70203,14 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_f_p) +"umY" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "unh" = ( /obj/structure/surface/table/almayer, /obj/item/storage/firstaid/o2, @@ -71221,13 +71123,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, /area/almayer/command/cichallway) -"uCX" = ( -/obj/structure/machinery/light{ - dir = 8 - }, -/obj/structure/pipes/standard/simple/hidden/supply, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "uDn" = ( /obj/structure/ladder{ height = 1; @@ -71782,6 +71677,18 @@ }, /turf/open/floor/almayer, /area/almayer/hallways/starboard_hallway) +"uQo" = ( +/obj/structure/machinery/disposal, +/obj/item/reagent_container/food/drinks/cans/beer{ + layer = 3.3; + pixel_x = -4; + pixel_y = 15 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/living/port_emb) "uQU" = ( /obj/structure/stairs{ dir = 1 @@ -72164,6 +72071,15 @@ dir = 8 }, /area/almayer/medical/containment/cell) +"uXu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/port_hallway) "uXL" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -72421,16 +72337,6 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/main_office) -"veI" = ( -/obj/structure/pipes/standard/manifold/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 2; - icon_state = "pipe-j2" - }, -/turf/open/floor/almayer, -/area/almayer/living/port_emb) "vfa" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72911,6 +72817,13 @@ icon_state = "redfull" }, /area/almayer/shipboard/port_missiles) +"vlR" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/pipes/standard/simple/hidden/supply, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "vlX" = ( /obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep, /turf/open/floor/almayer{ @@ -73017,16 +72930,6 @@ icon_state = "test_floor4" }, /area/almayer/hull/lower_hull/l_m_p) -"voW" = ( -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 8; - req_one_access = list(2,34,30) - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/lower_hull/l_m_s) "vpn" = ( /turf/open/floor/almayer{ dir = 9; @@ -73319,6 +73222,20 @@ icon_state = "test_floor4" }, /area/almayer/medical/upper_medical) +"vtB" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/machinery/door/poddoor/shutters/almayer{ + dir = 8; + id = "laddersoutheast"; + name = "\improper South East Ladders Shutters" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/port_hallway) "vtT" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /obj/structure/disposalpipe/junction{ @@ -73342,6 +73259,17 @@ /obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/living/briefing) +"vuF" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + access_modified = 1; + dir = 1; + name = "\improper Kitchen Hydroponics"; + req_one_access_txt = "30;19" + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/living/grunt_rnr) "vuG" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 @@ -73406,6 +73334,30 @@ icon_state = "plate" }, /area/almayer/engineering/upper_engineering/starboard) +"vvY" = ( +/obj/structure/sink{ + dir = 1; + pixel_y = -10 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 1 + }, +/obj/structure/surface/rack{ + density = 0; + pixel_x = 26 + }, +/obj/structure/bedsheetbin{ + pixel_x = 26; + pixel_y = 5 + }, +/obj/item/tool/soap/syndie, +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "vwF" = ( /obj/structure/machinery/light{ dir = 1 @@ -73761,10 +73713,6 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/hydroponics) -"vDh" = ( -/obj/item/weapon/dart/green, -/turf/open/floor/plating, -/area/almayer/hull/lower_hull/l_f_p) "vEf" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -73903,6 +73851,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, /area/almayer/living/port_emb) +"vHq" = ( +/obj/item/device/assembly/mousetrap/armed, +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "SW-out"; + pixel_y = -1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "vHs" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -74654,6 +74619,13 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/briefing) +"vVh" = ( +/obj/item/weapon/dart/green, +/obj/structure/dartboard{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/almayer/hull/lower_hull/l_f_p) "vVs" = ( /turf/open/floor/almayer{ icon_state = "sterile_green" @@ -74951,6 +74923,25 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/aft_hallway) +"wbe" = ( +/obj/structure/surface/table/almayer, +/obj/effect/landmark/map_item{ + layer = 3.03; + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/prop/helmetgarb/spacejam_tickets{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/item/prop/helmetgarb/spacejam_tickets{ + pixel_x = -8; + pixel_y = -3 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/living/briefing) "wbh" = ( /obj/structure/machinery/light{ dir = 4 @@ -75290,26 +75281,6 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_a_s) -"whd" = ( -/obj/item/frame/light_fixture{ - anchored = 1; - desc = "A broken fluorescent tube light."; - dir = 8; - icon_state = "tube-broken"; - name = "broken light fixture" - }, -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S"; - pixel_y = -1 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "whA" = ( /turf/open/floor/almayer/uscm/directional, /area/almayer/living/briefing) @@ -76037,6 +76008,18 @@ icon_state = "cargo" }, /area/almayer/living/synthcloset) +"wwk" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/item/stack/folding_barricade, +/obj/item/stack/sheet/mineral/uranium{ + layer = 2.99 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "wwr" = ( /obj/structure/machinery/cryopod{ layer = 3.1; @@ -76046,6 +76029,15 @@ icon_state = "cargo" }, /area/almayer/squads/charlie) +"wwu" = ( +/obj/structure/pipes/standard/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/port_hallway) "wwD" = ( /obj/structure/bed/chair/comfy/orange, /turf/open/floor/almayer{ @@ -76502,6 +76494,25 @@ /obj/structure/surface/table/almayer, /turf/open/floor/plating/plating_catwalk, /area/almayer/living/auxiliary_officer_office) +"wHj" = ( +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/prop/ice_colony/tiger_rug{ + desc = "A beat up beer stained, incredibly garish, polyester tiger rug. No one knows how it got here. Written on the wash tag are the words 'From Thedus, with love <3', in Sharpie."; + icon_state = "HotlineAlt"; + layer = 2.9; + name = "Richard the tiger" + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "emerald" + }, +/area/almayer/living/port_emb) "wHo" = ( /turf/open/floor/almayer{ icon_state = "emerald" @@ -76603,22 +76614,6 @@ "wJH" = ( /turf/closed/wall/almayer/research/containment/wall/east, /area/almayer/medical/containment/cell/cl) -"wKd" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "SE-out"; - pixel_y = -1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "NE-out"; - pixel_y = 1 - }, -/obj/structure/machinery/door/airlock/almayer/maint{ - dir = 8 - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/living/port_emb) "wKn" = ( /obj/structure/surface/rack, /obj/item/facepaint/sniper, @@ -77220,19 +77215,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_f_s) -"wVK" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "N"; - pixel_y = 1 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "S"; - pixel_y = -1 - }, -/turf/open/floor/almayer{ - icon_state = "dark_sterile" - }, -/area/almayer/living/port_emb) "wVP" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -77296,6 +77278,14 @@ icon_state = "blue" }, /area/almayer/living/pilotbunks) +"wWJ" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + icon_state = "dark_sterile" + }, +/area/almayer/living/port_emb) "wWL" = ( /obj/item/tool/screwdriver, /obj/structure/platform_decoration{ @@ -77853,6 +77843,16 @@ }, /turf/open/floor/almayer, /area/almayer/engineering/engine_core) +"xjb" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ + access_modified = 1; + name = "\improper Main Kitchen"; + req_one_access_txt = "30;19" + }, +/turf/open/floor/prison{ + icon_state = "kitchen" + }, +/area/almayer/living/grunt_rnr) "xjw" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -77928,6 +77928,15 @@ "xkd" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/shipboard/brig/cells) +"xkC" = ( +/obj/structure/machinery/light{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "emerald" + }, +/area/almayer/hallways/port_hallway) "xlk" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer, @@ -78216,6 +78225,11 @@ }, /turf/closed/wall/almayer, /area/almayer/command/securestorage) +"xqM" = ( +/obj/structure/platform, +/obj/structure/pipes/vents/pump, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xqS" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -78281,16 +78295,6 @@ icon_state = "cargo" }, /area/almayer/hallways/vehiclehangar) -"xtc" = ( -/obj/structure/stairs/perspective{ - dir = 1; - icon_state = "p_stair_full" - }, -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 5 - }, -/turf/open/floor/almayer, -/area/almayer/living/briefing) "xtD" = ( /obj/structure/surface/table/almayer, /obj/item/tool/weldpack, @@ -78679,6 +78683,17 @@ }, /turf/open/floor/plating, /area/almayer/hull/upper_hull/u_a_p) +"xzp" = ( +/obj/structure/bed/chair/comfy/bravo{ + dir = 1 + }, +/obj/structure/pipes/standard/simple/hidden/supply{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "orangefull" + }, +/area/almayer/living/briefing) "xzu" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -79370,25 +79385,19 @@ dir = 4 }, /area/almayer/medical/containment/cell) -"xPg" = ( -/obj/structure/pipes/standard/simple/hidden/supply{ - dir = 9 - }, -/obj/structure/machinery/door_control{ - id = "laddernortheast"; - name = "North East Ladders Shutters"; - pixel_y = -25; - req_one_access_txt = "2;3;12;19"; - throw_range = 15 - }, -/turf/open/floor/almayer{ - icon_state = "green" - }, -/area/almayer/hallways/starboard_hallway) "xPE" = ( /obj/structure/largecrate/random/barrel/white, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_s) +"xPR" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/structure/pipes/vents/scrubber{ + dir = 4 + }, +/turf/open/floor/almayer, +/area/almayer/living/briefing) "xPZ" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -79590,16 +79599,6 @@ icon_state = "red" }, /area/almayer/shipboard/brig/lobby) -"xSE" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ - access_modified = 1; - name = "\improper Main Kitchen"; - req_one_access_txt = "30;19" - }, -/turf/open/floor/prison{ - icon_state = "kitchen" - }, -/area/almayer/living/grunt_rnr) "xSI" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/emails{ @@ -97765,8 +97764,8 @@ baH fVz bHB bBN -qif -vDh +bcm +vVh kCT kCT kCT @@ -110738,7 +110737,7 @@ iMI rlZ rlZ rlZ -oZX +qep cnr qqK qqK @@ -111982,7 +111981,7 @@ gSk bDs bDs bDs -xSE +xjb fbo duo iIl @@ -112387,7 +112386,7 @@ nFI qdk vzP bJt -gZj +hjB bJt dpn bDs @@ -113575,27 +113574,27 @@ aQF aLG aYO aLG -kLv +tda ngI dkq lRZ -jhz +acc beH beH dwl bdd bdd -hBL +gac bdd bdd aMt beH beH -jhz +acc qby btY bAJ -aQD +huU buH bHL buH @@ -114220,7 +114219,7 @@ wUX bDs gSk vSp -ipb +lHG qgH oDf oDf @@ -114387,27 +114386,27 @@ bUP aLG aYO aLG -kLv +tda mng wTm wCI -jhz +acc beH beH beH -jhz +acc mng wTm wCI -jhz +acc beH beH beH -jhz +acc mng wTm wCI -kLv +tda buH bHL buH @@ -114600,7 +114599,7 @@ fUA qYZ bdd vuA -gSZ +fnx vuA bdd qCc @@ -114625,7 +114624,7 @@ bdd bdd bJt cDC -bRS +vuF bJt bJt oed @@ -114824,7 +114823,7 @@ diw csG sNI wNT -knG +wbe bdd qXo feq @@ -114973,7 +114972,7 @@ aSm aLf nsY nsY -oiZ +pRT nsY nsY nsY @@ -114982,7 +114981,7 @@ nsY nsY hhw hhw -voW +umv hhw bdd bqZ @@ -115035,7 +115034,7 @@ iMm hTT nsY nsY -wKd +nik nsY nsY nsY @@ -115176,11 +115175,11 @@ aLf aSm nsY xWT -wVK +kxd jgk nsY rSG -rSW +wWJ oqS nsY lhu @@ -115238,11 +115237,11 @@ iMm gzV nsY xWT -wVK +kxd viu nsY rSG -whd +qkP oqS nsY oDf @@ -115379,11 +115378,11 @@ aLf aSm nsY xWT -wVK +kxd viu nsY iIP -eOs +nna dDt nsY xiz @@ -115394,9 +115393,9 @@ bdd bDQ kbV tGG -kWF +okB tGG -nQd +crK tGG bdg beB @@ -115431,8 +115430,8 @@ sNI sNI sNI sNI -pXW -kmH +eCS +xqM udV bdd hTf @@ -115441,11 +115440,11 @@ oos sBL nsY xWT -efa +rfT viu nsY dmR -wVK +kxd dDt nsY oDf @@ -115581,13 +115580,13 @@ aKW aLa aSm nsY -ruP -fBA -fSF +gsg +vHq +vvY nsY -lmW -mtS -iKa +pPV +umY +npB nsY glr mhl @@ -115598,12 +115597,12 @@ bqZ qgw beH qMR -nGZ +vlR dRT -rKw -qcN +qin +pmv tBF -iBT +fSK aLG nyw bqZ @@ -115627,9 +115626,9 @@ eBg vKe eVv bFu -pIX +omW bFu -lSh +hLS eBg eBg eBg @@ -115643,13 +115642,13 @@ rKO wGb gUf nsY -gwO -lBz -ezW +gwM +bxC +pJD nsY -lwA -lBz -nob +iSm +bxC +jiU nsY oDf oed @@ -116004,12 +116003,12 @@ bqZ kKL aLJ eBg -uCX -sfT +dAO +cEG eBg -tDz +dYX tBF -jwI +lBz aLG iuy bqZ @@ -116033,15 +116032,15 @@ beH bqZ bdg buH -jUT +uXu bFu -kLo +iUk eBg -keO +gkJ eBg eBg -rbl -xtc +mVZ +kTx bqZ bdd hTf @@ -116050,9 +116049,9 @@ iMm gUf nsY aaq -lEL -tuv -eYv +wHj +qdv +uQo iQt uZo xmJ @@ -116204,11 +116203,11 @@ lQu aSm bdd bDQ -fQQ -hGI +iWE +jUo wmz wmz -qRp +wwk wmz bdg aLG @@ -116240,11 +116239,11 @@ hOR buH bdg wLV -iew +nza wLV wLV wLV -kZf +ukA bqZ bdd gKB @@ -116253,7 +116252,7 @@ oos gUf nsY mKJ -tIb +deT uAC rhQ pyc @@ -116392,8 +116391,8 @@ aLf aLf aLf aLf -aKK -ezO +heK +kam axc juD twW @@ -116408,7 +116407,7 @@ vUi bdd vTt kbV -iza +xzp vEn wmz wmz @@ -116456,13 +116455,13 @@ cdI sBL nsY eiN -gLu -eai -veI +dVs +tat +kNC xuQ uPW -gBg -oqc +kYv +oDx tbK tbK tbK @@ -116592,7 +116591,7 @@ aaa aKW jwD aLf -oPa +uig hhw hhw nsY @@ -116610,8 +116609,8 @@ qce aSm bdd bqZ -hbx -iBx +xPR +nIW wmz wmz wmz @@ -116812,7 +116811,7 @@ aLf tRc qEW bdd -fxR +jlj mLb wmz vpt @@ -116854,7 +116853,7 @@ vyU wLV wLV xDQ -kRm +bXc bdd pcO tJV @@ -116862,7 +116861,7 @@ qoY uCh nsY tXT -kOH +jJk wLG tyb sZH @@ -117256,7 +117255,7 @@ buH buH cbD iZH -sDQ +xkC njL njL njL @@ -117269,8 +117268,8 @@ iAT rdY bUM cbD -eXE -lUB +rGg +qtn kJV fiq fiq @@ -117411,8 +117410,8 @@ nHF cmE aLB nyG -qvy -jKl +iDN +tit nFV tBL tBL @@ -117454,7 +117453,7 @@ bqZ bdg buH bHa -mTk +wwu buI bFu cbE @@ -117472,7 +117471,7 @@ buI buI buI rpd -kVm +fkO bHY kro bGb @@ -117676,7 +117675,7 @@ clR clR cbD dQs -oRc +sFh guc bGb uaa @@ -117817,8 +117816,8 @@ nHF nHF jUx aLG -bbJ -cmc +qmL +rZz jeb jeb jeb @@ -118224,7 +118223,7 @@ nHF aLB udF aNO -nVU +nLZ jeb obE tdE @@ -118284,7 +118283,7 @@ lpt qYQ ptj vra -lSO +mEb bHY haT bGb @@ -118425,9 +118424,9 @@ hhw hhw hhw aLB -nyO -nyO -nFy +dzF +dzF +dac jeb vlX thA @@ -118487,9 +118486,9 @@ cgo hQc asX vra -hNL -oJq -rLF +cwQ +vtB +tQo bGb fiq fiq @@ -118630,7 +118629,7 @@ cmE aLB enx aQt -xPg +oQj jeb vlX tdE @@ -118690,7 +118689,7 @@ lpt qYQ asX vra -mYZ +ojR tki lQQ bGb From 8b14285077afeba4e394197fa253eb8d94b46c61 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 19 Oct 2023 21:55:03 +0100 Subject: [PATCH 094/199] Automatic changelog for PR #4677 [ci skip] --- html/changelogs/AutoChangeLog-pr-4677.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4677.yml diff --git a/html/changelogs/AutoChangeLog-pr-4677.yml b/html/changelogs/AutoChangeLog-pr-4677.yml new file mode 100644 index 000000000000..df286c4af2e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4677.yml @@ -0,0 +1,5 @@ +author: "VileBeggar" +delete-after: True +changes: + - rscadd: "Dartboards are now functional and can be crafted with cardboard." + - bugfix: "Fixed an issue with some deconstructed signs losing their icon." \ No newline at end of file From 504e741eadbcaa9fd341913f470a9d2e12fef2bb Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 20 Oct 2023 01:08:07 +0000 Subject: [PATCH 095/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4621.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4677.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4690.yml | 6 ------ html/changelogs/AutoChangeLog-pr-4700.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4712.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4715.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4720.yml | 4 ---- html/changelogs/archive/2023-10.yml | 17 +++++++++++++++++ 8 files changed, 17 insertions(+), 31 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4621.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4677.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4690.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4700.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4712.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4715.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4720.yml diff --git a/html/changelogs/AutoChangeLog-pr-4621.yml b/html/changelogs/AutoChangeLog-pr-4621.yml deleted file mode 100644 index 8227ca2d1327..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4621.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "IsProbablyCatto" -delete-after: True -changes: - - qol: "Medbelts pull from pillbottles as default" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4677.yml b/html/changelogs/AutoChangeLog-pr-4677.yml deleted file mode 100644 index df286c4af2e2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4677.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "VileBeggar" -delete-after: True -changes: - - rscadd: "Dartboards are now functional and can be crafted with cardboard." - - bugfix: "Fixed an issue with some deconstructed signs losing their icon." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4690.yml b/html/changelogs/AutoChangeLog-pr-4690.yml deleted file mode 100644 index 11450390dc56..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4690.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "MrDas" -delete-after: True -changes: - - bugfix: "You can now disassemble wide airlocks. (You can't unwrench them though)" - - spellcheck: "Fixed a few typos in airlock assembly." - - imageadd: "Added wide airlock assembly and generic solid wide airlock sprites." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4700.yml b/html/changelogs/AutoChangeLog-pr-4700.yml deleted file mode 100644 index 258d657914f9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4700.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Bandaided a problem with nulls in GLOB.clients" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4712.yml b/html/changelogs/AutoChangeLog-pr-4712.yml deleted file mode 100644 index 1cbad672fbd1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4712.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Removes stunprod from LV522" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4715.yml b/html/changelogs/AutoChangeLog-pr-4715.yml deleted file mode 100644 index 2720d275acfe..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4715.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kitsunemitsu" -delete-after: True -changes: - - bugfix: "fixed FTLs being demoted from SL erroneously having the tag TL in chat." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4720.yml b/html/changelogs/AutoChangeLog-pr-4720.yml deleted file mode 100644 index 724bbf0eaaa9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4720.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed a cause of bad icon operations" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 8991d866377a..dda0958c9320 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -269,3 +269,20 @@ worn. neeshacark: - qol: MT, CT, and Nurses can now take the bad leg trait. +2023-10-20: + Drathek: + - bugfix: Fixed a cause of bad icon operations + - bugfix: Bandaided a problem with nulls in GLOB.clients + IsProbablyCatto: + - qol: Medbelts pull from pillbottles as default + Kitsunemitsu: + - bugfix: fixed FTLs being demoted from SL erroneously having the tag TL in chat. + MrDas: + - bugfix: You can now disassemble wide airlocks. (You can't unwrench them though) + - spellcheck: Fixed a few typos in airlock assembly. + - imageadd: Added wide airlock assembly and generic solid wide airlock sprites. + SpartanBobby: + - maptweak: Removes stunprod from LV522 + VileBeggar: + - rscadd: Dartboards are now functional and can be crafted with cardboard. + - bugfix: Fixed an issue with some deconstructed signs losing their icon. From dff3a75802b2a402c52eefa85ba012d7a2933152 Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Thu, 19 Oct 2023 23:44:08 -0500 Subject: [PATCH 096/199] Renames UPP survivor synth from combat to support synth (#4703) # About the pull request Renames UPP Trijent Nightmare synthvivor from UPP Combat Synth to UPP Support Synthetic. It wasn't a combat synth in the first place. # Explain why it's good for the game Its not a combat synth and this round that just ended by time of creation I saw a friendly synth get killed and cremated because its ID said combat synthetic, so its obviously causing problems; and I'm going out on a limb and going to guess these problems were not intended. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: spellcheck: UPP Synth Survivor on the Trijent Dam nightmare is now called a Support Synthetic instead of a Combat Synthetic, as its not a combat synthetic /:cl: --- code/__DEFINES/job.dm | 1 + code/datums/factions/upp.dm | 2 ++ .../survivors/trijent/crashlanding_upp_bar_insert_trijent.dm | 4 ++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 52263a5e1367..89b88f67c038 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -267,6 +267,7 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_UPP_GENERAL "UPP Army General" #define JOB_UPP_COMBAT_SYNTH "UPP Combat Synthetic" +#define JOB_UPP_SUPPORT_SYNTH "UPP Support Synthetic" #define UPP_JOB_LIST list(JOB_UPP, JOB_UPP_ENGI, JOB_UPP_MEDIC, JOB_UPP_SPECIALIST, JOB_UPP_LEADER, JOB_UPP_POLICE, JOB_UPP_LT_OFFICER, JOB_UPP_LT_DOKTOR, JOB_UPP_SRLT_OFFICER, JOB_UPP_KPT_OFFICER, JOB_UPP_KOL_OFFICER, JOB_UPP_COMBAT_SYNTH) #define UPP_JOB_GRUNT_LIST list(JOB_UPP, JOB_UPP_ENGI, JOB_UPP_MEDIC, JOB_UPP_SPECIALIST, JOB_UPP_LEADER, JOB_UPP_POLICE, JOB_UPP_CREWMAN) diff --git a/code/datums/factions/upp.dm b/code/datums/factions/upp.dm index 5a790c89be67..90b04765cf85 100644 --- a/code/datums/factions/upp.dm +++ b/code/datums/factions/upp.dm @@ -41,6 +41,8 @@ hud_icon_state = "co" if(JOB_UPP_COMBAT_SYNTH) hud_icon_state = "synth" + if(JOB_UPP_SUPPORT_SYNTH) + hud_icon_state = "synth" if(JOB_UPP_COMMANDO) hud_icon_state = "com" if(JOB_UPP_COMMANDO_MEDIC) diff --git a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm index 5c662f50d8c7..c1ca81683c4b 100644 --- a/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm +++ b/code/modules/gear_presets/survivors/trijent/crashlanding_upp_bar_insert_trijent.dm @@ -166,8 +166,8 @@ name = "Survivor - Synthetic - UPP Synth" flags = EQUIPMENT_PRESET_EXTRA languages = ALL_SYNTH_LANGUAGES_UPP - assignment = JOB_UPP_COMBAT_SYNTH - rank = JOB_UPP_COMBAT_SYNTH + assignment = JOB_UPP_SUPPORT_SYNTH + rank = JOB_UPP_SUPPORT_SYNTH faction = FACTION_UPP faction_group = list(FACTION_UPP, FACTION_SURVIVOR) skills = /datum/skills/colonial_synthetic From 261e6f919fda0b45a6112370594b4bcf4f666dfe Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 05:53:29 +0100 Subject: [PATCH 097/199] Automatic changelog for PR #4703 [ci skip] --- html/changelogs/AutoChangeLog-pr-4703.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4703.yml diff --git a/html/changelogs/AutoChangeLog-pr-4703.yml b/html/changelogs/AutoChangeLog-pr-4703.yml new file mode 100644 index 000000000000..c140f3ea46f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4703.yml @@ -0,0 +1,4 @@ +author: "CapCamIII" +delete-after: True +changes: + - spellcheck: "UPP Synth Survivor on the Trijent Dam nightmare is now called a Support Synthetic instead of a Combat Synthetic, as its not a combat synthetic" \ No newline at end of file From 30d6b203d3bfaedd1f94549628d9e19f0855f197 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Fri, 20 Oct 2023 10:53:25 +0100 Subject: [PATCH 098/199] Adds USCM service jacket to SEA vendor (#4727) # About the pull request [Request from Ethan](https://forum.cm-ss13.com/t/lack-of-mentors/4696/20) Adds USCM service jacket to SEA Vendor as an armour option. # Explain why it's good for the game SEA can look pretty so they can feel pretty. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: USCM Service Jacket to SEA Vendor /:cl: --- code/game/machinery/vending/vendor_types/crew/sea.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/vending/vendor_types/crew/sea.dm b/code/game/machinery/vending/vendor_types/crew/sea.dm index 0da9181beb97..cb6698c6f714 100644 --- a/code/game/machinery/vending/vendor_types/crew/sea.dm +++ b/code/game/machinery/vending/vendor_types/crew/sea.dm @@ -56,6 +56,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_sea, list( list("M3-L Pattern Light Armor", 0, /obj/item/clothing/suit/storage/marine/light, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), list("M3 Pattern Padded Armor", 0, /obj/item/clothing/suit/storage/marine/padded, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("Bulletproof Vest", 0, /obj/item/clothing/suit/armor/bulletproof, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), + list("USCM Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR), list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), From 2d3d8a8043ab9b9303ca40fb09382b953a06a58b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:01:47 +0100 Subject: [PATCH 099/199] Automatic changelog for PR #4727 [ci skip] --- html/changelogs/AutoChangeLog-pr-4727.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4727.yml diff --git a/html/changelogs/AutoChangeLog-pr-4727.yml b/html/changelogs/AutoChangeLog-pr-4727.yml new file mode 100644 index 000000000000..e8bed292d815 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4727.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - rscadd: "USCM Service Jacket to SEA Vendor" \ No newline at end of file From cfcb282e8452904b853d486674db4d0b2ab1c93d Mon Sep 17 00:00:00 2001 From: fira Date: Fri, 20 Oct 2023 11:53:33 +0200 Subject: [PATCH 100/199] Fixes Langchat X offsets for Megaphone/Xenos (#4725) # About the pull request Langchat has incorrect calc for X offsets, which results in goofy speech through megaphone and some big xenos text being off-center This brings them in line accounting for atom dimension using `get_pixel_position_x` # Explain why it's good for the game Looks less goofy especially for megaphone # Testing Photographs and Procedure Tested megaphone and queen result in centered text. Also tested adjusting pixel_x on source atom and that it was still the case. I'd post an image of the problem but all i have is current round's # Changelog :cl: fix: Xeno and Megaphone abovehead chat speech should now properly be centered horizontally. /:cl: --- code/datums/langchat/langchat.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm index d1a6adafa2f3..af51a7196020 100644 --- a/code/datums/langchat/langchat.dm +++ b/code/datums/langchat/langchat.dm @@ -13,7 +13,6 @@ #define LANGCHAT_LONGEST_TEXT 64 #define LANGCHAT_WIDTH 96 -#define LANGCHAT_X_OFFSET -32 #define LANGCHAT_MAX_ALPHA 196 //pop defines @@ -57,7 +56,7 @@ langchat_image.appearance_flags = NO_CLIENT_COLOR|KEEP_APART|RESET_COLOR|RESET_TRANSFORM langchat_image.maptext_y = langchat_height langchat_image.maptext_height = 64 - langchat_image.maptext_x = LANGCHAT_X_OFFSET + langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) langchat_image.maptext_y -= LANGCHAT_MESSAGE_POP_Y_SINK langchat_image.pixel_y = 0 @@ -149,6 +148,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH * 2 + langchat_image.maptext_x -= LANGCHAT_WIDTH / 2 langchat_listeners = listeners for(var/mob/M in langchat_listeners) From 062389c63e898c5b1fe1b608c5fa3244734bf663 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:16:25 +0100 Subject: [PATCH 101/199] Automatic changelog for PR #4725 [ci skip] --- html/changelogs/AutoChangeLog-pr-4725.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4725.yml diff --git a/html/changelogs/AutoChangeLog-pr-4725.yml b/html/changelogs/AutoChangeLog-pr-4725.yml new file mode 100644 index 000000000000..4bd068d53256 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4725.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Xeno and Megaphone abovehead chat speech should now properly be centered horizontally." \ No newline at end of file From d8c6032abb76bc954995768086cb9eb5112fcc60 Mon Sep 17 00:00:00 2001 From: foxtrot <109758052+Foxtrot13224@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:04:05 +0100 Subject: [PATCH 102/199] Adds splints to the survival pouch & updates its description (#4724) # About the pull request Adds splints to the survival pouch that survivors spawn with, increases the survival pouch storage space from 6 to 7 & updates the survival pouch description. # Explain why it's good for the game Generally, unless you're actively inside of a survivor hold, getting a bone-break is essentially a death-sentence, as if you manage to kill whatever threat is attacking you, you are forced to either stop moving, or run the risk of gaining IB for each step you take. This wouldn't be an issue if it weren't for the large amount of RNG in getting a bone-break. You could just as easily have a ravager maul you to death and not break any bones as you could get a broken bone within one or two slashes from a runner. The current description is out-dated and straight-up wrong. The description is based off of the old survival pouch, which could hold metal sheets. # Testing Photographs and Procedure It does indeed work
# Changelog :cl: foxtrot1322 add: Added splints to the survival pouch add: Increased survival pouch storage space by 1 spellcheck: Updates the survival pouch's description /:cl: --- code/game/objects/items/storage/pouch.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index ee274aaab32b..f24c0c3f3131 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -142,9 +142,9 @@ /obj/item/storage/pouch/survival name = "survival pouch" - desc = "It can carry flashlights, a pill, a crowbar, metal sheets, and some bandages." + desc = "A pouch given to colonists in the event of an emergency." icon_state = "tools" - storage_slots = 6 + storage_slots = 7 max_w_class = SIZE_MEDIUM can_hold = list( /obj/item/device/flashlight, @@ -153,6 +153,7 @@ /obj/item/stack/medical/bruise_pack, /obj/item/device/radio, /obj/item/attachable/bayonet, + /obj/item/stack/medical/splint, ) /obj/item/storage/pouch/survival/full/fill_preset_inventory() @@ -162,7 +163,7 @@ new /obj/item/stack/medical/bruise_pack(src) new /obj/item/device/radio(src) new /obj/item/attachable/bayonet(src) - + new /obj/item/stack/medical/splint(src) /obj/item/storage/pouch/survival/synth name = "synth survival pouch" desc = "An emergency pouch given to synthetics in the event of an emergency." From 7a0fa185b19fc74cd0d8b0b36513acdd7eb7f16c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:30:19 +0100 Subject: [PATCH 103/199] Automatic changelog for PR #4724 [ci skip] --- html/changelogs/AutoChangeLog-pr-4724.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4724.yml diff --git a/html/changelogs/AutoChangeLog-pr-4724.yml b/html/changelogs/AutoChangeLog-pr-4724.yml new file mode 100644 index 000000000000..326c78aea2ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4724.yml @@ -0,0 +1,6 @@ +author: "foxtrot1322" +delete-after: True +changes: + - rscadd: "Added splints to the survival pouch" + - rscadd: "Increased survival pouch storage space by 1" + - spellcheck: "Updates the survival pouch's description" \ No newline at end of file From 358cb289b3ea1d2dcac143252e197881796326c6 Mon Sep 17 00:00:00 2001 From: spartanbobby <71467726+spartanbobby@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:18:42 +0100 Subject: [PATCH 104/199] Almayer fixes 19/10/2023 (#4721) # About the pull request This PR fixes 2 minor issues with the USS Almayer missed in a previous sweep Incorrect DIR on fire shutters Incorrect tile under door in maint # Explain why it's good for the game Admittedly these were both mistakes I made in a prior project I believe strongly in personally correcting bugs I put into the game thus I made this PR as soon as I noticed them # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: SpartanBobby maptweak: Fixes incorrect DIR on fireshutters in memorial maptweak: Corrects lack of warning stripe tile under door in north brig maint /:cl: --- maps/map_files/USS_Almayer/USS_Almayer.dmm | 23 ++++++---------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index d1897fc176df..3740158c7e0f 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -15600,10 +15600,10 @@ }, /area/almayer/living/starboard_garden) "biV" = ( -/obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 2 + dir = 8 }, +/obj/structure/window/framed/almayer, /turf/open/floor/plating, /area/almayer/living/starboard_garden) "bja" = ( @@ -29399,20 +29399,6 @@ icon_state = "sterile_green_side" }, /area/almayer/shipboard/brig/surgery) -"dav" = ( -/obj/structure/machinery/door/poddoor/almayer/open{ - id = "Brig Lockdown Shutters"; - name = "\improper Brig Lockdown Shutter" - }, -/obj/structure/machinery/door/airlock/almayer/maint{ - access_modified = 1; - dir = 2; - req_one_access = list(2,34,30) - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/upper_hull/u_f_s) "daz" = ( /turf/closed/wall/almayer/white/hull, /area/almayer/command/airoom) @@ -32519,6 +32505,9 @@ /obj/structure/machinery/door/airlock/almayer/generic/glass{ name = "\improper Memorial Room" }, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 8 + }, /turf/open/floor/almayer{ icon_state = "test_floor4" }, @@ -95399,7 +95388,7 @@ adG adG gqq iCz -dav +aFN rPC rPC kDb From f42024a98384de6d7e87a2eecbd34f350dbf47b8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:44:24 +0100 Subject: [PATCH 105/199] Automatic changelog for PR #4721 [ci skip] --- html/changelogs/AutoChangeLog-pr-4721.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4721.yml diff --git a/html/changelogs/AutoChangeLog-pr-4721.yml b/html/changelogs/AutoChangeLog-pr-4721.yml new file mode 100644 index 000000000000..5c78dc44993f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4721.yml @@ -0,0 +1,5 @@ +author: "SpartanBobby" +delete-after: True +changes: + - maptweak: "Fixes incorrect DIR on fireshutters in memorial" + - maptweak: "Corrects lack of warning stripe tile under door in north brig maint" \ No newline at end of file From 218ec5ce0f3b52e85a4a5d39be9fb040e39d74ee Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Fri, 20 Oct 2023 05:22:57 -0500 Subject: [PATCH 106/199] Crawling buffs (#4657) # About the pull request Makes crawling do_after(how long it takes to crawl to a new tile) 1 second instead of 3 and removes the busy icon. # Explain why it's good for the game Its fun, crawling has essentially no use and this makes it a bit better at potentially hiding in piles of corpses and moving around stealthily, still useless in actual normal gameplay though. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Crawling now only takes 1 second to move and no longer has an overhead icon when doing it. /:cl: --- code/modules/mob/mob_movement.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c3266982b20d..64253fbac5df 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -187,7 +187,7 @@ return //now crawl mob.crawling = TRUE - if(!do_after(mob, 3 SECONDS, INTERRUPT_MOVED|INTERRUPT_UNCONSCIOUS|INTERRUPT_STUNNED|INTERRUPT_RESIST|INTERRUPT_CHANGED_LYING, BUSY_ICON_GENERIC)) + if(!do_after(mob, 1 SECONDS, INTERRUPT_MOVED|INTERRUPT_UNCONSCIOUS|INTERRUPT_STUNNED|INTERRUPT_RESIST|INTERRUPT_CHANGED_LYING, NO_BUSY_ICON)) mob.crawling = FALSE next_movement = world.time + MINIMAL_MOVEMENT_INTERVAL mob.move_intentionally = FALSE From 3b0baad67c3d0b909f3d44d891948a3f005159cd Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 11:58:43 +0100 Subject: [PATCH 107/199] Automatic changelog for PR #4657 [ci skip] --- html/changelogs/AutoChangeLog-pr-4657.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4657.yml diff --git a/html/changelogs/AutoChangeLog-pr-4657.yml b/html/changelogs/AutoChangeLog-pr-4657.yml new file mode 100644 index 000000000000..4641f99bb6e0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4657.yml @@ -0,0 +1,4 @@ +author: "CapCamIII" +delete-after: True +changes: + - balance: "Crawling now only takes 1 second to move and no longer has an overhead icon when doing it." \ No newline at end of file From e953a78620fa0d3116aa969a825eea3262e7a1c2 Mon Sep 17 00:00:00 2001 From: Steelpoint <6595389+Steelpoint@users.noreply.github.com> Date: Fri, 20 Oct 2023 18:28:08 +0800 Subject: [PATCH 108/199] Add Non-Hostile UPP ERT (#4713) # About the pull request Adds a non-hostile UPP ERT alternative to the hostile ERT spawn. Has the same chance to spawn as the hostile version. # Explain why it's good for the game In lore the UPP enjoy a cold war esque relationship with the UA, a possibly neutral ERT helps better reflect this. Furthermore, as more UPP are added to the game, the need to help shift the community meta regarding UPP away from 100% hostile to 50/50 hostile is going to become more important, this would be 1 small step. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: UPP ERT's have a chance to be neutral to the USCM. /:cl: --------- Co-authored-by: Steelpoint Co-authored-by: harryob --- code/datums/emergency_calls/upp.dm | 49 +++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm index 04bcfecf9128..562dac3fe154 100644 --- a/code/datums/emergency_calls/upp.dm +++ b/code/datums/emergency_calls/upp.dm @@ -4,7 +4,7 @@ /datum/emergency_call/upp name = "UPP Naval Infantry (Squad)" mob_max = 9 - probability = 10 + probability = 20 shuttle_id = "Distress_UPP" name_of_spawn = /obj/effect/landmark/ert_spawns/distress_upp item_spawn = /obj/effect/landmark/ert_spawns/distress_upp/item @@ -14,15 +14,17 @@ max_heavies = 1 max_smartgunners = 0 var/heavy_pick = TRUE // whether heavy should count as either a minigunner or shotgunner - hostility = TRUE var/max_synths = 1 var/synths = 0 /datum/emergency_call/upp/New() - ..() - arrival_message = "T*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns )0r c|*$e @u*r*r$ c0m&*t." - objectives = "Eliminate the UA Forces to ensure the UPP prescence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." - + . = ..() + hostility = pick(50;FALSE,50;TRUE) + arrival_message = "[MAIN_SHIP_NAME] t*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns and pR*epr# t% r@nd$r a(tD." + if(hostility) + objectives = "Eliminate the UA Forces to ensure the UPP prescence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." + else + objectives = "Render assistance towards the UA Forces, do not engage UA forces. Listen to your superior officers." /datum/emergency_call/upp/print_backstory(mob/living/carbon/human/M) if(ishuman_strict(M)) @@ -94,10 +96,26 @@ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), H, SPAN_BOLD("Objectives: [objectives]")), 1 SECONDS) +/datum/emergency_call/upp/hostile + name = "UPP Naval Infantry (Squad) (Hostile)" + hostility = TRUE + +/datum/emergency_call/upp/hostile/New() + ..() + arrival_message = "[MAIN_SHIP_NAME] t*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns and pR*epr# t% r@nd$r a(tD." + objectives = "Eliminate the UA Forces to ensure the UPP presence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." + +/datum/emergency_call/upp/friendly + name = "UPP Naval Infantry (Squad) (Friendly)" + hostility = FALSE + +/datum/emergency_call/upp/friendly/New() + ..() + arrival_message = "This is UPP dispatch. USS Almayer, We are responding to your distress call, we will render aid as able, do not fire." + objectives = "Render assistance towards the UA Forces, Listen to your superior officers." /datum/emergency_call/upp/platoon - name = "UPP Naval Infantry (Platoon)" - mob_min = 4 + name = "UPP Naval Infantry (Platoon) (Hostile)" mob_max = 30 probability = 0 max_medics = 3 @@ -106,6 +124,21 @@ max_engineers = 2 max_synths = 1 heavy_pick = FALSE + hostility = TRUE + +/datum/emergency_call/upp/platoon/New() + ..() + arrival_message = "[MAIN_SHIP_NAME] t*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns and pR*epr# t% r@nd$r a(tD." + objectives = "Eliminate the UA Forces to ensure the UPP presence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs." + +/datum/emergency_call/upp/platoon/friendly + name = "UPP Naval Infantry (Platoon) (Friendly)" + hostility = FALSE + +/datum/emergency_call/upp/platoon/friendly/New() + ..() + arrival_message = "This is UPP dispatch. USS Almayer, We are responding to your distress call, we will render aid as able, do not fire." + objectives = "Render assistance towards the UA Forces, Listen to your superior officers." /obj/effect/landmark/ert_spawns/distress_upp name = "Distress_UPP" From 0686c381d265a80b64b9e039a4ee155468e06dbf Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 12:13:09 +0100 Subject: [PATCH 109/199] Automatic changelog for PR #4713 [ci skip] --- html/changelogs/AutoChangeLog-pr-4713.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4713.yml diff --git a/html/changelogs/AutoChangeLog-pr-4713.yml b/html/changelogs/AutoChangeLog-pr-4713.yml new file mode 100644 index 000000000000..71a3a8cfd066 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4713.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - rscadd: "UPP ERT's have a chance to be neutral to the USCM." \ No newline at end of file From 9d69f3aecf6a0070861688c5648479e8db6b679d Mon Sep 17 00:00:00 2001 From: fira Date: Fri, 20 Oct 2023 15:57:35 +0200 Subject: [PATCH 110/199] Fixes bugs with designator usage (#4693) # About the pull request The Laser Designator is a JTACer's workhorse and it's CLUNKY AS HELL. This fixes two main bugs: * The `interactee` is not properly cleared when using the designator (or any zoomed item), causing it to be unset instead of set the next time you use it. This means if you look up then back down your designator, you can't laze. * The interaction system wasn't made with movement in mind. It is a problem because zoom system allows movement, and designators are where the two meet. Now, they can explicitely keep interaction despite movement. # Explain why it's good for the game QoL that should have been done 6 years ago, give or take Because Zooming interactions are an awful mess, i'm flagging this for Testmerge where it'll inevitably break down # Testing Photographs and Procedure I take designator, i look, i try to laze. I put them down, move, do it again. And again. Several combinations of actions. The unzoom logic is blatantly busted and out of scope of the PR. # Changelog :cl: fix: Fixed Rangefinders/Designators preventing you from lazing if you looked up/down them without moving. fix: Fixed Rangefinders/Designators forcing you to look up/down again if you had moved while using them. /:cl: --- code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm | 4 ++++ code/game/objects/items.dm | 2 ++ code/game/objects/items/devices/binoculars.dm | 6 +++++- code/modules/mob/living/carbon/human/human_movement.dm | 3 ++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm index 0a9e00b59e04..6614272d33e5 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_human.dm @@ -36,6 +36,10 @@ #define COMSIG_HUMAN_UPDATE_SIGHT "human_update_sight" #define COMPONENT_OVERRIDE_UPDATE_SIGHT (1<<0) +///from /mob/living/carbon/human/movement_delay() +#define COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION "human_movement_cancel_interaction" + #define COMPONENT_HUMAN_MOVEMENT_KEEP_USING (1<<0) + ///from /mob/living/carbon/human/update_sight() #define COMSIG_HUMAN_POST_UPDATE_SIGHT "human_post_update_sight" ///from /mob/living/carbon/human/movement_delay(): (list/movedata) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 077c0a463aaa..2d142789fdaf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -824,6 +824,8 @@ cases. Override_icon_state should be a list.*/ unzoom(user) /obj/item/proc/unzoom(mob/living/user) + if(user.interactee == src) + user.unset_interaction() var/zoom_device = zoomdevicename ? "\improper [zoomdevicename] of [src]" : "\improper [src]" INVOKE_ASYNC(user, TYPE_PROC_REF(/atom, visible_message), SPAN_NOTICE("[user] looks up from [zoom_device]."), SPAN_NOTICE("You look up from [zoom_device].")) diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index a4589fb1dd78..2d44ce076f30 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -38,10 +38,14 @@ /obj/item/device/binoculars/on_set_interaction(mob/user) flags_atom |= RELAY_CLICK - + RegisterSignal(user, COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION, PROC_REF(interaction_handler)) /obj/item/device/binoculars/on_unset_interaction(mob/user) flags_atom &= ~RELAY_CLICK + UnregisterSignal(user, COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION) + +/obj/item/device/binoculars/proc/interaction_handler() + return COMPONENT_HUMAN_MOVEMENT_KEEP_USING /obj/item/device/binoculars/civ desc = "A pair of binoculars." diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index e4ed65107f03..1a906dfa5c11 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -4,7 +4,8 @@ recalculate_move_delay = FALSE if(interactee)// moving stops any kind of interaction - unset_interaction() + if(!(SEND_SIGNAL(src, COMSIG_HUMAN_MOVEMENT_CANCEL_INTERACTION) & COMPONENT_HUMAN_MOVEMENT_KEEP_USING)) + unset_interaction() if(species.slowdown) . += species.slowdown From 837aff230b3789a8941d7d3532ccc9715ac3d574 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:06:08 +0100 Subject: [PATCH 111/199] Automatic changelog for PR #4693 [ci skip] --- html/changelogs/AutoChangeLog-pr-4693.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4693.yml diff --git a/html/changelogs/AutoChangeLog-pr-4693.yml b/html/changelogs/AutoChangeLog-pr-4693.yml new file mode 100644 index 000000000000..e13e912459c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4693.yml @@ -0,0 +1,5 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed Rangefinders/Designators preventing you from lazing if you looked up/down them without moving." + - bugfix: "Fixed Rangefinders/Designators forcing you to look up/down again if you had moved while using them." \ No newline at end of file From 18ff30088f021bfab3f4921b2b8c3bfb827cadc2 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:29:56 -0700 Subject: [PATCH 112/199] Fix Imaginary Friends Initialization (#4730) # About the pull request This PR fixes the runtime that occurs during the initialization of an imaginary friend preventing the appearance from getting set up until the user manually requests to change their appearance yet again. The altered code probably could be removed altogether, but maybe there are scenarios where the ghost won't be null. # Explain why it's good for the game Features should not break or throw runtimes. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/f0e66ecc-95a6-491f-8515-797c79923339)
# Changelog :cl: Drathek fix: Fixed imaginary friends not initializing correctly and throwing a runtime /:cl: --- code/modules/mob/camera/imaginary_friend.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/camera/imaginary_friend.dm b/code/modules/mob/camera/imaginary_friend.dm index 3d6d5d5a0aa2..5d205dd17e4f 100644 --- a/code/modules/mob/camera/imaginary_friend.dm +++ b/code/modules/mob/camera/imaginary_friend.dm @@ -261,7 +261,7 @@ icon = friend_image mouse_opacity = MOUSE_OPACITY_ICON var/mob/ghost = ..() - if(ghost.mind) + if(ghost?.mind) ghost.mind.original = aghosted_original_mob return ghost From f638a52f5739ef7397c31ff892e9a63937189924 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:38:12 +0100 Subject: [PATCH 113/199] Automatic changelog for PR #4730 [ci skip] --- html/changelogs/AutoChangeLog-pr-4730.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4730.yml diff --git a/html/changelogs/AutoChangeLog-pr-4730.yml b/html/changelogs/AutoChangeLog-pr-4730.yml new file mode 100644 index 000000000000..b275429f33bc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4730.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed imaginary friends not initializing correctly and throwing a runtime" \ No newline at end of file From 881a2c75d71e84063084218ced4969918ce51a51 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Fri, 20 Oct 2023 14:30:11 -0700 Subject: [PATCH 114/199] Fix ghost alerts that are offset because of mapping/temporary changes (#4731) # About the pull request This PR resets the pixel_x and pixel_y adjustments for ghost alerts on an atom to their initial value (to ignore any temporary or mapping changes). There are still some ghost alerts that don't handle the offset correctly though (only ovi queen as far as I've seen) that this change does not resolve that I couldn't find a way to fix without incorrectly offsetting everything else... See screenshots below in testing section. # Explain why it's good for the game More polished UI for ghosts. # Testing Photographs and Procedure
Screenshots & Videos ![drone](https://github.com/cmss13-devs/cmss13/assets/76988376/539a91c2-191e-4a66-8b08-0ce26b826330) ![ghost](https://github.com/cmss13-devs/cmss13/assets/76988376/c51d8d81-393a-4f27-b61b-8b8e04b778ec) ![ghost2](https://github.com/cmss13-devs/cmss13/assets/76988376/bc7deb39-96f0-4b96-8fe8-a83e51d4efa0) ![hugged](https://github.com/cmss13-devs/cmss13/assets/76988376/c7a0fbb3-c454-4bbe-94f9-16c7bf10efd0) ![hugger](https://github.com/cmss13-devs/cmss13/assets/76988376/d25a1235-0276-48d5-94d3-501a6edde486) ![lesser](https://github.com/cmss13-devs/cmss13/assets/76988376/c08c093c-ff11-4a7a-bcbf-7f5acc3b7d14) ![queen](https://github.com/cmss13-devs/cmss13/assets/76988376/93c2716d-97e4-44e6-94b0-daf84802ce1f) ![tacmap](https://github.com/cmss13-devs/cmss13/assets/76988376/520e1177-1100-451a-9e53-730857473838) ![tacmap2](https://github.com/cmss13-devs/cmss13/assets/76988376/085dfbbf-6a32-44c6-93ca-a72270ef9af8) ![ovi](https://github.com/cmss13-devs/cmss13/assets/76988376/048ca721-db8a-4606-a575-093340c736dd)
# Changelog :cl: Drathek ui: Tweaked the position of some ghost alerts /:cl: --- code/modules/mob/mob_helpers.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 58933b8ca312..3d74673c5308 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -576,12 +576,14 @@ var/global/list/limb_types_by_name = list( var/iheight = source_icon.Height() var/iwidth = source_icon.Width() var/higher_power = (iheight > iwidth) ? iheight : iwidth + alert_overlay.pixel_y = initial(source.pixel_y) + alert_overlay.pixel_x = initial(source.pixel_x) if(higher_power > 32) var/diff = 32 / higher_power alert_overlay.transform = alert_overlay.transform.Scale(diff, diff) if(higher_power > 48) - alert_overlay.pixel_y = -(iheight / 2) * diff - alert_overlay.pixel_x = -(iwidth / 2) * diff + alert_overlay.pixel_y = -(iheight * 0.5) * diff + alert_overlay.pixel_x = -(iwidth * 0.5) * diff alert_overlay.layer = FLOAT_LAYER From 6342468a271e874037480d0e99003c23eb06cc46 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:52:32 +0100 Subject: [PATCH 115/199] Automatic changelog for PR #4731 [ci skip] --- html/changelogs/AutoChangeLog-pr-4731.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4731.yml diff --git a/html/changelogs/AutoChangeLog-pr-4731.yml b/html/changelogs/AutoChangeLog-pr-4731.yml new file mode 100644 index 000000000000..44d62ec78b5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4731.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - ui: "Tweaked the position of some ghost alerts" \ No newline at end of file From e4c3900e4f087444308138e9d05b4da9c774f6a9 Mon Sep 17 00:00:00 2001 From: riot <103988604+CapCamIII@users.noreply.github.com> Date: Fri, 20 Oct 2023 17:54:13 -0500 Subject: [PATCH 116/199] reduces timer on joining ert after death to 30 seconds (#4652) # About the pull request reduces timer # Explain why it's good for the game Having to wait a full minute to join an ERT is annoying, it was better b4 when timer from ERT was a minute as well, but 30 second ERT means if u die just b4 ERT goes you cant join regardless. if ppl are ghosting bc they want ert then they are stupid. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Timer on attempting to join ERT after death is now 30 seconds down from 1 minute /:cl: --- code/datums/emergency_calls/emergency_call.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 6533086d98f3..79ba9fff9747 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -168,7 +168,7 @@ return var/deathtime = world.time - usr.timeofdeath - if(deathtime < 1 MINUTES) //Nice try, ghosting right after the announcement + if(deathtime < 30 SECONDS) //Nice try, ghosting right after the announcement if(SSmapping.configs[GROUND_MAP].map_name != MAP_WHISKEY_OUTPOST) // people ghost so often on whiskey outpost. to_chat(src, SPAN_WARNING("You ghosted too recently.")) return From c7283e84a71b7255c6ade28048c809b844a95a13 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 00:08:01 +0100 Subject: [PATCH 117/199] Automatic changelog for PR #4652 [ci skip] --- html/changelogs/AutoChangeLog-pr-4652.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4652.yml diff --git a/html/changelogs/AutoChangeLog-pr-4652.yml b/html/changelogs/AutoChangeLog-pr-4652.yml new file mode 100644 index 000000000000..e356ef9f6e68 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4652.yml @@ -0,0 +1,4 @@ +author: "CapCamIII" +delete-after: True +changes: + - balance: "Timer on attempting to join ERT after death is now 30 seconds down from 1 minute" \ No newline at end of file From 66285595258c24740b5c683db48cd7fee4411765 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 21 Oct 2023 01:06:34 +0000 Subject: [PATCH 118/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4652.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4657.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4693.yml | 5 ---- html/changelogs/AutoChangeLog-pr-4703.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4713.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4721.yml | 5 ---- html/changelogs/AutoChangeLog-pr-4724.yml | 6 ----- html/changelogs/AutoChangeLog-pr-4725.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4727.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4730.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4731.yml | 4 ---- html/changelogs/archive/2023-10.yml | 29 +++++++++++++++++++++++ 12 files changed, 29 insertions(+), 48 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4652.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4657.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4693.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4703.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4713.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4721.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4724.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4725.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4727.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4730.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4731.yml diff --git a/html/changelogs/AutoChangeLog-pr-4652.yml b/html/changelogs/AutoChangeLog-pr-4652.yml deleted file mode 100644 index e356ef9f6e68..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4652.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - balance: "Timer on attempting to join ERT after death is now 30 seconds down from 1 minute" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4657.yml b/html/changelogs/AutoChangeLog-pr-4657.yml deleted file mode 100644 index 4641f99bb6e0..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4657.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - balance: "Crawling now only takes 1 second to move and no longer has an overhead icon when doing it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4693.yml b/html/changelogs/AutoChangeLog-pr-4693.yml deleted file mode 100644 index e13e912459c7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4693.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed Rangefinders/Designators preventing you from lazing if you looked up/down them without moving." - - bugfix: "Fixed Rangefinders/Designators forcing you to look up/down again if you had moved while using them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4703.yml b/html/changelogs/AutoChangeLog-pr-4703.yml deleted file mode 100644 index c140f3ea46f2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4703.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CapCamIII" -delete-after: True -changes: - - spellcheck: "UPP Synth Survivor on the Trijent Dam nightmare is now called a Support Synthetic instead of a Combat Synthetic, as its not a combat synthetic" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4713.yml b/html/changelogs/AutoChangeLog-pr-4713.yml deleted file mode 100644 index 71a3a8cfd066..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4713.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - rscadd: "UPP ERT's have a chance to be neutral to the USCM." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4721.yml b/html/changelogs/AutoChangeLog-pr-4721.yml deleted file mode 100644 index 5c78dc44993f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4721.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SpartanBobby" -delete-after: True -changes: - - maptweak: "Fixes incorrect DIR on fireshutters in memorial" - - maptweak: "Corrects lack of warning stripe tile under door in north brig maint" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4724.yml b/html/changelogs/AutoChangeLog-pr-4724.yml deleted file mode 100644 index 326c78aea2ae..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4724.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "foxtrot1322" -delete-after: True -changes: - - rscadd: "Added splints to the survival pouch" - - rscadd: "Increased survival pouch storage space by 1" - - spellcheck: "Updates the survival pouch's description" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4725.yml b/html/changelogs/AutoChangeLog-pr-4725.yml deleted file mode 100644 index 4bd068d53256..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4725.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Xeno and Megaphone abovehead chat speech should now properly be centered horizontally." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4727.yml b/html/changelogs/AutoChangeLog-pr-4727.yml deleted file mode 100644 index e8bed292d815..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4727.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - rscadd: "USCM Service Jacket to SEA Vendor" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4730.yml b/html/changelogs/AutoChangeLog-pr-4730.yml deleted file mode 100644 index b275429f33bc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4730.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed imaginary friends not initializing correctly and throwing a runtime" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4731.yml b/html/changelogs/AutoChangeLog-pr-4731.yml deleted file mode 100644 index 44d62ec78b5f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4731.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - ui: "Tweaked the position of some ghost alerts" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index dda0958c9320..94c952734866 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -286,3 +286,32 @@ VileBeggar: - rscadd: Dartboards are now functional and can be crafted with cardboard. - bugfix: Fixed an issue with some deconstructed signs losing their icon. +2023-10-21: + Birdtalon: + - rscadd: USCM Service Jacket to SEA Vendor + CapCamIII: + - balance: Crawling now only takes 1 second to move and no longer has an overhead + icon when doing it. + - balance: Timer on attempting to join ERT after death is now 30 seconds down from + 1 minute + - spellcheck: UPP Synth Survivor on the Trijent Dam nightmare is now called a Support + Synthetic instead of a Combat Synthetic, as its not a combat synthetic + Drathek: + - bugfix: Fixed imaginary friends not initializing correctly and throwing a runtime + - ui: Tweaked the position of some ghost alerts + SpartanBobby: + - maptweak: Fixes incorrect DIR on fireshutters in memorial + - maptweak: Corrects lack of warning stripe tile under door in north brig maint + Steelpoint: + - rscadd: UPP ERT's have a chance to be neutral to the USCM. + fira: + - bugfix: Xeno and Megaphone abovehead chat speech should now properly be centered + horizontally. + - bugfix: Fixed Rangefinders/Designators preventing you from lazing if you looked + up/down them without moving. + - bugfix: Fixed Rangefinders/Designators forcing you to look up/down again if you + had moved while using them. + foxtrot1322: + - rscadd: Added splints to the survival pouch + - rscadd: Increased survival pouch storage space by 1 + - spellcheck: Updates the survival pouch's description From 174e387bc30dc3211880d43e2a1e354b48173f84 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Sat, 21 Oct 2023 05:18:44 +0100 Subject: [PATCH 119/199] JAS Precautionary Charges (#4733) # About the pull request Adds Discretionary Arrest to JAS Moves above to new category, Precautionary Charges. Also moves Insanity and POW to this category. # Explain why it's good for the game Consistency with ML page. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added Discretionary Arrest to JAS. add: Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category. /:cl: --- code/controllers/subsystem/init/law.dm | 22 +++++++++++-------- code/game/machinery/computer/sentencing.dm | 1 + code/modules/law/law.dm | 17 +++++++------- code/modules/law/laws/capital_crime.dm | 8 ------- code/modules/law/laws/precautionary_charge.dm | 18 +++++++++++++++ colonialmarines.dme | 1 + 6 files changed, 42 insertions(+), 25 deletions(-) create mode 100644 code/modules/law/laws/precautionary_charge.dm diff --git a/code/controllers/subsystem/init/law.dm b/code/controllers/subsystem/init/law.dm index 52fbbbeadf5d..c7ade815972c 100644 --- a/code/controllers/subsystem/init/law.dm +++ b/code/controllers/subsystem/init/law.dm @@ -8,20 +8,24 @@ SUBSYSTEM_DEF(law_init) var/list/minor_law = list() var/list/major_law = list() var/list/capital_law = list() + var/list/precautionary_law = list() /datum/controller/subsystem/law_init/Initialize() - for(var/L in subtypesof(/datum/law/optional_law)) - optional_law += new L + for(var/law in subtypesof(/datum/law/optional_law)) + optional_law += new law - for(var/L in subtypesof(/datum/law/minor_law)) - minor_law += new L + for(var/law in subtypesof(/datum/law/minor_law)) + minor_law += new law - for(var/L in subtypesof(/datum/law/major_law)) - major_law += new L + for(var/law in subtypesof(/datum/law/major_law)) + major_law += new law - for(var/L in subtypesof(/datum/law/capital_law)) - capital_law += new L + for(var/law in subtypesof(/datum/law/capital_law)) + capital_law += new law - laws = optional_law + minor_law + major_law + capital_law + for(var/law in subtypesof(/datum/law/precautionary_charge)) + precautionary_law += new law + + laws = optional_law + minor_law + major_law + capital_law + precautionary_law return SS_INIT_SUCCESS diff --git a/code/game/machinery/computer/sentencing.dm b/code/game/machinery/computer/sentencing.dm index 52a4159a2a90..3aa9b5a032a8 100644 --- a/code/game/machinery/computer/sentencing.dm +++ b/code/game/machinery/computer/sentencing.dm @@ -78,6 +78,7 @@ data["laws"] += list(create_law_data("Major Laws", SSlaw_init.major_law)) data["laws"] += list(create_law_data("Capital Laws", SSlaw_init.capital_law)) data["laws"] += list(create_law_data("Optional Laws", SSlaw_init.optional_law)) + data["laws"] += list(create_law_data("Precautionary Laws", SSlaw_init.precautionary_law)) return data diff --git a/code/modules/law/law.dm b/code/modules/law/law.dm index 7d5906047021..20245beda35d 100644 --- a/code/modules/law/law.dm +++ b/code/modules/law/law.dm @@ -13,13 +13,14 @@ var/special_punishment = "" //This is for special punishments //These are bitflags to indicate the type of crime it is. -#define OPTIONAL_CRIME 1 -#define MINOR_CRIME 2 -#define MAJOR_CRIME 4 -#define CAPITAL_CRIME 8 +#define OPTIONAL_CRIME (1<<0) +#define MINOR_CRIME (1<<1) +#define MAJOR_CRIME (1<<2) +#define CAPITAL_CRIME (1<<3) +#define PRECAUTIONARY_CHARGE (1<<4) //These are bitflags for special punishments -#define PERMABRIG 1 -#define DOUBLE_TIME 2 -#define SAME_AS_ACCUSED 4 -#define DEMOTION 8 +#define PERMABRIG (1<<0) +#define DOUBLE_TIME (1<<1) +#define SAME_AS_ACCUSED (1<<2) +#define DEMOTION (1<<3) diff --git a/code/modules/law/laws/capital_crime.dm b/code/modules/law/laws/capital_crime.dm index 8329374e91db..687c483c6593 100644 --- a/code/modules/law/laws/capital_crime.dm +++ b/code/modules/law/laws/capital_crime.dm @@ -10,10 +10,6 @@ name = "Desertion" desc = "Refusing to carry out the duties essential to one’s post or abandoning post unauthorized, without intent to return. (Retreating from the planet when the FOB is breached is not Desertion, refusing to return when ordered is)." -/datum/law/capital_law/insanity - name = "Insanity" - desc = "Acting in such a manner which makes the offender not sound clear of mind. The CMO or Synthetic can declare insanity on a Marine if the Marine is believed to not be of sound mind. The Marine once cleared to be of sound mind may be released from this particular charge." - /datum/law/capital_law/jailbreak_escape name = "Jailbreak/Escape" desc = "To escape, assist in an escape, attempt escape, or be willfully and knowingly broken out." @@ -30,7 +26,3 @@ /datum/law/capital_law/crimes_against_humanity name = "Crimes against Humanity" desc = "To engage in actions that violate human rights or otherwise are heinous acts against humans. Examples are torture, cannibalism and forced infection with Xenomorph larva." - -/datum/law/capital_law/prisoner_of_war - name = "Prisoner of War" - desc = "Being a member of a currently hostile faction to the USCM." diff --git a/code/modules/law/laws/precautionary_charge.dm b/code/modules/law/laws/precautionary_charge.dm new file mode 100644 index 000000000000..c06cd6ca5287 --- /dev/null +++ b/code/modules/law/laws/precautionary_charge.dm @@ -0,0 +1,18 @@ +/datum/law/precautionary_charge + severity = PRECAUTIONARY_CHARGE + brig_time = PERMABRIG_SENTENCE + special_punishment = "Not inclusive for execution criteria." + +/datum/law/precautionary_charge/discretionary_arrest + name = "Discretionary Detainment" + desc = "A discretionary charge used by Commanding Officers to detain personnel for any reason, for the safety and benefit of the operation or security. The duration of this charge is variable and may be pardoned/lifted at any time by the Commanding Officer." + special_punishment = "Not inclusive for execution criteria. May only be appealed to the Acting Commander or Provost/USCM HC." + +/datum/law/precautionary_charge/insanity + name = "Insanity" + desc = "Acting in such a manner which makes the offender not sound clear of mind. The CMO or Synthetic can declare insanity on a Marine if the Marine is believed to not be of sound mind. The Marine once cleared to be of sound mind may be released from this particular charge." + +/datum/law/precautionary_charge/prisoner_of_war + name = "Prisoner of War" + desc = "Being a member of a legitimate and recognised faction currently hostile to the USCM." + special_punishment = "Execution is forbidden barring exceptional circumstances." diff --git a/colonialmarines.dme b/colonialmarines.dme index be463ce8a289..b6967c2df59b 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1748,6 +1748,7 @@ s// DM Environment file for colonialmarines.dme. #include "code\modules\law\laws\major_crime.dm" #include "code\modules\law\laws\minor_crime.dm" #include "code\modules\law\laws\optional.dm" +#include "code\modules\law\laws\precautionary_charge.dm" #include "code\modules\lighting\emissive_blocker.dm" #include "code\modules\lighting\lighting_area.dm" #include "code\modules\lighting\lighting_atom.dm" From 7cda2d4b3696d15c5f19f6ae9f2bccb4b4a270de Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 05:28:26 +0100 Subject: [PATCH 120/199] Automatic changelog for PR #4733 [ci skip] --- html/changelogs/AutoChangeLog-pr-4733.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4733.yml diff --git a/html/changelogs/AutoChangeLog-pr-4733.yml b/html/changelogs/AutoChangeLog-pr-4733.yml new file mode 100644 index 000000000000..43d1d2b92e0a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4733.yml @@ -0,0 +1,5 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Added Discretionary Arrest to JAS." + - rscadd: "Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category." \ No newline at end of file From de5c69661f8d33425123894028702f64239f861b Mon Sep 17 00:00:00 2001 From: kiVts <48099872+kiVts@users.noreply.github.com> Date: Sat, 21 Oct 2023 02:44:13 -0400 Subject: [PATCH 121/199] DFB property changes. (#4590) # About the pull request part 2 out of 4 This does a **big** touch up on defibrillation property in research Well, to start off, max_level = 1 was removed. It appears warcrimes forgot to remove it since process proc has benefits explicitly for higher levels. I would call it a bug(oversight rather). Second: Ghosts get notified when the chem starts to try and defib you, so you dont just wonder how did you stand up, and pretty neat too. Third: The >6 level of defib to apply healing like with actual item defib is too high, so we move requirement down to >1 but make it heal much, much worse at levels lower than 5. eg it took 20 units to heal ~20 brute at level 3(you will literally perma lmao), at level 5, however, this will go at around 2.5 per life tick, level 8 will give 4 damage heal. This is a balance change(buff) But hardly so since its research, Research is already neglecting most of the time this property. Fourth: removes one letter var, This whole file is entombed with them but Im not doing that for now. # Explain why it's good for the game Defib property is way too underused and crudely made. This fixes it, partially. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: kiVts add: Ghosts get notified when they are being revived by DFB property balance: DFB property healing threshold lowered, You can create DFB property higher than one. /:cl: --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .../chemistry_properties/prop_positive.dm | 42 ++++++++++++------ ...rt Beat Short.ogg => heart_beat_short.ogg} | Bin 2 files changed, 28 insertions(+), 14 deletions(-) rename sound/effects/{Heart Beat Short.ogg => heart_beat_short.ogg} (100%) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 7f476cecf2c5..971051e9bf88 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -548,7 +548,7 @@ rarity = PROPERTY_RARE category = PROPERTY_TYPE_REACTANT value = 3 - max_level = 1 + COOLDOWN_DECLARE(ghost_notif) /datum/chem_property/positive/defibrillating/on_delete(mob/living/M) ..() @@ -574,19 +574,33 @@ /datum/chem_property/positive/defibrillating/process_dead(mob/living/M, potency = 1, delta_time) if(!ishuman(M)) return - var/mob/living/carbon/human/H = M - H.apply_damage(-H.getOxyLoss(), OXY) - if(H.check_tod() && H.is_revivable() && H.health > HEALTH_THRESHOLD_DEAD) - to_chat(H, SPAN_NOTICE("You feel your heart struggling as you suddenly feel a spark, making it desperately try to continue pumping.")) - playsound_client(H.client, 'sound/effects/Heart Beat Short.ogg', 35) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, handle_revive)), 50, TIMER_UNIQUE) - else if (potency > POTENCY_MAX_TIER_1 && H.check_tod() && H.is_revivable() && H.health < HEALTH_THRESHOLD_DEAD) //Will heal if level is 7 or greater - to_chat(H, SPAN_NOTICE("You feel a faint spark in your chest.")) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BRUTE) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BURN) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, TOX) - H.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, CLONE) - H.apply_damage(-H.getOxyLoss(), OXY) + var/mob/living/carbon/human/dead = M + var/revivable = dead.check_tod() && dead.is_revivable() + if(revivable && (dead.health > HEALTH_THRESHOLD_DEAD)) + addtimer(CALLBACK(dead, TYPE_PROC_REF(/mob/living/carbon/human, handle_revive)), 5 SECONDS) + to_chat(dead, SPAN_NOTICE("You feel your heart struggling as you suddenly feel a spark, making it desperately try to continue pumping.")) + playsound_client(dead.client, 'sound/effects/heart_beat_short.ogg', 35) + else if ((potency >= 1) && revivable && dead.health <= HEALTH_THRESHOLD_DEAD) //heals on all level above 1. This is however, minimal. + to_chat(dead, SPAN_NOTICE("You feel a faint spark in your chest.")) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, BRUTE) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, BURN) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, TOX) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_VLOW, CLONE) + dead.apply_damage(-dead.getOxyLoss(), OXY) + if(potency > CREATE_MAX_TIER_1) //heal more if higher levels + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BRUTE) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, BURN) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, TOX) + dead.apply_damage(-potency * POTENCY_MULTIPLIER_LOW, CLONE) + if(dead.health < HEALTH_THRESHOLD_DEAD) + return + if(!COOLDOWN_FINISHED(src, ghost_notif)) + return + var/mob/dead/observer/ghost = dead.get_ghost() + if(ghost?.client) + COOLDOWN_START(src, ghost_notif, 30 SECONDS) + playsound_client(ghost.client, 'sound/effects/adminhelp_new.ogg') + to_chat(ghost, SPAN_BOLDNOTICE("Your heart is struggling to pump! There is a chance you might get up!(Verbs -> Ghost -> Re-enter corpse, or click here!)")) return TRUE /datum/chem_property/positive/hyperdensificating diff --git a/sound/effects/Heart Beat Short.ogg b/sound/effects/heart_beat_short.ogg similarity index 100% rename from sound/effects/Heart Beat Short.ogg rename to sound/effects/heart_beat_short.ogg From 1dc52fd06efe52e224c8d24158654c415d09f888 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 07:52:50 +0100 Subject: [PATCH 122/199] Automatic changelog for PR #4590 [ci skip] --- html/changelogs/AutoChangeLog-pr-4590.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4590.yml diff --git a/html/changelogs/AutoChangeLog-pr-4590.yml b/html/changelogs/AutoChangeLog-pr-4590.yml new file mode 100644 index 000000000000..df23394b9226 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4590.yml @@ -0,0 +1,5 @@ +author: "kiVts" +delete-after: True +changes: + - rscadd: "Ghosts get notified when they are being revived by DFB property" + - balance: "DFB property healing threshold lowered, You can create DFB property higher than one." \ No newline at end of file From 7928c2eb0e6edbfa2cf11f4be3f86ef6d8c00d62 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 11:16:44 +0200 Subject: [PATCH 123/199] Hotfixes Megaphone X Offset (#4741) # About the pull request Insufficient testing made me once more commit this mistake, because the langchat image is not regenerated the text keeps offsetting every time, drifting away and offscreen. This hotfixes it. closes #4742 # Changelog :cl: fix: Re-fixed Megaphone above-head-chat drifting to the left. /:cl: --- code/datums/langchat/langchat.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm index af51a7196020..3f00c26b6d36 100644 --- a/code/datums/langchat/langchat.dm +++ b/code/datums/langchat/langchat.dm @@ -102,6 +102,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH + langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) langchat_listeners = listeners for(var/mob/M in langchat_listeners) @@ -148,7 +149,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH * 2 - langchat_image.maptext_x -= LANGCHAT_WIDTH / 2 + langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) - LANGCHAT_WIDTH / 2 langchat_listeners = listeners for(var/mob/M in langchat_listeners) From 3a0cccec36c55b51c0b6b9969bde7e7292ce4930 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 10:25:29 +0100 Subject: [PATCH 124/199] Automatic changelog for PR #4741 [ci skip] --- html/changelogs/AutoChangeLog-pr-4741.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4741.yml diff --git a/html/changelogs/AutoChangeLog-pr-4741.yml b/html/changelogs/AutoChangeLog-pr-4741.yml new file mode 100644 index 000000000000..ec52d20b80b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4741.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Re-fixed Megaphone above-head-chat drifting to the left." \ No newline at end of file From 34ee2403613620c666877a01e4055578e16a997b Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:49:52 +0200 Subject: [PATCH 125/199] Unbinds ahelp due to it being doubled up (#4749) # About the pull request This removes the default bind for AdminHelp because SSinput already has an hardcoded bind for it, causing it to fire twice. You're still welcome to also bind ahelp to another key. This does not affect existing users because it only changes the default preset. # Explain why it's good for the game It's less of an issue with the new tgui ahelp box but has been a thing forever and still doubles up the chat help message. # Testing Photographs and Procedure Reset keybinds, pressed F1, tried reloading game etc # Changelog :cl: fix: Removed redundant double binding for F1 to AdminHelp from default keybinds. This does not affect existing users or their settings. /:cl: --- code/datums/keybinding/client.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index a5baf09a1360..752287882277 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -4,8 +4,8 @@ /datum/keybinding/client/admin_help - hotkey_keys = list("F1") - classic_keys = list("F1") + hotkey_keys = list("Unbound") + classic_keys = list("Unbound") name = "admin_help" full_name = "Admin Help" description = "Ask an admin for help." From cfa842ec19654eab70060f0120fe7dc1633e7227 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 22:58:00 +0100 Subject: [PATCH 126/199] Automatic changelog for PR #4749 [ci skip] --- html/changelogs/AutoChangeLog-pr-4749.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4749.yml diff --git a/html/changelogs/AutoChangeLog-pr-4749.yml b/html/changelogs/AutoChangeLog-pr-4749.yml new file mode 100644 index 000000000000..1e75689c0ad4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4749.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Removed redundant double binding for F1 to AdminHelp from default keybinds. This does not affect existing users or their settings." \ No newline at end of file From f9c27bb785012eefdac4f3744432fcdf7fc1e01d Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:50:54 +0200 Subject: [PATCH 127/199] Add a noise to paper stamping (#4748) # About the pull request Adds a paper stamping noise. Reuses Predalien stomp noise because frankly it's just very fitting. # Explain why it's good for the game Increases Reqs Productivity by 400% thanks to auditive feedback. Stamping the papers has never felt so satisfying. # Testing Photographs and Procedure This PR has been stamped by the System Administrators Cabal. # Changelog :cl: add: Stamping papers now makes a noise. /:cl: --- code/modules/paperwork/paper.dm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 71d1090b20e0..bde60ef3a368 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -382,9 +382,6 @@ /obj/item/paper/attackby(obj/item/P, mob/user) ..() - var/clown = 0 - if(user.mind && (user.job == "Clown")) - clown = 1 if(istype(P, /obj/item/paper) || istype(P, /obj/item/photo)) if (istype(P, /obj/item/paper/carbon)) @@ -424,6 +421,7 @@ return stamps += (stamps=="" ? "
" : "
") + "This paper has been stamped with the [P.name]." + playsound(src, 'sound/effects/alien_footstep_medium3.ogg', 20, TRUE, 6) var/image/stampoverlay = image('icons/obj/items/paper.dmi') var/x @@ -439,11 +437,6 @@ stampoverlay.pixel_x = x stampoverlay.pixel_y = y - if(istype(P, /obj/item/tool/stamp/clown)) - if(!clown) - to_chat(user, SPAN_NOTICE("You are totally unable to use the stamp. HONK!")) - return - if(!ico) ico = new ico += "paper_[P.icon_state]" From 30455997a78aeecdd5ecb59cabcd3ec093a7cda5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 23:13:06 +0100 Subject: [PATCH 128/199] Automatic changelog for PR #4748 [ci skip] --- html/changelogs/AutoChangeLog-pr-4748.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4748.yml diff --git a/html/changelogs/AutoChangeLog-pr-4748.yml b/html/changelogs/AutoChangeLog-pr-4748.yml new file mode 100644 index 000000000000..5b188fdc384e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4748.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - rscadd: "Stamping papers now makes a noise." \ No newline at end of file From 8666c6e22c8e35f52a954febd180121d62b632d4 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Sat, 21 Oct 2023 14:51:49 -0700 Subject: [PATCH 129/199] Mentors can now unmark mhelps (#4747) # About the pull request Changes the "Mark" button into a "Mark/Unmark" button, allowing mentors to unmark Mhelps. Ideally Mhelps should get a status tab or UI like adminhelps, but this is a good-enough stopgap # Explain why it's good for the game Unmarking mhelps is a fairly important thing because of all the reasons why a question may not be answered by the current mentor (AFK, accidentally clicked, etc.) that can currently only be solved by VV. # Changelog :cl: add: Mentors can now unmark mhelps /:cl: --- code/modules/mentor/mentorhelp.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index 7746e90d960d..bd40af9cbf3e 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -169,10 +169,7 @@ if(sender == author) message_title = "MentorHelp" // If there's a mentor, let them mark it. If not, let them unmark it - if(mentor) - message_sender_options = " (Unmark" - else - message_sender_options = " (Mark" + message_sender_options = " (Mark/Unmark" message_sender_options += " | Close | AutoResponse)" var/message_header = SPAN_MENTORHELP("[message_title] from [message_sender_key]: [message_sender_options]
") @@ -274,9 +271,10 @@ if("autorespond") autoresponse(C) if("mark") - mark(C) - if("unmark") - unmark(C) + if(!mentor) + mark(C) + else + unmark(C) if("close") if(C == author || C == mentor || CLIENT_IS_STAFF(C)) close(C) From 7c1c20f37ff872707722da06c4eedf9e6d77b67e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 21 Oct 2023 23:27:22 +0100 Subject: [PATCH 130/199] Automatic changelog for PR #4747 [ci skip] --- html/changelogs/AutoChangeLog-pr-4747.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4747.yml diff --git a/html/changelogs/AutoChangeLog-pr-4747.yml b/html/changelogs/AutoChangeLog-pr-4747.yml new file mode 100644 index 000000000000..0b876d3bacde --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4747.yml @@ -0,0 +1,4 @@ +author: "Zonespace27" +delete-after: True +changes: + - rscadd: "Mentors can now unmark mhelps" \ No newline at end of file From c61e36b81bb056a164c3217a38ea20b4a732cf20 Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:52:17 +0200 Subject: [PATCH 131/199] Fixes OB Warheads deletions (#4740) # About the pull request `runtime error: addtimer called with a callback assigned to a qdeleted object. In the future such timers will not be supported and may refuse to run or run with a 0 wait` Makes OB Warheads and especially cluster delete timely (after their explosion) saving us incertainties for most warheads, and a few hundreds of runtimes for cluster. # Explain why it's good for the game Cleaner logs, i can't see what's going on in there geez # Testing Photographs and Procedure Fired a cluster checking runtimes. That's it. # Changelog No player facing changes --- code/modules/admin/tabs/event_tab.dm | 7 +------ code/modules/cm_marines/orbital_cannon.dm | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index 2bd20b14ab56..b3e40af66ed7 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -931,13 +931,8 @@ message_admins("[key_name(usr)] has fired \an [warhead.name] at ([target.x],[target.y],[target.z]).") warhead.warhead_impact(target) - if(istype(warhead, /obj/structure/ob_ammo/warhead/cluster)) - // so the user's screen can shake for the duration of the cluster, otherwise we get a runtime. - QDEL_IN(warhead, OB_CLUSTER_DURATION) - else - QDEL_IN(warhead, OB_CRASHING_DOWN) else - warhead.loc = target + warhead.forceMove(target) /client/proc/change_taskbar_icon() set name = "Set Taskbar Icon" diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 8d80f80860f3..5a3cad590c08 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -217,15 +217,16 @@ var/list/ob_type_fuel_requirements if(user) tray.warhead.source_mob = user - tray.warhead.warhead_impact(target) + var/obj/structure/ob_ammo/warhead/warhead = tray.warhead + tray.warhead = null + warhead.moveToNullspace() + warhead.warhead_impact(target) sleep(OB_CRASHING_DOWN) ob_cannon_busy = FALSE - chambered_tray = FALSE tray.fuel_amt = 0 - QDEL_NULL(tray.warhead) tray.update_icon() update_icon() @@ -357,6 +358,9 @@ var/list/ob_type_fuel_requirements var/max_shake_factor var/max_knockdown_time + // Note that the warhead should be cleared of location by the firing proc, + // then auto-delete at the end of the warhead_impact implementation + /obj/structure/ob_ammo/warhead/proc/warhead_impact(turf/target) // make damn sure everyone hears it playsound(target, 'sound/weapons/gun_orbital_travel.ogg', 100, 1, 75) @@ -366,7 +370,7 @@ var/list/ob_type_fuel_requirements message_admins(FONT_SIZE_XL("CLICK TO CANCEL THIS OB")) var/relative_dir - for(var/mob/M in range(30, target)) + for(var/mob/M in urange(30, target)) if(get_turf(M) == target) relative_dir = 0 else @@ -377,7 +381,7 @@ var/list/ob_type_fuel_requirements ) sleep(OB_TRAVEL_TIMING/3) - for(var/mob/M in range(25, target)) + for(var/mob/M in urange(25, target)) if(get_turf(M) == target) relative_dir = 0 else @@ -388,7 +392,7 @@ var/list/ob_type_fuel_requirements ) sleep(OB_TRAVEL_TIMING/3) - for(var/mob/M in range(15, target)) + for(var/mob/M in urange(15, target)) M.show_message( \ SPAN_HIGHDANGER("OH GOD THE SKY WILL EXPLODE!!!"), SHOW_MESSAGE_VISIBLE, \ SPAN_HIGHDANGER("YOU SHOULDN'T BE HERE!"), SHOW_MESSAGE_AUDIBLE \ @@ -455,6 +459,7 @@ var/list/ob_type_fuel_requirements handle_ob_shake(target) sleep(double_explosion_delay) cell_explosion(target, standard_power, standard_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data) + qdel(src) return // Checks turf around the target @@ -464,8 +469,11 @@ var/list/ob_type_fuel_requirements handle_ob_shake(target) sleep(double_explosion_delay) cell_explosion(target, standard_power, standard_falloff, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data) + qdel(src) return + qdel(src) + /obj/structure/ob_ammo/warhead/incendiary name = "\improper Incendiary orbital warhead" warhead_kind = "incendiary" @@ -497,6 +505,7 @@ var/list/ob_type_fuel_requirements sleep(clear_delay) fire_spread(target, cause_data, distance, fire_level, burn_level, fire_color, fire_type, TURF_PROTECTION_OB) + qdel(src) /obj/structure/ob_ammo/warhead/cluster name = "\improper Cluster orbital warhead" @@ -533,8 +542,8 @@ var/list/ob_type_fuel_requirements if(protected_by_pylon(TURF_PROTECTION_OB, U)) //If the turf somehow gained OB protection while the cluster was firing continue fire_in_a_hole(U) - sleep(delay_between_clusters) + QDEL_IN(src, 5 SECONDS) // Leave time for last handle_ob_shake below /obj/structure/ob_ammo/warhead/cluster/proc/fire_in_a_hole(turf/loc) new /obj/effect/overlay/temp/blinking_laser (loc) From 13f73056cb6c8b32b4e8cb4f1e44e9a6286dd19a Mon Sep 17 00:00:00 2001 From: AndroBetel <44546836+AndroBetel@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:53:32 +0300 Subject: [PATCH 132/199] small 'typo' fix (#4744) # About the pull request fixes smartgunner far sight's log mentioning action name instead of head mounted sight's name # Explain why it's good for the game it was probably a mistype # Testing Photographs and Procedure
Screenshots & Videos before You enable Toggle Far Sight's far sight system. and after You enable M56 head mounted sight's far sight system.
# Changelog spellcheck: Tweaked message when using the M56 far sight system --- code/modules/clothing/glasses/night.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/night.dm b/code/modules/clothing/glasses/night.dm index afb711c3ca15..2a3780832e2a 100644 --- a/code/modules/clothing/glasses/night.dm +++ b/code/modules/clothing/glasses/night.dm @@ -187,7 +187,7 @@ if(target) var/obj/item/clothing/glasses/night/m56_goggles/G = target G.set_far_sight(owner, !G.far_sight) - to_chat(owner, SPAN_NOTICE("You [G.far_sight ? "enable" : "disable"] \the [src]'s far sight system.")) + to_chat(owner, SPAN_NOTICE("You [G.far_sight ? "enable" : "disable"] \the [G]'s far sight system.")) /datum/action/item_action/m56_goggles/far_sight/update_button_icon() if(!target) From 33456c17735d8faeedde72340cf6780b2625360f Mon Sep 17 00:00:00 2001 From: fira Date: Sat, 21 Oct 2023 23:54:42 +0200 Subject: [PATCH 133/199] fix reqs vendors sprites (#4745) # About the pull request Snowflake Reqs sprites for vendors are instanciated in map rather than using the dedicated subtypes. This causes the sprite to revert to normal vendor rack when you use it. Bleh. Witness: ![image](https://github.com/cmss13-devs/cmss13/assets/604624/c80d6182-2bc5-4776-88f3-be6caf5bf70e) ![image](https://github.com/cmss13-devs/cmss13/assets/604624/8e8da429-8514-4169-bf28-ccd8437652d5) The attachie vendor just wasn't messed up. I'm pretty sure this already got fixed before and was just reverted by sloppy map merging. # Explain why it's good for the game CM Dev gave me these cool sprites, I'm going to use all the cool sprites!!! # Testing Photographs and Procedure See above. # Changelog :cl: fix: Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in with the walls again. /:cl: --- code/game/machinery/vending/vendor_types/requisitions.dm | 4 ++-- code/game/turfs/walls/wall_types.dm | 4 ++-- maps/map_files/USS_Almayer/USS_Almayer.dmm | 8 ++------ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 07284e7f8e71..8558019839f7 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -192,7 +192,7 @@ turf_to_vent_to = H.loc return turf_to_vent_to -/obj/structure/machinery/cm_vending/sorted/cargo_guns/blend +/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend icon_state = "req_guns_wall" tiles_with = list( /obj/structure/window/framed/almayer, @@ -296,7 +296,7 @@ updateUsrDialog() return //We found our item, no reason to go on. -/obj/structure/machinery/cm_vending/sorted/cargo_ammo/blend +/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend icon_state = "req_ammo_wall" tiles_with = list( /obj/structure/window/framed/almayer, diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 22979858ce62..1b4091eb2aab 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -24,8 +24,8 @@ /obj/structure/girder, /obj/structure/machinery/door, /obj/structure/machinery/cm_vending/sorted/attachments/blend, - /obj/structure/machinery/cm_vending/sorted/cargo_ammo/blend, - /obj/structure/machinery/cm_vending/sorted/cargo_guns/blend, + /obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend, + /obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend, ) /turf/closed/wall/almayer/update_icon() diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 3740158c7e0f..b2b300133d12 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -22749,9 +22749,7 @@ /turf/closed/wall/almayer, /area/almayer/squads/req) "bQS" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo{ - icon_state = "req_ammo_wall" - }, +/obj/structure/machinery/cm_vending/sorted/cargo_ammo/cargo/blend, /turf/open/floor/almayer{ icon_state = "green" }, @@ -24366,9 +24364,7 @@ /turf/open/floor/almayer, /area/almayer/hallways/vehiclehangar) "bYa" = ( -/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo{ - icon_state = "req_guns_wall" - }, +/obj/structure/machinery/cm_vending/sorted/cargo_guns/cargo/blend, /turf/open/floor/almayer{ dir = 10; icon_state = "green" From bed5fd967489dc56d0697a7356f0655eeefd5edd Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:01:24 +0100 Subject: [PATCH 134/199] Automatic changelog for PR #4745 [ci skip] --- html/changelogs/AutoChangeLog-pr-4745.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4745.yml diff --git a/html/changelogs/AutoChangeLog-pr-4745.yml b/html/changelogs/AutoChangeLog-pr-4745.yml new file mode 100644 index 000000000000..b4e23e494b14 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4745.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in with the walls again." \ No newline at end of file From 7683b08631b86b2a608b455e756c9cef11e459d5 Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:06:06 +0100 Subject: [PATCH 135/199] prevents a href token error when changing gamemode (#4739) they were trying to recall topic but without providing a href token. i could provide a href token so this panel updated correctly, but i also don't think it matters that much (given it never worked, anyway) :cl: admin: no more href token errors when changing the game mode via game panel /:cl: --- code/modules/admin/topic/topic.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 8bbc99925239..8308d9c5644b 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -697,7 +697,6 @@ to_world(SPAN_NOTICE("The mode is now: [GLOB.master_mode]!")) Game() // updates the main game menu SSticker.save_mode(GLOB.master_mode) - .(href, list("c_mode"=1)) else if(href_list["f_secret2"]) From 9eead96223ee77d86686c61631b19f3f628b2811 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:23:55 +0100 Subject: [PATCH 136/199] Automatic changelog for PR #4739 [ci skip] --- html/changelogs/AutoChangeLog-pr-4739.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4739.yml diff --git a/html/changelogs/AutoChangeLog-pr-4739.yml b/html/changelogs/AutoChangeLog-pr-4739.yml new file mode 100644 index 000000000000..5d99c028a181 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4739.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - admin: "no more href token errors when changing the game mode via game panel" \ No newline at end of file From c32d56d928c0424f9a55823f116298c0dd1b39bb Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:06:21 +0100 Subject: [PATCH 137/199] adds a round id box to the issue template (#4737) so we can look at logs a little easier no playerfacing changes --- .github/ISSUE_TEMPLATE/bug_report.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 49eda07616c2..5eb8f0219e73 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -10,6 +10,12 @@ body: placeholder: "#1, #2, #3, etc" validations: required: true + - type: input + id: round-id + attributes: + label: Round ID + description: If known, what was the Round ID this bug was found on? Can be left blank if unknown or occured across multiple rounds. + placeholder: "12345" - type: textarea id: what-happened attributes: From 497f0d5a39edebff4bb0a8c03f41f9fe1970a5bc Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:07:00 +0100 Subject: [PATCH 138/199] removes hard coded discord links (#4736) i hate hardcoded urls :cl: fix: mentorhelp response no longer gives a dead discord link /:cl: --- code/modules/mentor/mentorhelp.dm | 2 +- interface/interface.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index bd40af9cbf3e..695ec604631e 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -325,7 +325,7 @@ var/msg = SPAN_MENTORSAY("Autoresponse: [choice]") switch(choice) if("L: Discord") - msg += "You can join our Discord server by using this link!" + msg += "You can join our Discord server by using this link!" if("L: Xeno Quickstart Guide") msg += "Your answer can be found on the Xeno Quickstart Guide on our wiki. Check it out here." if("L: Marine Quickstart Guide") diff --git a/interface/interface.dm b/interface/interface.dm index a37ab648b7f5..c9112160d94f 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -55,7 +55,7 @@ if(tgui_alert(src, "This will open the discord in your browser. Are you sure?", "Confirm", list("Yes", "No")) != "Yes") return - src << link("https://discord.gg/cmss13") + src << link("[CONFIG_GET(string/discordurl)]") return /client/verb/submitbug() From d6bdc1200065c019dfbe244bb51d93ebd029374a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 00:50:22 +0100 Subject: [PATCH 139/199] Automatic changelog for PR #4736 [ci skip] --- html/changelogs/AutoChangeLog-pr-4736.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4736.yml diff --git a/html/changelogs/AutoChangeLog-pr-4736.yml b/html/changelogs/AutoChangeLog-pr-4736.yml new file mode 100644 index 000000000000..3efd380ae2ca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4736.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - bugfix: "mentorhelp response no longer gives a dead discord link" \ No newline at end of file From 972d3f3c6b41a6b93b41c1dc5aa46df8b25fcb8d Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:08:20 +0100 Subject: [PATCH 140/199] backports mariadb compatibility (#4735) thanks morrow https://github.com/PvE-CMSS13/PvE-CMSS13/pull/9 :cl: Morrow server: the rustg mysql driver is now properly compatible with mariadb /:cl: Co-authored-by: morrowwolf --- code/datums/_ndatabase/code/brsql_adapter.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index 345ddfe005f3..a424b3fd6f9e 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -530,7 +530,7 @@ if(first && !is_id) if(!items_first) update_items+="," - update_items+="`[table_name]`.[esfield]=`__prep_update`.[esfield]" + update_items+="`[table_name]`.[esfield]=`subquery`.[esfield]" items_first = FALSE local_first = FALSE calltext += "SELECT [local_text]" @@ -539,9 +539,7 @@ issue_log += "No ID passed to update query." return "" // AAAAAAAAAAAAAH FUCK DON'T JUST KILL THE ENTIRE FUCKING TABLE BRUH return {" - WITH __prep_update as ( - [calltext] - ) UPDATE `[connection.database]`.`[table_name]` INNER JOIN `__prep_update` ON `[table_name]`.id = `__prep_update`.id SET [update_items] + UPDATE `[connection.database]`.`[table_name]` JOIN (WITH `__prep_update` AS ( [calltext] ) SELECT * FROM `__prep_update`) subquery ON `[table_name]`.id = subquery.id SET [update_items] "} /datum/db/adapter/brsql_adapter/proc/getquery_delete_table(table_name, list/ids) From ef3c179ade04bc59281750914a9f142605aaae18 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 01:06:28 +0100 Subject: [PATCH 141/199] Automatic changelog for PR #4735 [ci skip] --- html/changelogs/AutoChangeLog-pr-4735.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4735.yml diff --git a/html/changelogs/AutoChangeLog-pr-4735.yml b/html/changelogs/AutoChangeLog-pr-4735.yml new file mode 100644 index 000000000000..a92d5015c303 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4735.yml @@ -0,0 +1,4 @@ +author: "Morrow" +delete-after: True +changes: + - server: "the rustg mysql driver is now properly compatible with mariadb" \ No newline at end of file From 5d2771b4e2b62279faa9a846a4bc0477fbff0044 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 21 Oct 2023 15:08:36 -0700 Subject: [PATCH 142/199] Disables code in icon2html that causes bad icon operations (#4732) # About the pull request This PR disables MrStonedOne's workaround in icon2html specifically for humans. Rather than throwing a bad icon operation, the resulting icon will just be blank. # Explain why it's good for the game Situations that cause tens of thousands of runtimes in a round need to be eliminated. # Testing Photographs and Procedure
Screenshots & Videos 1. Inject Carbon and Nitrogen into self 2. Inject Oxygen into self 3. Observe a reaction for a blank icon (you) rather than throwing errors. ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/efbd7eea-69c5-4968-8c24-8f79c66970df)
# Changelog :cl: Drathek fix: Disabled code in icon2html that is causing bad icon operations /:cl: --- code/__HELPERS/icons.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index edc711d25bc1..1116f1acb2a8 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -732,11 +732,12 @@ world if (isnull(dir)) dir = thing.dir - if (ishuman(thing)) // Shitty workaround for a BYOND issue. + // Commented out because this is seemingly our source of bad icon operations + /* if (ishuman(thing)) // Shitty workaround for a BYOND issue. var/icon/temp = icon2collapse icon2collapse = icon() icon2collapse.Insert(temp, dir = SOUTH) - dir = SOUTH + dir = SOUTH*/ else if (isnull(dir)) dir = SOUTH From ca47702875ebadecfe0e2a104e26bfbb42515702 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 01:25:50 +0100 Subject: [PATCH 143/199] Automatic changelog for PR #4732 [ci skip] --- html/changelogs/AutoChangeLog-pr-4732.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4732.yml diff --git a/html/changelogs/AutoChangeLog-pr-4732.yml b/html/changelogs/AutoChangeLog-pr-4732.yml new file mode 100644 index 000000000000..afe968b3a583 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4732.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Disabled code in icon2html that is causing bad icon operations" \ No newline at end of file From 23e0d1d0cbbf60b08b3d124104ccf2e7d1fdd05c Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:11:47 +0100 Subject: [PATCH 144/199] od linter (#4645) uses opendream's compiler for a bit of extended linting, i guess we'll see how many extra errors this'll pick up heavy lifting down by aa07 on https://github.com/ParadiseSS13/Paradise/pull/21099 so far as wrestling OD into CI and the #include tricks --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .github/workflows/ci_suite.yml | 28 +++++++ .gitignore | 3 + code/__DEFINES/bullet_traits.dm | 2 +- code/__HELPERS/type2type.dm | 5 +- code/__odlint.dm | 11 +++ code/__pragmas.dm | 27 +++++++ code/_byond_version_compat.dm | 2 +- code/_compile_options.dm | 2 +- code/controllers/subsystem/atoms.dm | 2 +- code/controllers/subsystem/vote.dm | 2 +- code/datums/_ndatabase/code/brsql_adapter.dm | 4 +- code/datums/_ndatabase/code/native_adapter.dm | 3 +- code/game/machinery/OpTable.dm | 2 - code/game/machinery/air_alarm.dm | 2 - code/game/machinery/bots/mulebot.dm | 2 +- code/game/machinery/computer/computer.dm | 2 - code/game/machinery/computer/medical.dm | 7 -- code/game/machinery/computer/pod.dm | 1 - code/game/machinery/computer/robot.dm | 3 +- code/game/machinery/computer/skills.dm | 45 +++++------ code/game/machinery/deployable.dm | 1 - .../game/machinery/medical_pod/bodyscanner.dm | 4 - code/game/machinery/medical_pod/sleeper.dm | 1 - code/game/machinery/vending/vending.dm | 35 ++++---- code/game/objects/effects/glowshroom.dm | 2 - code/game/objects/explosion_recursive.dm | 2 +- code/game/objects/items.dm | 1 - .../items/reagent_containers/food/snacks.dm | 3 +- code/game/objects/items/stacks/nanopaste.dm | 2 +- .../objects/items/storage/large_holster.dm | 2 +- .../objects/structures/barricade/barricade.dm | 2 +- .../objects/structures/barricade/handrail.dm | 2 +- code/game/objects/structures/bookcase.dm | 2 - .../crates_lockers/closets/utility_closets.dm | 2 - .../structures/crates_lockers/crates.dm | 2 - code/game/objects/structures/lattice.dm | 2 - .../objects/structures/reagent_dispensers.dm | 2 - code/modules/admin/topic/topic.dm | 80 ------------------- code/modules/asset_cache/asset_list_items.dm | 2 +- code/modules/client/preferences.dm | 7 +- code/modules/clothing/suits/armor.dm | 2 +- .../modules/desert_dam/filtration/consoles.dm | 2 - code/modules/flufftext/Chinese.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 1 - .../modules/projectiles/guns/flamer/flamer.dm | 2 - .../reagents/chemistry_reagents/drink.dm | 8 +- colonialmarines.dme | 3 +- dependencies.sh | 2 + tools/ci/download_od.sh | 11 +++ tools/ci/run_od.sh | 4 + tools/ci/setup_od.sh | 7 ++ tools/ci/validate_dme.py | 3 + 52 files changed, 161 insertions(+), 199 deletions(-) create mode 100644 code/__odlint.dm create mode 100644 code/__pragmas.dm create mode 100644 tools/ci/download_od.sh create mode 100644 tools/ci/run_od.sh create mode 100644 tools/ci/setup_od.sh diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 683f3909b447..0488055312f7 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -60,6 +60,34 @@ jobs: with: outputFile: output-annotations.txt + + odlint: + name: Lint with OpenDream + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - name: Get OpenDream Version + run: | + source dependencies.sh + echo "OPENDREAM_VERSION=$OPENDREAM_VERSION" >> $GITHUB_ENV + - name: Restore OpenDream cache + uses: actions/cache@v3 + id: cache-od + with: + path: ~/OpenDream + key: ${{ runner.os }}-opendream-${{ env.OPENDREAM_VERSION }} + - name: Download OpenDream + if: steps.cache-od.outputs.cache-hit != 'true' + run: | + bash tools/ci/download_od.sh + - name: Setup OpenDream + if: steps.cache-od.outputs.cache-hit != 'true' + run: | + bash tools/ci/setup_od.sh + - name: Run OpenDream + run: | + bash tools/ci/run_od.sh + compile_all_maps: if: "!contains(github.event.head_commit.message, '[ci skip]')" name: Compile Maps diff --git a/.gitignore b/.gitignore index 210efc84d75b..4d2b7e810de8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ test_environment.txt # byond-tracy backend, not shipped with the codebase so it shouldn't be maintained prof.dll libprof.so + +# OpenDream compatibility stuff +colonialmarines.json diff --git a/code/__DEFINES/bullet_traits.dm b/code/__DEFINES/bullet_traits.dm index 0ca3bce2e602..40e250cd0dd2 100644 --- a/code/__DEFINES/bullet_traits.dm +++ b/code/__DEFINES/bullet_traits.dm @@ -3,7 +3,7 @@ // list of args if there are any args /// An entry to a list for giving projectiles bullet traits /// Must be placed inside of a list -#define BULLET_TRAIT_ENTRY(trait, args...) trait = #args ? list(##args) : null +#define BULLET_TRAIT_ENTRY(trait, args...) trait = list(##args) /// An entry to a list for giving projectiles bullet traits with a unique ID /// Must be placed inside of a list #define BULLET_TRAIT_ENTRY_ID(id, trait, args...) id = list(trait, ##args) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 4e4a1b3ff31c..5d0d113b0c55 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -21,7 +21,7 @@ var/char = copytext(hex, i, i + 1) switch(char) if("0") - //Apparently, switch works with empty statements, yay! If that doesn't work, blame me, though. -- Urist + pass() if("9", "8", "7", "6", "5", "4", "3", "2", "1") num += text2num(char) * 16 ** power if("a", "A") @@ -77,7 +77,6 @@ hex += "E" if(15.0) hex += "F" - else power-- while(length(hex) < placeholder) hex = text("0[]", hex) @@ -165,8 +164,6 @@ return 6 if("SOUTHWEST") return 10 - else - return //Converts an angle (degrees) into an ss13 direction /proc/angle2dir(degree) diff --git a/code/__odlint.dm b/code/__odlint.dm new file mode 100644 index 000000000000..f42517133746 --- /dev/null +++ b/code/__odlint.dm @@ -0,0 +1,11 @@ +// This file is included right at the start of the DME. +// Its purpose is to enable multiple lints (pragmas) that are supported by OpenDream to better validate the codebase +// These are essentially nitpicks the DM compiler should pick up on but doesnt + +#ifndef SPACEMAN_DMM +#ifdef OPENDREAM +// These are in their own file as you need to do it with an include as a hack to avoid +// SpacemanDMM evaluating the #pragma lines, even if its outside a block it cares about +#include "__pragmas.dm" +#endif +#endif diff --git a/code/__pragmas.dm b/code/__pragmas.dm new file mode 100644 index 000000000000..39c14e1bbc95 --- /dev/null +++ b/code/__pragmas.dm @@ -0,0 +1,27 @@ +//1000-1999 +#pragma FileAlreadyIncluded error +#pragma MissingIncludedFile error +#pragma MisplacedDirective error +#pragma UndefineMissingDirective error +#pragma DefinedMissingParen error +#pragma ErrorDirective error +#pragma WarningDirective error +#pragma MiscapitalizedDirective error + +//2000-2999 +#pragma SoftReservedKeyword error +#pragma DuplicateVariable error +#pragma DuplicateProcDefinition error +#pragma TooManyArguments error +#pragma PointlessParentCall error +#pragma PointlessBuiltinCall error +#pragma SuspiciousMatrixCall error +#pragma MalformedRange error +#pragma InvalidRange error +#pragma InvalidSetStatement error +#pragma InvalidOverride error +#pragma DanglingVarType error +#pragma MissingInterpolatedExpression error + +//3000-3999 +#pragma EmptyBlock error diff --git a/code/_byond_version_compat.dm b/code/_byond_version_compat.dm index 719d85654b5f..26968f0f837c 100644 --- a/code/_byond_version_compat.dm +++ b/code/_byond_version_compat.dm @@ -3,7 +3,7 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 #define MIN_COMPILER_BUILD 1588 -#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) +#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. #error You need version 514.1588 or higher diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 0f81b0173ac1..20aa2081318c 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -30,7 +30,7 @@ #define CBT #endif -#if !defined(CBT) && !defined(SPACEMAN_DMM) +#if !defined(CBT) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) #warn Building with Dream Maker is no longer supported and will result in errors. #warn In order to build, run BUILD.bat in the bin directory. #warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 23da8cc8c9eb..3d544dca1390 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -131,7 +131,7 @@ SUBSYSTEM_DEF(atoms) switch(result) if (INITIALIZE_HINT_NORMAL) - // pass + pass() if(INITIALIZE_HINT_LATELOAD) if(arguments[1]) //mapload late_loaders += A diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 3882228a5ab1..a56e10636a1e 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -273,7 +273,7 @@ SUBSYSTEM_DEF(vote) question = "Gamemode vote" randomize_entries = TRUE for(var/mode_type in config.gamemode_cache) - var/datum/game_mode/M = initial(mode_type) + var/datum/game_mode/M = mode_type if(initial(M.config_tag)) var/vote_cycle_met = !initial(M.vote_cycle) || (text2num(SSperf_logging?.round?.id) % initial(M.vote_cycle) == 0) if(initial(M.votable) && vote_cycle_met) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index a424b3fd6f9e..251267a04fdb 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -101,8 +101,8 @@ SSdatabase.create_parametric_query(query_updatetable, qpars, CB) /datum/db/adapter/brsql_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) - if(!sync) - set waitfor = 0 + set waitfor = FALSE + var/length = values.len var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, qpars) diff --git a/code/datums/_ndatabase/code/native_adapter.dm b/code/datums/_ndatabase/code/native_adapter.dm index a5e4d41fb6a0..1c23a6ceab8f 100644 --- a/code/datums/_ndatabase/code/native_adapter.dm +++ b/code/datums/_ndatabase/code/native_adapter.dm @@ -83,8 +83,7 @@ SSdatabase.create_query(query_gettable, CB) /datum/db/adapter/native_adapter/update_table(table_name, list/values, datum/callback/CB, sync = FALSE) - if(!sync) - set waitfor = 0 + set waitfor = FALSE for(var/list/vals in values) var/list/qpars = list() diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 3c4104b6c283..c9092a750f73 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -59,8 +59,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/optable/get_examine_text(mob/user) . = ..() diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 16512a944be1..e6fc0c8de76e 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -431,8 +431,6 @@ var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function AAlarmwires |= wireFlag switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - if(AALARM_WIRE_POWER) shorted = 0 shock(usr, 50) diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index b70829c708ed..d82591994e7b 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -551,7 +551,7 @@ var/speed = ((wires & WIRE_MOTOR1) ? 1:0) + ((wires & WIRE_MOTOR2) ? 2:0) switch(speed) if(0) - // do nothing + pass() if(1) process_bot() spawn(2) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index adce72f7d8b6..304b24a14f04 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -53,8 +53,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/computer/bullet_act(obj/projectile/Proj) if(exproof) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index b68ca41d6f09..fe85599018ae 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -123,7 +123,6 @@ else dat += "
[bdat]" - else else dat += text("{Log In}", src) show_browser(user, dat, "Medical Records", "med_rec") @@ -365,8 +364,6 @@ for(var/datum/data/record/E in GLOB.data_core.medical) if ((E.fields["ref"] == R.fields["ref"] || E.fields["id"] == R.fields["id"])) M = E - else - //Foreach continue //goto(2540) src.active1 = R src.active2 = M src.screen = 4 @@ -417,16 +414,12 @@ for(var/datum/data/record/R as anything in GLOB.data_core.medical) if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]))) src.active2 = R - else - //Foreach continue //goto(3229) if (!active2) temp = "Could not locate record [t1]." else for(var/datum/data/record/E in GLOB.data_core.general) if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) src.active1 = E - else - //Foreach continue //goto(3334) src.screen = 4 if (href_list["print_p"]) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 3858230a089c..f6adaa8edd4e 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -20,7 +20,6 @@ for(var/obj/structure/machinery/mass_driver/M in machines) if(M.id == id) connected = M - else return return diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 12f4faedc979..c5a13e2c3e74 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -55,8 +55,7 @@ dat += " Locked Down |" else dat += " Operating Normally |" - if (!R.canmove) - else if(R.cell) + if(R.canmove && R.cell) dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" else dat += " No Cell Installed |" diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index f891d46bc36b..a20d344b53a9 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -43,16 +43,16 @@ var/dat if (temp) - dat = text("[]

Clear Screen", temp, src) + dat = "[temp]

Clear Screen" else - dat = text("Confirm Identity: []
", src, (scan ? text("[]", scan.name) : "----------")) + dat = "Confirm Identity: [scan ? scan.name : "----------"]
" if (authenticated) switch(screen) if(1.0) dat += {"

"} - dat += text("Search Records
", src) - dat += text("New Record
", src) + dat += "Search Records
" + dat += "New Record
" dat += {"

@@ -70,20 +70,19 @@ if(!isnull(GLOB.data_core.general)) for(var/datum/data/record/R in sortRecord(GLOB.data_core.general, sortBy, order)) for(var/datum/data/record/E in GLOB.data_core.security) - var/background - dat += text("", background, src, R, R.fields["name"]) - dat += text("", R.fields["id"]) - dat += text("", R.fields["rank"]) + dat += "" + dat += "" + dat += "" dat += "
[][][]
[R.fields["name"]][R.fields["id"]][R.fields["rank"]]

" - dat += text("Record Maintenance

", src) - dat += text("{Log Out}",src) + dat += "Record Maintenance

" + dat += "{Log Out}" if(2.0) dat += "Records Maintenance
" dat += "
Delete All Records

Back" if(3.0) dat += "
Employment Record

" if ((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))) - dat += text("
\ + dat += " \
\ Name: [active1.fields["name"]]
\ ID: [active1.fields["id"]]
\n \ Sex: [active1.fields["sex"]]
\n \ @@ -93,18 +92,18 @@ Mental Status: [active1.fields["m_stat"]]

\n \ Employment/skills summary:
[decode(active1.fields["notes"])]
Photo:
\ -
") +
" else dat += "General Record Lost!
" - dat += text("\nDelete Record (ALL)

\nPrint Record
\nBack
", src, src, src) + dat += "\nDelete Record (ALL)

\nPrint Record
\nBack
" if(4.0) if(!Perp.len) - dat += text("ERROR. String could not be located.

Back", src) + dat += "ERROR. String could not be located.

Back" else dat += {" "} - dat += text("", tempname) + dat += "" dat += {"
Search Results for '[]':Search Results for '[tempname]':
@@ -121,17 +120,14 @@ if(istype(Perp[i+1],/datum/data/record/)) var/datum/data/record/E = Perp[i+1] crimstat = E.fields["criminal"] - var/background - background = "'background-color:#00FF7F;'" - dat += text("[]", background, src, R, R.fields["name"]) - dat += text("[]", R.fields["id"]) - dat += text("[]", R.fields["rank"]) - dat += text("[]", crimstat) + dat += "[R.fields["name"]]" + dat += "[R.fields["id"]]" + dat += "[R.fields["rank"]]" + dat += "[crimstat]" dat += "
" - dat += text("
Return to index.", src) - else + dat += "
Return to index." else - dat += text("{Log In}", src) + dat += "{Log In}" show_browser(user, dat, "Employment Records", "secure_rec", "size=600x400") onclose(user, "secure_rec") return @@ -342,7 +338,6 @@ What a mess.*/ if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"])) GLOB.data_core.medical -= R qdel(R) - else QDEL_NULL(active1) else temp = "This function does not appear to be working at the moment. Our apologies." diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index e6df92d258c0..99996bea8978 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -54,7 +54,6 @@ src.health -= W.force * 0.75 if("brute") src.health -= W.force * 0.5 - else if (src.health <= 0) src.explode() ..() diff --git a/code/game/machinery/medical_pod/bodyscanner.dm b/code/game/machinery/medical_pod/bodyscanner.dm index 4756121e50ae..fdcd0ceb62e6 100644 --- a/code/game/machinery/medical_pod/bodyscanner.dm +++ b/code/game/machinery/medical_pod/bodyscanner.dm @@ -62,8 +62,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return #ifdef OBJECTS_PROXY_SPEECH // Transfers speech to occupant @@ -124,8 +122,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/machinery/body_scanconsole/power_change() ..() diff --git a/code/game/machinery/medical_pod/sleeper.dm b/code/game/machinery/medical_pod/sleeper.dm index 805fedb29257..35d9a44863d2 100644 --- a/code/game/machinery/medical_pod/sleeper.dm +++ b/code/game/machinery/medical_pod/sleeper.dm @@ -385,7 +385,6 @@ t1 = "Unconscious" if(2) t1 = "*dead*" - else to_chat(user, "[]\t Health %: [] ([])", (occupant.health > 50 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.health, t1) to_chat(user, "[]\t -Core Temperature: []°C ([]°F)
", (occupant.bodytemperature > 50 ? "" : ""), occupant.bodytemperature-T0C, occupant.bodytemperature*1.8-459.67) to_chat(user, "[]\t -Brute Damage %: []", (occupant.getBruteLoss() < 60 ? SPAN_NOTICE("") : SPAN_DANGER("")), occupant.getBruteLoss()) diff --git a/code/game/machinery/vending/vending.dm b/code/game/machinery/vending/vending.dm index a74dd923cbe7..414ab4a562e1 100644 --- a/code/game/machinery/vending/vending.dm +++ b/code/game/machinery/vending/vending.dm @@ -398,28 +398,25 @@ GLOBAL_LIST_EMPTY_TYPED(total_vending_machines, /obj/structure/machinery/vending /obj/structure/machinery/vending/proc/GetProductIndex(datum/data/vending_product/product) var/list/plist - switch(product.category) - if(CAT_NORMAL) - plist=product_records - if(CAT_HIDDEN) - plist=hidden_records - if(CAT_COIN) - plist=coin_records - else - warning("UNKNOWN CATEGORY [product.category] IN TYPE [product.product_path] INSIDE [type]!") + if(product.category == CAT_NORMAL) + plist = product_records + else if(product.category == CAT_HIDDEN) + plist = hidden_records + else if(product.category == CAT_COIN) + plist = coin_records + else + warning("UNKNOWN CATEGORY [product.category] IN TYPE [product.product_path] INSIDE [type]!") return plist.Find(product) /obj/structure/machinery/vending/proc/GetProductByID(pid, category) - switch(category) - if(CAT_NORMAL) - return product_records[pid] - if(CAT_HIDDEN) - return hidden_records[pid] - if(CAT_COIN) - return coin_records[pid] - else - warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") - return null + if(category == CAT_NORMAL) + return product_records[pid] + else if(category == CAT_HIDDEN) + return hidden_records[pid] + else if(category == CAT_COIN) + return coin_records[pid] + else + warning("UNKNOWN PRODUCT: PID: [pid], CAT: [category] INSIDE [type]!") /obj/structure/machinery/vending/attack_hand(mob/user) if(is_tipped_over) diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index bebe0ec8b27f..56c6ae45cda7 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -95,8 +95,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/effect/glowshroom/fire_act(exposed_temperature, exposed_volume) if(exposed_temperature > 300) diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 1f52901c21a6..82566c80302f 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -149,7 +149,7 @@ explosion resistance exactly as much as their health switch(angle) //this reduces power when the explosion is going around corners if (0) - //no change + pass() if (45) if(spread_power >= 0) spread_power *= 0.75 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2d142789fdaf..9dbe33e05135 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -268,7 +268,6 @@ cases. Override_icon_state should be a list.*/ size = "huge" if(SIZE_MASSIVE) size = "massive" - else . += "This is a [blood_color ? blood_color != "#030303" ? "bloody " : "oil-stained " : ""][icon2html(src, user)][src.name]. It is a [size] item." if(desc) . += desc diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 06a4d785e677..179e2014f8cf 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -182,8 +182,7 @@ return 0 var/inaccurate = 0 - if(W.sharp == IS_SHARP_ITEM_ACCURATE) - else if(W.sharp == IS_SHARP_ITEM_BIG) + if(W.sharp == IS_SHARP_ITEM_BIG) inaccurate = 1 else return 1 diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 32e9a030462e..754a36c6012a 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -40,7 +40,7 @@ H.pain.recalculate_pain() H.updatehealth() use(1) - var/others_msg = "\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"] [S.display_name] with \the [src]." // Needs to create vars for these messages because macro doesn't work otherwise + var/others_msg = "\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " the"] [S.display_name] with \the [src]." // Needs to create vars for these messages because macro doesn't work otherwise var/user_msg = "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name]." user.visible_message(SPAN_NOTICE("[others_msg]"),\ SPAN_NOTICE("[user_msg]")) diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index ef2bcfb7216a..b4a6c3a8c1af 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -326,7 +326,7 @@ /obj/item/storage/large_holster/fuelpack/get_examine_text(mob/user) . = ..() if(contents.len) - . += "It is storing \a M240-T incinerator unit." + . += "It is storing a M240-T incinerator unit." if (get_dist(user, src) <= 1) if(fuel) . += "The [fuel.caliber] currently contains: [round(fuel.get_ammo_percent())]% fuel." diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 0ca2ccb1ddbc..5a72ec33ea2a 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -78,7 +78,7 @@ switch(dir) if(SOUTH) layer = ABOVE_MOB_LAYER - else if(NORTH) + if(NORTH) layer = initial(layer) - 0.01 else layer = initial(layer) diff --git a/code/game/objects/structures/barricade/handrail.dm b/code/game/objects/structures/barricade/handrail.dm index ea10dc7256de..ae166dbbf985 100644 --- a/code/game/objects/structures/barricade/handrail.dm +++ b/code/game/objects/structures/barricade/handrail.dm @@ -24,7 +24,7 @@ switch(dir) if(SOUTH) layer = ABOVE_MOB_LAYER - else if(NORTH) + if(NORTH) layer = initial(layer) - 0.01 else layer = initial(layer) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index c71b2853ea07..becb0906e3c6 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -58,8 +58,6 @@ contents_explosion(severity) deconstruct(FALSE) return - else - return /obj/structure/bookcase/update_icon() if(contents.len < 5) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 7848aaba4897..b000fd5733a2 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -51,8 +51,6 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas(src) new /obj/item/storage/firstaid/o2(src) - if ("nothing") - // doot // teehee - Ah, tg coders... if ("delete") diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 7c9faaf1a027..9f0417ccb372 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -130,8 +130,6 @@ contents_explosion(severity) deconstruct(FALSE) return - else - return /obj/structure/closet/crate/alpha name = "alpha squad crate" diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 38201e052c50..d2b3d36b5920 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -43,8 +43,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob) diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index 7dc6d883a2d5..6471dfa21520 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -119,8 +119,6 @@ if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) deconstruct(FALSE) return - else - return /obj/structure/reagent_dispensers/attack_hand() if(!reagents || reagents.locked) diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 8308d9c5644b..27e457be6d43 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -336,86 +336,6 @@ /////////////////////////////////////new ban stuff - else if(href_list["jobban2"]) -// if(!check_rights(R_BAN)) return - /* - var/mob/M = locate(href_list["jobban2"]) - if(!ismob(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - if(!M.ckey) //sanity - to_chat(usr, "This mob has no ckey") - return - if(!RoleAuthority) - to_chat(usr, "The Role Authority is not set up!") - return - - var/datum/entity/player/P = get_player_from_key(M.ckey) - - var/dat = "" - var/body - var/jobs = "" - - /***********************************WARNING!************************************ - The jobban stuff looks mangled and disgusting - But it looks beautiful in-game - -Nodrak - ************************************WARNING!***********************************/ -//Regular jobs - //Command (Blue) - jobs += generate_job_ban_list(M, ROLES_CIC, "CIC", "ddddff") - jobs += "
" - // SUPPORT - jobs += generate_job_ban_list(M, ROLES_AUXIL_SUPPORT, "Support", "ccccff") - jobs += "
" - // MPs - jobs += generate_job_ban_list(M, ROLES_POLICE, "Police", "ffdddd") - jobs += "
" - //Engineering (Yellow) - jobs += generate_job_ban_list(M, ROLES_ENGINEERING, "Engineering", "fff5cc") - jobs += "
" - //Cargo (Yellow) //Copy paste, yada, yada. Hopefully Snail can rework this in the future. - jobs += generate_job_ban_list(M, ROLES_REQUISITION, "Requisition", "fff5cc") - jobs += "
" - //Medical (White) - jobs += generate_job_ban_list(M, ROLES_MEDICAL, "Medical", "ffeef0") - jobs += "
" - //Marines - jobs += generate_job_ban_list(M, ROLES_MARINES, "Marines", "ffeeee") - jobs += "
" - // MISC - jobs += generate_job_ban_list(M, ROLES_MISC, "Misc", "aaee55") - jobs += "
" - // Xenos (Orange) - jobs += generate_job_ban_list(M, ROLES_XENO, "Xenos", "a268b1") - jobs += "
" - //Extra (Orange) - var/isbanned_dept = jobban_isbanned(M, "Syndicate", P) - jobs += "" - jobs += "" - - //ERT - if(jobban_isbanned(M, "Emergency Response Team", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - //Survivor - if(jobban_isbanned(M, "Survivor", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - if(jobban_isbanned(M, "Agent", P) || isbanned_dept) - jobs += "" - else - jobs += "" - - body = "[jobs]" - dat = "[body]" - show_browser(usr, dat, "Job-Ban Panel: [M.name]", "jobban2", "size=800x490") - return*/ // DEPRECATED //JOBBAN'S INNARDS else if(href_list["jobban3"]) if(!check_rights(R_MOD,0) && !check_rights(R_ADMIN)) return diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index d5d44a047947..d1e7f83dacb1 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -321,7 +321,7 @@ I = icon(icon_file, icon_state, SOUTH) var/c = initial(item.color) if (!isnull(c) && c != "#FFFFFF") - I.Blend(initial(c), ICON_MULTIPLY) + I.Blend(c, ICON_MULTIPLY) else if (ispath(k, /obj/effect/essentials_set)) var/obj/effect/essentials_set/es_set = new k() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1da30d6e47e3..04b82628e3c6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1414,11 +1414,8 @@ var/const/MAX_SAVE_SLOTS = 10 var/all_ok = TRUE for(var/i=1, i<=length(new_xeno_prefix), i++) var/ascii_char = text2ascii(new_xeno_prefix,i) - switch(ascii_char) - // A .. Z - if(65 to 90) //Uppercase Letters will work - else - all_ok = FALSE //everything else - won't + if(ascii_char < 65 || ascii_char > 90) + all_ok = FALSE //everything else - won't if(all_ok) xeno_prefix = new_xeno_prefix owner.load_xeno_name() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index d969587e32e5..cc7fee7724f4 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -423,7 +423,7 @@ return var/obj/item/weapon/gun/W = usr.get_active_hand() if (W.w_class > SIZE_MEDIUM) - to_chat(usr, SPAN_DANGER("This gun won't fit in \the belt!")) + to_chat(usr, SPAN_DANGER("This gun won't fit in the belt!")) return holstered = usr.get_active_hand() usr.drop_held_item() diff --git a/code/modules/desert_dam/filtration/consoles.dm b/code/modules/desert_dam/filtration/consoles.dm index 038b96eb4713..8c2814fafde7 100644 --- a/code/modules/desert_dam/filtration/consoles.dm +++ b/code/modules/desert_dam/filtration/consoles.dm @@ -35,8 +35,6 @@ var/global/river_activated = FALSE if (prob(10)) get_broken() return - else - return /obj/structure/machinery/filtration/console/proc/get_broken() if(damaged) diff --git a/code/modules/flufftext/Chinese.dm b/code/modules/flufftext/Chinese.dm index 36da1d307a5b..6b19dd61fcf5 100644 --- a/code/modules/flufftext/Chinese.dm +++ b/code/modules/flufftext/Chinese.dm @@ -62,12 +62,12 @@ //remove complex/simple -u- glide final_syllables if(initial.initial_sound_flags & SIMPLE_U_ONLY) for(var/datum/chinese_sound/final_syllable/final_syllable as anything in possible_final_syllables) - if(initial(initial(final_syllable.vowel_class)) == VOWEL_CLASS_BACK_CLOSE) + if(initial(final_syllable.vowel_class) == VOWEL_CLASS_BACK_CLOSE) possible_final_syllables -= final_syllable possible_final_syllables += /datum/chinese_sound/final_syllable/u else if(initial.initial_sound_flags & HALF_U) for(var/datum/chinese_sound/final_syllable/final_syllable as anything in possible_final_syllables) - if(initial(initial(final_syllable.vowel_class)) == VOWEL_CLASS_BACK_CLOSE && initial(final_syllable.final_syllable_sound_flags) & U_GROUP_FULL) + if(initial(final_syllable.vowel_class) == VOWEL_CLASS_BACK_CLOSE && initial(final_syllable.final_syllable_sound_flags) & U_GROUP_FULL) possible_final_syllables -= final_syllable //check for if the sound is alveolo-palatal or sibilant/retroflex - then remove or keep front close vowels accordingly diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 4b86c827a069..069392f2c92e 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -132,7 +132,6 @@ for(var/message_mode in parsed["modes"]) var/list/obj/item/used_radios = list() switch(message_mode) - if(MESSAGE_MODE_LOCAL) if(RADIO_MODE_WHISPER) whisper_say(message, speaking, alt_name) return diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 13ccd03c3e82..1091df3391b6 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -737,8 +737,6 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/angle = 180 - abs( abs( direction_angle - spread_direction_angle ) - 180 ) // the angle difference between the spread direction and initial direction switch(angle) //this reduces power when the explosion is going around corners - if (0) - //no change if (45) spread_power *= 0.75 else //turns out angles greater than 90 degrees almost never happen. This bit also prevents trying to spread backwards diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm index 468243a0cc8d..3bd7336c32b6 100644 --- a/code/modules/reagents/chemistry_reagents/drink.dm +++ b/code/modules/reagents/chemistry_reagents/drink.dm @@ -85,13 +85,13 @@ /datum/reagent/drink/carrotjuice/on_mob_life(mob/living/M) . = ..() - if(!.) return + if(!.) + return M.ReduceEyeBlur(1) M.ReduceEyeBlind(1) - if(!data) data = 1 + if(!data) + data = 1 switch(data) - if(1 to 20) - //nothing if(21 to INFINITY) if(prob(data-10)) M.disabilities &= ~NEARSIGHTED diff --git a/colonialmarines.dme b/colonialmarines.dme index b6967c2df59b..0853abf66ba8 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1,4 +1,4 @@ -s// DM Environment file for colonialmarines.dme. +// DM Environment file for colonialmarines.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. // BEGIN_INTERNALS @@ -11,6 +11,7 @@ s// DM Environment file for colonialmarines.dme. #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\__odlint.dm" #include "code\_byond_version_compat.dm" #include "code\_compile_options.dm" #include "code\_experiments.dm" diff --git a/dependencies.sh b/dependencies.sh index 2889751d36e6..f88c2f9b0a4b 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -19,3 +19,5 @@ export SPACEMAN_DMM_VERSION=suite-1.7.2 # Python version for mapmerge and other tools export PYTHON_VERSION=3.7.9 + +export OPENDREAM_VERSION=0.2.0 diff --git a/tools/ci/download_od.sh b/tools/ci/download_od.sh new file mode 100644 index 000000000000..024f93f9289c --- /dev/null +++ b/tools/ci/download_od.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -eo pipefail + +if [ -z "${OPENDREAM_VERSION+x}" ]; then + source dependencies.sh +fi + +git clone https://github.com/OpenDreamProject/OpenDream.git ~/OpenDream +cd ~/OpenDream +git checkout tags/v${OPENDREAM_VERSION} +git submodule update --init --recursive diff --git a/tools/ci/run_od.sh b/tools/ci/run_od.sh new file mode 100644 index 000000000000..3eeac5907353 --- /dev/null +++ b/tools/ci/run_od.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -eo pipefail + +dotnet ~/OpenDream/DMCompiler/bin/Release/net7.0/DMCompiler.dll --suppress-unimplemented colonialmarines.dme diff --git a/tools/ci/setup_od.sh b/tools/ci/setup_od.sh new file mode 100644 index 000000000000..6d2ec170687c --- /dev/null +++ b/tools/ci/setup_od.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eo pipefail + +cd ~/OpenDream + +dotnet restore +dotnet build -c Release diff --git a/tools/ci/validate_dme.py b/tools/ci/validate_dme.py index 33066f72e75e..55666480425d 100644 --- a/tools/ci/validate_dme.py +++ b/tools/ci/validate_dme.py @@ -17,6 +17,9 @@ # Included by BSQL/includes.dm r'code/__HELPERS/BSQL/**/*.dm', + + # Included as part of OD lints + r'code/__pragmas.dm' ] lines = [] From 47f8a6e7d394b89566075f9c711bc67bc82f5118 Mon Sep 17 00:00:00 2001 From: harryob Date: Sat, 21 Oct 2023 23:12:59 +0100 Subject: [PATCH 145/199] fixes missing href token in admin noting (#4738) because we have two different panels for noting ?? anyway :cl: admin: view-target-records now allows you to note people properly /:cl: --- code/game/verbs/records.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/verbs/records.dm b/code/game/verbs/records.dm index f09de72da2e6..18ed35ee6321 100644 --- a/code/game/verbs/records.dm +++ b/code/game/verbs/records.dm @@ -143,7 +143,7 @@ dat += "" var/color = "#008800" - var/add_dat = "Add Admin Note
Add Confidential Admin Note
" + var/add_dat = "Add Admin Note
Add Confidential Admin Note
" switch(note_category) if(NOTE_MERIT) color = "#9e3dff" From 04de099194f99f0b692051e1728f2186e71be544 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 01:53:31 +0100 Subject: [PATCH 146/199] Automatic changelog for PR #4738 [ci skip] --- html/changelogs/AutoChangeLog-pr-4738.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4738.yml diff --git a/html/changelogs/AutoChangeLog-pr-4738.yml b/html/changelogs/AutoChangeLog-pr-4738.yml new file mode 100644 index 000000000000..248817ba603c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4738.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - admin: "view-target-records now allows you to note people properly" \ No newline at end of file From 3971a14e34d43f1b280f6f5a7bd57975060f99c9 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 21 Oct 2023 17:16:31 -0700 Subject: [PATCH 147/199] Fix cluster and incend OB not respecting ceiling protections (#4746) # About the pull request This PR makes it so incend and cluster OBs actually respect ceiling protections (not just pylon protections). HE already is respecting closed areas, so your fault for leaving the doors open. # Explain why it's good for the game Dropships ceilings were changed fairly long ago to protect against OBs, but the implementation I guess was never tested thoroughly. # Testing Photographs and Procedure
Screenshots & Videos ![incend](https://github.com/cmss13-devs/cmss13/assets/76988376/76907e59-d95d-4ddd-8165-864fa688e8c6) https://youtu.be/Fc0q9p6hmeE
# Changelog :cl: Drathek fix: Fix incend and cluster OBs not respecting ceiling OB protections. /:cl: --- code/__DEFINES/__game.dm | 13 ++++- code/modules/cm_marines/orbital_cannon.dm | 10 ++-- .../modules/projectiles/guns/flamer/flamer.dm | 50 +++++++++++-------- 3 files changed, 48 insertions(+), 25 deletions(-) diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 113b78dbada1..f1424f5560ec 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -283,7 +283,6 @@ block( \ /// Only use the CEILING_PROTECTION_TIER_X defines for `protection_level` #define CEILING_IS_PROTECTED(ceiling, protection_level) (ceiling >= protection_level) - // Default font settings #define FONT_SIZE "5pt" #define DEFAULT_FONT_COLOR "#09f" @@ -493,6 +492,18 @@ block( \ #define TURF_PROTECTION_CAS 2 #define TURF_PROTECTION_OB 3 +/// Convert a turf protection level to a ceiling protection level +/proc/get_ceiling_protection_level(turf_protection_level) + switch(turf_protection_level) + if(TURF_PROTECTION_OB) + return CEILING_PROTECTION_TIER_4 + if(TURF_PROTECTION_CAS) + return CEILING_PROTECTION_TIER_3 + if(TURF_PROTECTION_MORTAR) + return CEILING_PROTECTION_TIER_2 + else + return CEILING_NO_PROTECTION + // Anything above the deck boundary is the upper deck, anything below is the lower deck // This is exclusive, so anything ON the boundary is an edge case that's neither on the upper nor the lower deck #define ALMAYER_DECK_BOUNDARY 101 diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 5a3cad590c08..78bdfc3d778c 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -538,10 +538,14 @@ var/list/ob_type_fuel_requirements for(var/i = 1 to total_amount) for(var/k = 1 to instant_amount) - var/turf/U = pick(turf_list) - if(protected_by_pylon(TURF_PROTECTION_OB, U)) //If the turf somehow gained OB protection while the cluster was firing + var/turf/selected_turf = pick(turf_list) + if(protected_by_pylon(TURF_PROTECTION_OB, selected_turf)) continue - fire_in_a_hole(U) + var/area/selected_area = get_area(selected_turf) + if(CEILING_IS_PROTECTED(selected_area?.ceiling, CEILING_PROTECTION_TIER_4)) + continue + fire_in_a_hole(selected_turf) + sleep(delay_between_clusters) QDEL_IN(src, 5 SECONDS) // Leave time for last handle_ob_shake below diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 1091df3391b6..d562d305c28b 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -719,12 +719,12 @@ GLOBAL_LIST_EMPTY(flamer_particles) var/direction_angle = dir2angle(direction) var/obj/flamer_fire/foundflame = locate() in target if(!foundflame) - var/datum/reagent/R = new() - R.intensityfire = burn_lvl - R.durationfire = fire_lvl - R.burn_sprite = burn_sprite - R.burncolor = f_color - new/obj/flamer_fire(target, cause_data, R) + var/datum/reagent/fire_reag = new() + fire_reag.intensityfire = burn_lvl + fire_reag.durationfire = fire_lvl + fire_reag.burn_sprite = burn_sprite + fire_reag.burncolor = f_color + new/obj/flamer_fire(target, cause_data, fire_reag) if(target.density) return @@ -751,25 +751,29 @@ GLOBAL_LIST_EMPTY(flamer_particles) if (spread_power < 1) continue - var/turf/T = get_step(target, spread_direction) + var/turf/picked_turf = get_step(target, spread_direction) - if(!T) //prevents trying to spread into "null" (edge of the map?) + if(!picked_turf) //prevents trying to spread into "null" (edge of the map?) continue - if(aerial_flame_level && (T.get_pylon_protection_level() >= aerial_flame_level)) - break + if(aerial_flame_level) + if(picked_turf.get_pylon_protection_level() >= aerial_flame_level) + break + var/area/picked_area = get_area(picked_turf) + if(CEILING_IS_PROTECTED(picked_area?.ceiling, get_ceiling_protection_level(aerial_flame_level))) + break spawn(0) - fire_spread_recur(T, cause_data, spread_power, spread_direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) + fire_spread_recur(picked_turf, cause_data, spread_power, spread_direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) /proc/fire_spread(turf/target, datum/cause_data/cause_data, range, fire_lvl, burn_lvl, f_color, burn_sprite = "dynamic", aerial_flame_level = TURF_PROTECTION_NONE) - var/datum/reagent/R = new() - R.intensityfire = burn_lvl - R.durationfire = fire_lvl - R.burn_sprite = burn_sprite - R.burncolor = f_color + var/datum/reagent/fire_reag = new() + fire_reag.intensityfire = burn_lvl + fire_reag.durationfire = fire_lvl + fire_reag.burn_sprite = burn_sprite + fire_reag.burncolor = f_color - new/obj/flamer_fire(target, cause_data, R) + new/obj/flamer_fire(target, cause_data, fire_reag) for(var/direction in alldirs) var/spread_power = range switch(direction) @@ -777,7 +781,11 @@ GLOBAL_LIST_EMPTY(flamer_particles) spread_power-- else spread_power -= 1.414 //diagonal spreading - var/turf/T = get_step(target, direction) - if(aerial_flame_level && (T.get_pylon_protection_level() >= aerial_flame_level)) - continue - fire_spread_recur(T, cause_data, spread_power, direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) + var/turf/picked_turf = get_step(target, direction) + if(aerial_flame_level) + if(picked_turf.get_pylon_protection_level() >= aerial_flame_level) + continue + var/area/picked_area = get_area(picked_turf) + if(CEILING_IS_PROTECTED(picked_area?.ceiling, get_ceiling_protection_level(aerial_flame_level))) + continue + fire_spread_recur(picked_turf, cause_data, spread_power, direction, fire_lvl, burn_lvl, f_color, burn_sprite, aerial_flame_level) From c4e4072e85f4e57137adc634f9f9fc6d9fac96eb Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 02:08:02 +0100 Subject: [PATCH 148/199] Automatic changelog for PR #4746 [ci skip] --- html/changelogs/AutoChangeLog-pr-4746.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4746.yml diff --git a/html/changelogs/AutoChangeLog-pr-4746.yml b/html/changelogs/AutoChangeLog-pr-4746.yml new file mode 100644 index 000000000000..9b13c70d9b50 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4746.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix incend and cluster OBs not respecting ceiling OB protections." \ No newline at end of file From 3b00860df93a882f62ec2b0d3e58481c12cbcc42 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 22 Oct 2023 01:12:34 +0000 Subject: [PATCH 149/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4590.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4732.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4733.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4735.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4736.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4738.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4739.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4741.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4745.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4746.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4747.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4748.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4749.yml | 4 ---- html/changelogs/archive/2023-10.yml | 27 +++++++++++++++++++++++ 14 files changed, 27 insertions(+), 54 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4590.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4732.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4733.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4735.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4736.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4738.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4739.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4741.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4745.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4746.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4747.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4748.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4749.yml diff --git a/html/changelogs/AutoChangeLog-pr-4590.yml b/html/changelogs/AutoChangeLog-pr-4590.yml deleted file mode 100644 index df23394b9226..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4590.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kiVts" -delete-after: True -changes: - - rscadd: "Ghosts get notified when they are being revived by DFB property" - - balance: "DFB property healing threshold lowered, You can create DFB property higher than one." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4732.yml b/html/changelogs/AutoChangeLog-pr-4732.yml deleted file mode 100644 index afe968b3a583..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4732.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Disabled code in icon2html that is causing bad icon operations" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4733.yml b/html/changelogs/AutoChangeLog-pr-4733.yml deleted file mode 100644 index 43d1d2b92e0a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4733.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Added Discretionary Arrest to JAS." - - rscadd: "Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4735.yml b/html/changelogs/AutoChangeLog-pr-4735.yml deleted file mode 100644 index a92d5015c303..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4735.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Morrow" -delete-after: True -changes: - - server: "the rustg mysql driver is now properly compatible with mariadb" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4736.yml b/html/changelogs/AutoChangeLog-pr-4736.yml deleted file mode 100644 index 3efd380ae2ca..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4736.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - bugfix: "mentorhelp response no longer gives a dead discord link" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4738.yml b/html/changelogs/AutoChangeLog-pr-4738.yml deleted file mode 100644 index 248817ba603c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4738.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - admin: "view-target-records now allows you to note people properly" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4739.yml b/html/changelogs/AutoChangeLog-pr-4739.yml deleted file mode 100644 index 5d99c028a181..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4739.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - admin: "no more href token errors when changing the game mode via game panel" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4741.yml b/html/changelogs/AutoChangeLog-pr-4741.yml deleted file mode 100644 index ec52d20b80b9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4741.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Re-fixed Megaphone above-head-chat drifting to the left." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4745.yml b/html/changelogs/AutoChangeLog-pr-4745.yml deleted file mode 100644 index b4e23e494b14..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4745.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in with the walls again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4746.yml b/html/changelogs/AutoChangeLog-pr-4746.yml deleted file mode 100644 index 9b13c70d9b50..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4746.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fix incend and cluster OBs not respecting ceiling OB protections." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4747.yml b/html/changelogs/AutoChangeLog-pr-4747.yml deleted file mode 100644 index 0b876d3bacde..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4747.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - rscadd: "Mentors can now unmark mhelps" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4748.yml b/html/changelogs/AutoChangeLog-pr-4748.yml deleted file mode 100644 index 5b188fdc384e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4748.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - rscadd: "Stamping papers now makes a noise." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4749.yml b/html/changelogs/AutoChangeLog-pr-4749.yml deleted file mode 100644 index 1e75689c0ad4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4749.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Removed redundant double binding for F1 to AdminHelp from default keybinds. This does not affect existing users or their settings." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 94c952734866..2e3ce59495b2 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -315,3 +315,30 @@ - rscadd: Added splints to the survival pouch - rscadd: Increased survival pouch storage space by 1 - spellcheck: Updates the survival pouch's description +2023-10-22: + Drathek: + - bugfix: Fix incend and cluster OBs not respecting ceiling OB protections. + - bugfix: Disabled code in icon2html that is causing bad icon operations + Morrow: + - server: the rustg mysql driver is now properly compatible with mariadb + Zonespace27: + - rscadd: Mentors can now unmark mhelps + fira: + - bugfix: Removed redundant double binding for F1 to AdminHelp from default keybinds. + This does not affect existing users or their settings. + - rscadd: Stamping papers now makes a noise. + - bugfix: Fixed incorrect Reqs vendors visuals on the Almayer. They now blend in + with the walls again. + - bugfix: Re-fixed Megaphone above-head-chat drifting to the left. + harryob: + - admin: no more href token errors when changing the game mode via game panel + - bugfix: mentorhelp response no longer gives a dead discord link + - admin: view-target-records now allows you to note people properly + kiVts: + - rscadd: Ghosts get notified when they are being revived by DFB property + - balance: DFB property healing threshold lowered, You can create DFB property higher + than one. + realforest2001: + - rscadd: Added Discretionary Arrest to JAS. + - rscadd: Added a new category to JAS, Precautionary Charges. Moves Insanity and + POW to this category. From 1e890af39d7c4b6233439fbaa8693a3918e35f5c Mon Sep 17 00:00:00 2001 From: Steelpoint <6595389+Steelpoint@users.noreply.github.com> Date: Mon, 23 Oct 2023 02:03:20 +0800 Subject: [PATCH 150/199] Revolver Heavy Ammo Effect Change (#4706) # About the pull request This PR changes heavy ammo for the Revolver to knockback a mob and slow them down instead of stunning it. # Explain why it's good for the game Combat balance is a precarious and often difficult conversation to hold, ergo I'll lay my biases out on the table at first. I'm a marine main at heart, but I have played a lot of xeno recently to gain a better understanding of their side of the story, enough that I feel confident to make these assertions. My belief is that the heavy ammo of the revolver is a negative concept for the game, and it needs to be removed, due to its stun factor. The issue here is readability and prediction. When you see a RPG, you know that it can fire a devastating warhead that can stun and kill T3s. When you see a Warrior, you know it can leap to 4 tiles to stun and drag a Human, when you hear a CAS strike you know exactly what is about to drop. When you see a Queen you know she can stun screech and neuro stun you. But the issue with the Revolver is it has no obvious tell. It is a small item, that can be fit inside backpacks, holsters, pouches, belts, armour slots. It has no obvious advance warning when you are going to fire it. There is no special uniform requirement making a revolver user standout amongst the crowd. There is no tell. The problem with the stun revolver is simply that is is a hard counter to all T1s and most T2s. Its ability to stun allows it to perform an attack that is uncounterable to a xeno as a xeno has no way to predict who may be carrying one. A xeno can tell who a Specialist is, a xeno can tell who has a shotgun or flamer or sniper or RPG, you can tell when a mortar is being prepared, or a CAS strike or even an OB. You can see the smartgunner. Even the Scout, a literal cloaked Marine, has to uncloak to fire. You can not tell who has a revolver until they pull it out and stun you. Once you are stunned you die. A xeno equilivant would be if any Xeno could be carrying a special tool that lets them grab a marine from 7 tiles away and pull them in plus stun them for 2 seconds. But any xenomorph could be using it, including a Lesser Drone. Perhaps the heavy revolver could be reworked to do something else, but ultimately the only reason anyone takes this ammo is for the stun. Anything else is beating around the bush. Those are my reasoning's, I'll leave the rest to the powers' that be. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time. /:cl: --------- Co-authored-by: Steelpoint --- code/datums/ammo/ammo.dm | 9 +++++++++ code/datums/ammo/bullet/revolver.dm | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index c536ac83484c..a858c6b1f5a7 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -171,6 +171,15 @@ else living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) +/datum/ammo/proc/slowdown(mob/living/living_mob, obj/projectile/fired_projectile) + if(iscarbonsizexeno(living_mob)) + var/mob/living/carbon/xenomorph/target = living_mob + target.apply_effect(1, SUPERSLOW) + target.apply_effect(2, SLOW) + to_chat(target, SPAN_XENODANGER("You are slowed by the sudden impact!")) + else + living_mob.apply_stamina_damage(fired_projectile.ammo.damage, fired_projectile.def_zone, ARMOR_BULLET) + /datum/ammo/proc/pushback(mob/target_mob, obj/projectile/fired_projectile, max_range = 2) if(!target_mob || target_mob == fired_projectile.firer || fired_projectile.distance_travelled > max_range || target_mob.lying) return diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm index 339609f57be7..633bf3e2f7ff 100644 --- a/code/datums/ammo/bullet/revolver.dm +++ b/code/datums/ammo/bullet/revolver.dm @@ -27,8 +27,9 @@ penetration = ARMOR_PENETRATION_TIER_4 accuracy = HIT_ACCURACY_TIER_3 -/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/M, obj/projectile/P) - knockback(M, P, 4) +/datum/ammo/bullet/revolver/heavy/on_hit_mob(mob/entity, obj/projectile/bullet) + slowdown(entity, bullet) + pushback(entity, bullet, 4) /datum/ammo/bullet/revolver/incendiary name = "incendiary revolver bullet" From 81f90df92c06f7182e671c942155ed89b1ad19aa Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 19:17:21 +0100 Subject: [PATCH 151/199] Automatic changelog for PR #4706 [ci skip] --- html/changelogs/AutoChangeLog-pr-4706.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4706.yml diff --git a/html/changelogs/AutoChangeLog-pr-4706.yml b/html/changelogs/AutoChangeLog-pr-4706.yml new file mode 100644 index 000000000000..8d6c934a5cc0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4706.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - balance: "Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time." \ No newline at end of file From b02c8445b85796e1647d1e423697bdf0dc007bf0 Mon Sep 17 00:00:00 2001 From: harryob Date: Sun, 22 Oct 2023 19:04:12 +0100 Subject: [PATCH 152/199] removes hardcoded server name from latejoiners (#4753) latejoiners were always shown the default skin in the .dmf as the custom title based on config was only shown if you happened to be connected when SSmapping was initializing :cl: server: the server now respects /string/title for late joiners /:cl: --- code/controllers/subsystem/mapping.dm | 4 +--- interface/skin.dmf | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index afecabd74be0..be69bdad1b7e 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -29,9 +29,7 @@ SUBSYSTEM_DEF(mapping) /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() if(!configs) configs = load_map_configs(ALL_MAPTYPES, error_if_missing = FALSE) - for(var/i in GLOB.clients) - var/client/C = i - winset(C, null, "mainwindow.title='[CONFIG_GET(string/title)] - [SSmapping.configs[SHIP_MAP].map_name]'") + world.name = "[CONFIG_GET(string/title)] - [SSmapping.configs[SHIP_MAP].map_name]" /datum/controller/subsystem/mapping/Initialize(timeofday) HACK_LoadMapConfig() diff --git a/interface/skin.dmf b/interface/skin.dmf index 5d06bb40e858..e31c42938cd9 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -164,7 +164,6 @@ window "mainwindow" anchor2 = -1,-1 is-default = true saved-params = "pos;size;is-minimized;is-maximized" - title = "CM-SS13 - USS Almayer" is-maximized = true statusbar = false icon = 'icons\\taskbar\\gml_distress.png' From 9703d4cd7407b5e6a32ee8c6b487f697b8acd078 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 19:35:53 +0100 Subject: [PATCH 153/199] Automatic changelog for PR #4753 [ci skip] --- html/changelogs/AutoChangeLog-pr-4753.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4753.yml diff --git a/html/changelogs/AutoChangeLog-pr-4753.yml b/html/changelogs/AutoChangeLog-pr-4753.yml new file mode 100644 index 000000000000..961d6e35c2d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4753.yml @@ -0,0 +1,4 @@ +author: "harryob" +delete-after: True +changes: + - server: "the server now respects /string/title for late joiners" \ No newline at end of file From 3d2b2ed59547b3786ab65336bc78276e8d28a4bf Mon Sep 17 00:00:00 2001 From: QuickLode <63271983+QuickLode@users.noreply.github.com> Date: Sun, 22 Oct 2023 11:04:32 -0700 Subject: [PATCH 154/199] Nerfs Colony Synthetic Pouch (#4752) # About the pull request nerfs synth surv pouch by 1 slot # Explain why it's good for the game Feel like it holds a little much so this is a step in the right direction. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: Nerfs synth surv pouch by removing 1 storage slot. /:cl: --- code/game/objects/items/storage/pouch.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm index f24c0c3f3131..48eb322f2093 100644 --- a/code/game/objects/items/storage/pouch.dm +++ b/code/game/objects/items/storage/pouch.dm @@ -168,7 +168,7 @@ name = "synth survival pouch" desc = "An emergency pouch given to synthetics in the event of an emergency." icon_state = "tools" - storage_slots = 7 + storage_slots = 6 max_w_class = SIZE_MEDIUM can_hold = list( /obj/item/device/flashlight, @@ -181,7 +181,6 @@ ) /obj/item/storage/pouch/survival/synth/full/fill_preset_inventory() - new /obj/item/device/flashlight(src) new /obj/item/tool/crowbar/red(src) new /obj/item/tool/weldingtool(src) new /obj/item/stack/cable_coil(src) From 14319cf2222148f10d6fa59bd128d77ddb3d8540 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:01:28 +0100 Subject: [PATCH 155/199] Automatic changelog for PR #4752 [ci skip] --- html/changelogs/AutoChangeLog-pr-4752.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4752.yml diff --git a/html/changelogs/AutoChangeLog-pr-4752.yml b/html/changelogs/AutoChangeLog-pr-4752.yml new file mode 100644 index 000000000000..b6417f410eb9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4752.yml @@ -0,0 +1,4 @@ +author: "QuickLode" +delete-after: True +changes: + - balance: "Nerfs synth surv pouch by removing 1 storage slot." \ No newline at end of file From 5a48d2c38271fcc61e14491095756676a1aeaca6 Mon Sep 17 00:00:00 2001 From: stalkerino <66872447+irakligabunia@users.noreply.github.com> Date: Sun, 22 Oct 2023 22:07:21 +0400 Subject: [PATCH 156/199] M39 being able to use vertical grip again [BUFF] (#4627) # About the pull request M39 receives a buff, which allows it to use a attachment that make sit viable. # Explain why it's good for the game M39 as it stands is quite useless, the vertical grip might help it become a viable choice over the M4RA, the MK2 and the M37 :) # Testing Photographs and Procedure Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: stalkerino balance: m39 is able to use vertigrip /:cl: --- code/modules/projectiles/guns/smgs.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/guns/smgs.dm b/code/modules/projectiles/guns/smgs.dm index 89e6594c64e7..24eddf31597d 100644 --- a/code/modules/projectiles/guns/smgs.dm +++ b/code/modules/projectiles/guns/smgs.dm @@ -11,7 +11,7 @@ aim_slowdown = SLOWDOWN_ADS_QUICK wield_delay = WIELD_DELAY_VERY_FAST attachable_allowed = list( - /obj/item/attachable/suppressor, + /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, /obj/item/attachable/flashlight, @@ -50,7 +50,8 @@ /obj/item/attachable/suppressor, /obj/item/attachable/reddot, /obj/item/attachable/reflex, - /obj/item/attachable/angledgrip, + /obj/item/attachable/angledgrip, + /obj/item/attachable/verticalgrip, /obj/item/attachable/flashlight/grip, /obj/item/attachable/stock/smg, /obj/item/attachable/stock/smg/collapsible, From 6fdb79b32114f1ce5ed59f044498819028074e68 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:41:08 +0100 Subject: [PATCH 157/199] Automatic changelog for PR #4627 [ci skip] --- html/changelogs/AutoChangeLog-pr-4627.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4627.yml diff --git a/html/changelogs/AutoChangeLog-pr-4627.yml b/html/changelogs/AutoChangeLog-pr-4627.yml new file mode 100644 index 000000000000..69b88c735822 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4627.yml @@ -0,0 +1,4 @@ +author: "stalkerino" +delete-after: True +changes: + - balance: "m39 is able to use vertigrip" \ No newline at end of file From 34878a19fa8f942b60f8742fb48db9255d1da9fc Mon Sep 17 00:00:00 2001 From: Spy <31124786+SpypigDev@users.noreply.github.com> Date: Mon, 23 Oct 2023 05:08:46 +1100 Subject: [PATCH 158/199] SO CIC vendor quality of life tweaks (#4707) # About the pull request Brings more cohesion to the SO vendor system, as well as CIC Armory. Reworking the gear/prep aspect of SOs to better reflect what gear would be reasonable for them to have IC (no machetes right out of cryo for example). - SO spawn vendors majorly cut back, with webbing, combat helmet, machete, all belts, and RTO pack removed, moving each to the _SO Armory Vendor_. The SO spawn vendor should provide purely for SO activity _within_ CIC, and I feel this is more appropriate - Added a new vendor in CIC's Armory called the 'SO Armory Vendor' to serve as a new location for the deployment gear set required by SOs. - On top of already already-mentioned moved gear, the Armory vendor adds combat gear, aviator shades (because of course), an option to specialize as either an Engineer or a Medic with their essential kit, an engineer belt! (as well as all the other belts removed from the SO spawn room) - Adds some extra items to the Armory vendor point-buy section to **finally** give SOs a reason to chew up their 45 points, notably including the RTO pack # Explain why it's good for the game I've always found it really unusual how SO spawn vendors are a bit all over the place in terms of supplied gear. With this PR, SO gear has been split into two distinct vendors, with one being firmly behind the Armory shutters to ensure that SOs aren't allowed to continually roll around the Almayer with a full combat set minus the chest piece and rifle. This way, SOs can still get basic gear needed for CIC operation from their regular vendor, but can also access a full combat set _and more_ once the Armory shutters go up, whether it's from XO deployment or code red. # Testing Photographs and Procedure
Screenshots & Videos New SO spawn vend: https://cdn.discordapp.com/attachments/1100833406314618880/1163812305352528015/image.png?ex=6540efac&is=652e7aac&hm=5a4db3d47b2a0f6416e7b0181ad135913203512f7fb7b5c5600394d75e9856aa& Armory Vendor, the typo has since been repaired (1/2): https://cdn.discordapp.com/attachments/1100833406314618880/1163812464232775690/image.png?ex=6540efd2&is=652e7ad2&hm=b6040e631260ef77f502903b1cf65a59d18f7b2a896d45d0d0e9ce0493e2887e& Armory Vendor (2/2): https://cdn.discordapp.com/attachments/1100833406314618880/1163812566569582632/image.png?ex=6540efea&is=652e7aea&hm=186a90a37c2b6b8821de93ae476aa02733db22a9360e050900beb81d4b412a7a& New CIC Armory setup: https://cdn.discordapp.com/attachments/1100833406314618880/1163812692696498226/image.png?ex=6540f008&is=652e7b08&hm=7434e1a665e87af3683be853a388c97039f3c790ba1c17e9482347c532fca2e9&
# Changelog :cl: add: CIC Armory SO vendor balance: Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor balance: Made RTO pack a point-buy item in CIC Armory vendor for SOs /:cl: --- code/game/machinery/vending/cm_vending.dm | 2 +- .../vendor_types/crew/staff_officer.dm | 55 ++---------- .../vendor_types/crew/staff_officer_armory.dm | 83 +++++++++++++++++++ colonialmarines.dme | 1 + maps/map_files/USS_Almayer/USS_Almayer.dmm | 8 +- 5 files changed, 92 insertions(+), 57 deletions(-) create mode 100644 code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index bf7c4fffee65..861f5b37ebca 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -774,8 +774,8 @@ GLOBAL_LIST_EMPTY(vending_products) desc = "An automated closet hooked up to a colossal storage of standard-issue uniform and armor." icon_state = "clothing" use_points = TRUE + show_points = TRUE vendor_theme = VENDOR_THEME_USCM - show_points = FALSE vend_flags = VEND_CLUTTER_PROTECTION | VEND_UNIFORM_RANKS | VEND_UNIFORM_AUTOEQUIP | VEND_CATEGORY_CHECK /obj/structure/machinery/cm_vending/clothing/ui_static_data(mob/user) diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm index 85a8a58d162e..50b83ccdc54f 100644 --- a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm @@ -13,13 +13,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Service Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), list("Operations Uniform", 0, /obj/item/clothing/under/marine/officer/boiler, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED), + list("Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR), list("JACKET (CHOOSE 1)", 0, null, null, null), list("Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED), @@ -33,66 +33,21 @@ GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list( list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null), - list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), + list("VP78 Pistol", 0, /obj/item/storage/belt/gun/m4a3/vp78, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_RECOMMENDED), list("BACKPACK (CHOOSE 1)", 0, null, null, null), list("Backpack", 0, /obj/item/storage/backpack/marine, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), list("Satchel", 0, /obj/item/storage/backpack/marine/satchel, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_REGULAR), - list("Radio Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_RECOMMENDED), - list("BELT (CHOOSE 1)", 0, null, null, null), - list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), - list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), - - list("POUCHES (CHOOSE 2)", 0, null, null, null), - list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), - list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), - - list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), - list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), - list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), - - list("MASK (CHOOSE 1)", 0, null, null, null), - list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), - list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), list("OTHER SUPPLIES", 0, null, null, null), list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), - list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), - list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), - list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), - list("Machete Scabbard (Full)", 2, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) )) diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm new file mode 100644 index 000000000000..ac7b22b4e0a0 --- /dev/null +++ b/code/game/machinery/vending/vendor_types/crew/staff_officer_armory.dm @@ -0,0 +1,83 @@ +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory + name = "\improper ColMarTech Staff Officer Armory Equipment Rack" + desc = "An automated combat equipment vendor for Staff Officers." + req_access = list(ACCESS_MARINE_COMMAND) + icon_state = "mar_rack" + vendor_role = list(JOB_SO) + +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory/get_listed_products(mob/user) + return GLOB.cm_vending_clothing_staff_officer_armory + +//------------GEAR--------------- + +GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer_armory, list( + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), + list("Officer M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/SO, MARINE_CAN_BUY_COMBAT_ARMOR, VENDOR_ITEM_MANDATORY), + list("Officer M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_COMBAT_HELMET, VENDOR_ITEM_MANDATORY), + list("Marine Combat Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY), + list("Marine Combat Gloves", 0, /obj/item/clothing/gloves/marine, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_MANDATORY), + list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), + + list("SPECIALISATION KIT (CHOOSE 1)", 0, null, null, null), + list("Essential Engineer Set", 0, /obj/effect/essentials_set/engi, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + list("Essential Medical Set", 0, /obj/effect/essentials_set/medic, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED), + + list("BELT (CHOOSE 1)", 0, null, null, null), + list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Toolbelt Rig (Full)", 0, /obj/item/storage/belt/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Lifesaver Bag (Full)", 0, /obj/item/storage/belt/medical/lifesaver/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Medical Storage Rig (Full)", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M39 Holster Rig", 0, /obj/item/storage/belt/gun/m39, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 Shotgun Shell Loading Rig", 0, /obj/item/storage/belt/shotgun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + list("M276 M40 Grenade Rig", 0, /obj/item/storage/belt/grenade, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), + + list("POUCHES (CHOOSE 2)", 0, null, null, null), + list("Autoinjector Pouch", 0, /obj/item/storage/pouch/autoinjector, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Construction Pouch", 0, /obj/item/storage/pouch/construction, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Document Pouch", 0, /obj/item/storage/pouch/document, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Electronics Pouch (Full)", 0, /obj/item/storage/pouch/electronics/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Splints, Gauze, Ointment)", 0, /obj/item/storage/pouch/firstaid/full/alternate, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First-Aid Pouch (Pill Packets)", 0, /obj/item/storage/pouch/firstaid/full/pills, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("First Responder Pouch", 0, /obj/item/storage/pouch/first_responder, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Flare Pouch (Full)", 0, /obj/item/storage/pouch/flare/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Fuel Tank Strap Pouch", 0, /obj/item/storage/pouch/flamertank, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large General Pouch", 0, /obj/item/storage/pouch/general/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_RECOMMENDED), + list("Large Magazine Pouch", 0, /obj/item/storage/pouch/magazine/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Shotgun Shell Pouch", 0, /obj/item/storage/pouch/shotgun/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Large Pistol Magazine Pouch", 0, /obj/item/storage/pouch/magazine/pistol/large, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Pouch", 0, /obj/item/storage/pouch/medical, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Medical Kit Pouch", 0, /obj/item/storage/pouch/medkit, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Pistol Pouch", 0, /obj/item/storage/pouch/pistol, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Sling Pouch", 0, /obj/item/storage/pouch/sling, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + list("Tools Pouch (Full)", 0, /obj/item/storage/pouch/tools/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), + + list("ACCESSORIES (CHOOSE 1)", 0, null, null, null), + list("Black Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Brown Webbing Vest", 0, /obj/item/clothing/accessory/storage/black_vest/brown_vest, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED), + list("Drop Pouch", 0, /obj/item/clothing/accessory/storage/droppouch, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Webbing", 0, /obj/item/clothing/accessory/storage/webbing, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + list("Shoulder Holster", 0, /obj/item/clothing/accessory/storage/holster, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR), + + list("MASK (CHOOSE 1)", 0, null, null, null), + list("Gas Mask", 0, /obj/item/clothing/mask/gas, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + + list("OTHER SUPPLIES", 0, null, null, null), + list("Medical Helmet Optic", 5, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), + list("Magnetic Harness", 12, /obj/item/attachable/magnetic_harness, null, VENDOR_ITEM_REGULAR), + list("Radio Telephone Pack", 15, /obj/item/storage/backpack/marine/satchel/rto, null, VENDOR_ITEM_RECOMMENDED), + list("Binoculars", 5,/obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Rangefinder", 8, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 12, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_RECOMMENDED), + list("Data Detector", 5, /obj/item/device/motiondetector/intel, null, VENDOR_ITEM_REGULAR), + list("Flashlight", 1, /obj/item/device/flashlight, null, VENDOR_ITEM_RECOMMENDED), + list("Fulton Recovery Device", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), + list("Motion Detector", 5, /obj/item/device/motiondetector, null, VENDOR_ITEM_REGULAR), + list("Space Cleaner", 2, /obj/item/reagent_container/spray/cleaner, null, VENDOR_ITEM_REGULAR), + list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), + list("Machete Scabbard (Full)", 5, /obj/item/storage/large_holster/machete/full, null, VENDOR_ITEM_REGULAR) + )) diff --git a/colonialmarines.dme b/colonialmarines.dme index 0853abf66ba8..fe2fadba5c0e 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -939,6 +939,7 @@ #include "code\game\machinery\vending\vendor_types\crew\sea.dm" #include "code\game\machinery\vending\vendor_types\crew\senior_officers.dm" #include "code\game\machinery\vending\vendor_types\crew\staff_officer.dm" +#include "code\game\machinery\vending\vendor_types\crew\staff_officer_armory.dm" #include "code\game\machinery\vending\vendor_types\crew\synthetic.dm" #include "code\game\machinery\vending\vendor_types\crew\vehicle_crew.dm" #include "code\game\machinery\vending\vendor_types\squad_prep\squad_engineer.dm" diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index b2b300133d12..12227cacc551 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -530,14 +530,12 @@ }, /area/almayer/hallways/aft_hallway) "abQ" = ( -/obj/structure/surface/rack, -/obj/item/clothing/suit/storage/marine/light/vest, -/obj/item/clothing/suit/storage/marine/light/vest, /obj/item/device/radio/intercom{ freerange = 1; name = "General Listening Channel"; pixel_y = 28 }, +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory, /turf/open/floor/almayer{ icon_state = "redfull" }, @@ -63674,9 +63672,7 @@ }, /area/almayer/lifeboat_pumps/north1) "ryR" = ( -/obj/structure/machinery/cm_vending/sorted/uniform_supply/squad_prep{ - req_access = list(1) - }, +/obj/structure/machinery/cm_vending/clothing/staff_officer_armory, /turf/open/floor/almayer{ icon_state = "redfull" }, From b511436086cf3a8e25846d615193803a5399d6e5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:59:03 +0100 Subject: [PATCH 159/199] Automatic changelog for PR #4707 [ci skip] --- html/changelogs/AutoChangeLog-pr-4707.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4707.yml diff --git a/html/changelogs/AutoChangeLog-pr-4707.yml b/html/changelogs/AutoChangeLog-pr-4707.yml new file mode 100644 index 000000000000..d609bd7febd2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4707.yml @@ -0,0 +1,6 @@ +author: "SpypigDev" +delete-after: True +changes: + - rscadd: "CIC Armory SO vendor" + - balance: "Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor" + - balance: "Made RTO pack a point-buy item in CIC Armory vendor for SOs" \ No newline at end of file From 9961f9b450f035060b83d3f49f83f90cefe4410a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 23 Oct 2023 01:08:30 +0000 Subject: [PATCH 160/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4627.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4706.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4707.yml | 6 ------ html/changelogs/AutoChangeLog-pr-4752.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4753.yml | 4 ---- html/changelogs/archive/2023-10.yml | 14 ++++++++++++++ 6 files changed, 14 insertions(+), 22 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4627.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4706.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4707.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4752.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4753.yml diff --git a/html/changelogs/AutoChangeLog-pr-4627.yml b/html/changelogs/AutoChangeLog-pr-4627.yml deleted file mode 100644 index 69b88c735822..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4627.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "stalkerino" -delete-after: True -changes: - - balance: "m39 is able to use vertigrip" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4706.yml b/html/changelogs/AutoChangeLog-pr-4706.yml deleted file mode 100644 index 8d6c934a5cc0..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4706.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - balance: "Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4707.yml b/html/changelogs/AutoChangeLog-pr-4707.yml deleted file mode 100644 index d609bd7febd2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4707.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SpypigDev" -delete-after: True -changes: - - rscadd: "CIC Armory SO vendor" - - balance: "Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor" - - balance: "Made RTO pack a point-buy item in CIC Armory vendor for SOs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4752.yml b/html/changelogs/AutoChangeLog-pr-4752.yml deleted file mode 100644 index b6417f410eb9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4752.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "QuickLode" -delete-after: True -changes: - - balance: "Nerfs synth surv pouch by removing 1 storage slot." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4753.yml b/html/changelogs/AutoChangeLog-pr-4753.yml deleted file mode 100644 index 961d6e35c2d4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4753.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "harryob" -delete-after: True -changes: - - server: "the server now respects /string/title for late joiners" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 2e3ce59495b2..91ac923f0bb9 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -342,3 +342,17 @@ - rscadd: Added Discretionary Arrest to JAS. - rscadd: Added a new category to JAS, Precautionary Charges. Moves Insanity and POW to this category. +2023-10-23: + QuickLode: + - balance: Nerfs synth surv pouch by removing 1 storage slot. + SpypigDev: + - rscadd: CIC Armory SO vendor + - balance: Moved most combat-themed gear from SO spawn vendors, to CIC Armory vendor + - balance: Made RTO pack a point-buy item in CIC Armory vendor for SOs + Steelpoint: + - balance: Revolver Heavy ammo no longer stuns targets it strikes, it will instead + knock them back and slow them down for a short time. + harryob: + - server: the server now respects /string/title for late joiners + stalkerino: + - balance: m39 is able to use vertigrip From b7aafd1ef82c1fcc9d4ca0577600399311576b12 Mon Sep 17 00:00:00 2001 From: Segrain Date: Tue, 24 Oct 2023 02:54:45 +0400 Subject: [PATCH 161/199] Fix for slicing food. (#4770) # About the pull request Followup to #4645. And also a fix for ancient math mistake few lines below. # Explain why it's good for the game Is fix. # Changelog :cl: fix: Slicing food once again works as intended. /:cl: --- code/game/objects/items/reagent_containers/food/snacks.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 179e2014f8cf..2892eb1113e7 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -184,7 +184,7 @@ var/inaccurate = 0 if(W.sharp == IS_SHARP_ITEM_BIG) inaccurate = 1 - else + else if(W.sharp != IS_SHARP_ITEM_ACCURATE) return 1 if ( !istype(loc, /obj/structure/surface/table) && \ (!isturf(src.loc) || \ @@ -205,7 +205,7 @@ SPAN_NOTICE("[user] crudely slices \the [src] with [W]!"), \ SPAN_NOTICE("You crudely slice \the [src] with your [W]!") \ ) - slices_lost = rand(1,min(1,round(slices_num/2))) + slices_lost = rand(1,max(1,round(slices_num/2))) var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) var/obj/slice = new slice_path (src.loc) From 004cd863319b7a483ef71fb3e01541187d9f5806 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 00:04:49 +0100 Subject: [PATCH 162/199] Automatic changelog for PR #4770 [ci skip] --- html/changelogs/AutoChangeLog-pr-4770.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4770.yml diff --git a/html/changelogs/AutoChangeLog-pr-4770.yml b/html/changelogs/AutoChangeLog-pr-4770.yml new file mode 100644 index 000000000000..c805c6a63cc1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4770.yml @@ -0,0 +1,4 @@ +author: "Segrain" +delete-after: True +changes: + - bugfix: "Slicing food once again works as intended." \ No newline at end of file From 78c89745a61388f3b59b9d6c540528cd6cf75271 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 24 Oct 2023 01:07:47 +0000 Subject: [PATCH 163/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4770.yml | 4 ---- html/changelogs/archive/2023-10.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4770.yml diff --git a/html/changelogs/AutoChangeLog-pr-4770.yml b/html/changelogs/AutoChangeLog-pr-4770.yml deleted file mode 100644 index c805c6a63cc1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4770.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Segrain" -delete-after: True -changes: - - bugfix: "Slicing food once again works as intended." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 91ac923f0bb9..82d637659173 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -356,3 +356,6 @@ - server: the server now respects /string/title for late joiners stalkerino: - balance: m39 is able to use vertigrip +2023-10-24: + Segrain: + - bugfix: Slicing food once again works as intended. From 62aac19f76773033ecd3f04e5132a310c7d67ec2 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 05:04:01 +0200 Subject: [PATCH 164/199] hotfix for radio talking (#4769) # About the pull request Hotfix for #4645 - removing the switch clause makes normal talk fall through into radio speech and makes everyone talk on radio all the time # Testing Photographs and Procedure Very basic testing # Changelog :cl: fix: Fixed people talking in radios all the time. Finally some quiet. /:cl: --- code/modules/mob/living/carbon/human/say.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 069392f2c92e..28e45dcb2f5e 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -141,9 +141,10 @@ used_radios += I break // remove this if we EVER have two different intercomms with DIFFERENT frequencies IN ONE ROOM else - var/earpiece = get_type_in_ears(/obj/item/device/radio) - if(earpiece) - used_radios += earpiece + if(message_mode != MESSAGE_MODE_LOCAL) + var/earpiece = get_type_in_ears(/obj/item/device/radio) + if(earpiece) + used_radios += earpiece var/sound/speech_sound var/sound_vol From b4e6d9145173054104c94417f5f58e57e14360ff Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 04:12:35 +0100 Subject: [PATCH 165/199] Automatic changelog for PR #4769 [ci skip] --- html/changelogs/AutoChangeLog-pr-4769.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4769.yml diff --git a/html/changelogs/AutoChangeLog-pr-4769.yml b/html/changelogs/AutoChangeLog-pr-4769.yml new file mode 100644 index 000000000000..f91f0bc5b2d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4769.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed people talking in radios all the time. Finally some quiet." \ No newline at end of file From e31a1d21ee9aa87a84b4d639bea4139bd859d8f5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 08:50:23 +0100 Subject: [PATCH 166/199] Automatic TGS DMAPI Update (#4773) This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging. Co-authored-by: tgstation-server --- code/__DEFINES/tgs.dm | 13 ++++++++++++- code/modules/tgs/core/core.dm | 7 ++++++- code/modules/tgs/core/datum.dm | 3 +++ code/modules/tgs/v5/__interop_version.dm | 2 +- code/modules/tgs/v5/_defines.dm | 1 + code/modules/tgs/v5/api.dm | 6 ++++++ code/modules/tgs/v5/undefs.dm | 1 + 7 files changed, 30 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 6187a67825a4..9825cd118b68 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.5.3" +#define TGS_DMAPI_VERSION "6.6.0" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -129,6 +129,13 @@ /// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 +/// DreamDaemon public visibility level. +#define TGS_VISIBILITY_PUBLIC 0 +/// DreamDaemon private visibility level. +#define TGS_VISIBILITY_PRIVATE 1 +/// DreamDaemon invisible visibility level. +#define TGS_VISIBILITY_INVISIBLE 2 + //REQUIRED HOOKS /** @@ -458,6 +465,10 @@ /world/proc/TgsSecurityLevel() return +/// Returns the current BYOND visibility level as a TGS_VISIBILITY_ define if TGS is present, null otherwise. Requires TGS to be using interop API version 5 or higher otherwise the string "___unimplemented" wil be returned. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! +/world/proc/TgsVisibility() + return + /// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsTestMerges() return diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 41a047339452..b9a9f27a28ae 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -153,4 +153,9 @@ /world/TgsSecurityLevel() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) - api.SecurityLevel() + return api.SecurityLevel() + +/world/TgsVisibility() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.Visibility() diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 68b0330fe860..93377079aa73 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -57,3 +57,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/Visibility() + return TGS_UNIMPLEMENTED diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 5d3d491a7362..1b52b31d6a73 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.6.1" +"5.6.2" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index f973338daa03..bdcd4e4dd58e 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -48,6 +48,7 @@ #define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" #define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" #define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" +#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility" #define DMAPI5_CHAT_UPDATE_CHANNELS "channels" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 34cc43f8762f..45250efc4627 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -4,6 +4,7 @@ var/instance_name var/security_level + var/visibility var/reboot_mode = TGS_REBOOT_MODE_NORMAL @@ -54,6 +55,7 @@ version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] @@ -252,3 +254,7 @@ /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level + +/datum/tgs_api/v5/Visibility() + RequireInitialBridgeResponse() + return visibility diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index c679737dfc49..f163adaaafe3 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -48,6 +48,7 @@ #undef DMAPI5_RUNTIME_INFORMATION_REVISION #undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES #undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL +#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY #undef DMAPI5_CHAT_UPDATE_CHANNELS From 336625688585418f3123387467f4eb8ba469f732 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 13:52:23 +0200 Subject: [PATCH 167/199] Fixes Observer Death Messages being delayed (#4775) # About the pull request Long standing bug - due to waiting for not one but two full database entities loading, the death message in dchat is delayed. It's also symptomatic of a scheduling problem with DBQM as you can see deaths occuring in "batches" every couple seconds, indicating the queries are not processed timely - but this is out of scope for this PR. Instead it just moves the observer logging to take place before DB ops. # Explain why it's good for the game Feels less clunky. # Testing Photographs and Procedure Just spawned stuff and abombed it. # Changelog :cl: fix: deadchat death messages should now display immediately rather than being delayed a couple seconds. /:cl: --- code/datums/statistics/entities/death_stats.dm | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm index 4a01e4e9d72b..cb3053a33442 100644 --- a/code/datums/statistics/entities/death_stats.dm +++ b/code/datums/statistics/entities/death_stats.dm @@ -84,6 +84,10 @@ if(!mind || statistic_exempt) return + var/area/area = get_area(death_loc) + handle_observer_message(cause_data, cause_mob, death_loc, area) + + // Perform logging above before get_player_from_key to avoid delays var/datum/entity/statistic/death/new_death = DB_ENTITY(/datum/entity/statistic/death) var/datum/entity/player/player_entity = get_player_from_key(mind.ckey) if(player_entity) @@ -95,11 +99,8 @@ new_death.role_name = get_role_name() new_death.mob_name = real_name new_death.faction_name = faction - new_death.is_xeno = FALSE - - var/area/A = get_area(death_loc) - new_death.area_name = A.name + new_death.area_name = area.name new_death.cause_name = cause_data?.cause_name var/datum/entity/player/cause_player = get_player_from_key(cause_data?.ckey) @@ -132,8 +133,6 @@ new_death.total_damage_taken = life_damage_taken_total new_death.total_revives_done = life_revives_total - handle_observer_message(cause_data, cause_mob, death_loc, A) - if(round_statistics) round_statistics.track_death(new_death) From bfe6e4e0a94d2f9e7d593ef7f0eaca5d93ff29f6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:02:36 +0100 Subject: [PATCH 168/199] Automatic changelog for PR #4775 [ci skip] --- html/changelogs/AutoChangeLog-pr-4775.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4775.yml diff --git a/html/changelogs/AutoChangeLog-pr-4775.yml b/html/changelogs/AutoChangeLog-pr-4775.yml new file mode 100644 index 000000000000..c142696105eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4775.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "deadchat death messages should now display immediately rather than being delayed a couple seconds." \ No newline at end of file From 7cfbe6f482edd510dca8b2b363e32b4c8ea18482 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 13:53:10 +0200 Subject: [PATCH 169/199] Fixes pounces targeting unliving on the landing turf (#4776) # About the pull request Fixes #1053 Stops pounce landing from scanning ghosts/holograms and targeting them in place of a living target. It was pretty obvious for Queen Eye but apparently seemed to actually happen with Ghosts aswell - since there was no message due to checks further down, it was overlooked # Explain why it's good for the game Invisible bugs aren't so fun # Changelog :cl: fix: Fixed Ghosts and Queen Eye occasionally "eating" pounces in place of a mob on the same turf. /:cl: --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index fa9036bd8305..3fd8e53024d5 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -357,8 +357,8 @@ /mob/living/carbon/xenomorph/proc/pounced_turf(turf/T) if(!T.density) - for(var/mob/M in T) - pounced_mob(M) + for(var/mob/living/mob in T) + pounced_mob(mob) break else turf_launch_collision(T) From 9bbd25e667934db3de0c1a3feeefb36461103739 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:18:04 +0100 Subject: [PATCH 170/199] Automatic changelog for PR #4776 [ci skip] --- html/changelogs/AutoChangeLog-pr-4776.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4776.yml diff --git a/html/changelogs/AutoChangeLog-pr-4776.yml b/html/changelogs/AutoChangeLog-pr-4776.yml new file mode 100644 index 000000000000..0be7bf108010 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4776.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed Ghosts and Queen Eye occasionally \"eating\" pounces in place of a mob on the same turf." \ No newline at end of file From a1681d59bd2a5bcbff370186d2d4488bcd8f35a0 Mon Sep 17 00:00:00 2001 From: fira Date: Tue, 24 Oct 2023 13:53:50 +0200 Subject: [PATCH 171/199] Fixed Lagnchat Xeno offsets again, final edition i swear (#4771) # About the pull request Fixes for Xeno langchat offsets, AGAIN. My math keeps being wrong and failing under specific cases... It turns out it's a lot simpler than what i've been trying to do too. AGH! # Testing Photographs and Procedure I brought PROPER photos of PROPER testing which hopefully means that it's a PROPER fix this time ### CLF are not very good at briefings ![image](https://github.com/cmss13-devs/cmss13/assets/604624/ba9c96b3-1d86-4a9a-8a35-c486fad73bfe) ### Bad CLF but with megaphone ![image](https://github.com/cmss13-devs/cmss13/assets/604624/19ace90b-6b36-4470-a0e8-07897c640d01) ### Queen (icon_size=64) has joined the chat ![image](https://github.com/cmss13-devs/cmss13/assets/604624/02e88372-b881-4b21-866e-f9562e644ea5) ### Queen but offset by pixel_x ![image](https://github.com/cmss13-devs/cmss13/assets/604624/4319d02a-cf69-4f16-a5a1-01b2fcacaea7) # Changelog :cl: fix: Re-Re-Fixed Xeno Above Head Chat offsets, for real this time /:cl: --- code/datums/langchat/langchat.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm index 3f00c26b6d36..83b9be0ac053 100644 --- a/code/datums/langchat/langchat.dm +++ b/code/datums/langchat/langchat.dm @@ -47,6 +47,13 @@ M.client.images -= langchat_image langchat_listeners = null +/atom/proc/langchat_set_x_offset() + langchat_image.maptext_x = world.icon_size / 2 - langchat_image.maptext_width / 2 +/atom/movable/langchat_set_x_offset() + langchat_image.maptext_x = bound_width / 2 - langchat_image.maptext_width / 2 +/mob/langchat_set_x_offset() + langchat_image.maptext_x = icon_size / 2 - langchat_image.maptext_width / 2 + ///Creates the image if one does not exist, resets settings that are modified by speech procs. /atom/proc/langchat_make_image(override_color = null) if(!langchat_image) @@ -56,8 +63,8 @@ langchat_image.appearance_flags = NO_CLIENT_COLOR|KEEP_APART|RESET_COLOR|RESET_TRANSFORM langchat_image.maptext_y = langchat_height langchat_image.maptext_height = 64 - langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) langchat_image.maptext_y -= LANGCHAT_MESSAGE_POP_Y_SINK + langchat_set_x_offset() langchat_image.pixel_y = 0 langchat_image.alpha = 0 @@ -102,7 +109,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH - langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) + langchat_set_x_offset() langchat_listeners = listeners for(var/mob/M in langchat_listeners) @@ -149,7 +156,7 @@ langchat_image.maptext = text_to_display langchat_image.maptext_width = LANGCHAT_WIDTH * 2 - langchat_image.maptext_x = - world.icon_size - get_pixel_position_x(src, TRUE) - LANGCHAT_WIDTH / 2 + langchat_set_x_offset() langchat_listeners = listeners for(var/mob/M in langchat_listeners) From 747b99c3bbc7b67f4df8e5f2a77c582bc4258df7 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 24 Oct 2023 13:32:52 +0100 Subject: [PATCH 172/199] Automatic changelog for PR #4771 [ci skip] --- html/changelogs/AutoChangeLog-pr-4771.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4771.yml diff --git a/html/changelogs/AutoChangeLog-pr-4771.yml b/html/changelogs/AutoChangeLog-pr-4771.yml new file mode 100644 index 000000000000..c0d2caca3939 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4771.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Re-Re-Fixed Xeno Above Head Chat offsets, for real this time" \ No newline at end of file From 990bd14115406bfbe8b1e5ffecee00ba7986681f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 25 Oct 2023 01:08:03 +0000 Subject: [PATCH 173/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4769.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4771.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4775.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4776.yml | 4 ---- html/changelogs/archive/2023-10.yml | 8 ++++++++ 5 files changed, 8 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4769.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4771.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4775.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4776.yml diff --git a/html/changelogs/AutoChangeLog-pr-4769.yml b/html/changelogs/AutoChangeLog-pr-4769.yml deleted file mode 100644 index f91f0bc5b2d8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4769.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed people talking in radios all the time. Finally some quiet." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4771.yml b/html/changelogs/AutoChangeLog-pr-4771.yml deleted file mode 100644 index c0d2caca3939..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4771.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Re-Re-Fixed Xeno Above Head Chat offsets, for real this time" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4775.yml b/html/changelogs/AutoChangeLog-pr-4775.yml deleted file mode 100644 index c142696105eb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4775.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "deadchat death messages should now display immediately rather than being delayed a couple seconds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4776.yml b/html/changelogs/AutoChangeLog-pr-4776.yml deleted file mode 100644 index 0be7bf108010..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4776.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed Ghosts and Queen Eye occasionally \"eating\" pounces in place of a mob on the same turf." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 82d637659173..1cb7c4597dd0 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -359,3 +359,11 @@ 2023-10-24: Segrain: - bugfix: Slicing food once again works as intended. +2023-10-25: + fira: + - bugfix: Fixed Ghosts and Queen Eye occasionally "eating" pounces in place of a + mob on the same turf. + - bugfix: Re-Re-Fixed Xeno Above Head Chat offsets, for real this time + - bugfix: Fixed people talking in radios all the time. Finally some quiet. + - bugfix: deadchat death messages should now display immediately rather than being + delayed a couple seconds. From c6e17e22f9b76d6de7ec48fd41c2d6432c558874 Mon Sep 17 00:00:00 2001 From: 4hands44 <107715181+4hands44@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:58:10 -0500 Subject: [PATCH 174/199] CO Vendor Tweaks (#4751) # About the pull request CO's only having one belt and satchel to choose from is weird and dumb. This PR seeks to Fix this by adding a variety of existing belts to the CO vendor, as well as touches the Weapon Vendor, by adding a variety attachments and equipment, to bring CO in line with SLs, IOs and other Field officer roles. # Explain why it's good for the game Gives COs more options for their loadouts # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added more attachments, and belts to the CO arsenal. add: CO now has an Essentials Kit like other roles, containing his Designator, and other useful tools. add: Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and XO currently.) del: Removed Laser Designator from CO spawn Preset. balance: CO can now vend welding Helmet visors. balance: Adds grenade packets to CO Vendor. /:cl: --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- .../vendor_types/crew/commanding_officer.dm | 43 ++++++++++++++++--- code/modules/gear_presets/uscm_ship.dm | 7 +-- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm index 830511ad4b19..d7d49a8ae044 100644 --- a/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm +++ b/code/game/machinery/vending/vendor_types/crew/commanding_officer.dm @@ -1,9 +1,9 @@ //------------GEAR VENDOR--------------- GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( - list("COMMANDING OFFICER'S PRIMARY (CHOOSE 1)", 0, null, null, null), - list("M46C pulse rifle", 0, /obj/effect/essentials_set/co/riflepreset, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), - list("M56C Smartgun", 0, /obj/item/storage/box/m56c_system, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + list("COMMANDER'S PRIMARY (CHOOSE 1)", 0, null, null, null), + list("M46C Pulse Rifle", 0, /obj/effect/essentials_set/co/riflepreset, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_MANDATORY), + list("M56C Smartgun", 0, /obj/item/storage/box/m56c_system, MARINE_CAN_BUY_SECONDARY, VENDOR_ITEM_MANDATORY), list("PRIMARY AMMUNITION", 0, null, null, null), list("M41A MK1 Magazine", 30, /obj/item/ammo_magazine/rifle/m41aMK1, null, VENDOR_ITEM_RECOMMENDED), @@ -28,11 +28,19 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("M41A Rubber Shot Magazine", 10, /obj/item/ammo_magazine/rifle/rubber, null, VENDOR_ITEM_REGULAR), list("Beanbag Slugs", 10, /obj/item/ammo_magazine/shotgun/beanbag, null, VENDOR_ITEM_REGULAR), + list("EXPLOSIVES", 0, null, null, null), + list("HEDP Grenade Pack", 15, /obj/item/storage/box/packet/high_explosive, null, VENDOR_ITEM_REGULAR), + list("HEFA Grenade Pack", 15, /obj/item/storage/box/packet/hefa, null, VENDOR_ITEM_REGULAR), + list("WP Grenade Pack", 15, /obj/item/storage/box/packet/phosphorus, null, VENDOR_ITEM_REGULAR), + list("RAIL ATTACHMENTS", 0, null, null, null), list("Red-Dot Sight", 15, /obj/item/attachable/reddot, null, VENDOR_ITEM_REGULAR), list("Reflex Sight", 15, /obj/item/attachable/reflex, null, VENDOR_ITEM_REGULAR), list("S4 2x Telescopic Mini-Scope", 15, /obj/item/attachable/scope/mini, null, VENDOR_ITEM_REGULAR), + list("Helmet Visors", 0, null, null, null), + list("Welding Visor", 5, /obj/item/device/helmet_visor/welding_visor, null, VENDOR_ITEM_RECOMMENDED), + list("UNDERBARREL ATTACHMENTS", 0, null, null, null), list("Laser Sight", 15, /obj/item/attachable/lasersight, null, VENDOR_ITEM_REGULAR), list("Angled Grip", 15, /obj/item/attachable/angledgrip, null, VENDOR_ITEM_REGULAR), @@ -40,12 +48,13 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( list("Underbarrel Shotgun", 15, /obj/item/attachable/attached_gun/shotgun, null, VENDOR_ITEM_REGULAR), list("Underbarrel Extinguisher", 15, /obj/item/attachable/attached_gun/extinguisher, null, VENDOR_ITEM_REGULAR), list("Underbarrel Flamethrower", 15, /obj/item/attachable/attached_gun/flamer, null, VENDOR_ITEM_REGULAR), + list("Underbarrel Grenade Launcher", 5, /obj/item/attachable/attached_gun/grenade, null, VENDOR_ITEM_REGULAR), list("BARREL ATTACHMENTS", 0, null, null, null), - list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), list("Extended Barrel", 15, /obj/item/attachable/extended_barrel, null, VENDOR_ITEM_REGULAR), list("Recoil Compensator", 15, /obj/item/attachable/compensator, null, VENDOR_ITEM_REGULAR), - )) + list("Suppressor", 15, /obj/item/attachable/suppressor, null, VENDOR_ITEM_REGULAR), + )) /obj/structure/machinery/cm_vending/gear/commanding_officer name = "\improper ColMarTech Commanding Officer Weapon Rack" @@ -63,9 +72,15 @@ GLOBAL_LIST_INIT(cm_vending_gear_commanding_officer, list( GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), - list("Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY), + list("COMMANDING OFFICER ESSENTIALS KIT (TAKE ALL)", 0, null, null, null), + list("Commanding Officer Essentials Kit", 0, /obj/effect/essentials_set/commanding_officer, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), + + list("BAGS (CHOOSE 1)", 0, null, null, null), + list("Commanding Officer Backpack", 0, /obj/item/storage/backpack/mcommander, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("Secure Satchel", 0, /obj/item/storage/backpack/satchel/lockable, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY), + list("COMBAT EQUIPMENT (TAKE ALL)", 0, null, null, null), list("Commanding Officer's M3 Armor", 0, /obj/item/clothing/suit/storage/marine/MP/CO, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_MANDATORY), list("Commanding Officer's M10 Helmet", 0, /obj/item/clothing/head/helmet/marine/CO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY), @@ -84,8 +99,13 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( list("Medical HUD Glasses", 0, /obj/item/clothing/glasses/hud/health, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED), list("Security HUD Glasses", 0, /obj/item/clothing/glasses/sunglasses/sechud, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR), - list("BELTS (TAKE ALL)", 0, null, null, null), + list("BELTS (CHOOSE 1)", 0, null, null, null), list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("Military Police Belt", 0, /obj/item/storage/belt/security/MP/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Medical Storage Rig", 0, /obj/item/storage/belt/medical/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Ammo Load Rig", 0, /obj/item/storage/belt/marine, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 Holster Toolrig", 0, /obj/item/storage/belt/gun/utility/full, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED), + list("M276 M82F Holster Rig", 0, /obj/item/storage/belt/gun/flaregun, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR), list("POUCHES (CHOOSE 2)", 0, null, null, null), list("First-Aid Pouch (Refillable Injectors)", 0, /obj/item/storage/pouch/firstaid/full, MARINE_CAN_BUY_POUCH, VENDOR_ITEM_REGULAR), @@ -110,6 +130,15 @@ GLOBAL_LIST_INIT(cm_vending_clothing_commanding_officer, list( /obj/structure/machinery/cm_vending/clothing/commanding_officer/get_listed_products(mob/user) return GLOB.cm_vending_clothing_commanding_officer +/obj/effect/essentials_set/commanding_officer + spawned_gear_list = list( + /obj/item/device/binoculars/range/designator, + /obj/item/map/current_map, + /obj/item/device/whistle, + /obj/item/weapon/gun/energy/taser, + /obj/item/device/megaphone, + ) + // This gets around the COs' weapon not spawning without incendiary mag. /obj/effect/essentials_set/co/riflepreset spawned_gear_list = list( diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 4c383cfed6d9..5ea860b05edb 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -417,7 +417,7 @@ dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full) dress_hat = list(/obj/item/clothing/head/marine/peaked/captain/white, /obj/item/clothing/head/marine/peaked/captain/black, /obj/item/clothing/head/marine/peaked) dress_shoes = list(/obj/item/clothing/shoes/dress/commander) - dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/officer/white, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress) + dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/officer/white, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress, /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey, ) /datum/equipment_preset/uscm_ship/commander/New() . = ..() @@ -458,7 +458,6 @@ new_human.equip_to_slot_or_del(new back_item(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/general/large(new_human), WEAR_R_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/pistol/command(new_human), WEAR_L_STORE) - new_human.equip_to_slot_or_del(new /obj/item/device/binoculars/range/designator(new_human), WEAR_L_HAND) if(kit) new_human.equip_to_slot_or_del(new kit(new_human), WEAR_IN_BACK) @@ -479,6 +478,8 @@ /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/falcon, + /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey, + /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat, ) /datum/equipment_preset/uscm_ship/commander/council/load_gear(mob/living/carbon/human/new_human) @@ -512,7 +513,7 @@ minimap_icon = list("cic" = MINIMAP_ICON_COLOR_HEAD) minimap_background = MINIMAP_ICON_BACKGROUND_CIC - dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full) + dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full, /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey,) /datum/equipment_preset/uscm_ship/xo/New() . = ..() From 9ad1550bb2d387746c3a1d734df9253b467fc7b6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 25 Oct 2023 23:11:11 +0100 Subject: [PATCH 175/199] Automatic changelog for PR #4751 [ci skip] --- html/changelogs/AutoChangeLog-pr-4751.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4751.yml diff --git a/html/changelogs/AutoChangeLog-pr-4751.yml b/html/changelogs/AutoChangeLog-pr-4751.yml new file mode 100644 index 000000000000..876d9b32a5ed --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4751.yml @@ -0,0 +1,9 @@ +author: "4hands44" +delete-after: True +changes: + - rscadd: "Added more attachments, and belts to the CO arsenal." + - rscadd: "CO now has an Essentials Kit like other roles, containing his Designator, and other useful tools." + - rscadd: "Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and XO currently.)" + - rscdel: "Removed Laser Designator from CO spawn Preset." + - balance: "CO can now vend welding Helmet visors." + - balance: "Adds grenade packets to CO Vendor." \ No newline at end of file From dec69dd6e3bda50216cd5669c0e37ffcf87caade Mon Sep 17 00:00:00 2001 From: Paladina <82751385+XDinka@users.noreply.github.com> Date: Thu, 26 Oct 2023 04:23:59 +0500 Subject: [PATCH 176/199] 4 New Haircuts (#4728) # About the pull request ## Some new haicuts Looking at the current sheet it occurred to me to add a few current popular hairstyles that have passed the community evaluation. It's a bit hard for me to write text and descriptions due to my poor language skills, but I'll try to describe as much as I can. # Explain why it's good for the game First of all, playing on the server we try to associate ourselves with the character, try to be in his skin. His appearance plays an important role. A couple of beautiful hairstyles will please the eye of players and add a little more variety # Photographs
Screenshots & Videos ## Gentle Ponytail ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/340409c0-28ac-494b-935e-b21eed177468) ![hair_gentleponytail](https://github.com/cmss13-devs/cmss13/assets/82751385/f58b4fe0-3bb4-41be-b016-77edfa26b22e) ## Edgar haircut ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/69020adb-bc87-4f68-9f56-e3334bf5b741) ![hair_edgar](https://github.com/cmss13-devs/cmss13/assets/82751385/c0477be4-f10c-4622-a496-b3d405631df3) ## Emo Bun ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/605352c2-c35c-49da-bbc1-2dbf472fde44) ![hair_emobun](https://github.com/cmss13-devs/cmss13/assets/82751385/93432acf-2116-403e-9cc7-7ffd772fb6b0) ## Taper haircut ![image](https://github.com/cmss13-devs/cmss13/assets/82751385/18378922-f72b-4060-b66d-b3aae4e16a23) ![hair_taper](https://github.com/cmss13-devs/cmss13/assets/82751385/15e72936-c981-4e0e-9834-ac0f4740c605)
# Changelog :cl: XDinka add: Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut. /:cl: --- .../mob/new_player/sprite_accessories/hair.dm | 17 +++++++++++++++++ icons/mob/humans/human_hair.dmi | Bin 49242 -> 58422 bytes 2 files changed, 17 insertions(+) diff --git a/code/modules/mob/new_player/sprite_accessories/hair.dm b/code/modules/mob/new_player/sprite_accessories/hair.dm index 3f624b8d3b15..3dfe8bebd5af 100644 --- a/code/modules/mob/new_player/sprite_accessories/hair.dm +++ b/code/modules/mob/new_player/sprite_accessories/hair.dm @@ -738,3 +738,20 @@ /datum/sprite_accessory/hair/aviator name = "Aviator" icon_state = "hair_aviator" + +/datum/sprite_accessory/hair/gantleponytail + name = "Gentle Ponytail" + icon_state = "hair_gantleponytail" + gender = FEMALE + +/datum/sprite_accessory/hair/edgar + name = "Edgar" + icon_state = "hair_edgar" + +/datum/sprite_accessory/hair/emobun + name = "Emo Little Bun" + icon_state = "hair_emobun" + +/datum/sprite_accessory/hair/taper + name = "Taper" + icon_state = "hair_taper" diff --git a/icons/mob/humans/human_hair.dmi b/icons/mob/humans/human_hair.dmi index ca4a20bcafbdfa02a53cfac18801df9dc668f62b..9634a2543aa44fc25120de838b04a53ecabc5e67 100644 GIT binary patch literal 58422 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≫L?RJOaCcsca($ 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 z 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 VJcpL@r=rKcXl8Y;#Pr6){{!?c|62e6 From 7ef46d06198935b5c98f44ec5949b2d8e5f081a4 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 00:32:52 +0100 Subject: [PATCH 177/199] Automatic changelog for PR #4728 [ci skip] --- html/changelogs/AutoChangeLog-pr-4728.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4728.yml diff --git a/html/changelogs/AutoChangeLog-pr-4728.yml b/html/changelogs/AutoChangeLog-pr-4728.yml new file mode 100644 index 000000000000..9eac7be42937 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4728.yml @@ -0,0 +1,4 @@ +author: "XDinka" +delete-after: True +changes: + - rscadd: "Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut." \ No newline at end of file From c590d113d8a0f804f3952f042c3cab153ebd0fe4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 26 Oct 2023 01:06:41 +0000 Subject: [PATCH 178/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4728.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4751.yml | 9 --------- html/changelogs/archive/2023-10.yml | 13 +++++++++++++ 3 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4728.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4751.yml diff --git a/html/changelogs/AutoChangeLog-pr-4728.yml b/html/changelogs/AutoChangeLog-pr-4728.yml deleted file mode 100644 index 9eac7be42937..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4728.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDinka" -delete-after: True -changes: - - rscadd: "Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4751.yml b/html/changelogs/AutoChangeLog-pr-4751.yml deleted file mode 100644 index 876d9b32a5ed..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4751.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "4hands44" -delete-after: True -changes: - - rscadd: "Added more attachments, and belts to the CO arsenal." - - rscadd: "CO now has an Essentials Kit like other roles, containing his Designator, and other useful tools." - - rscadd: "Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and XO currently.)" - - rscdel: "Removed Laser Designator from CO spawn Preset." - - balance: "CO can now vend welding Helmet visors." - - balance: "Adds grenade packets to CO Vendor." \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index 1cb7c4597dd0..fb4ed664fdfd 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -367,3 +367,16 @@ - bugfix: Fixed people talking in radios all the time. Finally some quiet. - bugfix: deadchat death messages should now display immediately rather than being delayed a couple seconds. +2023-10-26: + 4hands44: + - rscadd: Added more attachments, and belts to the CO arsenal. + - rscadd: CO now has an Essentials Kit like other roles, containing his Designator, + and other useful tools. + - rscadd: Re-Adds Bridgecoat to some Officer Dress vendors. (Limited to CO(+) and + XO currently.) + - rscdel: Removed Laser Designator from CO spawn Preset. + - balance: CO can now vend welding Helmet visors. + - balance: Adds grenade packets to CO Vendor. + XDinka: + - rscadd: 'Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper + haircut.' From c1563b85bdbdce4019dd138fcee478c7411e11e1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 08:05:51 +0100 Subject: [PATCH 179/199] Automatic TGS DMAPI Update (#4779) This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging. Co-authored-by: tgstation-server --- code/__DEFINES/tgs.dm | 2 +- code/modules/tgs/core/datum.dm | 4 ++++ code/modules/tgs/v4/api.dm | 10 +++++----- code/modules/tgs/v5/api.dm | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 9825cd118b68..d468d6044196 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.6.0" +#define TGS_DMAPI_VERSION "6.6.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 93377079aa73..de420a2a325a 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -11,6 +11,10 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) src.event_handler = event_handler src.version = version +/datum/tgs_api/proc/TerminateWorld() + del(world) + sleep(1) // https://www.byond.com/forum/post/2894866 + /datum/tgs_api/latest parent_type = /datum/tgs_api/v5 diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index b9a75c4abb48..945e2e411767 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -73,7 +73,7 @@ if(cached_json["apiValidateOnly"]) TGS_INFO_LOG("Validating API and exiting...") Export(TGS4_COMM_VALIDATE, list(TGS4_PARAMETER_DATA = "[minimum_required_security_level]")) - del(world) + TerminateWorld() security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] @@ -188,7 +188,7 @@ requesting_new_port = TRUE if(!world.OpenPort(0)) //open any port TGS_ERROR_LOG("Unable to open random port to retrieve new port![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() //request a new port export_lock = FALSE @@ -196,16 +196,16 @@ if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() var/new_port = new_port_json[TGS4_PARAMETER_DATA] if(!isnum(new_port) || new_port <= 0) TGS_ERROR_LOG("Malformed new port json ([json_encode(new_port_json)])![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() if(new_port != world.port && !world.OpenPort(new_port)) TGS_ERROR_LOG("Unable to open port [new_port]![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() requesting_new_port = FALSE while(export_lock) diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 45250efc4627..7226f29bba60 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -51,7 +51,7 @@ if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY]) TGS_INFO_LOG("DMAPI validation, exiting...") - del(world) + TerminateWorld() version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] From 2507b46ed90edad9c274f648dbdd287288623761 Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 26 Oct 2023 09:19:46 +0200 Subject: [PATCH 180/199] Fixes Smartfridge deletions + Turing/Smartfridge networking issue (#4696) # About the pull request This fixes 2 things: * Smartfridges deletion would not clean `item_quants` keeping references preventing contents deletion * The Turing machine was never updated to work with new Smartfridges and would botch `item_quants` when trying to delete empty bottles The second would manifest as such in game logs: `RUNTIME: type mismatch: -4 += Phoron bottle (/obj/item/reagent_container/glass/bottle) - code/game/machinery/kitchen/smartfridge.dm@136` because the Turing was still using it as a number and not a list. This probably fixes all sorts of weirdnesses with Turing/Fridge and possibly links to #4694 - but i recommend this be TMed by Real Research Mains to ensure nothing broke # Explain why it's good for the game Less bugs more consistency # Testing Photographs and Procedure Tested simple Turing usage, and chemical auto-bottling (looping phoron without new chems creation) # Changelog :cl: fix: Fixed various issues in the Networking between Turing machine and Smartfridges. /:cl: --- code/game/machinery/kitchen/smartfridge.dm | 20 ++++++++++++++++++- .../chemistry_machinery/autodispenser.dm | 3 +-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index f52350aa8db3..903cd06c3119 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -23,7 +23,7 @@ var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" var/icon_panel = "smartfridge-panel" - var/item_quants = list() + var/list/item_quants = list() //! Assoc list of names -> list(items) var/ispowered = TRUE //starts powered var/is_secure_fridge = FALSE var/shoot_inventory = FALSE @@ -40,6 +40,24 @@ GLOB.vending_products[/obj/item/reagent_container/glass/bottle] = 1 GLOB.vending_products[/obj/item/storage/pill_bottle] = 1 +/obj/structure/machinery/smartfridge/Destroy(force) + if(is_in_network()) // Delete all contents from networked storage index + for(var/atom/movable/item as anything in contents) + delete_contents(item) + item_quants.Cut() + return ..() // parent will delete contents if we're not networked + +/// Deletes given object in contents of the smartfridge +/obj/structure/machinery/smartfridge/proc/delete_contents(obj/item/item) + if(item.loc != src) + return + contents -= item + if(item_quants[item.name]) + item_quants[item.name] -= item + if(is_in_network() && chemical_data.shared_item_storage[item.name]) + chemical_data.shared_item_storage[item.name] -= item + qdel(item) + /obj/structure/machinery/smartfridge/proc/accept_check(obj/item/O as obj) if(istype(O,/obj/item/reagent_container/food/snacks/grown/) || istype(O,/obj/item/seeds/)) return 1 diff --git a/code/modules/reagents/chemistry_machinery/autodispenser.dm b/code/modules/reagents/chemistry_machinery/autodispenser.dm index a06042aac7a8..eed96564da71 100644 --- a/code/modules/reagents/chemistry_machinery/autodispenser.dm +++ b/code/modules/reagents/chemistry_machinery/autodispenser.dm @@ -346,8 +346,7 @@ C.reagents.trans_to(container, amount) //We don't care about keeping empty bottles stored if(C.reagents.total_volume <= 0 && istypestrict(C,/obj/item/reagent_container/glass/bottle)) - linked_storage.item_quants[C.name]-- - qdel(C) //Might want to connect it to a disposal system later instead + linked_storage.delete_contents(C) if(stage_missing) amount = stage_missing From 11c020ecfd6f2dbb4237a5e364f47a73e0a812f7 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 08:29:43 +0100 Subject: [PATCH 181/199] Automatic changelog for PR #4696 [ci skip] --- html/changelogs/AutoChangeLog-pr-4696.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4696.yml diff --git a/html/changelogs/AutoChangeLog-pr-4696.yml b/html/changelogs/AutoChangeLog-pr-4696.yml new file mode 100644 index 000000000000..3cec02591554 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4696.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed various issues in the Networking between Turing machine and Smartfridges." \ No newline at end of file From ce4d4818f47bfbcbb327511fdb63dc62cb3fbdb8 Mon Sep 17 00:00:00 2001 From: Releasethesea <135743398+Releasethesea@users.noreply.github.com> Date: Thu, 26 Oct 2023 14:54:04 -0500 Subject: [PATCH 182/199] fixes reqs emergency doors (#4763) # About the pull request The southern emergency shutters weren't properly aligned and it was bothering me so i wanted to fix it # Explain why it's good for the game map fixes are probably always good :) # Changelog :cl: Backsea fix: Fixed the incorrectly placed shutters at req and that one light near CIC /:cl: --- maps/map_files/USS_Almayer/USS_Almayer.dmm | 58 +++++++--------------- 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 12227cacc551..523f461ee94d 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -20261,6 +20261,9 @@ /area/almayer/squads/req) "bGz" = ( /obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, /turf/open/floor/almayer{ dir = 9; icon_state = "green" @@ -39680,7 +39683,6 @@ /obj/structure/machinery/door/airlock/multi_tile/almayer/generic2{ access_modified = 1; name = "\improper Flight Crew Quarters"; - req_access_txt = null; req_one_access_txt = "19;22" }, /turf/open/floor/almayer{ @@ -48195,7 +48197,6 @@ access_modified = 1; dir = 1; name = "\improper Flight Crew Quarters"; - req_access_txt = null; req_one_access_txt = "19;22" }, /turf/open/floor/almayer{ @@ -51457,15 +51458,6 @@ icon_state = "silver" }, /area/almayer/living/briefing) -"moU" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 4; - icon_state = "plating_striped" - }, -/area/almayer/squads/req) "moY" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/almayer, @@ -56351,6 +56343,9 @@ id = "req_belt" }, /obj/structure/plasticflaps, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, /turf/open/floor/almayer, /area/almayer/squads/req) "oqZ" = ( @@ -57236,18 +57231,6 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_p) -"oLg" = ( -/obj/structure/machinery/conveyor{ - id = "req_belt" - }, -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/squads/req) "oLi" = ( /obj/effect/landmark/start/marine/medic/bravo, /obj/effect/landmark/late_join/bravo, @@ -72168,6 +72151,9 @@ /area/almayer/squads/bravo) "vbR" = ( /obj/structure/window/framed/almayer, +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 1 + }, /turf/open/floor/almayer{ dir = 5; icon_state = "green" @@ -76463,11 +76449,12 @@ /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/delta) "wGI" = ( +/obj/effect/decal/cleanable/dirt, /obj/structure/machinery/light{ - dir = 4 + dir = 8 }, -/turf/closed/wall/almayer/reinforced, -/area/almayer/shipboard/port_missiles) +/turf/open/floor/almayer, +/area/almayer/hull/upper_hull/u_f_p) "wGX" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -79230,15 +79217,6 @@ "xMs" = ( /turf/closed/wall/almayer/white, /area/almayer/medical/operating_room_two) -"xMt" = ( -/obj/structure/machinery/door/firedoor/border_only/almayer{ - dir = 1 - }, -/turf/open/floor/almayer{ - dir = 8; - icon_state = "plating_striped" - }, -/area/almayer/squads/req) "xMA" = ( /obj/structure/machinery/computer/med_data, /obj/structure/sign/safety/terminal{ @@ -97649,7 +97627,7 @@ vcK mBA kCi kCi -wGI +kCi kCi vmW nIE @@ -97852,7 +97830,7 @@ ukU bfP fvv vcK -vcK +wGI tuA tuA tuA @@ -122707,7 +122685,7 @@ bxg bZr bNQ bNQ -xMt +bNQ bGz hMs cbw @@ -122910,7 +122888,7 @@ bxh bZr krN krN -oLg +krN oqY can buH @@ -123113,7 +123091,7 @@ bxg bZr ibc uly -moU +bNN vbR pky cbv From 8fc551634637af00a70691ffd15fcd17ccb91ddf Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:03:34 +0100 Subject: [PATCH 183/199] Automatic changelog for PR #4763 [ci skip] --- html/changelogs/AutoChangeLog-pr-4763.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4763.yml diff --git a/html/changelogs/AutoChangeLog-pr-4763.yml b/html/changelogs/AutoChangeLog-pr-4763.yml new file mode 100644 index 000000000000..cf9158bbf92c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4763.yml @@ -0,0 +1,4 @@ +author: "Backsea" +delete-after: True +changes: + - bugfix: "Fixed the incorrectly placed shutters at req and that one light near CIC" \ No newline at end of file From e120ab795ba0e92e4eb0f91fda194c59f83cb5aa Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 26 Oct 2023 21:55:07 +0200 Subject: [PATCH 184/199] Add Item & Footprints offsets (#4762) # About the pull request This: * Adds transverse offsets to blood footprints * Adds notable pixel offsets to a few items * Adds a very slight pixel offset to all items * Enables rotation for thrown flashlights * Cause objects exiting a surface (rack/table) to regenerate offset instead of being stuck at center * Stops random offsets from overwriting mapped offsets # Explain why it's good for the game The goal is to have map visuals more organic when we have a lot of objects on the ground - targeting in particular items you find readily in dense areas such as Reqs or a FOB. Consider this for example, the blood footprints are all aligned, in more extreme situations (eg WO) it makes an actual "grid" which i personally find very immersion breaking ![image](https://github.com/cmss13-devs/cmss13/assets/604624/83883e15-a9a0-4a2d-aa90-41c785e047b9) Adding a slight offset helps counter that: ![image](https://github.com/cmss13-devs/cmss13/assets/604624/504d1baf-385c-4774-86f3-6331c4ac87ed) # Changelog :cl: add: Bloody footprints are now slightly offset to break long visual straight lines. fix: Items do not align back to the center of turfs anymore when picked from a surface (table or rack) add: Some more items now have offsets on the map display, and they all can be slightly offset. /:cl: --------- Co-authored-by: harryob --- .../effects/decals/cleanable/blood/tracks.dm | 25 +++++++++++++------ code/game/objects/items.dm | 12 +++++++++ code/game/objects/items/devices/coins.dm | 7 ++---- code/game/objects/items/devices/flashlight.dm | 9 +++++-- .../items/explosives/grenades/grenade.dm | 4 +-- code/game/objects/items/explosives/warhead.dm | 7 ++---- .../objects/items/reagent_containers/glass.dm | 7 ++---- .../objects/items/reagent_containers/pill.dm | 2 ++ .../reagent_containers/reagent_container.dm | 2 ++ code/game/objects/items/stacks/cable_coil.dm | 6 ++--- .../items/stacks/sheets/sheet_types.dm | 3 +++ code/game/objects/structures/surface.dm | 3 +-- code/modules/cm_marines/equipment/guncases.dm | 1 + .../modules/cm_marines/equipment/kit_boxes.dm | 4 +-- .../equipment/mortar/mortar_shells.dm | 6 ++--- code/modules/cm_marines/orbital_cannon.dm | 4 +-- code/modules/hydroponics/botany_disks.dm | 6 ++--- code/modules/objectives/data_retrieval.dm | 4 +-- code/modules/objectives/documents.dm | 4 +-- code/modules/paperwork/paper.dm | 4 +-- code/modules/paperwork/photocopier.dm | 2 -- .../projectiles/ammo_boxes/ammo_boxes.dm | 4 +-- code/modules/projectiles/ammunition.dm | 5 ++-- .../chemistry_machinery/chem_master.dm | 4 --- 24 files changed, 75 insertions(+), 60 deletions(-) diff --git a/code/game/objects/effects/decals/cleanable/blood/tracks.dm b/code/game/objects/effects/decals/cleanable/blood/tracks.dm index 32593f6f30fa..c764259a6252 100644 --- a/code/game/objects/effects/decals/cleanable/blood/tracks.dm +++ b/code/game/objects/effects/decals/cleanable/blood/tracks.dm @@ -14,6 +14,9 @@ var/list/overlay_images = list() + /// Amount of pixels to shift either way in an attempt to make the tracks more organic + var/transverse_amplitude = 3 + /obj/effect/decal/cleanable/blood/tracks/Crossed() return @@ -21,19 +24,27 @@ return FALSE /obj/effect/decal/cleanable/blood/tracks/proc/add_tracks(direction, tcolor, out) - var/image/I = image(icon = icon, icon_state = out ? going_state : coming_state, dir = direction) - var/mutable_appearance/MA = new(I) + var/image/image = image(icon = icon, icon_state = out ? going_state : coming_state, dir = direction) + + var/mutable_appearance/MA = new(image) MA.color = tcolor MA.layer = layer MA.appearance_flags |= RESET_COLOR - I.appearance = MA + image.appearance = MA + + switch(direction) + if(NORTH, SOUTH) + image.pixel_x += rand(-transverse_amplitude, transverse_amplitude) + if(EAST, WEST) + image.pixel_y += rand(-transverse_amplitude, transverse_amplitude) + if(out) - LAZYSET(steps_out, "[direction]", I) + LAZYSET(steps_out, "[direction]", image) else - LAZYSET(steps_in, "[direction]", I) + LAZYSET(steps_in, "[direction]", image) - overlay_images += I - cleanable_turf.overlays += I + overlay_images += image + cleanable_turf.overlays += image /obj/effect/decal/cleanable/blood/tracks/clear_overlay() if(length(overlay_images)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 9dbe33e05135..bf24b0758262 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -156,6 +156,11 @@ var/list/inherent_traits + /// How much to offset the item randomly either way alongside X visually + var/ground_offset_x = 0 + /// How much to offset the item randomly either way alongside Y visually + var/ground_offset_y = 0 + /obj/item/Initialize(mapload, ...) . = ..() @@ -175,6 +180,8 @@ if(flags_item & MOB_LOCK_ON_EQUIP) AddComponent(/datum/component/id_lock) + scatter_item() + /obj/item/Destroy() flags_item &= ~DELONDROP //to avoid infinite loop of unequip, delete, unequip, delete. flags_item &= ~NODROP //so the item is properly unequipped if on a mob. @@ -458,6 +465,11 @@ cases. Override_icon_state should be a list.*/ /obj/item/proc/item_action_slot_check(mob/user, slot) return TRUE +/obj/item/proc/scatter_item() + if(!pixel_x && !pixel_y) + pixel_x = rand(-ground_offset_x, ground_offset_x) + pixel_y = rand(-ground_offset_y, ground_offset_y) + // The mob M is attempting to equip this item into the slot passed through as 'slot'. return TRUE if it can do this and 0 if it can't. // If you are making custom procs but would like to retain partial or complete functionality of this one, include a 'return ..()' to where you want this to happen. // Set disable_warning to TRUE if you wish it to not give you outputs. diff --git a/code/game/objects/items/devices/coins.dm b/code/game/objects/items/devices/coins.dm index 6ab79e3216d4..7343d14ad199 100644 --- a/code/game/objects/items/devices/coins.dm +++ b/code/game/objects/items/devices/coins.dm @@ -11,11 +11,8 @@ black_market_value = 10 var/string_attached var/sides = 2 - -/obj/item/coin/Initialize() - . = ..() - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 + ground_offset_x = 8 + ground_offset_y = 4 /obj/item/coin/gold name = "gold coin" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index e795f4e28de4..114964464a25 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -12,6 +12,8 @@ light_range = 5 light_power = 1 + ground_offset_x = 2 + ground_offset_y = 6 actions_types = list(/datum/action/item_action) var/on = FALSE @@ -33,6 +35,11 @@ else icon_state = initial(icon_state) +/obj/item/device/flashlight/animation_spin(speed = 5, loop_amount = -1, clockwise = TRUE, sections = 3, angular_offset = 0, pixel_fuzz = 0) + clockwise = pick(TRUE, FALSE) + angular_offset = rand(360) + return ..() + /obj/item/device/flashlight/proc/update_brightness(mob/user = null) if(on) set_light_range(light_range) @@ -296,8 +303,6 @@ // Causes flares to stop with a rotation offset for visual purposes /obj/item/device/flashlight/flare/animation_spin(speed = 5, loop_amount = -1, clockwise = TRUE, sections = 3, angular_offset = 0, pixel_fuzz = 0) - clockwise = pick(TRUE, FALSE) - angular_offset = rand(360) pixel_fuzz = 16 return ..() /obj/item/device/flashlight/flare/pickup() diff --git a/code/game/objects/items/explosives/grenades/grenade.dm b/code/game/objects/items/explosives/grenades/grenade.dm index 7e98e9819931..6b793233678d 100644 --- a/code/game/objects/items/explosives/grenades/grenade.dm +++ b/code/game/objects/items/explosives/grenades/grenade.dm @@ -20,12 +20,12 @@ var/hand_throwable = TRUE harmful = TRUE //Is it harmful? Are they banned for synths? antigrief_protection = TRUE //Should it be checked by antigrief? + ground_offset_x = 7 + ground_offset_y = 6 /obj/item/explosive/grenade/Initialize() . = ..() det_time = max(0, rand(det_time - 5, det_time + 5)) - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) /obj/item/explosive/grenade/proc/can_use_grenade(mob/living/carbon/human/user) if(!hand_throwable) diff --git a/code/game/objects/items/explosives/warhead.dm b/code/game/objects/items/explosives/warhead.dm index 5dfdf2a41eac..9825d7483193 100644 --- a/code/game/objects/items/explosives/warhead.dm +++ b/code/game/objects/items/explosives/warhead.dm @@ -2,11 +2,8 @@ icon = 'icons/obj/items/weapons/grenade.dmi' customizable = TRUE allowed_sensors = list() //We only need a detonator - -/obj/item/explosive/warhead/Initialize(mapload, ...) - . = ..() - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) + ground_offset_x = 7 + ground_offset_y = 6 /obj/item/explosive/warhead/rocket name = "84mm rocket warhead" diff --git a/code/game/objects/items/reagent_containers/glass.dm b/code/game/objects/items/reagent_containers/glass.dm index 240809b7851f..df344506c72c 100644 --- a/code/game/objects/items/reagent_containers/glass.dm +++ b/code/game/objects/items/reagent_containers/glass.dm @@ -363,11 +363,8 @@ matter = list() possible_transfer_amounts = list(5,10,15,25,30) flags_atom = FPRINT|OPENCONTAINER - -/obj/item/reagent_container/glass/beaker/vial/Initialize() - . = ..() - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) + ground_offset_x = 9 + ground_offset_y = 8 /obj/item/reagent_container/glass/beaker/vial/tricordrazine name = "tricordrazine vial" diff --git a/code/game/objects/items/reagent_containers/pill.dm b/code/game/objects/items/reagent_containers/pill.dm index de86ad07f53a..6c71d8be3c0c 100644 --- a/code/game/objects/items/reagent_containers/pill.dm +++ b/code/game/objects/items/reagent_containers/pill.dm @@ -23,6 +23,8 @@ w_class = SIZE_TINY volume = 60 reagent_desc_override = TRUE //it has a special examining mechanic + ground_offset_x = 7 + ground_offset_y = 7 var/identificable = TRUE //can medically trained people tell what's in it? var/pill_desc = "An unknown pill." // The real description of the pill, shown when examined by a medically trained person var/pill_icon_class = "random" // Pills with the same icon class share icons diff --git a/code/game/objects/items/reagent_containers/reagent_container.dm b/code/game/objects/items/reagent_containers/reagent_container.dm index eddbf5197a9e..e0561d5a7e3d 100644 --- a/code/game/objects/items/reagent_containers/reagent_container.dm +++ b/code/game/objects/items/reagent_containers/reagent_container.dm @@ -14,6 +14,8 @@ var/transparent = FALSE //can we see what's in it? var/reagent_desc_override = FALSE //does it have a special examining mechanic that should override the normal /reagent_containers examine proc? actions_types = list(/datum/action/item_action/reagent_container/set_transfer_amount) + ground_offset_x = 7 + ground_offset_y = 7 /obj/item/reagent_container/Initialize() if(!possible_transfer_amounts) diff --git a/code/game/objects/items/stacks/cable_coil.dm b/code/game/objects/items/stacks/cable_coil.dm index 9135c793cd00..e846979c00b4 100644 --- a/code/game/objects/items/stacks/cable_coil.dm +++ b/code/game/objects/items/stacks/cable_coil.dm @@ -20,14 +20,14 @@ attack_verb = list("whipped", "lashed", "disciplined", "flogged") stack_id = "cable coil" attack_speed = 3 + ground_offset_x = 2 + ground_offset_y = 2 /obj/item/stack/cable_coil/Initialize(mapload, length = MAXCOIL, param_color = null) . = ..() src.amount = length if (param_color) // It should be red by default, so only recolor it if parameter was specified. color = param_color - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) updateicon() update_wclass() @@ -276,8 +276,6 @@ /obj/item/stack/cable_coil/cut/Initialize() . = ..() src.amount = rand(1,2) - pixel_x = rand(-2,2) - pixel_y = rand(-2,2) updateicon() update_wclass() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index f6a8d02c3e9d..07345dcdc09f 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -69,6 +69,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \ sheettype = "metal" stack_id = "metal" + /obj/item/stack/sheet/metal/small_stack amount = STACK_10 @@ -114,6 +115,8 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \ amount_sprites = TRUE sheettype = "plasteel" stack_id = "plasteel" + ground_offset_x = 4 + ground_offset_y = 5 /obj/item/stack/sheet/plasteel/New(loc, amount=null) recipes = plasteel_recipes diff --git a/code/game/objects/structures/surface.dm b/code/game/objects/structures/surface.dm index 3a2dbd3e8d5c..efc69002424f 100644 --- a/code/game/objects/structures/surface.dm +++ b/code/game/objects/structures/surface.dm @@ -61,8 +61,7 @@ draw_item_overlays() /obj/structure/surface/proc/detach_item(obj/item/O) - O.pixel_x = initial(O.pixel_x) - O.pixel_y = initial(O.pixel_y) + O.scatter_item() UnregisterSignal(O, COMSIG_ATOM_DECORATED) draw_item_overlays() return diff --git a/code/modules/cm_marines/equipment/guncases.dm b/code/modules/cm_marines/equipment/guncases.dm index 507d6140666d..ddf010547ba4 100644 --- a/code/modules/cm_marines/equipment/guncases.dm +++ b/code/modules/cm_marines/equipment/guncases.dm @@ -9,6 +9,7 @@ can_hold = list()//define on a per case basis for the original firearm. foldable = TRUE foldable = /obj/item/stack/sheet/mineral/plastic//it makes sense + ground_offset_y = 5 /obj/item/storage/box/guncase/update_icon() if(LAZYLEN(contents)) diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm index 43cf733adb75..4a7864dbe0f5 100644 --- a/code/modules/cm_marines/equipment/kit_boxes.dm +++ b/code/modules/cm_marines/equipment/kit_boxes.dm @@ -274,12 +274,12 @@ slowdown = 1 can_hold = list() //Nada. Once you take the stuff out it doesn't fit back in. foldable = TRUE + ground_offset_x = 5 + ground_offset_y = 5 var/pro_case_overlay /obj/item/storage/box/kit/Initialize() . = ..() - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) if(pro_case_overlay) overlays += image('icons/obj/items/storage.dmi', "+[pro_case_overlay]") diff --git a/code/modules/cm_marines/equipment/mortar/mortar_shells.dm b/code/modules/cm_marines/equipment/mortar/mortar_shells.dm index 7fd05322f1c7..45b3a6859d4a 100644 --- a/code/modules/cm_marines/equipment/mortar/mortar_shells.dm +++ b/code/modules/cm_marines/equipment/mortar/mortar_shells.dm @@ -6,11 +6,9 @@ w_class = SIZE_HUGE flags_atom = FPRINT|CONDUCT var/datum/cause_data/cause_data + ground_offset_x = 7 + ground_offset_y = 6 -/obj/item/mortar_shell/Initialize(mapload, ...) - . = ..() - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) /obj/item/mortar_shell/Destroy() . = ..() diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm index 78bdfc3d778c..1d49c42f5e0d 100644 --- a/code/modules/cm_marines/orbital_cannon.dm +++ b/code/modules/cm_marines/orbital_cannon.dm @@ -559,8 +559,8 @@ var/list/ob_type_fuel_requirements icon_state = "ob_fuel" is_solid_fuel = 1 -/obj/structure/ob_ammo/ob_fuel/New() - ..() +/obj/structure/ob_ammo/ob_fuel/Initialize() + . = ..() pixel_x = rand(-5,5) pixel_y = rand(-5,5) diff --git a/code/modules/hydroponics/botany_disks.dm b/code/modules/hydroponics/botany_disks.dm index fda43b6f164e..602003b19ccc 100644 --- a/code/modules/hydroponics/botany_disks.dm +++ b/code/modules/hydroponics/botany_disks.dm @@ -4,14 +4,12 @@ icon = 'icons/obj/items/disk.dmi' icon_state = "botanydisk" w_class = SIZE_TINY + ground_offset_x = 5 + ground_offset_y = 5 var/list/genes = list() var/genesource = "unknown" -/obj/item/disk/botany/Initialize() - . = ..() - pixel_x = rand(-5,5) - pixel_y = rand(-5,5) /obj/item/disk/botany/attack_self(mob/user) ..() diff --git a/code/modules/objectives/data_retrieval.dm b/code/modules/objectives/data_retrieval.dm index 955d2cc8e63e..01689a18d081 100644 --- a/code/modules/objectives/data_retrieval.dm +++ b/code/modules/objectives/data_retrieval.dm @@ -177,6 +177,8 @@ var/datum/cm_objective/retrieve_item/document/retrieve_objective var/display_color = "white" var/disk_color = "White" + ground_offset_x = 9 + ground_offset_y = 8 /obj/item/disk/objective/Initialize(mapload, ...) . = ..() @@ -210,8 +212,6 @@ name = "[disk_color] computer disk [label]" objective = new /datum/cm_objective/retrieve_data/disk(src) retrieve_objective = new /datum/cm_objective/retrieve_item/document(src) - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) w_class = SIZE_TINY /obj/item/disk/objective/Destroy() diff --git a/code/modules/objectives/documents.dm b/code/modules/objectives/documents.dm index 14bef02245f0..5c6041a406c2 100644 --- a/code/modules/objectives/documents.dm +++ b/code/modules/objectives/documents.dm @@ -122,6 +122,8 @@ unacidable = TRUE indestructible = 1 is_objective = TRUE + ground_offset_x = 9 + ground_offset_y = 8 var/label // label on the document var/renamed = FALSE //Once someone reads a document the item gets renamed based on the objective they are linked to) @@ -131,8 +133,6 @@ objective = new objective_type(src) retrieve_objective = new /datum/cm_objective/retrieve_item/document(src) LAZYADD(objective.enables_objectives, retrieve_objective) - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) /obj/item/document_objective/Destroy() qdel(objective) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index bde60ef3a368..e18c1ce3c2e7 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -19,6 +19,8 @@ flags_equip_slot = SLOT_HEAD flags_armor_protection = BODY_FLAG_HEAD attack_verb = list("bapped") + ground_offset_x = 9 + ground_offset_y = 8 var/info //What's actually written on the paper. var/info_links //A different version of the paper which includes html links at fields and EOF @@ -42,8 +44,6 @@ /obj/item/paper/Initialize(mapload, photo_list) . = ..() - pixel_y = rand(-8, 8) - pixel_x = rand(-9, 9) stamps = "" src.photo_list = photo_list diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 70d6bf3898a6..b47f630974e6 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -82,8 +82,6 @@ p.update_icon() p.icon_state = "paper_words" p.name = bundle.name - p.pixel_y = rand(-8, 8) - p.pixel_x = rand(-9, 9) sleep(15*j) updateUsrDialog() else if(href_list["remove"]) diff --git a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm index 831923415453..df8a7d7bdd76 100644 --- a/code/modules/projectiles/ammo_boxes/ammo_boxes.dm +++ b/code/modules/projectiles/ammo_boxes/ammo_boxes.dm @@ -85,6 +85,8 @@ var/handful = "shells" //used for 'magazine' boxes that give handfuls to determine what kind for the sprite can_explode = TRUE limit_per_tile = 2 + ground_offset_x = 5 + ground_offset_y = 5 /obj/item/ammo_box/magazine/empty empty = TRUE @@ -102,8 +104,6 @@ while(i < num_of_magazines) contents += new magazine_type(src) i++ - pixel_x = rand(-5, 5) - pixel_y = rand(-5, 5) update_icon() /obj/item/ammo_box/magazine/update_icon() diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index d747525f3feb..594ad6b69dce 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -18,6 +18,8 @@ They're all essentially identical when it comes to getting the job done. w_class = SIZE_SMALL throw_speed = SPEED_SLOW throw_range = 6 + ground_offset_x = 7 + ground_offset_y = 6 var/default_ammo = /datum/ammo/bullet var/caliber = null // This is used for matching handfuls to each other or whatever the mag is. Examples are" "12g" ".44" ".357" etc. var/current_rounds = -1 //Set this to something else for it not to start with different initial counts. @@ -50,8 +52,7 @@ They're all essentially identical when it comes to getting the job done. if(0) icon_state += "_e" //In case it spawns empty instead. item_state += "_e" - pixel_y = rand(-6, 6) - pixel_x = rand(-7, 7) + if(ammo_band_color && ammo_band_icon) update_ammo_band() diff --git a/code/modules/reagents/chemistry_machinery/chem_master.dm b/code/modules/reagents/chemistry_machinery/chem_master.dm index 9d2d1ff10a0c..1e7e3bb08384 100644 --- a/code/modules/reagents/chemistry_machinery/chem_master.dm +++ b/code/modules/reagents/chemistry_machinery/chem_master.dm @@ -237,8 +237,6 @@ while (count--) var/obj/item/reagent_container/pill/P = new/obj/item/reagent_container/pill(loc) P.pill_desc = "A custom pill." - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) P.icon_state = "pill"+pillsprite reagents.trans_to(P,amount_per_pill) if(loaded_pill_bottle) @@ -271,8 +269,6 @@ P.name = "[name] vial" reagents.trans_to(P, 30) - P.pixel_x = rand(-7, 7) //random position - P.pixel_y = rand(-7, 7) P.update_icon() if(href_list["store"]) From fda83c2185e51c4dd74b3a24a047a6f4d5421dd9 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:19:37 +0100 Subject: [PATCH 185/199] Automatic changelog for PR #4762 [ci skip] --- html/changelogs/AutoChangeLog-pr-4762.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4762.yml diff --git a/html/changelogs/AutoChangeLog-pr-4762.yml b/html/changelogs/AutoChangeLog-pr-4762.yml new file mode 100644 index 000000000000..9d3c3f7a6cbd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4762.yml @@ -0,0 +1,6 @@ +author: "fira" +delete-after: True +changes: + - rscadd: "Bloody footprints are now slightly offset to break long visual straight lines." + - bugfix: "Items do not align back to the center of turfs anymore when picked from a surface (table or rack)" + - rscadd: "Some more items now have offsets on the map display, and they all can be slightly offset." \ No newline at end of file From 08aef2a3848bdcde09a01a1c0cc6401c2fc21d44 Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 26 Oct 2023 22:01:29 +0200 Subject: [PATCH 186/199] reset CAS direct camera on change to avoid duplicated signal handlers (#4755) # About the pull request Explicitely resets CAS direct guidance camera before setting a new one, avoiding log being flooded by double signal registrations ``` runtime error: mob_resist overridden. Use override = TRUE to suppress this warning proc name: stack trace (/proc/stack_trace) source file: code/__HELPERS/unsorted.dm,1893 usr: Honk (/mob/living/carbon/human) src: null usr.loc: the floor (206,40,4) (/turf/open/shuttle/dropship) ``` --- code/game/machinery/computer/dropship_weapons.dm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 60bf17388db8..6218bf0cdedb 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -594,14 +594,21 @@ return var/targ_id = text2num(href_list["cas_camera"]) + + var/datum/cas_signal/new_signal for(var/datum/cas_signal/LT as anything in cas_group.cas_signals) if(LT.target_id == targ_id && LT.valid_signal()) - selected_cas_signal = LT + new_signal = LT break - if(!selected_cas_signal) + if(!new_signal) to_chat(usr, SPAN_WARNING("Target lost or obstructed.")) return + + if(usr in selected_cas_signal?.linked_cam?.viewing_users) // Reset previous cam + remove_from_view(usr) + + selected_cas_signal = new_signal if(selected_cas_signal && selected_cas_signal.linked_cam) selected_cas_signal.linked_cam.view_directly(usr) else From df7dfce311ec44b84eae02b2bb2a46167c791f8f Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Thu, 26 Oct 2023 13:03:14 -0700 Subject: [PATCH 187/199] Re-removes bridge coats (#4784) # About the pull request Partially reverts https://github.com/cmss13-devs/cmss13/pull/4751 # Explain why it's good for the game Same reasoning as https://github.com/cmss13-devs/cmss13/pull/1193 I fucked up and shouldn't have let this be readded in the first place. Sprite maintainers can close this PR if they disagree with the re-removal. :cl: del: Re-removed CO/XO bridge coat /:cl: --- code/modules/gear_presets/uscm_ship.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm index 5ea860b05edb..d34137a1c36b 100644 --- a/code/modules/gear_presets/uscm_ship.dm +++ b/code/modules/gear_presets/uscm_ship.dm @@ -417,7 +417,7 @@ dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full) dress_hat = list(/obj/item/clothing/head/marine/peaked/captain/white, /obj/item/clothing/head/marine/peaked/captain/black, /obj/item/clothing/head/marine/peaked) dress_shoes = list(/obj/item/clothing/shoes/dress/commander) - dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/officer/white, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress, /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey, ) + dress_over = list(/obj/item/clothing/suit/storage/jacket/marine/dress/officer/white, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress) /datum/equipment_preset/uscm_ship/commander/New() . = ..() @@ -478,8 +478,6 @@ /obj/item/clothing/suit/storage/jacket/marine/dress/officer/black, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/suit, /obj/item/clothing/suit/storage/jacket/marine/dress/officer/falcon, - /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey, - /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat, ) /datum/equipment_preset/uscm_ship/commander/council/load_gear(mob/living/carbon/human/new_human) @@ -513,7 +511,7 @@ minimap_icon = list("cic" = MINIMAP_ICON_COLOR_HEAD) minimap_background = MINIMAP_ICON_BACKGROUND_CIC - dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full, /obj/item/clothing/suit/storage/jacket/marine/dress/bridge_coat_grey,) + dress_extra = list(/obj/item/storage/large_holster/ceremonial_sword/full) /datum/equipment_preset/uscm_ship/xo/New() . = ..() From d7c6ca01e1a74c69950db5d07d4f52d16e96e665 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:43:38 +0100 Subject: [PATCH 188/199] Automatic changelog for PR #4784 [ci skip] --- html/changelogs/AutoChangeLog-pr-4784.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4784.yml diff --git a/html/changelogs/AutoChangeLog-pr-4784.yml b/html/changelogs/AutoChangeLog-pr-4784.yml new file mode 100644 index 000000000000..6ee8c2d91ee8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4784.yml @@ -0,0 +1,4 @@ +author: "Zonespace27" +delete-after: True +changes: + - rscdel: "Re-removed CO/XO bridge coat" \ No newline at end of file From 982baa8aec974c72c3fcb0308dfcc9089c2822bf Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 26 Oct 2023 22:04:15 +0200 Subject: [PATCH 189/199] Adds ~50 tips (#4772) # About the pull request Adds 38-or-something more tips, with some information on JTAC and Settings esp for new players. # Explain why it's good for the game Nobody seems to bother doing it and the tips get stale over time. # Changelog :cl: add: Added about 50 new tips. /:cl: --------- Co-authored-by: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Co-authored-by: forest2001 <41653574+realforest2001@users.noreply.github.com> Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- strings/marinetips.txt | 20 ++++++++++++++++++-- strings/memetips.txt | 24 +++++++++++++++++++++++- strings/metatips.txt | 13 +++++++++++-- strings/xenotips.txt | 2 ++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/strings/marinetips.txt b/strings/marinetips.txt index cf808884f1e5..416c9ef0a4dd 100644 --- a/strings/marinetips.txt +++ b/strings/marinetips.txt @@ -53,35 +53,51 @@ A misloaded OB can deviate severely from the intended target area - ensure you l The XO and CO are trained in Power Loader use and engineering, and can load the OB. You can change what your SL tracker beacon is tracking by right clicking on your headset and clicking "Switch Tracker Target". Boilers emit light - not every glow from around the corner is friendly! +The amount of items in Requisitions and Squad Preparations depend on how many players readied up at the start of the round. You can carry a variety of items inside your helmet - from gauze and cigarettes to flares and screwdrivers. CIC staff can track every USCM-aligned person via the suit sensors console and overwatch console - useful for finding escaped prisoners or dead marines. When the M7 RPG is fired, it creates a substantial shockwave behind it that can stun and harm marines standing too close. Watch your backblast! Remember that you need to put a defibrillator's paddles away in order to store it. -W-Y PMCs do not have marine IFF. Don't fire Smartguns through them! -To talk on multiple radio channels at once, put a COMMA [,] before your message and add up to four prefixes. E.g, ,abcd talks on all squad channels at once. +W-Y PMCs do not have marine IFF. Don't fire Smartguns at them! +To talk on multiple radio channels at once, put a COMMA [,] before your message and add up to four prefixes. E.g, ,abcd talks on the main four squad channels at once. Put .w or :w before your message to whisper. Another way to whisper is to use the verb "whisper" in the IC tab or command bar. For Vehicle Crewmen : it is often safer to repair the parts of your APC or tank inside the vehicle than outside it. It is almost always faster to do surgery manually than in the autodoc. To check your skills, go to the IC tab and click "view skills". +Minirockets pack the most punch per cost as far as CAS weaponry is concerned. The U7 underbarrel shotgun can instantly break down both resin doors and mechanical airlocks, and it's not bad at breaking walls down either. You can find breaching charges in Requisitions or the Squad Engineer vendor. They function like C4, but can be deployed and explode much quicker, and release powerful shrapnel on the opposite side. They require minor engineering knowledge, which can be obtained from pamphlets. Armor piercing ammunition does less damage to unarmored targets. +Requisitions may not grant you service if you are a 'pajamarine' : a marine in cryosleep attire. Be sure to dress up! You can insert empty pill bottles into ChemMasters before creating pills to have them automatically inserted. Nurses can practice a full range of surgeries on Professor DUMMY. Ask the gods to give you one if you see (or are) a nurse practicing. Drinks from the hot drinks machine warm you up. Be careful! Barricades block grenades, and indeed all thrown items, from the front if they're barbed up. +CAS Fire Missions doubles the accuracy of fired weapons, which can be substantial. Painkillers do not stack. Only the strongest has any effect. +Don't underestimate the mortar: with ammo and proper communication it can hit surprisingly hard. +You can shoot through tents, but they won't protect you much in return. +Reqs doesn't have an infinite budget. +Good Reqs can land supplies anywhere outside - given coords - and sometimes in a minimal amount of time. +A ‘point blank’ or ‘PB’ is a type of attack with a firearm where you click directly on a mob next to you. These attacks are not effected by accuracy allowing you to quickly fire with weapons like a shotgun to great effect. Intel Officers can be put in a squad by going to CIC and requesting it. Any marine can perform CPR. On dead marines, this will increase the time they have until they become unrevivable. If you've been pounced on and your squad is unloading into the target, you can hit the 'rest' button to stay down so you don't get filled with lead after getting up. You can check the landing zone as a marine in the status panel. +The Colonial Marshals may come to crack down on too heavy of a Black Market usage. Functioning night vision goggles can be recharged with batteries. Broken night vision goggles can be repaired by an Engineer with a screwdriver. Not the loadout ones though, those cannot be fixed. You can put a pistol belt on your suit slot. (Just grab a rifle instead.) Alt-clicking the Squad Leader tracker lets you track your fireteam leader instead. Armor has a randomized reduction in effectiveness, and does not protect the digits. Take the wiki damage values as a best-case scenario. You can click on your Security Access Tuner (multitool) in your hand to locate the area's APC if there is one. +Need help learning the game and these tips aren't enough? Use MentorHelp or try to get ahold of your ship's Senior Enlisted Advisor. Clicking on your sprite with help intent will let you check your body, seeing where your fractures and other wounds are. Armor has insulative properties - taking it off will help you cool off and take less damage faster if you've been set on fire. Both foldable cades & plasteel cades if loosened and folded down can be transported in crates! In this way, you can use the crate as a portable breach-repair kit, or dragged (or carried via Power Loader) to an unsecure area for quick defensive set up. The fuel tank pouch doesn't just carry fuel for an incinerator- they can also carry full-size extinguishers. Toolbelts & tool pouches also may hold miniature extinguishers. The M2C heavy machine gunner belt rig can also carry C4, breaching charges, and most tools. +You can always multitask as Medic, such as by using pills or healing kits at the same time as defibrillator. +The nuclear ordnance requires BOTH communication towers to be actively held to decrypt the nuclear codes. +ARES will periodically report the amount of available tech points on Command Channel. +The quick wield keys generally prioritize wieldable gear going from left to right on your inventory bar. +Orbital Bombardment warheads respect roofing and hive core protection. They won't hit inside of protected areas. diff --git a/strings/memetips.txt b/strings/memetips.txt index e05ac2f66bdb..abfe0872180c 100644 --- a/strings/memetips.txt +++ b/strings/memetips.txt @@ -12,17 +12,39 @@ Contrary to popular belief, turning off IFF as a Smartgunner does not actually i When playing as a Xenomorph, remember to aim for the groin to inflict additional psychological damage to marines. Never tell an officer that you're smarter than them - especially if it's true. There is no USS Sulaco. -There is no such thing as an Intel Officer. +There is no such thing as a Radio-Telephone Operator. There is no such thing as a techweb. +There is no such thing as a tip. +There is no such thing as a Fatty. +Dropship update is dropping tomorrow. +Don't forget your ceramic plates. Echo Squad does not exist. +Reqs should always spend all its resources on the Black Market. Foxtrot Squad DEFINITELY does not exist. +Intel Squad is a unicorn. Spec rolls are not actually random. +Watch out for Queen's charge ability. Never, ever attempt to correct a Provost about anything. If you die, make sure to ahelp so staff can restart the round! +You can obtain spec tokens by climbing outside the map and into space. There is no alcohol on Whiskey Outpost, other than in the Ground Commander's locker. Hitting enemies with weapons damages them. +Don't swap East and West. AGAIN. +Don't swap Minus and Positive coordinates... AGAIN. +OB'ing the FOB is always an option. +OB'ing the FOB is the best way to get some recognition from the aCO. +The sky erupts into flames right above you! This tip is a lie. +Stay hydrated. +Have a good day. +There is no tip. +These tips suck. Please write more. +This tip is not ready, please wait until next round. +Someone stole this tip, ask staff for a new one. If it's stupid but it works, it isn't stupid. If it's stupid but it works, it's still stupid and you got lucky. Corroders aren't real. They can't hurt you. ARES is not sentient. It has no feelings and its only thoughts are pre-programmed subroutines. +Remember that as Yautja HPCs are your primary weapons. +You can always bully staff into giving you more awesome tips. +Embrace the suck. diff --git a/strings/metatips.txt b/strings/metatips.txt index f694da02b5bf..24be6896bc05 100644 --- a/strings/metatips.txt +++ b/strings/metatips.txt @@ -1,13 +1,22 @@ Remember hotkeys and macros can be customized to your liking. Hotkeys can be accessed in your preferences, and macros can be edited in the Byond macro editor, available in the top left drop down menu (click the Byond logo in the corner of the game window). -If you're unsure about a gameplay mechanic, use the 'mentorhelp' verb in the Admin tab to ask veteran players on the subject. +If you're unsure about a gameplay mechanic, use the 'mentorhelp' verb in the Admin tab to ask veteran players on the subject. It is also available from the pause menu, pressing ESCAPE. Try not to get too mad about dying. We’re all here to have fun. +You can get information on current TestMerges by pressing 'Show Server Revision' in 'OOC' tab. After dying, ask yourself what you did wrong and make a mental note to not make the same mistake again. Communication, be it from a marine to a marine, a drone to the queen, or command to everyone, is vital and information on flanks can change how the entire round plays out. As an alien or marine, be careful of the flank, regardless of if the push is going well or stalling out. Half of getting good is knowing to be aggressive. The other half is knowing when not to be aggressive. Alt-click a storage item to draw the last item in it (last non-weapon if it's a weapon belt). Middle-click a storage item to immediately open it, and middle-click structures to attempt to vault them. Use "North, South, West, East" when referring to locations in-game rather than "up, down, left, right". +As a mentor, you can become the imaginary friend of a new player to teach them! You shouldn't ignore what your allies are up to. Sometimes they can be organizing a flank in hivemind/radio, sometimes they can be walking up behind you with a slug-loaded shotgun. Either way, it pays to be alert to what they're doing, as much to as what the enemies are. The Wiki (https://cm-ss13.com/wiki) is a very useful repository of information about the game, such as weapons, equipment, xenomorph castes and their strains. It may not be fully up to date much of the time, but the basics are usually accurate. As an observer, you may see how much remaining hijack time is left in the status panel. -Embrace the suck. +You can always AdminHelp with the F1 key to question a mmeber of staff regarding rules or game bugs. +As ghost you are given extra tools for spectating the round: you can jump and follow specific players, get notifications about CAS and OB strikes, can see all health bars, and such. +You can press ESC key to bring up the game pause menu. It allows you change settings, AdminHelp and MentorHelp, and even access the Web Maps of game by clicking at top right. +Dead? You can take that moment to 'Edit Characters' from Preferences or Escape menus, to flesh out your characters or change your settings. +Control of intelligence is important: be it for retrieving it as marine, or denying it as Xeno. +If the lobby music is too loud or bothering you, you can disable it in Preferences tab at top right. +Maps can and will be unpredictably modified by the Nightmare system - stay frosty while roaming around! +You can go to GitHub to view code of the game and propose modifications of your own. diff --git a/strings/xenotips.txt b/strings/xenotips.txt index 2ca2964ae2d5..8674146de655 100644 --- a/strings/xenotips.txt +++ b/strings/xenotips.txt @@ -32,5 +32,7 @@ You can join the hive as a living Facehugger by clicking on the hive's Eggmorphe Playable Facehuggers can leap onto targets with a one-second windup, but this will only infect them if they are adjacent to it. Otherwise, it will simply knock them down for a small duration. As a Facehugger, you cannot talk in hivemind, but you can still open Hive Status and overwatch your sisters. This can be useful if you're locating other Facehuggers, flanker castes, or trying to learn from experienced Facehugger players. Shift-clicking the Queen indicator will tell you what area you are in, on the map. +As a Ravager your abilities become greatly enhanced when you empower with three or more people around you. Resisting on a water tile will immediately put out fires. Make sure you're alone though - It's usually better to let a friendly Xenomorph pat you out than it is to expose yourself to open water. You can filter out the Xenomorphs displayed in hive status by health, allowing you to look only for wounded sisters. +Each xeno has their own ‘tackle counter’ on a marine. The range to successfully tackle can be anywhere from two to six tackles based on caste. If a marine gets stunned or knocked over by other means it will reset everyone's tackle counters and they may get up! From 98c34ed44c37c9f6698c62052650d74fe465be7f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:58:47 +0100 Subject: [PATCH 190/199] Automatic changelog for PR #4772 [ci skip] --- html/changelogs/AutoChangeLog-pr-4772.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4772.yml diff --git a/html/changelogs/AutoChangeLog-pr-4772.yml b/html/changelogs/AutoChangeLog-pr-4772.yml new file mode 100644 index 000000000000..bf0c0ef5b0b4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4772.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - rscadd: "Added about 50 new tips." \ No newline at end of file From e7caf52c21e01e4580cbf03ff1c61579054dd7a2 Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 26 Oct 2023 22:08:36 +0200 Subject: [PATCH 191/199] Rewrite Xeno Acid processing (#4759) # About the pull request Rewrites scheduling of xeno acid to hopefully finally be done with dangling references warnings with acid. Also generally improves the awful code quality # Explain why it's good for the game Like, dude, some of these values were outright inversed. acid_**strength**=2.5 is noted as "250% speed" when it multiplies the sleep delays. Can't leave code in that state. # Testing Photographs and Procedure Summary testing, timing appear correct overall but I'm not entirely certain it's perfect due to random delays and obtuse code # Changelog :cl: code: Rewrote Xeno Acid ticking code. fix: Weather updates won't cause turfs to acid melt more rapidly anymore /:cl: --- code/game/objects/effects/aliens.dm | 149 ++++++++++-------- .../abilities/ability_helper_procs.dm | 2 +- .../abilities/runner/runner_powers.dm | 2 +- 3 files changed, 87 insertions(+), 66 deletions(-) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 49d758b52b19..867c6924b39d 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -287,19 +287,23 @@ opacity = FALSE anchored = TRUE unacidable = TRUE + /// Target the acid is melting var/atom/acid_t - var/ticks = 0 - var/acid_strength = 1 //100% speed, normal - var/barricade_damage = 40 + /// Duration left to next acid stage + var/remaining = 0 + /// Acid stages left to complete melting + var/ticks_left = 3 + /// Factor of duration between acid progression + var/acid_delay = 1 /// How much fuel the acid drains from the flare every acid tick var/flare_damage = 500 - var/barricade_damage_ticks = 10 // tick is once per 5 seconds. This tells us how many times it will try damaging barricades + var/barricade_damage = 40 var/in_weather = FALSE //Sentinel weakest acid /obj/effect/xenomorph/acid/weak name = "weak acid" - acid_strength = 2.5 //250% normal speed + acid_delay = 2.5 //250% delay (40% speed) barricade_damage = 20 flare_damage = 150 icon_state = "acid_weak" @@ -307,24 +311,32 @@ //Superacid /obj/effect/xenomorph/acid/strong name = "strong acid" - acid_strength = 0.4 //40% normal speed + acid_delay = 0.4 //40% delay (250% speed) barricade_damage = 100 flare_damage = 1875 icon_state = "acid_strong" -/obj/effect/xenomorph/acid/New(loc, target) - ..(loc) +/obj/effect/xenomorph/acid/Initialize(mapload, atom/target) + . = ..() acid_t = target - var/strength_t = isturf(acid_t) ? 8:4 // Turf take twice as long to take down. + if(isturf(acid_t)) + ticks_left = 7 // Turf take twice as long to take down. + else if(istype(acid_t, /obj/structure/barricade)) + ticks_left = 9 handle_weather() - tick(strength_t) - RegisterSignal(SSdcs, COMSIG_GLOB_WEATHER_CHANGE, PROC_REF(handle_weather)) + RegisterSignal(acid_t, COMSIG_PARENT_QDELETING, PROC_REF(cleanup)) + START_PROCESSING(SSeffects, src) /obj/effect/xenomorph/acid/Destroy() acid_t = null + STOP_PROCESSING(SSeffects, src) . = ..() +/obj/effect/xenomorph/acid/proc/cleanup() + SIGNAL_HANDLER + qdel(src) + /obj/effect/xenomorph/acid/proc/handle_weather() SIGNAL_HANDLER @@ -333,76 +345,85 @@ return if(SSweather.is_weather_event && locate(acids_area) in SSweather.weather_areas) - acid_strength = acid_strength + (SSweather.weather_event_instance.fire_smothering_strength * 0.33) //smothering_strength is 1-10, acid strength is a multiplier + acid_delay = acid_delay + (SSweather.weather_event_instance.fire_smothering_strength * 0.33) //smothering_strength is 1-10, acid strength is a multiplier in_weather = SSweather.weather_event_instance.fire_smothering_strength else - acid_strength = initial(acid_strength) + acid_delay = initial(acid_delay) in_weather = FALSE /obj/effect/xenomorph/acid/proc/handle_barricade() + if(prob(in_weather)) + visible_message(SPAN_XENOWARNING("Acid on \The [acid_t] subsides!")) + return NONE var/obj/structure/barricade/cade = acid_t - if(istype(cade)) - cade.take_acid_damage(barricade_damage) - -/obj/effect/xenomorph/acid/proc/tick(strength_t) - set waitfor = 0 - if(!acid_t || !acid_t.loc) - qdel(src) + cade.take_acid_damage(barricade_damage) + return (5 SECONDS) + +/obj/effect/xenomorph/acid/proc/handle_flashlight() + var/obj/item/device/flashlight/flare/flare = acid_t + if(flare.fuel <= 0) + return NONE + flare.fuel -= flare_damage + return (rand(15, 25) SECONDS) * acid_delay + +/obj/effect/xenomorph/acid/process(delta_time) + remaining -= delta_time * (1 SECONDS) + if(remaining > 0) return + ticks_left -= 1 - if(istype(acid_t,/obj/structure/barricade)) - if(++ticks >= barricade_damage_ticks || prob(in_weather)) - visible_message(SPAN_XENOWARNING("Acid on \The [acid_t] subsides!")) - qdel(src) - return - handle_barricade() - sleep(50) - .() - return - if(istype(acid_t, /obj/item/device/flashlight/flare)) - var/obj/item/device/flashlight/flare/flare = acid_t - if(flare.fuel > 0) //Flares that have fuel in them lose fuel instead of melting - flare.fuel -= flare_damage - sleep(rand(150,250) * (acid_strength)) - return .() - - if(++ticks >= strength_t) - visible_message(SPAN_XENODANGER("[acid_t] collapses under its own weight into a puddle of goop and undigested debris!")) - playsound(src, "acid_hit", 25, TRUE) - - if(istype(acid_t, /turf)) - if(istype(acid_t, /turf/closed/wall)) - var/turf/closed/wall/W = acid_t - new /obj/effect/acid_hole (W) - else - var/turf/T = acid_t - T.ScrapeAway() - else if (istype(acid_t, /obj/structure/girder)) - var/obj/structure/girder/G = acid_t - G.dismantle() - else if(istype(acid_t, /obj/structure/window/framed)) - var/obj/structure/window/framed/WF = acid_t - WF.deconstruct(disassembled = FALSE) - else if(istype(acid_t,/obj/item/explosive/plastic)) - qdel(acid_t) + var/return_delay = NONE + if(istype(acid_t, /obj/structure/barricade)) + return_delay = handle_barricade() + else if(istype(acid_t, /obj/item/device/flashlight/flare)) + return_delay = handle_flashlight() + else + return_delay = (rand(20, 30) SECONDS) * acid_delay - else - if(acid_t.contents.len) //Hopefully won't auto-delete things inside melted stuff.. - for(var/mob/M in acid_t.contents) - if(acid_t.loc) M.forceMove(acid_t.loc) - QDEL_NULL(acid_t) + if(!ticks_left) + finish_melting() + return PROCESS_KILL + if(!return_delay) qdel(src) - return + return PROCESS_KILL - switch(strength_t - ticks) + remaining = return_delay + + switch(ticks_left) if(6) visible_message(SPAN_XENOWARNING("\The [acid_t] is barely holding up against the acid!")) if(4) visible_message(SPAN_XENOWARNING("\The [acid_t]\s structure is being melted by the acid!")) if(2) visible_message(SPAN_XENOWARNING("\The [acid_t] is struggling to withstand the acid!")) if(0 to 1) visible_message(SPAN_XENOWARNING("\The [acid_t] begins to crumble under the acid!")) - sleep(rand(200,300) * (acid_strength)) - .() +/obj/effect/xenomorph/acid/proc/finish_melting() + visible_message(SPAN_XENODANGER("[acid_t] collapses under its own weight into a puddle of goop and undigested debris!")) + playsound(src, "acid_hit", 25, TRUE) + + if(istype(acid_t, /turf)) + if(istype(acid_t, /turf/closed/wall)) + var/turf/closed/wall/wall = acid_t + new /obj/effect/acid_hole(wall) + else + var/turf/turf = acid_t + turf.ScrapeAway() + + else if (istype(acid_t, /obj/structure/girder)) + var/obj/structure/girder/girder = acid_t + girder.dismantle() + + else if(istype(acid_t, /obj/structure/window/framed)) + var/obj/structure/window/framed/window = acid_t + window.deconstruct(disassembled = FALSE) + + else if(istype(acid_t, /obj/structure/barricade)) + pass() // Don't delete it, just damaj + + else + for(var/mob/mob in acid_t) + mob.forceMove(loc) + qdel(acid_t) + qdel(src) /obj/effect/xenomorph/boiler_bombard name = "???" diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index af8f33cf1c76..705837699275 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -135,7 +135,7 @@ if(istype(O, /obj/vehicle/multitile)) var/obj/vehicle/multitile/R = O - R.take_damage_type((1 / A.acid_strength) * 40, "acid", src) + R.take_damage_type(40 / A.acid_delay, "acid", src) visible_message(SPAN_XENOWARNING("[src] vomits globs of vile stuff at \the [O]. It sizzles under the bubbling mess of acid!"), \ SPAN_XENOWARNING("You vomit globs of vile stuff at [O]. It sizzles under the bubbling mess of acid!"), null, 5) playsound(loc, "sound/bullets/acid_impact1.ogg", 25) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm index 708334d31a96..9a29e2cb6da0 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm @@ -130,7 +130,7 @@ if(istype(O, /obj/vehicle/multitile)) var/obj/vehicle/multitile/R = O - R.take_damage_type((1 / A.acid_strength) * 20, "acid", src) + R.take_damage_type(20 / A.acid_delay, "acid", src) visible_message(SPAN_XENOWARNING("[src] vomits globs of vile stuff at \the [O]. It sizzles under the bubbling mess of acid!"), \ SPAN_XENOWARNING("You vomit globs of vile stuff at [O]. It sizzles under the bubbling mess of acid!"), null, 5) playsound(loc, "sound/bullets/acid_impact1.ogg", 25) From 6c9641d9cedc9b507877ea0e9b7d76f6401f6c11 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:13:28 +0100 Subject: [PATCH 192/199] Automatic changelog for PR #4759 [ci skip] --- html/changelogs/AutoChangeLog-pr-4759.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4759.yml diff --git a/html/changelogs/AutoChangeLog-pr-4759.yml b/html/changelogs/AutoChangeLog-pr-4759.yml new file mode 100644 index 000000000000..42a30db9e677 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4759.yml @@ -0,0 +1,5 @@ +author: "fira" +delete-after: True +changes: + - code_imp: "Rewrote Xeno Acid ticking code." + - bugfix: "Weather updates won't cause turfs to acid melt more rapidly anymore" \ No newline at end of file From aafa42697f0b9558d51a4fcb6a0ebebe1795b87b Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Thu, 26 Oct 2023 21:09:03 +0100 Subject: [PATCH 193/199] Fixes custom ERT calling (#4783) # About the pull request Removes announce_dispatch_message variable as it was a defunct duplicate of a different variable. Adds and fixes the announcement settings for custom ERTs. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixes custom ERT calling broadcasting when it should not. code: Removes unused vars from ERT procs. code: Renames the announce var in ERT procs to be more indicative of what it does. add: Added a setting on custom ERTs for announcing beacon was received. /:cl: --- code/datums/emergency_calls/cryo_marines.dm | 2 +- .../emergency_calls/cryo_marines_heavy.dm | 2 +- code/datums/emergency_calls/emergency_call.dm | 14 +++++----- .../colonialmarines/colonialmarines.dm | 2 +- .../colonialmarines/whiskey_outpost.dm | 2 +- code/game/supplyshuttle.dm | 2 +- code/modules/admin/tabs/event_tab.dm | 21 ++++++++------ code/modules/admin/topic/topic.dm | 2 +- code/modules/admin/topic/topic_events.dm | 28 +++++++++++++++++-- .../cm_tech/techs/marine/tier3/cryo_spec.dm | 2 +- .../cm_tech/techs/marine/tier3/cryorine.dm | 2 +- .../chemistry_properties/prop_special.dm | 2 +- 12 files changed, 54 insertions(+), 27 deletions(-) diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm index 7ed61852e9bf..19f73a9843ce 100644 --- a/code/datums/emergency_calls/cryo_marines.dm +++ b/code/datums/emergency_calls/cryo_marines.dm @@ -13,7 +13,7 @@ var/leaders = 0 spawn_max_amount = TRUE -/datum/emergency_call/cryo_squad/spawn_candidates(announce, override_spawn_loc, announce_dispatch_message) +/datum/emergency_call/cryo_squad/spawn_candidates(quiet_launch, announce_incoming, override_spawn_loc) var/datum/squad/marine/cryo/cryo_squad = RoleAuthority.squads_by_type[/datum/squad/marine/cryo] leaders = cryo_squad.num_leaders . = ..() diff --git a/code/datums/emergency_calls/cryo_marines_heavy.dm b/code/datums/emergency_calls/cryo_marines_heavy.dm index 70ce52443573..f4fe3c9f2a57 100644 --- a/code/datums/emergency_calls/cryo_marines_heavy.dm +++ b/code/datums/emergency_calls/cryo_marines_heavy.dm @@ -16,7 +16,7 @@ var/leaders = 0 -/datum/emergency_call/cryo_squad_equipped/spawn_candidates(announce, override_spawn_loc, announce_dispatch_message) +/datum/emergency_call/cryo_squad_equipped/spawn_candidates(quiet_launch, announce_incoming, override_spawn_loc) var/datum/squad/marine/cryo/cryo_squad = RoleAuthority.squads_by_type[/datum/squad/marine/cryo] leaders = cryo_squad.num_leaders . = ..() diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index 79ba9fff9747..4c3dfbbfac2b 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -91,12 +91,12 @@ else return chosen_call -/datum/game_mode/proc/get_specific_call(call_name, quiet_launch = FALSE, announce = TRUE, is_emergency = TRUE, info = "", announce_dispatch_message = TRUE) +/datum/game_mode/proc/get_specific_call(call_name, quiet_launch = FALSE, announce_incoming = TRUE, info = "") for(var/datum/emergency_call/E in all_calls) //Loop through all potential candidates if(E.name == call_name) var/datum/emergency_call/em_call = new E.type() em_call.objective_info = info - em_call.activate(quiet_launch, announce, is_emergency, announce_dispatch_message) + em_call.activate(quiet_launch, announce_incoming) return error("get_specific_call could not find emergency call '[call_name]'") return @@ -192,7 +192,7 @@ else to_chat(src, SPAN_WARNING("You did not get enlisted in the response team. Better luck next time!")) -/datum/emergency_call/proc/activate(quiet_launch = FALSE, announce = TRUE, turf/override_spawn_loc, announce_dispatch_message = TRUE) +/datum/emergency_call/proc/activate(quiet_launch = FALSE, announce_incoming = TRUE, turf/override_spawn_loc) set waitfor = 0 if(!SSticker.mode) //Something horribly wrong with the gamemode ticker return @@ -205,9 +205,9 @@ if(!quiet_launch) marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY) - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), quiet_launch, announce, override_spawn_loc, announce_dispatch_message), 30 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), quiet_launch, announce_incoming, override_spawn_loc), 30 SECONDS) -/datum/emergency_call/proc/spawn_candidates(quiet_launch = FALSE, announce = TRUE, override_spawn_loc, announce_dispatch_message = TRUE) +/datum/emergency_call/proc/spawn_candidates(quiet_launch = FALSE, announce_incoming = TRUE, override_spawn_loc) if(SSticker.mode) SSticker.mode.picked_calls -= src @@ -248,7 +248,7 @@ if(I.current) to_chat(I.current, SPAN_WARNING("You didn't get selected to join the distress team. Better luck next time!")) - if(announce) + if(announce_incoming) marine_announcement(dispatch_message, "Distress Beacon", 'sound/AI/distressreceived.ogg', logging = ARES_LOG_SECURITY) //Announcement that the Distress Beacon has been answered, does not hint towards the chosen ERT message_admins("Distress beacon: [src.name] finalized, setting up candidates.") @@ -304,7 +304,7 @@ create_member(null, override_spawn_loc) candidates = list() - if(arrival_message && announce) + if(arrival_message && announce_incoming) marine_announcement(arrival_message, "Intercepted Tranmission:") /datum/emergency_call/proc/add_candidate(mob/M) diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index 258a1a962713..df04873ac140 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -265,7 +265,7 @@ continue if(groundside_humans > (groundside_xenos * GROUNDSIDE_XENO_MULTIPLIER)) - SSticker.mode.get_specific_call("Xenomorphs Groundside (Forsaken)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Xenomorphs Groundside (Forsaken)", TRUE, FALSE) TIMER_COOLDOWN_START(src, COOLDOWN_HIJACK_GROUND_CHECK, 1 MINUTES) diff --git a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm index 3d856f35ce77..e7d7b7a67edf 100644 --- a/code/game/gamemodes/colonialmarines/whiskey_outpost.dm +++ b/code/game/gamemodes/colonialmarines/whiskey_outpost.dm @@ -193,7 +193,7 @@ announce_xeno_wave(wave) if(xeno_wave == 7) //Wave when Marines get reinforcements! - get_specific_call("Marine Reinforcements (Squad)", FALSE, TRUE, FALSE) + get_specific_call("Marine Reinforcements (Squad)", FALSE, TRUE) xeno_wave = min(xeno_wave + 1, WO_MAX_WAVE) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 53ce9ef177fa..e8f40c1d52b3 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1251,7 +1251,7 @@ var/datum/controller/supply/supply_controller = new() /datum/controller/supply/proc/black_market_investigation() black_market_heat = -1 - SSticker.mode.get_specific_call("Inspection - Colonial Marshal Ledger Investigation Team", TRUE, TRUE, FALSE) + SSticker.mode.get_specific_call("Inspection - Colonial Marshal Ledger Investigation Team", TRUE, TRUE) log_game("Black Market Inspection auto-triggered.") /obj/structure/machinery/computer/supplycomp/proc/is_buyable(datum/supply_packs/supply_pack) diff --git a/code/modules/admin/tabs/event_tab.dm b/code/modules/admin/tabs/event_tab.dm index b3e40af66ed7..8bcd15cb04a9 100644 --- a/code/modules/admin/tabs/event_tab.dm +++ b/code/modules/admin/tabs/event_tab.dm @@ -218,14 +218,17 @@ if(!istype(chosen_ert)) return - var/quiet_launch = tgui_alert(usr, "Would you like to announce the distress beacon to the server population? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) - if(!quiet_launch) - qdel(chosen_ert) - return - if(quiet_launch == "No") - quiet_launch = TRUE - if (quiet_launch == "Yes") - quiet_launch = FALSE + var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(launch_broadcast == "Yes") + launch_broadcast = TRUE + else + launch_broadcast = FALSE + + var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(announce_receipt == "Yes") + announce_receipt = TRUE + else + announce_receipt = FALSE var/turf/override_spawn_loc var/prompt = tgui_alert(usr, "Spawn at their assigned spawn, or at your location?", "Spawnpoint Selection", list("Spawn", "Current Location"), 0) @@ -235,7 +238,7 @@ if(prompt == "Current Location") override_spawn_loc = get_turf(usr) - chosen_ert.activate(quiet_launch = quiet_launch, announce = !quiet_launch, override_spawn_loc = override_spawn_loc) + chosen_ert.activate(quiet_launch = launch_broadcast, announce_incoming = announce_receipt, override_spawn_loc = override_spawn_loc) message_admins("[key_name_admin(usr)] admin-called a [choice == "Randomize" ? "randomized ":""]distress beacon: [chosen_ert.name]") diff --git a/code/modules/admin/topic/topic.dm b/code/modules/admin/topic/topic.dm index 27e457be6d43..f78b6a844d4b 100644 --- a/code/modules/admin/topic/topic.dm +++ b/code/modules/admin/topic/topic.dm @@ -2017,7 +2017,7 @@ if(distress_cancel) return distress_cancel = TRUE - SSticker.mode.get_specific_call("[ert_called]", TRUE, FALSE, FALSE) + SSticker.mode.get_specific_call("[ert_called]", TRUE, FALSE) log_game("[key_name_admin(approver)] has sent [ert_called], requested by [key_name_admin(ref_person)]") message_admins("[key_name_admin(approver)] has sent [ert_called], requested by [key_name_admin(ref_person)]") diff --git a/code/modules/admin/topic/topic_events.dm b/code/modules/admin/topic/topic_events.dm index 45d826668d4b..c38f715d93bf 100644 --- a/code/modules/admin/topic/topic_events.dm +++ b/code/modules/admin/topic/topic_events.dm @@ -206,7 +206,19 @@ em_call.players_to_offer = humans em_call.owner = owner - em_call.activate(announce = FALSE) + var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(launch_broadcast == "Yes") + launch_broadcast = TRUE + else + launch_broadcast = FALSE + + var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(announce_receipt == "Yes") + announce_receipt = TRUE + else + announce_receipt = FALSE + + em_call.activate(launch_broadcast, announce_receipt) message_admins("[key_name_admin(usr)] created [humans_to_spawn] humans as [job_name] at [get_area(initial_spot)]") @@ -284,7 +296,19 @@ em_call.players_to_offer = xenos em_call.owner = owner - em_call.activate(announce = FALSE) + var/launch_broadcast = tgui_alert(usr, "Would you like to broadcast the beacon launch? This will reveal the distress beacon to all players.", "Announce distress beacon?", list("Yes", "No"), 20 SECONDS) + if(launch_broadcast == "Yes") + launch_broadcast = TRUE + else + launch_broadcast = FALSE + + var/announce_receipt = tgui_alert(usr, "Would you like to announce the beacon received message? This will reveal the distress beacon to all players.", "Announce beacon received?", list("Yes", "No"), 20 SECONDS) + if(announce_receipt == "Yes") + announce_receipt = TRUE + else + announce_receipt = FALSE + + em_call.activate(launch_broadcast, announce_receipt) message_admins("[key_name_admin(usr)] created [xenos_to_spawn] xenos as [xeno_caste] at [get_area(initial_spot)]") diff --git a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm index d6c849e883af..16f0f26576a3 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryo_spec.dm @@ -21,4 +21,4 @@ /datum/tech/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcement (Spec)", TRUE, FALSE) diff --git a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm index 575ffe67b85b..49b4eea8f525 100644 --- a/code/modules/cm_tech/techs/marine/tier3/cryorine.dm +++ b/code/modules/cm_tech/techs/marine/tier3/cryorine.dm @@ -23,4 +23,4 @@ /datum/tech/repeatable/cryomarine/on_unlock() . = ..() - SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", TRUE, FALSE, FALSE, announce_dispatch_message = FALSE) + SSticker.mode.get_specific_call("Marine Cryo Reinforcements (Tech)", TRUE, FALSE) diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index 640e18426311..cec04ca66616 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -96,7 +96,7 @@ H.contract_disease(new /datum/disease/xeno_transformation(0),1) //This is the real reason PMCs are being sent to retrieve it. /datum/chem_property/special/DNA_Disintegrating/trigger() - SSticker.mode.get_specific_call("Weyland-Yutani Goon (Chemical Investigation Squad)", TRUE, FALSE, FALSE, holder.name, TRUE) + SSticker.mode.get_specific_call("Weyland-Yutani Goon (Chemical Investigation Squad)", TRUE, FALSE, holder.name) chemical_data.update_credits(10) message_admins("The research department has discovered DNA_Disintegrating in [holder.name] adding 10 bonus tech points.") var/datum/techtree/tree = GET_TREE(TREE_MARINE) From 9146ca8a80dea08360e80daa61131508f8b545c6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:28:45 +0100 Subject: [PATCH 194/199] Automatic changelog for PR #4783 [ci skip] --- html/changelogs/AutoChangeLog-pr-4783.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4783.yml diff --git a/html/changelogs/AutoChangeLog-pr-4783.yml b/html/changelogs/AutoChangeLog-pr-4783.yml new file mode 100644 index 000000000000..ebded74b04de --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4783.yml @@ -0,0 +1,7 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Fixes custom ERT calling broadcasting when it should not." + - code_imp: "Removes unused vars from ERT procs." + - code_imp: "Renames the announce var in ERT procs to be more indicative of what it does." + - rscadd: "Added a setting on custom ERTs for announcing beacon was received." \ No newline at end of file From 4b641b9e1b1bbc150b9ae8f0991c1bc9c068a63e Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Thu, 26 Oct 2023 21:18:59 +0100 Subject: [PATCH 195/199] Vanguard Prae Pierce Refactor + Bugfix (#4641) # About the pull request Refactors a bit of `praetorian_powers.dm` Fixes #4612 Previously the ability would check for `opacity` alone meaning that it could be used through doors with windows in and attack people on the other side. Now checks each turf in turn for any `obj` which has `density` and `throwpass = 0` Also changed the visible message as the description for this ability says the Praetorian is using it's tail but the visible message says claws. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos ![dreamseeker_2023-10-11_21-26-49](https://github.com/cmss13-devs/cmss13/assets/25027759/f0d2ae9a-d730-4c86-892f-c1e980e50209) ![dreamseeker_2023-10-11_21-27-31](https://github.com/cmss13-devs/cmss13/assets/25027759/a310dbd3-e9f9-4e07-92b0-872da9254ed4)
# Changelog :cl: refactor: Refactored praetorian pierce ability fix: Praetorian vanguard can no longer pierce through windowed doors /:cl: --------- Co-authored-by: Lee B --- .../abilities/praetorian/praetorian_powers.dm | 100 +++++++++--------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index 3975a229bbc1..e926349af60d 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -1,74 +1,76 @@ -/datum/action/xeno_action/activable/pierce/use_ability(atom/A) - var/mob/living/carbon/xenomorph/X = owner +/datum/action/xeno_action/activable/pierce/use_ability(atom/targetted_atom) + var/mob/living/carbon/xenomorph/source_xeno = owner if (!action_cooldown_check()) return - if (!X.check_state()) + if (!source_xeno.check_state()) return - if(!A || A.layer >= FLY_LAYER || !isturf(X.loc)) + if(!targetted_atom || targetted_atom.layer >= FLY_LAYER || !isturf(source_xeno.loc)) return if (!check_and_use_plasma_owner()) return + //X = xeno user, A = target atom + var/list/turf/target_turfs = getline2(source_xeno, targetted_atom, include_from_atom = FALSE) + var/length_of_line = LAZYLEN(target_turfs) + if(length_of_line > 3) + target_turfs = target_turfs.Copy(1, 4) + // Get list of target mobs var/list/target_mobs = list() + var/blocked = FALSE - - var/list/target_turfs = list() - var/facing = Get_Compass_Dir(X, A) - var/turf/T = X.loc - var/turf/temp = X.loc - - for(var/x in 0 to 2) - temp = get_step(T, facing) - if(!temp || temp.density || temp.opacity) - break - - var/blocked = FALSE - for(var/obj/structure/S in temp) - if(istype(S, /obj/structure/window/framed)) - var/obj/structure/window/framed/W = S - if(!W.unslashable) - W.deconstruct(disassembled = FALSE) - - if(S.opacity) - blocked = TRUE - break + for(var/turf/path_turf as anything in target_turfs) if(blocked) break + //Check for walls etc and stop if we encounter one + if(path_turf.density) + break - T = temp - target_turfs += T - - for(var/turf/target_turf in target_turfs) - for(var/mob/living/carbon/H in target_turf) - if (!isxeno_human(H) || X.can_not_harm(H)) - continue - - if(!(H in target_mobs)) - target_mobs += H - - X.visible_message(SPAN_XENODANGER("[X] slashes its claws through the area in front of it!"), SPAN_XENODANGER("You slash your claws through the area in front of you!")) - X.animation_attack_on(A, 15) - - X.emote("roar") - - // Loop through our turfs, finding any humans there and dealing damage to them - for (var/mob/living/carbon/H in target_mobs) - if (!isxeno_human(H) || X.can_not_harm(H)) + //Check for structures such as doors + for(var/atom/path_content as anything in path_turf.contents) + if(isobj(path_content)) + var/obj/object = path_content + //If we shouldn't be able to pass through it then stop at this turf + if(object.density && !object.throwpass) + blocked = TRUE + break + + if(istype(object, /obj/structure/window/framed)) + var/obj/structure/window/framed/framed_window = object + if(!framed_window.unslashable) + framed_window.deconstruct(disassembled = FALSE) + + //Check for mobs and add them to our target list for damage + if(iscarbon(path_content)) + var/mob/living/carbon/mob_to_act = path_content + if(!isxeno_human(mob_to_act) || source_xeno.can_not_harm(mob_to_act)) + continue + + if(!(mob_to_act in target_mobs)) + target_mobs += mob_to_act + + source_xeno.visible_message(SPAN_XENODANGER("[source_xeno] slashes its tail through the area in front of it!"), SPAN_XENODANGER("You slash your tail through the area in front of you!")) + source_xeno.animation_attack_on(targetted_atom, 15) + + source_xeno.emote("roar") + + // Loop through our mob list, finding any humans there and dealing damage to them + for (var/mob/living/carbon/current_mob in target_mobs) + if (!isxeno_human(current_mob) || source_xeno.can_not_harm(current_mob)) continue - if (H.stat == DEAD) + if (current_mob.stat == DEAD) continue - X.flick_attack_overlay(H, "slash") - H.apply_armoured_damage(get_xeno_damage_slash(H, damage), ARMOR_MELEE, BRUTE, null, 20) + current_mob.flick_attack_overlay(current_mob, "slash") + current_mob.apply_armoured_damage(get_xeno_damage_slash(current_mob, damage), ARMOR_MELEE, BRUTE, null, 20) if (target_mobs.len >= shield_regen_threshold) - if (X.mutation_type == PRAETORIAN_VANGUARD) - var/datum/behavior_delegate/praetorian_vanguard/BD = X.behavior_delegate + if (source_xeno.mutation_type == PRAETORIAN_VANGUARD) + var/datum/behavior_delegate/praetorian_vanguard/BD = source_xeno.behavior_delegate if (istype(BD)) BD.regen_shield() From 7c5f7ab5d5f82429a90320e28f9b1b69e0ac9458 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:44:21 +0100 Subject: [PATCH 196/199] Automatic changelog for PR #4641 [ci skip] --- html/changelogs/AutoChangeLog-pr-4641.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4641.yml diff --git a/html/changelogs/AutoChangeLog-pr-4641.yml b/html/changelogs/AutoChangeLog-pr-4641.yml new file mode 100644 index 000000000000..96049a37d160 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4641.yml @@ -0,0 +1,5 @@ +author: "Birdtalon" +delete-after: True +changes: + - refactor: "Refactored praetorian pierce ability" + - bugfix: "Praetorian vanguard can no longer pierce through windowed doors" \ No newline at end of file From 38ced94fc7dee11e73f66f6c008983493aac13a5 Mon Sep 17 00:00:00 2001 From: SASoperative <147741618+SASoperative@users.noreply.github.com> Date: Thu, 26 Oct 2023 19:34:01 -0500 Subject: [PATCH 197/199] Sprites changes for old donator kit (#4702) # About the pull request Added sprites for the Juggernaut Donator kit. # Explain why it's good for the game Replaces the old donator set which was using the vanilla syndicate hardsuit from SS13. # Testing Photographs and Procedure
Screenshots & Videos (https://media.discordapp.net/attachments/1155292420343345182/1158740768677175396/jbTCHQLNCAANgNFAq26gCqW1JQoiUKTlCe6Fw6MLaXkbaVde0BxSxRAQAeyREQFokxREQARQEEypikNABCACiPOu7WoWAWzX9ot68lkQwKIQ02KFgBAQAitBQASwEkPqMYSAEBACXgREAF7EJC8EhIAQWAkCIoCVGFKPIQSEgBDwIiAC8CImeSEgBITAShAQAazEkHoMISAEhIAXARGAFzHJCwEhIARWgoAIYCWG1GMIASEgBLwIiAC8iEleCAgBIbASBP4POBL9vytFWmQAAAAASUVORK5CYII.png?ex=652e7c6f&is=651c076f&hm=12a12a220c0c86891b429785dacdfc940dde3ac22dddd9f346ecf3b05be15459&)
# Changelog :cl: add: Added donator item and sprites /:cl: --------- Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- code/modules/cm_marines/Donator_Items.dm | 26 ++++++++++++----------- code/modules/cm_marines/Donator_Kits.dm | 2 +- icons/mob/humans/onmob/back.dmi | Bin 104630 -> 110676 bytes icons/mob/humans/onmob/head_0.dmi | Bin 111771 -> 112697 bytes icons/mob/humans/onmob/suit_0.dmi | Bin 330109 -> 332134 bytes icons/obj/items/clothing/backpacks.dmi | Bin 60368 -> 60965 bytes icons/obj/items/clothing/hats.dmi | Bin 54930 -> 55462 bytes icons/obj/items/clothing/suits.dmi | Bin 164838 -> 165536 bytes 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/code/modules/cm_marines/Donator_Items.dm b/code/modules/cm_marines/Donator_Items.dm index 1c7281114c01..bcebad4661b0 100644 --- a/code/modules/cm_marines/Donator_Items.dm +++ b/code/modules/cm_marines/Donator_Items.dm @@ -126,6 +126,9 @@ /obj/item/storage/backpack/marine/fluff xeno_types = null +/obj/item/storage/backpack/marine/satchel/fluff + xeno_types = null + /obj/item/clothing/gloves/marine/fluff //MARINE GLOVES TEMPLATE name = "ITEM NAME" desc = "ITEM DESCRIPTION. DONOR ITEM" //Add UNIQUE if Unique @@ -211,10 +214,10 @@ item_state = "armor_reflec" /obj/item/clothing/suit/storage/marine/fluff/sas_juggernaut //CKEY=sasoperative (UNIQUE) - name = "Juggernaut Armor" + name = "juggernaut armor" desc = "Some fancy looking armor. DONOR ITEM" - icon_state = "rig-syndi" - item_state = "syndie_hardsuit" + icon_state = "skinnerarmor" + item_state = "skinnerarmor" /obj/item/clothing/suit/storage/marine/fluff/penguin //CKEY=tophatpenguin name = "Trenchcoat" @@ -589,8 +592,8 @@ flags_inv_hide = HIDEEARS|HIDEALLHAIR /obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut //CKEY=sasoperative (UNIQUE) - name = "Juggernaut Helmet" - icon_state = "rig0-syndi" + name = "juggernaut helmet" + icon_state = "skinnerhelmet" desc = "A red helmet, for pairing with JuggerNaut Armor. DONOR ITEM" /obj/item/clothing/head/helmet/marine/fluff/tristan //CKEY=tristan63 @@ -613,13 +616,6 @@ flags_inventory = BLOCKSHARPOBJ flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR -/obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut_alt //CKEY=sasoperative (UNIQUE) - name = "Juggernaut Helmet" - icon_state = "ncrhelmet" - desc = "A red helmet, for pairing with JuggerNaut Armor. DONOR ITEM" - flags_inventory = BLOCKSHARPOBJ - flags_inv_hide = HIDEEARS|HIDEMASK|HIDEEYES|HIDEALLHAIR - /obj/item/clothing/head/helmet/marine/fluff/sadokist //CKEY=sadokist name = "Tanya's Beret" desc = "A bright red beret, owned by Tanya Edenia." @@ -1366,6 +1362,12 @@ icon_state = "securitypack" item_state = "securitypack" +/obj/item/storage/backpack/marine/satchel/fluff/sas_juggernaut //CKEY=sasoperative (UNIQUE) + name = "tactical radiopack" + desc = "A Radio backpack for use with the Juggernaut armor. DONOR ITEM" + icon_state = "skinnerpack" + item_state = "skinnerpack" + /obj/item/clothing/glasses/fluff/alexwarhammer name = "Black Jack's Dank Shades" desc = "+20 Badass points. Donor item" diff --git a/code/modules/cm_marines/Donator_Kits.dm b/code/modules/cm_marines/Donator_Kits.dm index 6c8347f3280e..01acf638c2cd 100644 --- a/code/modules/cm_marines/Donator_Kits.dm +++ b/code/modules/cm_marines/Donator_Kits.dm @@ -427,7 +427,7 @@ donor_key = "sasoperative" kit_variant = "Juggernaut" donor_gear = list( - /obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut_alt, + /obj/item/storage/backpack/marine/satchel/fluff/sas_juggernaut, /obj/item/clothing/head/helmet/marine/fluff/sas_juggernaut, /obj/item/clothing/suit/storage/marine/fluff/sas_juggernaut, ) diff --git a/icons/mob/humans/onmob/back.dmi b/icons/mob/humans/onmob/back.dmi index 8a51050c03c322def9e366f173d973ee9dac06eb..a6e9ef72c010aa95517c677918c16c942f696e70 100644 GIT binary patch literal 110676 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

uid*tKg+yYWC>Ynj*7jDNpB^HU; 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 delta 15784 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 Ii5dm}A8F6E9smFU diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi index d7dfd5394f0d7771aadc09a5fd20412cbbae2714..52f2c7f0a9cbb563d1d9023f48e1d0eee62627d5 100644 GIT binary patch delta 24466 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

Extras
Emergency Response TeamEmergency Response TeamSurvivorSurvivorAgentAgenttEycgCn?}kWWcuOh*4Eat?}b+pM1X&L;%|NpM?s(uOJ?Ph zG7A(6ZQWIQhOQ8+r0H)cngky9JC9rGy>QeAt(Y9U5B3C@Ne=Vq=5+*NzPxiaoHkI6 zyvEGWsDpiV4$*Eeucbpx!=WV_rT98h*eKCFjJlSs<_W)UM3`HP8c(1CJ;EL1w|wyH$CS>! z`g}uc-%E0Emh9i!lHtcxK&vrvp=7R0ricufH|;ktiih3zMEhNC!9LMSL%_7XwCB!5 zmfqQM_MrIMY=>XoGE$n4QjD1*SvmMHW-bfpy&OKcPyk(0T0(`w+z&w|6Sn46hAZyB z5`<4I4D!brrKIRGcqs7IVvcO{^&cHT0V%0iuu)@R-hbkJlI`cM+5RfXj-Wz-P(pe- zmnkJ?Fa;>J)XNB+!WBwuT=w_KloLm2i*N+Zlb1H)M4u(2S$1=o5H&{5q~srO_?DQr zQytz|@w!BY@DCzcsdcWw46kEiNsNoujD)6n$b zh=0^;otmZ#WqZY$9%y;vunVXd{33wC-hbcms9mr$a+x2gkBa*RwdzBi4A8UilyVmq zdthjqcdXi0XG)(iq%t5XdF=Qyz@IZ;aOk9|a694kz*jU&Yr%FlXdZ?xCq4H$=P@!e z5)h|)ZVz{HA?D@f756zWb+}$!T!aMd?>o(%7UB~SSXf)5yZ@p?05laSAH``a7WSx~ zK1~og>T0NEdZk)G&N#6q+?d8C+kf#f^TJrQcH=t)h0*CepIdfa74?rMIpexd+~iXs zauq^Uf1o>k@+TxROwV7nsInjB$9V)o=|ya)Xdbfo84in>qRK6PlDON8y14W%E{3p zBfNG%4}erS77_LU2^2$lM5o3Ywmz1;qw%TyJ^DeJG)CBCPWj*Yd-#|N z1-C6KUc1Gg#;m!J?q_*b#YUy*@nb*57@0ap%9Q)ohwguJyG!l~t zeJ9CS7f_Ss9O@wnkyXVsG$R0C|EundU}tktE>`bfE(`>dW0jHVz0lD$piqms5~$Mg1lx!pdCM2I{8 l?k*KVH%p>HDpV0)0`!<_8^a_9I1uomrlh6#Q{Fu2e*jSrQwsn9 delta 22425 zcmb@tWmFwo)Gc^`;4VRe2PbF<65Js`un^oKxVsnbE`i`K!5xCT1PvZsf@^R+UEJ^9 z_g?p}?lJnu8CA7i=9+8mwb$9s#e0m$i=~E1tEP!WAb8l>)l(zySgEk-@cQu}B%VNZ zC3#N{3%)-N3C2x~q?C5}qNQO@bAsnP9S!pEm_9s2J?yz%HDCrG1`Qb@l(E3ngr z6E9Gv{7@hn)r@^9kN6|KytvG^|FoC-;i^(#?+;lPW|7>bVhBd}b$hL%ltkFCpzFZ| ziIKWFx@uO1StC<-?%+}}7`ty|K-w^`=NBI)5`h;nUW>lk^{<$EvR4@7JqY($9fl{7 zNnk8S1V(8&rV?VmC~k5$%J)UmtzPlbac$Lixc{MCar$0XaXmF6&;K(<0odE$_gBsH zo9TX3PN<2`M2i)1J0K?>7x2V#`k{EZ*g@V?Tho+vu;VXR41CY^Uq#NR1K^CYWX6+> zcb#&)yi_A3@E+SK*hvLOzDUFoLe@rz&Qd4fMRn5-xD7+(i?%+JGgNTfJ$d3U3!pyf z5A?l)3VTD?@&mKCmRK6QSIC1C$!f(aZW}eUZ`RPE3J>y0$#C%TgASG6(fE#U1l{sp ziXnt_zM?w1#7Sks5NSrd0fHm)AA-DKSrN;lxfbfiq^izh<2%`tdH-l4eS>x$OpB-A zYK(V~oRc9DIlkW^Uvm*eo}%7}?DR!K<)qT?9tjbKt!2s|`GJK~mQQQP-z|E7oilZd z6rpfFh0L|BocM@!e4sg!4c}R`wD~zt?eFSppho=O)h|rt?YB6;E`V+0csM= zFbz%*no3u4{A*rvCP{W=6MyMR%T2?Jpg(L5dx-Jr>5)Hv@KV#!ZB8?||E56V{8PB$ z6to)61Zg~%(Hm7N5S@QfFO)t9VSqle)7~dps{2~{|ER8e*@K&qtwJALNFJV2Oh3PD zGo3=r&d-j#{S|>)suWP%*|+c6=jFZgdW!5_aYuiZ5`e52?diIFhM zJL~)^lcGf&SE`z~ve#K~%4hEo^`cMl>;VaY-oxWXm{GxVgmC>rQt4mlzrYV2+H8Eb>tY7h>~sAui8D zIaZ#eQuuQc{N&{1yw9rYlPSu0fnr#WUeg5@$8~^vS)U>L_Y)`H+Z$;# z(04=JCd0lnvhd|>F1a%}1@zf%xWO~+cmN>5AR!}nJ@5a3uv{R!Wq<9QS<($4(SXtM zTR9>Ut>Ua$aK-mKBkB`7K=`C%)5TsYrLt*|eHnzb1MRaHJ3BNu#*`~n%zLPVV|w#Q zx5jiJd~2@Xi^OSVO$K3Uefu7MoXn;-$H?UafEdG6Y8)tl5EzrjG$4#0tbB0&d7q-* zXVkGM1r$h)bwVVgIL$0Gqyd0rckf=`l6PvS-yz@4c?R%)TL5cadyo^_*-4D$ zUpellP7E~=#IUY zW8JG&627ST8k9()jG%+c4}F*JdpCdf71&s4k@aSY+;OSBt9ah0dVVF*H>u1R6Z}@W z$sr;=9wXIm-MRX8tdCU<@b9}rYu&@=CY74k+xoeUG4GwJJI5SyD`KXp(Ia<%Utea& z^8I5u5-PHY%Z7$XVWb<7_;@T;s6Xm<70qYcS7Cdd`+XR;KGmot`aVw<3@N?ZHH z!Dd`s&Ow2Y$>BI8o|I=2|L2IqBkM8l#w~lwUax3L}j6tpc94!^w~)9Mf0^( zT_2+@wbsA#Y~PV#xmwBaTXdPdeA{0^>ka!2x_ZLB@zZ^eXB{}~@A%2g)5WU@HQihF znuRv|f4KXEPrUlluV6FSFy8{nW*vp*U!#i7YWRl+q z{pc@+$34rd;Hx+I~n_V zbwx^NV5?*-MA7O5*MCGJJ-pT$IMB?{iMK>>SXv0;VGP z&7@7tr6|%His3)PeTLD1Z1>OMeVV3OZS%bVC0NwQIASpg0t8 zD^|0`s;+L*cH1~ZJUf&CmPSi!Me)IZ1 z%I60h3{eCKWkc5_p2bxqdOR66v=3o}B;PQ>C6#7CViy{;XF!fYl9K7CA6a(dmX#5a zd{AKFbDdhY0+Rxz0%d{k3TraHtq*R+oYghEC`y)wx9ryqo|H_ZIg0uD6%}K)1o-do z_0a0t2YT98RTz_Utu7|@0;{FX0}};r(Ldd7agQ8Jxw7ArKlPsoTs?&}Z*IL;?qdu6 zyt$A(dsdCq!7}gwVWEWEQpTPNL^5`hd4WO3y)pP{;9GTNbo>R-uXopC^sEik9K9<> zXpS&HSj|IH$aeCUC&Pb1D@-92Y`X8+($Xp!Ga~-TL`cc}`0?ZBpp8YN2dcHb-k(z{ z`&%y5Z zudND7Rr80TqTAt6W0`Yn-c5hWfR4@{_j>GEp{1LM0&$GG1|^8ME9?5}PP|GQ_L^UD zQij8)?07SL?z%P-UcIkuVSUtJl`a3!4~@V%j+!F?Xv*Q_BV`!6 zQlF@ej%Zc&u0uoawl*?akZ6t~Jst}9&}O-{m0u^g8X6jUIO}|iw(hSzvMi0DDWuLs z7K12LfCFamIPc>Dy89XWfwVtQ*L#%I)CLA%rCU%(W(FlLAwxcYUb%Q&Nkaf(@B~Gc zRXOLFhypK(DZ81)T1dn;aknF8vm8N$`rO<9blOY;+vrV0gy{>MpcYN-H8NX1rF~Lo z$KQl2Cl4Li^y|`J+qCD+AQbfCA@2!QtNc>%Rz$MZgV~ae(BB5GOu1xYdYU@u@bjny zx5#7rgLu}CCZCtt5pbHbvWG=e{6+~X^Gje={ofgakKsSD&~3a~liJG#EipI#`SUwV zkXd~wsPA)2N|0p=YLeH5$z%=uk?P?tpXISrJ4)N>|6HZ#HWZR%ZTw~aTep82|NAN6 z6(|({P7HW{R(KS{{5Q{k%KrHt@_&^1|FcN2_C98r%@ZmrM2VfZ=?EX-$A1_$`SF1}ucdXgIKP+DNcse`# zWPDEy^2EMN<)AC zQm9l9_#&ZDrJM?Z%js}CXFg0-)043Bf^Gj@O*%z~NAZRR9e~(Pl{>;f^t{_iZEfcv zTM;Eo+^bN?v@-}i*eC?P%h2`#WbAP7y4@kt7b4KoeBieKw zzbw~U)h#{%vFb}?mdUI0pB zq(?X;Nyl)X4y|U5G>&;V3w$n0e%~$4^J1n6AmBygt10dvY=$Zz2?7VO-l6i~poE=ZtA34-D zJ#_mpm%{$OwL#@hIOdl9K6s(+BALWTyuq_Gz9**2&xj37k`7ff0p1`r zW7bAY?NCZ_qUiPc^xYj>8Fhp|hL0*mb#Gj_H*H3RXe@Jli{AsRG-60*=%3+uf7UR5 zQ~8WnN0q$OyRiCL8FGkB#(99sYo=^~NkO^a#b)Xy*<2fzeKW@;=xsG~M_yVRgJ4Uj9@ExJ@#Zt$e86;L5 z>X%Ww(8s+anvseS5)!R{fVeq}slN$N)SV&LSdK-)w8+JuplCUG?+t_)`^O zJJzQ~P9mJGbDeKLukSxG+qVq`uQXUoA-u zd`^3GCnS$35WtD_iQYXI`eIG%Iqn4)+~*9R0X4AKX)Oz>@5xNfw zv(mkjbNb=G3gy!&8I;WmJ0!?&hT=Xqf7lC4ZBZMWG4BX{9zLMGOVV^0x9e1}@iPjg z^&uQv&qjqJp0w#6pyopc-`9Fvdn9R;${-L5$Omx|l^b>KE9u@K-G@gY%f5n3ukMB~ zyb)^ahZQosP|paN7RF-YaM`ui2(+puBmyNrY8u2433hHn(9#(&}=+n&VA5zsd?5K0oNJ|XL9lR)%0QrMfIbC{d$(59AE_K$!oBcG=-Ni>PAgo6Wu$toK$ z4NZZ1=ELh+ko{doQb-OTJm~iKzq7fhFu9PKbzNhgytD>L0`H8Z`f~e7Hi6A-kD6wN`!iQJS~b@%Qd&YDoV(w=A3W@pMZ%q?E1q};JF@qR>1Z(v=DLE9hb|&!LRs^W0m|Ti{~M4 zYhxS6iVHc3Dq@YpTL|Q3!DqI7yK9JT3nthiD9h5{VBqW|V>P>k)4qnEBEdtlhs>@b zWXnHO@r(L}Y||Re{9c~FT#NJROS~UDD&wL=9i~UO+MZGrFJAlpJF+T}XxHopW0D9J zShI8$%~J>(unwrtf$fX&di|RR>2g#Gy0G(ba88Ex85GX_@t%ow=N@ZI(Z8q25Z@o4 zgoM*#;UT-HKPD$nNkLwSeG7-M7D=HaPTY-SLczozJ{J=vyS^Fzix3N+EQrqL2D8i;xQ&p@)H zZQ$|cBZRHw=qrUh#NUytX&Ukv8i~dwa>^&(c35AEyQq}m|F(nwPJ#gx_u$PRm-UGU z!615nOeuYZAQgg1WWiacOCH^*S$&3l_Jk35N1mzx4&!=1B;vcmHgrPkkDZHC=k#{} zMXxxd^O_b{vd;nrG8T40WpXHZG#0D{a!OkAQu4LfL$P_uJpjLX*ghQ2=je^>9 zqh}KF7W(PQgD*h0@Pur~s+WyLtdISpY}b zq!W^kjYm3#Al8dU-;?X+?Jb8wo=iIo`J#?@?0wUH{cI-y?5ZkjeWu3)bXnFxCCx-( zXJ_+mkCu?m`Wz$H`&^a~@|a}9>#NFVTfwN=dy=2zy$38Ib0&s{T_dQc8JOerE=&vZ zDH)itFF9$a=TdHh+$>0w4f9$2g>Q?)-QaTN251~Q-IOj9N+1-7W4(=@XiB~ zKlABZe6Ls4`xXe~nF+GUy1g&llJFM9%!rW@b4 zU=`H_ST~-Jhei0Wy0c#f1qL#X?=2{~0Zk~(_}tq%+-Q)hbIXbs5*DvgN#}1b<$ERU z=Q^BSnKzu22>BTCxl9!z4dZGVvod&_A+b!t54o+TG}abY*9iL%9gR; zlA_W--&*a}JQ1^hT1gx2@7uc>u(#)Z*D#&K*Z-5;a)-wW8)&I#%8alD0}A?J<4t0&n4oPjDKLUsCtc*a`4yf?LmN)m&6p=Q zmntri0~Tb7cn3)eMqV7IpUb9TB6d=OA8{j-e&gus(#aX-G&v4w0BCW{AGnL<8i~)j zHaf2*z;Qu*d-m7RF(H7W=0f9<8AqX6r8XXVnm2N{JZS zJfd}M4=;yK1XnGoj=DlC?e2I9AxI!YUQXmM2oWks4^+HHFo{a9e4dh&UQuIa`7#hE zSKZrqwm|_X%w5KMPrw*pdSf?vxok~(Gr)}i;cBw}*t!k_K$Kp=Rqj|=i>r5|WxsaQ zW2r`#P4UCPH1%*>;_7hx9mu3k%!u_BD+us1+P!}0Q0MofiSU6;h-3PRRIbTkdeV_; z62b-Oc8zz4RCdC)!Ls5j=x2>S=B%ER7iT4K(eFO&Rm7V5`2J+KOspDJ?9%fh<1#ZchP|1V^y;{&h=~ku#d1La3aqs$p)%_mf zE7Ki}@XJ>S)=jXE>}a6Ck9!zg_3h?7@f2%ge#h zUzD8IgmR;!URF}knOGkKQZSpF^KOH<);ex5v_s*vO?m^GI#y}L_3nBPDPCj}$N~pC zX({fu%v+>^-?&HC(c=Irnt?cO!*?btY&%OD?&z`eH!mQ<-lHxg4DX|-shM58+u%5C zQv$eG@94OIb94axapt?tDJ87~nHXWjo_GwLdKp)??1%CvW|j{c0i}0(dH^&0#=NVv~Kzqq!iV zN#ZfaIxpTjJHT8Wv-VC8!3!VtLA3#_SCrlvw&vBL6|xftO$wx%noM@QO;ES(VjJ-W zF8J>(qwt%!aJg~ie@LLD%!@bbf$ZU3QCj#_#&OHW?|Nc$LmEdTwp5N+K-U%}D61A9 z-=z|3cCw)X&{m#+25^bkypw2OMe27c=#OV!dS(*dVUVLXmZGn?K<~pAXAnYW{7#Xe zOl;QaHy!7GFQ(QEl|Y$~7m_q|xnWs_WYyRs%i=H02BVna)=aG1Qwn~2Be8$_0~AjR zWm3$v+joS)>sbW2$-iuIU#Ixw^OB9cKNpeST>xr*#&N|~f02cmHKLR1Hm=&oq;ZIM zm)3>Frs}`4(ZcQS&f_uKC!scx^)#;B(PMfRv7y&3RnuYqBrmNhY~-50-fuO} ztRM&I`WcH64i7Kur)2I#kzp_Y)0<`uj(M1fPZ1*fb6-MMp_m^{$U&v;Gmtg{2u`Q8 zdLbZCzR_61B=^Ub3+OeRcynV!yu}eX zOB+T^oEp^NY-l|~tUBfUjmX$?LX>ZD!b0~iweibV&wD3Kk4*JH->w~=>WOQ%38wsB zdhY1G415W4p@`vR@b!pL81St=tJ$g?{)E|J==Gv;xo|EQY9*C$Z>IJX zr+;40L_Pyf%mLPx^Jcdff8LgO+e_)hFq#rOL$Gg*icAz^m= z`pqMC%2N;)@JWd9s(}O4m^X3})p>?-U+GtJ&kaAwM)uDurSDjQdeFp@Oi31_&7PPk#thD`pfX_o=iAvXJf-@ zP=n_9A>lAyAIT^lC+8MNT031{Wpl{D`Lxh~6|hf3wLrh-tDF_@0euEfsgWit)Ul#M zW7!h3#qa174F+E&1@i>Vp0ujpf&Lu!f*?9Yn!!Ue^O~#h9U0K-m6T0L0<@iT5x|_g z&+(fLoM(mpv0PFduVJUQ)xA%B9Md9ZbW6w?(vq$~>Swm*njJ$lD{etXdP&fwlJGXpv-|HGrt zkp?tv#TSM$?@zDb%GEmxO7v)e_k~>Cwv0&T7PbMD{#xopuU}72uWY+Mxs@hyBj1VX z-R)VtETpEU;C+Yp2?yuqFJ|>6=puSiTi);rG1cQO-*?in=Mj_G*6047Joj|Z9tyOs zpLt{)ss<_llSpV=IT3r@(xVXVTe2%I=zYhKW>?ya#~jvYYfzFp3J`NMqXwUwKZSZ{ zS)rRE+h&(6iD@3kP?MHwHGVZ%T1)tmD^SfemtaYiy6RL>@5G~FL5g{n9nZA620LFz ziV&s|s?4aYg|tbqy&AnS+boQ@`xe7x<3DNEkLekq_<5?sZLCNklEAQ6I)^;8sx@%p z_mc1IHiD8fORzrh!?yiWK~PMB>CoC#QP+Ii(;|}eWyD1wS&>E_iin55zg{E&J=HC2 z{l)a#kY5oh8d?qrzWa_f#90wYn2tfr(vV)@q=7v(2m7du&9Xgofa2+glqEHWyotw$ zDq&WEHR=}}88ShSlTf@X4Z2jS8tf_$&YkVHyWdas7&ro5M-~C&1I+%QcQDq6RQbSj zu{HicP4IKS3iwmkvT8jO**I&sUvsI~S$mluU|bYyiNHhE``d7H^SCnjtqh#CD1N%C z4fe#IWypZ_=EoQidi*xTyx!?B$91W~cg~?*w-@s zP8Wlsi!YJ&dn`gBoFkbkzF;IH1TuY@HXF9 z_L;-(%~2xkOkF!QQO`X?tMDNPktkxSmzbQIOd+I24LLl$3E=;4_Du4)%o@BrGA}Q!fem-Pj9xHvwo ze(UQW$dJX{ADFEo$RiI;x$Bzf>&t12y3fBZ)Y`eT7I{Ok>eDz-iM+o^%yn8F_CdNB zM@j4l@Ng$HpROZ9u$+%51;)aCZBG<(rToDwP|SYi#oD^<=ez6b?4jsna~@M6Kkn|c z@rxqDytcsA9CIizG-3({X6U_11S+F5lwfmfC#aH2`w+1o=f;ZxExcX#-fMx<5Jyhz z`$2ufyzei@CwudCWV6k8>DaNkJF={y?24L$z$0|Z_+4JuLu=q&FIt>T2WzPAOxP>1 zl(zZAdn!>25SPXE7G_TDtqUTC%7_f;`nIb%McJRTqlROfRpRv zS6XA5H%exXxe$Q@f?h&(Ao9MqzG@mdT`N?!L}3K0@q# z%*r7Jdt5uUq0)}ahG$phMZ<3kYN?W&x46n4B9VR|2SGZ8XbXc>{+-s~0lC>*Q2F-# zI~WF;(KJ$OTHsf*I1{+_^3#_~K#b~%zkJev6Cx?!KJM6JXJ^j;MQ0MKa_23g+p(mA zl)-qWZ62%jwoSiR67$a}1`h6?tOJ8~Jj~xTMB0tB`DDUh#!e%pn+xpb=E+Qq_+Y$A z^(E5Sh29P6`YUwsL8d(|S)daHDi<~_1e z3SJEzS>tysyWgQ^IooIO3%Rma z8oAa{(bl*QAv1Jge-es~RV>h>9X`?tJHR!IFb$b&5^SG@6;t3yYxcL{-q4LAs} zs!jzjIHC(PS8x}C@sJwzUs@8x3w!6>QohpiQsCkQfKvNLdP*r~5dq|}?-8zH4R9kt7v4wmA1(tZ4;e%~ z5>qUHVin@Ko=p;fxC0Ms+T~HwWP&hP_<4GA%_mDN|Frbbm?Ln#=TVYi%lq5-DhE6| zU23I@FT!k#-j$EBfNh;w9b=+7G@pEkiEoqO>ZNDBt)2b}-h%)Eb-i{foNiV6F8rX9 zq&Rf^8_S?pcS~S`h18hy(nKw`Fi*7-6C|&BRW0V<7;FT;T%G8tXE1}Sijek{9P0Wa zcNN`_q0TmRpnpa2#6{o3@b!06B_HYJM62fMkPtB;JaXR5n(>8$9nVxe4t@Nyt<$Bd5+z~ zQ!i7#{xw@aF*zSZ$QC_^v@BAexb^1(c;X>Yb!{q~p4lGA}U=u0)+`=nrS z7YG~6g#P~G1bW$1vj?XwIb4L=t{)1pC#1)QUkho6e71aw{xi;$EYm>nGfN}-`SUq> zD^LZpw)x$Xhq=T>57oOF-S>^3g3Uq~NLq05$f8a{&0j*S9?b_;8~>T=!3+-zBrVE_wi}o-b3F{SCKi zMBr%yMPfcEi|H+j1mRKzS7`OrSf6mJZG2&o= zi@}N#r~OOHINw8kK@TD!-;p+2{w=M!2P5?YR(~3fGAAs0VPzQE>ogy>%+W_b^SAd{ zxC{V;m7FnB>WCoN1Mt7PK*NsvuZ!;!Y+x5>cX@go;NC0cY$PsfqbTK|sJA^=`Cm0a z%lyB2BpFQB>>(PRi&b*4#Gr>O-kw0iCy+o@1YQymyIU=m25N8=t}mW+GPicf{)w66 zOqX;JWdyxcK=26=Yx5@CZ??nd7ZcOUQf;lAPLFwq6&gc*&`2tK)HrYRiO})(PcMAi z_MkSfj1M9q187MrF}um7+M;l<snrFqx$?rKvC$6t1HR)w&kV$#wfP zZytIzy3gojb-XPT^Szt|<;CaO)k6{ew5;H1s~r>Z&wl>Ok#C+DOhiZ;6ucqCS72fy zV@=N>^&-a@p7~H(ihU$VmwvSLxVrJKYheY&)bkBLDa&)kq8=I|ilTkuQ|$$g!|+K~ zz#g4)HNAh^ghoHRM%ba&iST~=-PNFNQ{w8*aHfI6jO<)&ZT=zkS7vV#&>Q-Yo5j?t zl}3Epb*Df*MP~N6J*z6XXnYpZSOrOj0mCu#$6B#ozw?d9Rjzj9Ai!i8peztp2AwVF zQH(D*C2e3Tl!AowQ2dUTxau7!iWYEyLFO#o0iS9&Za4^Qrgm>M=}XkKT3J=G?qjo^ zo%OzihQk&cGmP>G;E@&C=f&MIU@d1S8Y6%qS%_)o+*{fRun{qzOMF&-) z0>9FFr3M^A(V|MySKf>!)>>meo|`hky|e`;lK%1k4g~a3bt=NSmQB!llfM8*vb~Q0 zj${|#ro5%W=9T5d8$fYpEw21Uu)gg<_wFHmS$SH&;MWn*YgX;%pMRc(SFp{&EPbvJ zY>H@#cS=1BS%^CzPLO(gb~PxkHo=?1fxCkoZ9@P zD~d~RU2BXz@FU<$XCE>E?K!*Othizp2+AG1-1jLDErnG%0pMw$kN69n!iG~DP(SBr z9JV>iV3mEfi%oU9@uqar{i@8^p2V#z6x)Vb%jktgBuo2QVHH6T$z9i&Yzg$S$Mf3< z%ku>-!M5m^Hr}!$nC!%{SMWvH&hiNn1`C*|^RE(6neiL*jf97_Yw8(zJPL~trLNZS zo>~)CR1>pYO_PVi9X?!ww>&UwK*J7AOJ`!R!yJ<+B`3{1B#2F6zawbK)hk*1)r=q?o!J9(X?Z(c*;^&}!=ow6u6VI48K> zwH%$?Qt(B+SiBT>llzC8LE}I4bI@R}LNUAh*=wFWN-kPF@DT8OX}N}&!ur_e=||Yv zJzqiBZS)V_o*Z9@kQT;DWa(Qto=XORPDGGHSB^PCF_Kgo2*8*BTX(?! z?$0~pC{(f7c#>{@>0|3;Hd=%~s4z_%6PXH zjUyzFdER;u2+tvnU_@S2nX1Z|v!2y^FrYuwFNZ8;k!cizl<>0dl7g&o0(w4K5S zpXebI$;edoFdP%WoonkEn=D%FT-sCec(1zQ4QB@h^rrDd1`Kuo?#0FNrbTV))8D3= zTj*E{s#m|`XT>pDP;*BR;`ivE+@oS@=JyugQEMFa{`m-aO4I>)+ z6Y}lviWS#<1#7nth4L$`UI?}YW(m3!7}Db6WDN(=0FTcpxDHhRc=gMGolhO$J!3us z(!T*we~QMx?3BM$Q)i?eZ~5{iy82S$77Ut z>`9{DZ!|t0N|_4wU=>|(R(W6EVO=4_p~l;@OF2{N;Y`nAa2irE@%^5xi4v0hFBD5V zRF+G)A`uOUICAy!k?4JnS|anBs|q;?nCxb58p>@c=!2y%uYp z>Y~(egq+c$0_EQpAqP>yk^HoQRfvPp71lmR$4>JUpE0rijqDnpfmudK2BW%IVB1)D zi-$y__nar&#=^>N8=5?bNFDZ))n;GwIRb>kZ!F!*!E4k+BW7}9oA`Gx4wvYMo-(}pXP7hCx90*FH^BRbn5a)r7Eet!4M6rY_c$^iWOotQM7+6 zBxcc0L;joZKcQz1GaP2waM}O7{~K=xh{nCL@clniM4R_>J}NT&*DJ~&Q~!PBN8u3R z95ljzf+GKS;o;AioWlPT68LYT_NC%;+~oiJA^=$Q|5G!~NRpL|`pA3!h5rQ;kT2cy z@J-mi_`9|;urOJQQqk1(@0cpy1*17ZKx7v6#p}2q9&p6Gg(F3j@QHs)>;ogsbLW<> z0cUNL$M&(I983s2Jp4_|iFZR)6&5kKO`v1FyYLgfio))~qD>1rm`P7hFKl42E*uDA z<++2u3I5Nq3%@Yse00W-^?u!>>*)>jnfyKQz=s5Cc0~_i!-=pgzv09f9uJ^t`8z)y zXvg2g2J`vI-j0jgNOh-3t@mUJ00+hd8MGd;B6r|EuwmbH8D-IM+5vb{mmO@s9U5ic z49KZg&h=Pv^=zJXUTMOS2W$_$P%TmMPv>q^Wbp7B8jmsB-00TlO3Rr$m|R*K$%=@H z*@<-fdF3gPbm8te){kaE<80NLP>(hG=`J$uJqsMw-H88}H@l z^6v1_;WLaE)iT!O`|*k|?p1Z)c-7|{#a=qFph8fBUgqhe*Ft z*a(kff}~{fP0DV10Xw~~|J*uVjjXY~*vC5RGUYW+0~FK<@YdIhJ!;H^cZ4?Uy=HeV zMTu}=*M9BjT?XpLH_<0%!3qtbVI?un+MZP^_jT`CB}sUK3$I!b4i8!K`AKN}CEwt$ zBb-s^!Z@IV49lA78GkiQ z5$_$32Y?^W2W+NeBv#8mURu<@!U%zL+#XqvsnlwekGH~`!S%SBlp^ojoy=Q5bBoQ) zj8@b0erel!hTwC*xC#qtuvta{%cwHKiCzX~ew3B%X>~t`_;TwW|2SYVd-sYyNv5~I zA5V6JWe=iIE8gp zT|RA&%-+XvWO*t1N2N8MRu8gcBUQA+6>(JjzbR{o49-KG28*aAFr*d zMq{Z9S;tm-##+2F`sK-E4vJ!Ye=hsg)F3$Bx3UrD>pZ}8sb!*ar$8W-H9BCZx}9};l5|B#J7Nap)b{#f;SY9 z?CQ9dr*f@E!bP$Lj9F>%m=5JY`IoQl%BPyiVB`B?1B}Spddr_g7rf;-@Fk6kq|9u zn#=LP3Kd=4H$1qHkqF;Du+MvLQF9$FjT6HtSDW>qT^$h%8u@So8>HK=R4WGfW0@m* z9n;$}SUI=Vc2~x+ZY%BU9Kpst(h{wLWFU{AcHDEyw&S6|Z(N=!55ulSV&qna#YkD$ zki9!w+H~{g&w{6f?|mqSI>L*!%M+0I1-^H@bqg$vRC$IR%^bhMn07jg;66dZ+`*q( zyx!N)42?2D1^^in%WaP1rOUc~;^s@ECs;|~o60JPtm#G*0VoqeNpCpUJ2L0)`8=0{wIr?DCRlO8+`5cSwO8ZRwHY1S|EuW zjqX~7E(hKP*P2zQ_q7XrblV^I>~v}}j`=VcE_Pi7nJ`3`l0vMyM#RKlPV@t2{v?QJ z1+;}UE2w{uCJAU8icH-%sarTKt~3``QmUVK5Q%Gf__Lj6EBWywdZG+Xcz8Gja#tod zqUXc`!eE>A2NC!M0n1{8xfT`{u^c9m^mjQqIqDrg0+8$vr^sqx-mj^t+myhaxk|m5 zi3vreiy)Ai5|fg;fOWgIqsCPP$gUG_uNh}b$F9lb<(=VEZW?ypjBwEu3}nUU-kOI5 z11v03q9RkMrC~d8!@k!xf)O92s9~Edm$sW0bvY;(?kA{wa$UKg&f45g+YfC+VArv7 zA-*{KTM&P+dHIlnXwvqgpPp8?lHlb)bhl08rqh|y(@z_qF>hmDDfSSlWcRdweYa6- z%}G7Z`6C&KvcVs;m@X}(i-LEJTX%l32MvoyAf>LK-%@jmNN-E!P3{&k(>%lDE}weq zV``wt^74Fx0bC*_CB2|m3RF2bP=7HPop5?Ns`W!cwt@_fHKqJW%)`*9iJ9%rXlGl4 z({C7CfI_A}m>nzRjsjM^xf$hVFK!{eO(>E!^nd0+lbtOJ%J=Y#TvonQ>uZ%-pc*Xd zfst@)%BMvddO#{{v+hBlrY<@q;#KYw&e8s;t&EJu0395b?$J}t7a=b7t55Re$X8C1 z*7c`k5`ytn|2SU6lFtxF#-ol z)~)SN2ZlCJdFu1Qzt14^U;P2iiLtWLVc zP(wC`Ix@vuZIIgC#WVX8y3}3o8kr!64>ZXh4?jmY=ZWU_72UrRi8&kO9xP-4NAzzj z11V`S{Afeq@N5jm@@)Q|KD9l#~=41VrM*tQ!t*28K-*;u$t&=*Nki z(P@~*akvcm5U?e?mgQD<3R-|lD!R9E)h8k~_0^MlJPMLhsX>FLqNWQ8*g+&!2!N-f zHTWRGomY3rbEryu@rv~I*!-HEFSqfpU%%KKwxmDQS%WY$lG1-5Tze)mNCm-wp1ff9 z{^li*%Ik7uw+(f6N!DgoY}AuPeuSc*=nyk5?jCcSKp7#ty`GS~ zNwdUh2>9Q#HeDfp{?<7+X$=H%8E;6ZyUj>XPftL9>R&J3H3GT83n$_4zA z>YFhPq780I`4Bk4O3<@iq*!6X@*ZyMN~=lX3KrmC8?-OEy%d{zjKl=*0Jj(euyM$_ ztFnB4l8WsQGUY3@;0FZ-+3{HI?j8pA7>F4dQ2r{?iI|Slh(CZ6zN@o@flyTv?_8@} zcvGTc3U(JpkBF`%PrsPbc00xXKmrB%ZT?S8e$Gt)hSMkF^wQChU_FvAx~pb^f~tty zWq_CYY8Q`F4gPqP-Z+$Qb>*nXRY+6uvm*lca%}WnwL%0hOF}=bVd!g;qjFU*&!(5e zC%j!GJS*WD5~K6gbIgS*Sr6VTYG^|qajDN%QA8hX-Xs!aP#Ps<*&^WQ`U?o*M_P#Q z&vo&lN;skq>!)t~Y_FoK)R`XT`^G%p1IfQ*DT-WjH1OQkI*cal*DNy1QYF= zwQ~#oW8NoE#((`9Tvzu_kSwIfzMVV)FQlhSua>QX{q>hs?LFy?Gi+)7?Ff+jN`2U1 zjbdx?O3)c2iFlDf`1BrZ-m)h7(D$Q}267csPa*hLO;9RINKrC5A^9w|0jN=uRM5(~ z19S_7(4g@hF}X-6)K#~#an23xoQjb3oy z6O+HbmMIMqWI&d7 z_TOv9jT}D+TD0iPJ_c-5!1mDgkB>RY{uC4#4&N#1Y7WQTF4*8JX_o6T*_6HnRdO)l zUJV3PnqjiTkjXt?0mLhVso9g$;jFBUn2x)#((Fqci(+Cw;(?&j=poXnR(!|JXUBp2xD+K97s`eyRc;ZcMf~c zJ@@omU&!|D+c9+LP>dNf24=IF&jhhpEXc|o37^l0(z4^?h<}|2qG3oJii+YBz|cql zKyq?2^m;u?N=mSO`*vWw_}XS;J@y_s$t|)+^c+7_QVmUvT^2*YX1AeI7*n%ZwjLyX zL1GY&iIm7~{1AqwqyVl8IL-dOh@9p|M3D0m($U$C7Atq{*IqZ0&0( zP)#2`yw`X%o_{lorJ&JhXf2`QSS%elL`Yr;C~VcV@B9bNAo;fD8~Q zLZDKsAw>gJqM!17I!oq%^u#>=9LdU%QXk-&tyTyctdh(V0J3C&Was4Y86YIvL#5?* zMIwez#%uX3$&#T^DCg&rcY&EUX$tln*avH?jW2G>A_ zT2&Z2I)7Lk{iYDJMAS|;DB);zB6_eFcizxb^Z)ejTiFqrVYutQ>A*%21%q(cebe#$ zA11K*Swk=Uag3U=jCR(l_LR<(ID? zjFOTP*lgTln_O>QjgcRZ_@o3;^#Z9Y=ZqIcRD@p)r%s(hOG}HS+NLfA^mbb>qk}v) zb;;Y4%4W9#GBzI#ylzvM0ytI-n>|U=-W$OT|Y<4>;D!ZUj%Tte9c7oG+>-`Uc9+#8J zmX*vqj{jrjHbKa>+Z?T!Y*{J$jZV%*_a9CaN_|9Hto9Ezsf1nL)!62k0r(jr|7tbCpU~N`z_k+9U8Gm4{ zIDt=0H?WT-el5uutTo-h-d>S}Tc#QC)~8)TvtY!`3^Bb>+3R(x>b=m10OoTGZ~)MU z_)t|3sKWdHxyzw?dEX6Rr%s)U(9lp!ojMhJ_wMzN@eiev{SMk}HkAMV7y|&=uUx}2 z47clwLNFduBGh3R22~CP$lqM{D}UFp8jZ9IakH@=`+ryEH@^FSSH(>JO9l%_Yk-)# z6u`L!{-JY5%ppNsQX4RVuWwvl#-ywq&B9nOy8%M3*BJ0OBIOt~8jXmA4{dhiMIDzy z-|O}ETJ-mITxu$wE@tvxPG{Q%*R4=UH~tERg3mT-G#U|sE>t{ys@J_vs(-~VS@4_d z>!D9dLPBy18tRNN*VjX(R!eSzkW!aGoxYAsP1Tb{3~4w@#zSZfiA}u0fc(i*_%U}n z90<1MFEu|Xl#An%43IB=!M)L19=Oxr#DIS#g6Q{&#QMP+tiFF^ea|r&$}cX|+kb+t=n-HB_5M>& z$dG0mRxbTJ3~`DMsKSAaq#kXH6>xfiN_!ZxUe0C3uD>Sw;o;$kQ*;1lY;aY7&7X@n z<3)sKFj{=l=@W?gLB5}|W;hFQDd!nU;V6~35@SjlgR1&-b^kGg{(pPt8rxQR#_|72 zZ6{6~-;&m@vE$aUt$#EL30-Jc(ke77OcPs}rXV2(9|j7AZR%7ILX4>m5n_wF3MLrR zv{t(aX;mjN#8m=@fDn?6s!GySA;hVhi{s{E$G5a6zNBX#+~b_YZYap_X_r2~FScGg z`akDAignI&{?GHE`{2rW?l|^6c2fwHi&t$z`s0?pc=PQ~Sbs@p^v!l#X8i4cftAx| z7`q>=%IwktF(x@1unzSPz-+hWJlnd|3DZUp!Z*r;CKk0`@Yyo$vcltj~Ie;O=ej?bQS#WDdS-tcQvL11YL zQ)B-D00^N)M1K`!Id8`Et?%xv7ev>E6tVXQOZ~+hO?C@XDF}gcnf(w#?9RUsIESgO zsr38MA_{W!+{qOqK@hq5#tsmIAZ`xce0LaociT|kREzr_{uc`MRVdYHP*C8&$qz07 zAH0uXyb#4@+fk56;{5puU?;nH_;>;(C2GVLE+UagVSiv?2$hvv5D11~)N2u(599HZ zXYtM->%sFe%tzyS)lV)hA;vEu#$SeNW)8MZg%}wOf#(;I)H?AUh06^8wyD{6< z1)k?&YkzkOlO6e+4kXo|T`WXXQxkkXAFNg@d_Etlc3RQZ)dc`d^Z{VJeK==wL2N<_ z0RChJ;xYf~ujGw*>>~W76>!=n*8JXhd-hY|d|03iq>C$H@Ol>60hnuVdUIR4!>!aexmL&97zgzr=Y(cnyv zqkmSZfHyungZYaUC@W`sQC?nVKp+@GQDGtG0`s_BqQSyN9y(nK=EG4~EhY^9+RNS5 zk-lNh_lVwPB8d=o;O*X104~7K*Fvx70YQLegBMi|W<0ZQpS63IBn$isj?=+dx<8A?TT}ghhgy(ro zc8qX8_~%aqtJMmVDP4Z#^Z7DQhgs^^)YPD@=YVj$@s-RuR&3q_05F+M@Si%xQa-~i zx3y;WT}oTe0imX*hMDeK{Uzpe^af$2|N8wOXZ?@0o@^Fa>-&;L*nPw)h$TQ$&3{}m zvEudnKjuX3)|1VGsJ;7$Q(#>Nv{ng<987kMaJF{0aBg@wYn`?B2Bl(!!_3`TFYr8% zMTzS}&Jq}&=dE0rtu zgQWvwk>@i#KqBEVij~T&cr@BlW`FtwvEJY!FHK+X7zl#+Kj6U+ekwSeRfvqefuG-J z1BU`QcioO7o$q4uVjUJPUczg4y~gZ9n^+j2)y1=p{ONtx`h<_V_T)!{2cDEpo$USqA?PRXHKcxF$g+igMJ!kpbCuObQ z-}O$e5=(byy>Ka+e(>NsG{kfttj|{q08p${X6^a6DgV?xVgC9r5yU!$5+DRYToXs8 ze=GF$4Ps-t0RyK$M7=vbf>XVz8UC3$G;D9cLE}MY7XZ&sJSR-~{C}vasYZ9t7vSS@ z==C~SH=Droi>TgKg+~h?W2XOTcbnjHIuHs+P+z|t9?uBOCKLQKvrwxxKpA=uPi*UE zdI9v(mwSYy;U4gbC0I;p&hLU(HK1&33+BU7H0{{~uh+v= zf6C{F)9plG{{S{`HbY%hh?3$WOkJ2prON^Dc`s9atHp$;&415wMJfe)KK~4dDh_jl zgJ)pWl_H)|3{Hk{_#?4Fq7{x|ONElz2Q2hr@xEmKHQOH$$yf zfBhfj3AI{{=6~j9w6wIq;cy@x&u_0Ag2;uf-7V}raj&r20dlo<7W%o|2SEDiH*5V| zdV5dYd)1g&>x+9Xmwv-omrSucoFS61UZ+92zB5cT9Z?p%m_ zzSf=)1hF=h03itCnsB*XIMde$tHlI^UWd9{YY_|vQGa)9Egmg=jB~kMO!YULH{z-C zr#Y9?g~dw?_}kzAfm9*^SEUg)(Zux6iUm>WjXF#i07iTyc`9oRL-&_f*{t05+DRYToVU$>GGC##|xax z<-!5oL9WcG&#a5DtPpSVFIrP*EhO5->2HI+(1Z)Dp9S8p_;v9S@w8V!tBw2Ve0iZvQEHa0TXmtrs&P*PHY zrKKhG_V&tJescE7Q(SLvFP4^;P*PF?vHt);u*5$;j+yBh_{YaH{U;_nMmXs@OT-4O zpFHpuC-yoRd1iq7)WO{Nkb1tMY5d?AVPy&P? zh-*f?!S;C4g%+{IJV~)T>vnqzrP;?0|S_wTRCcRZf*_(0|V&q?|+v~ z-|J16J9)ic+4Q9Z0s%y$QH+j`V*EPX0F952V{~*B(P$KbtCR&1M7|NHkVqXM(sh>H zNDdJ3y&T7VHKf{dmH&u0`>P!wawGw6BnOE2etL2;YbuT$M8e?}drl4zg81f80)!xl zZ_M>@JzS07ZTtNV6U%zWY&N5{wSN`6c1!uE#sB~Sy-7qtRPBP=(JAif1O1%@C9f*=TjAPC|nfu_I^H#6h_AqavX2!bF8f*=TD-9rfw mf*=TjAP9mW2!bHiJ^uqxdd~JwY2Mrb00001yof*+pxW9ln&``1f)y48x&Exk?!sdN;iTcC0!z23R2S2ozmSM2M+w3=Xu}t zt?yg^S}e}&vuDrQbI+aE%*ZrS!2(hO1DN8grQ(!!Bk9DHQbT868d3w$;!oYz?r1UZOV152-8LZ~0u+rIQ#2Dz6 zh>Xu;zTL6A)PAtx`b!o5aY#CR&O7Czy2-dggjgldEcK%Ls39|2Gd(w^^kL$)ESPyw z&5837L>>NkJDM^S%9AtXJFB*3h95Gy*IH(5U1~VsJ3Bb^E}BKfFw@n+<6j*YryPI# zWRi~@MboM4_sKq9mVh5t;+D<(!~N+JFXD$+m75UnYuOH-9@>}JvQ_fVk?il(2#YsP zMy*%rxrkOz5J~)IuVaj~DB%d#vIfJcTSnrLpVzK==RUN>Q^C>t2;gWvHCzZ1us_J3 ztV|KRl2Wp~m9{pRb;o>el)luS1+&;}A?c3|p;hMhNUK{(s}EEA< z^(l-b#O5W~^%hRj*|*F$hFat6qN~)E5rHgQLk;5q-cV=kI)F9nKB@2&L(e z$KvkQ)WIUi-EzX+qWa_(|@3M@94?uZocjx18z4*J{&gCQ-6u~K{Stk zqSjBu+*zV2q_0Y2l}^AmOE^SCpx0ZHG51W~+|P~;CDqe+U!38C3!7M-oF}$zIG_Cl zswogJwti_s`xbG%Dtv*QJs(sJ61_|y{}^hptGpA`V14V0d)S6NMH}t89c0IaqA}_n zj{Os+dCU;&wH>tg0>xBR;w`8cH#*^@$1}H7{-_}b6;ol%-49sa~=kEr6R3*Cc!{C7P(*9F+Zi_HylZHzWo(ssOODwH72 zpEB1ll@yadF=|r(>IHnC+tf2XcW|ziK}&r}@h$fRo6-W&#rspYhaa-l2(#QPP^CpK=o!LK%D*l<1qAmqn(L|b-tV1k)KPKrpP#u! z(J+$`{>^4V?c!2QmeR!hWQuO2?$P-d^eIA7B11*DtoRu5rwU7j@I{Gk;FbE%&aQ#aqOvnzq59+Q9QF+ly!+-lXqbkRK{|V8LJyKx z9P!VpoEtB>c@NalqH5&sNNSkc>A(v+1A6}^Nj3;*t_7aW-fYb{%BaTO4qEZ1p|x1| zd_#V@nXBYf=KM5+&+hx^yv#TvZS(#0)xGeNf8Dvmb-!-UVRRzRkM51SXT3kJTE0;R z8Kf553@q5b-)xK74i1*nZxX6k4p{~7_zw^FbgMr%n``3)!wO5c~5TZj={$Tl})GWj-C`%gYTO1Tl6v8e9uOH`!ajb0`|LwgR!_Xc0vjN6;M%jq8yz5|aQ z6kL-iyrj)x{8-b1f>sRX{ye;Yn4R#Ia{g8GJUWP^4Zz3c9MxJi|H02BA07F{n2-CN z%=giWA|{8j8~&=;e5IrbQGTOU4hg&OQ!35*{I*=9*>r!)5dU&W5)$bcNal7jpWT`Z zh4VJmRPGP$mpd<3q*VONbh8xa?QcArJ-YH6nyr0bYI%|yinvn>GUT*N{ZpX0qT9oHeAx1^*|YN^?nQyg@a@Pfi-LCZ!+pyljoaD`V(Js!lB=wN zqxbh$%;Rsq7X7f@i*a|XJhc7W{E%NiGBs@Mkcnq(#NvE?cJ^?&-+r|O#!pOW-Q5g> zVMRqcTgUdjG#S0aAQJ0G4o=RVEcLLJv8BN1kSvZ|CYH@$oqP_12oww=bP>;e=WT;~ z*mUb^Yd6!}#PG9XZX`aR7&S7v268()i$OH<8?L1#s%^7eUh4Pt_gOD4&F1<7Kf#YE z19+z6eVTFXA_f}ft6PN~C7#CIeJCw1uiGKkYCd6t7kppm1h2CJh%o%S(C`rYWhe!!X#R+dh3p|@4SyXvROL(}XdX$3ppi&P zFa*VYpZmEY7VTM36udoj!6qdyAI8Mb|5m5Q5=+2gF=mf{np;*7*}NyND>CW!_=IzF zCG}x8mNOO+r1CKnc*^M?dNSM`J2{SYvXCpM)9B4DK2!UIyxy_vob?R_j}$l`cohHq z;Dv~n<5U8ji2%yPGyB%P&t1;>=syKzK9B+otd->^x1{O%jd$GJm#7gY;!kop0)#2z zcrd3>JnUF88Fy?CIjv&s2?iS+c0Baogl4vPT!pG?|kmu+nHj+tPx8pd|3KHjxu6S>zS|QhW zM~n-1B3DJn!%%lDFarCOxAzD77Vd;lxuq=BsWtc61qZ|!go20^k{YS?=~k{{5a@*A z<%RXkpo-Obr|B_8T6C$*=PBFhFYUGXuv+c3?E>lf-KGQ5)FS99tF4_tsH5TYa3OtD(k;47IJVq!=Ko z8-qzcTE+N#|7ee6R{Kf7B}T>qgHCU5Y`)qP_#%4xE#u7X{TA^TWup9pC%hJ=v2|Ci zO|049&hJHUqG4s{a9x=6B{TCe^_&NqFDZmke36D}59+@DH$+Eme8*&}pZ!Fw(`GtCa#r{lw# zpPjB4{UL zPf1Ckfk-gZpoVL&>+7|6{$bIxnC$628{fUmh9y+sH*B}mGhnL`>Cp9o)|q!rZ{qI0 zl1tJyg!({?=~vE9IP%CGHRuxeNvfBV{j>k;9(kN1hkR-g>b~aUrTLYkRy)(BCdfOa zYr8SqRD8R;uQC2>`$9ry0EZ?H^Y%m|kX_4wE&ny0orl=oR9O?V)7+u^!^*io18VQ< zq91(gDa0apWT_@GaI-SO#e9PLDtIHA*ylwxykkX(+%f2}wZ?UOb>wA(rQtNa2Ij5#$*_w3y#4_V5mjH_ARqCY*CF3TY$Z`iLE3e-L@SmL%U%13XJ zlH!`0GJ9wVAnG~#p1CK|z5BK_ogO}HJ3H|h(#^{jIX=sCuE`iF*-vuXZUi@B|`+>btM8@bFa-5O0c*wA%q8wVim$J3up#K zs}BFQvUr|AuYZH5sB2!+0Tk}Q}S@L%u6l}^a&F4SId^q=n zYg`>Z8?t;KEGqvr9}nfXn*xCErKO`Y;7r8WnCAM%hHzKNLO;w0)_1l_$4fMu$gDSkL(v}R~zl6>xzGYWm~MKQlY zd#4gT2P{+g->5j9UOaRgg;7)L@cYAdZC~xM)x*nzwEO*JLRvmL#AhHQBgy&(in#-a zG(8d-q``bU=t-n9k=;|txJ&T1tbgHad6;aBJ>Xe~7feq(L@^a?TQ{Q(LdSY_}o}RhB9rr>T8yiDzHo}oq zJ(HD}U!CrWAHNg?i`3;@T(}jpYHRtVln6%VFB%-?nSh{n697O)MIGA;`G|(2Y_!zq zp~8AYRkl=saC&hnYn@H~ymarCt|1zvf9r%_#s%;bPcBaL5As{_zfyCGzl_->aDCce z!um!}0$Rv;_4F9K(6>L|u@rg@Wwg-EU+I~C&Tl1yNd<#OT3NBZ$SA%g9=)S=6U4oW1a<>MLv_A7(TaOxe$DS4s2`>37 z*Ja%p3@i_8zR`aBw!NbR2@0^@+-XWz-18T{V&}fiW=u339BS4M4h21NF)_%1y^`9& zwwAU+1JpmKuI}yYfM%ok;$jv)KECXqKS>Y}5ER3{T+ZU-N;cfqJ#f8N2IuP?KByOU z9Ite6%=N0Z6c(cT`1lYVyn%!cnZ~jrVIf$w=VcQVGsq$24WkR7q^3mGik=6PaYH{A zagM>r%~WUZ4eg@aYx`P_C zQGbgKBC~s5x2m%>jRd~uWJeCOO1FtUSp%tgKgGGp7{+8Z)z>K|rkH;>yf5ku!gK4r z)Rta)*Ne_sH)j3zE#<=%xG^Tl0GEl08p9=E@DksIPh{uhAf&u7%$2vhQNfsze^k}6 z0u@C?#aF6H3wItbDVt|G{Z4Uoz~cs;Q9&FReNMBLKcT(-{U3dv_L^`lU!Saf<+uCt zk11bpd!7&h_F9_oIp%6?SZoV!o~gZKVt%(Y68yM}@jX+h*@X?5U-U01F`3w|P0?4C z6`n20`TP15(bioy>2)ZvG0_8(=t~Eld)OiN1X&ul%a~$J#NkZgw-$76vbr!!C0kVv zc${Lqb(`YfXnqq0vBKm>-TWgXQ!+|B8hdx zX0E*BMO_B|p^j^-S?dw;sz@VwAci!IKG)zpWOi3jwNtP9X zkUvlhK#(-d-;kgB3i}KN;PWFq2zSwZC8SX4e<^M)na( z6qPT_N=jB>0wZPU2^A?;J=Say^5G=(pXhi68g%lDDcTLP_@yk!xh3)ql>*Mtac8?1 zmuFc(#j>1P+bGp1@FBWaLnBsdxU=#DI5ygvOQML<^{H0~oh%Vm^;7?+2Q!mZLJIMV zZxR|Z9Vw-Qf8xq5R^mHdN*gWejAwh2kRX84i#S z^s~SGr8ljiY4jlO^1+e5Fg!FCQMZ)9RW^%Xa6iGVeo&OMFs#Mrdu)J~%+k9F9w`qG zkFP>5bbveA3P=+$K+h1DJ83HdxzzA;8#}u<3qiO9M5LsVkZYrO>5fjotlpW*YsKZZ zsY>|lnNqH7+#l>c0kT*i2rY{Q6Y$=y76iEe=8W$oq@;xZ{3$fMMqw3I_p60bfRu)3 z^*J(S_Xm4k&R0zH$$T`j(Q00a2lmKO`CZ9V#0sLB;GYQVJ(LlsfMQ|93d#^C4P_*v zIC72>Pd}uapG7BBie@d-kQepvFt>X1N|_804ycah5PGMd#V=$bLLSTmc{0N6Pp~y+ z4FsCBxVj@94TmzLUon^3V?Y9)_Kzx>`P?=6Q5d-ZN+H9#_m6hk{~grn2y-YdEgOX5 z-pZ%~b(d9E0BYGgjHEtUwJ-`uKqIzw#oxdG$%_}?b*AMi)fh9V-zFv`EY77SC1q6# zpR6M`riO$QMB<~VnI$W9d9)P2GhUQeU5!smOIzCveZI`Zc5!hT*>NWkbff^Pu)_k9 z*>E>ubdXr4EC93o(6TC13@}mV1CljZU=mM^Pa)}nzRn+s%v$DTv~3@27iwk^cCM|` zT0@utc@8c*J&phCe&MDi=ILoJd~)oF9i^yHoFaTK97M$I+1yKte)d z;it>T`t&*aj}{UNG@GWE`?H=0PDg=<+0-N?=m6JH>cS@0lEeR{l zapGvCe;n-3qtVa6hW#ZJz`8!H@UK*e+!9z=SljaroPf#ka{EXMR9vgBS7SL zc9xix6+h+j%bGGJ`mV*NcX+sG@y_2LmpnQxjZ8~ho1U3j;Z&piMcAH7m2FV(oE|$v zmqklve!+m1&E>^u?R-e@4w9LB&&&dyQac0*Eb_$Twv+10bQGh&9)A%fjMQlq6cpcC z2gHTf)VO&fkD=vh`P2wI`Gt#Y)(?j+2#9XZE9v!$@~n{)S~NUyRtNyJ!qwUn&v<(9 z0;=mj3$qaoHgHLO(<|Fw4}lV)eE|el*#Eu+y$rPGX6{?|@4hggcnPqn2<)y!w1^c~ z?TV0sV~#wj&THLRvT}0m7Cbp+Wsn@OtnKV%3=JuBb91d3BL2mX2S7(yZZ8ia;^R|PiLR$$Y62j3*-namBTj(|Uz_|- z+153f0$bsd&C{6t&(ATj_~37K4Vg)aa1_Dt<{ARrY8zI+%0g-=(dHJ!n=elmSK9Nx zta!r*cQ30{=3%Eyz!o9C&HS{#G=9#kPG<8zoqo+u3-XPiD?lkC6ml5_{XJ&{$)6w1Zby3=mH&B)x$pyKF!LSUNrcg+{3NMpWZGUr_>Eb7psCRdG4Mqy7@;Or z)iIQr(+VXteJnzn3}v-}UavatDl2U&ARh=hJz5$XfGH_5jT)a;vk~|unE3763)Re* z&$2T6q@A6)@bU30EeFX4o{UQ>PDmzkKz{&vaKU_v*;u}kkn1`+KZZgaMSCK>f(aLi z^==U)N?Jl+7cddXp_pT+If?}sLxehH9$qkkct6!5xgufaBG zhV=6+okcy68fqB!;otBgX{yM$;Pe+eFRiT1(XSkcmKZ_0Gw*3;;QN_)vzZrzbsKY( zlU7!ImeE18h$cj?HOz8t77~6|vYu7}ZVtaZ6)vEf$@FfWwHN%$k#m(OP&`0HTZ7WO*=UbfoyW`LRY*-KsEmK|$4-gXFdiND_3>Fb-x-(GdCE`IYlMj&1K$= znV+A(+{LzKxdOLfOenPTHYX^Nl|gaWcIQE zdvCs$#MUV!Kgbqq@EV@3vLhR0VJ7J|(}zo)DUdoeVqj+-hHqzfA)xrQS4Tg3)Vya5 z0wkS5o0Unlu-luJ)tfW-Zc9dD)B}zL!jah@>|`gjpxeLS=chc;_n?oLSZ0hfBol9# z)!B|}pV)gfcK%<)L^6y?xcEsjbW%Vu?P_-q_sq%?2JwqdXfbi|@jnP!wqOH%h)6)I z2*XgIfv#@k^|kl<`ufOP0y;V=6Lv&b+pyS`K?)v;Fnro-O8R3gKGLQZe0m8Ni{?vh zRu5?XLznlTDO^1|+m9Ej+Q$;o$R6?H^wUyn->7uz+u2s9tT4(+3p<9ql3%HDA67Se z0;gIozJ$s854$v|L=c zlarG_-FNU8z1Ofzo^+;zO*ifM%dvusV5JUn@Y>bdi zH42SO(%FSV^t9SQyydx^+_?i8>XQEK&-W>oeYsk}hW-fi3+7G;x}e19GeRN7zkwy=(Yc5G6OsaImrE)z#zdu~ZHFy++#W3ALEfA=O#EEwf==DRNNCyPJ9AEV|Hwa2 z>!1HZs1A;ceE4n=9TXhLN1Do#kVmoK3A#cyCbDDYw8E)C<+&=M`5$PQ7>Ou+nPbV3 zpxLu&sc=OHuLJ-ZKuK0gOU%e;;~5qxVlnS^WW;Vyy@Kq{{vb(oYj5}y_hkegu4Et~ zAwg71>%qc(>}S7f(PpBZg;+$K zcMfjFlhefgGZ0Q40I^(!nj=15c$ABysB_Bi3{wkAW~f(Lx{5C)u}=s@#Q&R(?^s!A zGHCvz?Z5RCyFdbje&dJP;JSYcv#$4g3FhEsUdM6o8&a}gmqP=I&FqG0-D=Om*Q5`r zNuL1T&-p(;7_SRa{`WbHoq=`HQ!Oyef=Kt$LwmCq?>XBwT@6JXTZ!NV65tQ#AZFM+ zSAWOEjIo|Ir>6|w6Q(~&V>jqt-S?3E+2RVzOr_wzT!V<8S5ayDoe1f!|B}bFL9quF z@}+;F+Q}z-ZGC+uLT<^Oot-~v{B{5UnV_}3y{wH5>ti&v`U;dE8Nk8EJ(kU3ul<>v zIS+Ae^DvsL-@Nxe>%C%UStEu@i$*L!koE~c5y+d|lJ(|$kk9#S^Twr}KY7J~&-8#Q^YH65VxzZ?ED^pb`!Y61t z%&SGHl$$2qGClC$12@jtnj-K4b^!!+c6JfL zwJoCy*LSPmi%DmFQ*fnkG$O?9Tm zF6Cciu(%Nyp8%UHd~Ho(WKH-lQpfG8M1ceP@rktI?Md$$TG*AGr)PQx8T;i|YCus{ zYZ$pX2~5mM6ydBJh)>IEeStMn?=X*?sUE)45w2gGm~OA8hIM*+%05@5p1JEx_+hW< zUDn9w5^h0hTjvYg5}AXH!@QEeJu8A)V+qB>|0bGxvtydn(|(RNW3b1o9+yK5IHI`ki=b4`1diI2bu zi6a44N|e*nb7?mf-f|-jIk)HyP+;tE!{(qrXxw496%`OY?WS5m8;(rOS}^N!Me9QWHKz$$=T~amQvxBxgyS25v-rjNUt!&D5nTML) z>P7y%|2Nk|iAYpYrs9N6mF`qs^+3OL7Qb1#K#6_=2a$NRZ-dii7r5HBTd**3cQLL#%$a#31 zbz@3l5ik^am^_#kmpu5)=?v04`ExMjXZ5s1U2e^g7W&NzmZRQX| zNiiag9v<(0=}uJ*I|vE&%>VdzaISh>@B%$RS~nB{33k!G*!)oKlZ60>v3x;9>P#Q0 zADl;USCuc?1oI>0HYNdpnz|=UBnjSkLJ>@Y=T`Gtw=i%bb#hS36uT3y&bJz-U5{airc~cqG4_%mwS!^`_U>^5o3(BE_8q`1>5quM$NZ z`^(-n4OIz#N(eNH3Dg3xSXb4+h5i6%!HXC8H3W&7Ut{r_#cM zv9iL#%8?}ct^fD3GXh_KlM{#zM36s={B1Dbs=q2PmwW9>wHR|8-K(1aLv8KB&VQ`#fnF<~-XZkSf2`38kw9L$stQVcPD zxQBlg4|w^UjSUYUUwWR6jSWitaY15YG)R6fYuyOAd#`2`ejys_FT=_wt!V4SpiNsy zz1o)Bb4kfXy}4rV35kj4`6=!p)v@{ZEs1XZ*=PC+MVMV<_4l=u`Qu71f1?u=z{Fiz z^f}vii-xM(+6CLt8<)=!_qf%Z8@=M%NWvUey99@Yiv@yr;U|^W=!+g;6yL_`cHCAT z=S%JRRM_Kw-F8jm-Nw?(d<{oY?Fz!Y#aHnzYdtiI#33?h*z{)JLc3TO=ZSZ8R~J_u zZ%Rr&;4`r>ZgB6*XPexE*tkWIMT){xR1DmDd+@H?+Zi8aW-ef#X(SIlwYXE3*U_cGLHWbdN* zyQ}^7uMActXfL_tX7eRrl2F8~+~0rFOD};4B!2-@#ud&SEU4{z-s0DzDjcj_x$4>O zZ4qrmc}N7V#w^qt8evPL>*QbzGDGgO~TUdhdI zoM&QjOW<{M>8k~E zzZA!u4_>oaWuI?V^pj=dn3-1zN>KloOaPKQj93X}Qg}haRaJ_`B@pZ6cXee4gRA9! zU$$My!Am}}YjX%Mo;UBpHlcG0V0LzP+n?j@3*V-3<4kV6w$#flB-m9Ela=Jd{kw+L zqar4I+G>N>)pL47V>lRCGFgUZyQKk@NywVGlwZigI>Thwi8c`1IS;^;fgk(}w<5#1|fVbJ4xBY`P=Rfe9&%sl&=Pgx@ zSw4Q}5hhxj)8lKb!R<3R)*817=Qt%DczKe4p$IgW>G8)=A2>CI+vUl~k zb9g*FJbXUizI~m!_w8M7KYqay;w42JR$H{ZUay9nu(k8VDhAQco{zS?0L6uaqn4;I zRc~lycriKFLqFc^AXCP@w@Em_^P+uDB)rmb@3n=~t}ocB)u4m;W8Qb7uzatcN{%^i z@?c84t~Gsi??_?G;N;>ei7?ZsSrgMd04a|0e!{F%%|WfqZ0nUS2NjzHC(hB`rq{LY zydxoak8*l;`pW(7T_Ag-9>+X30EbItl)npC^YZgX7D~uy>`QeHPNHs+g3lg+zkpxh}j+ zjr|ToW{^Ys8;&h?GeS#}iF@SEQFn0^NJ}KB5E{AZ3Q3hnuFW{`gmG$7m|;iZ@=a86 zW%~qj>hwawG$hah*e|)i>Op6Bqa+w&zozrE#$e^$I!k~tD4`18F?)lDTf=&H>G#(f z+iH=7xpOK>BPrrx$X=Kpf!n`)bZ&YCac94s3MiDrhcX5FPWD475iH}<+yI0x^lj*_ zmf;yHir&1K-GN^pw3Zwz=q)ke&GYPqh_49h#KCuOOy*iv{Wdo?LdT0VWE4}8)aq%{ zXzW9R7uuA;_ym96 z=~OV)8m(ziMFic)`B2Z~&Ar_xS!1kT7hMjk9qJ6fCr7{QDL|m|^y(;DetkCXvZub~ zQFz{4bsIuYmzR$?S4t^1EH{{7@nW~n`K6eR_N|Q@>eg;VDmZ!?t>O`%-qVN)UEzPb zV?Y?DN2L~H3T)YUnw2F%_A&lmH^{?0{*SfwTLzSEWyt+~N{fb~$nwmJhR8oF*qTIp zRY%ryfu}Jbra2B}vGp1+H#mHsrp{E6n;8M9r`OwRb=;2`>wCpm)t z_z0sW^nqJ7VVATN!mh{=hYW5v$;Ly^se6r|xcwBggE1hY0E!F9Su(9|Y2qVPKFSNS z!|!7?65d=4LN4RAoN?SE?IU8>p@|{oMfGaE#fDHQk?a!uPy}epkqOt*C9EqcKrxz= zI=&oT{ri~?XzNWhL)3KCf1?t87px_zzLW~Z6stRSnWVc0WYd2&3NG%qFKuOW|Dfi9 z#doLy7Fe2pFSr#&YgBPW8B{gUowv`N>8?X8l`lw44{E}lq2534;J5gOmnWIiU%a-D zj0*+Twba3XGkM+@S@A1A5rtVKwAu8#XQL7r&d!I7aurLHvY5n2zp*w7gi?HR`boWq z-x~!j0di9_r~scpRO@rVv^aAHhEXU3x7ziUkP5x<>n!|9o^uW*pw*v`!$RBODjVH-DX{@q0Gb4 zHP-e=w^ZV7J(H%*(ev+@@LyxIaC5~YvKiL8UuOzuz->0}E{35-)i`7AxiBCLyScI3 z5~^26TOL@S5nH~Uzboc`h_7l1F06R>u;LNSFZKAl=cDhgP#Pa@YPcjVZbBQs9BtRr z0k3DtOqBfKI0BwAA8d~ZC@5kwGAL%zW&ej3s!qcW@Uo5a!QVT6dwFeyQ%6zIQh?Tv zr(!hSkR!USJHoKY>UP1$DA(85hnRjzJ3QDBa5m^sL@1G-g;rXDy5#TnPr6?hW=6=O zs}r8b2a}0GhhX0JxTye$&Nw&U7g``hgK-|_T`%d)LVyv69#l9*y1;w$ z&yB&7MN&-JNWfZy*UI!XHK=>Tn0e?{Qz1dt;=#WADb)=t^tnZpH5yZaHM~r@sQ?O$y9y+Pejbs`LlU!=iYADCU7i;U6HZF-!wc5G}+JG%! z%V=tIvV%${(cj3mpu#2g*%JtM{y(e}3u2w%|AC!fq9r2)jhY9UyDm5`>UaVsCQ{5F zMRGZ+*OVp-KOYBzI9soC#~p?`Q(@)5?^t(*+A>cF3?gJm_$=6 zFqRrIYkX^Qg9291Fr`{qLYtk}#~nB}68OP1D*QlD8QUkffa%>PHb@cv&}e7?W|=sV zn5j-~7sA4C`b%ISfkM*x&1>qHyBN5!c%&DfPk1jbh&k0|y$|=?{bq~#XC}nY7jm#E<)Qx}sh=X6v{(Apk931;~0n9!- zJ>73PafN299R%y~;Jc$fq{)zNBDL;GMV zZrX4?20gO7vK#GHk9Y4*dS3lWq6l@}1;i3OY=asf&;Dhf94Ahs37u{BUl^7SLr|D$ zoyh`2`9;{S;|xzxT$*LuBnT^)hVrl6|DK~1dpyGx_02X=s9Y}gk^lbZI3)y=Poq^I zX);8Q&rN4u+@4;3-@(S{e=QcDHX!z%;& zm6AZvKTDMso%x|(4J2PO*hAW@M$P`w3JcGY@=$h(^hB_EQ&}%fyUG3&`!O^o#4jmfRbY3*m*RLmz-Rm>mj!rz} z!@>qCHg?@sig5%b|E)uWJ7v3GLG(pktGh39zSwHVt_VNk`tBa{&)uV=7qBh6o?lv7 zTuxv+;)THNZLKZ&iKOH)Z-;Q>U?16ELr(hCKw#U0^J}(5sS0kB*YIuxF<;H^(D-7AnW~uGsN| z=g~|KE9Z0Rj%njHXn#Jfyx#55(3`Lr^lGyUYJAcpNj|*=Gg!J=u(c0C2+FB{SFPqi zw-_i3NG}W8lRUOqZjOc-Eqk11xF&~#J62fG;sKAOTLpQ<$^cEK^5KhLEvG*WFA<5L zvworDOy&pG#2L9anmH2HW^9Rg8PO?EIfxB0F`v5r^>NNXibuTg_eL&Gp8&~s5hC_t zodci|GKVFpsTcUjxY_-MfaSu`h+uJX_0fBU%!)VeFU{M}Y^nt}D5)Ksm0^RQVdX8J z>cbz%p*;vU4O4c`;HsRKH4lgeZ!o?PrQfPrzTq>yI4yEsF^jXf{W^N0bL^j%U61En zaQ|UzJS2SeR{230JrIiSa4)R z8nb|Amzj~E9whj-`7^!|8Odj|CAOc>4FlkZ$5&ghT%(;yP4@JwH@5!J%XY#3J+vL) zhL?Vqs0KGsnQlNFK*$iJ#$2hY)qpyNKt};|+>nCcY`G7AV@v{fsbSaw%zmz|n?6lb% zWb2#L4QX#{lLj24cc$By;!|9ys!^1sP1ms7N3QT%|4nqMb`-bc9SOupL!PX;Y`2-p zU1VjxB*nVG67nb@iNujznfPqBO&~9YlU;5s5!331<^hM5aMN(pi4|Cl5pL z10p0OdwSxtd)&POgdOz30UW@f#q&Rs(-!9Nw3+{Nv8$Z@54gc51d|`E$JpiK23^Dj zNVAVeBt<`ow%jTV_sTjtUU?HzRs6r{p+8gigoImb(OtPW zbp=$#HR2Rk?Mz5o?@T4vFVY;T4f+U4a%vP4(rkDjgi-IXh@EZDBV?uaRNJ))tJn!_ zE8`rZp=g`ko8B?+I}o7^&{{PPq~b#{lr z52Jg+sTR({lmP{^DhFWX9FB8xJOf&j^p}sBH`cW9JNQ*@%?+MR%9(8bm}O~pRa?L% zjsCFe-znQ|cHN6d1XqFVmssj$sAQIjtya@71|jS!?KH~yoLB|c zWi8K-ih17I(4fcV@dsX=Nb)B%TKMbBl|aZ5zg;MTlidD&oL^H*#^v1A)iUIbRlo5W znpNt&;{=};se@o>-O-WD_MAgbwh%Q+*G;v9%m*0&h$iN2Qz6zcJy}JGvUN)?P(i8% z9|FT$6u-3I=_`1m0U;qF5W#soGL@5aHc}0-n|Gyh@81`6GzJMFuHPpn{`4&%ff7BX zM004y6Xd%)^fz+*dq?4qP@J(P;huYn-(5hNI`8Eq~7v^ouav!WJrQz5eHfdj*!9G!H5b~*Ukyw+)23TP`- z6FF|5x1)H87U%mj01FqmJ9@aUu-EFb;L*+RRAnL%75mH@MQ?on2zXQUm25~II9WM5 zppB}v{aIC#J@Rc%3%ibwP5n;aK=rSpJos?K{8lI>{;9PzIeoO-3gwi{l`_YENrB3L z&1YO#2sj$_RwRx=Ka=dAxCgT_Zq-bZ8Vv#QU-Zk)Nwy>;e1>-j9DuK)frO%UxtEvm zm&!&BU-hb-jQPKP75LWDa_R9|X6`)gE28D8sA}O7aS_gP^!TcqSyWg&g;ayf0&#-@ zhW+8fFT@)(sGP>uDnVxkm+3Xlqx4^!1N>}35V+(R?cyH`=Al6b12O0MB_ zzQ5PErhpK%excG2D#f21*IJEaXMPAT68p&eAWoZcbM+*>1;?;t*cPd+BVIHtoZ2U* z-V40ci?ln!G&T&$?-hp3=??PvO3gTt6fO(o4Y9!En*z@JGu%M#DC_g*(%#-bCj+1p zJ`9Pum0Y70DJfp9flqM3n^F!QXQH?BPG7krRTa8v}Dv5O(E$w_$%I4Rw!UjBL%J3(N7PpmPTju zi*={rry=@@3L!(meWx>GUp9g}k9p14qd>?Qx97k`A4xU_M+z*R{L|Be#>hCe^)@0R zA|bysH?Qj#**?D{dp8W#S0;h{ULWE}t(Z!*`FUCkaO3T{tvV=-&`1$S%={#|?qipo zeYF%+W1JCu;+bv+%UW{m5R!i=YX68QE=uvS_T$L*&XcS!ai%4V4M*9R(nRHp_J`cl z!>duP64OT`;vhtargyd9YI)2fYrWOdrC^38$*1M-rm;hCaCn#(Qh!4s4tYF0)V793 z{P{Vx_=*>Z&^$W4vWdF&nQZ;d=*&;#)ShsD@N`?40vMT?5P|BN8dE+pMh85+FK+CW z-MznCn<4vP5C%`}e)1Md+!IiU+?CMfy&AYMUjxmYFQa*1jN?#K#oaB4zFemaTK_c% zWw(La4{*P9@!*(0bUlZCFg0o8zP!Bkt&Nq;r8{-c+fHf?7q$SqIgY}2r4=G}dxv%N ze-oB*Uy3g3A@_Q#49MOs@jID3FzfG6trkbmlVuMJi7NdM&*& ziUJ{0)tG^BWw42IjrHo#;r#`U@!wGJrvd3Vw{r=Y2HssbW_tk8>yQ|L4P1y_KStN1 zSQv6ELIC8opu}1z-340&`@LDas*T}mZ6=eR997Ia^*h?@5w|k{SW}4UOdJ+RqDce1 zrUa*%`W-U{g%sw4Q!T-pAmLX_9k6L5d;^7>5P5FN# zChZT)FoRaXy_$0YcqS;q;Pa1?pzTviJvuPLXHU{{1G956e*hY$tm>`~M3l4Qm7|jW zzX1LM0sXut+unVu2U%LuUK)jEoG;i}Rlr0N~~S zegUUWe}&1D9>S^9Ujgv8*mv@z>9miv8I#>v-{{VxLUeK90bq zv}{=mjHkfv4cyWIee%gC8g}j;jYb2L$<*lxFoMZsf`^AVYCwt6UqHt%VKT`Xsf#eD zq_oUpP7too^|`(>^ag#Bb|L(A=ifC8o==m^T{B{s9{SLZkyh+;^L;n`>CeIg--v56 zhV~hNiuUJCf4)QAPT$qn-W5ZFLolR$2)s4enWH)Gk6Rib0JLzK7@@&~2cuuVe$Z$% zlIRejfB*gv1c90#_85*pzWjat{a~zbfU&-z%S9l4Wrk^UeXh^-?WZ^E@Azl~H3DDd zkjM%f<;avgewDKaJ3iV#zx#&1@_PWlpwOWhN``{JfB(Tfq3`Nz2Sj5wd+s8E7@r3p zd;n1+qb>RsT`8o`4^>xM7&?yop~=X|aP>KKi9ItpD`9?E$W6c&)L4v?>vMgs-+T2P zVZ)#PZ1Me>_N!ky?fhJ+uax%exr>CD$XJV_XE}TaYEe*}Z&Lwua&mHaPlcl(_k;m* z7f3;9TUV&{<;V58KG*NP`W)9Xd+s8^d~!rNe032vkN)BY$hB|-#Nlu_9F7a%2FSIz vGp5jdX~l7cTq{pYQKk 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 diff --git a/icons/obj/items/clothing/hats.dmi b/icons/obj/items/clothing/hats.dmi index 7d2c45103ba63fcc8fba8eef68ddf08aabd6d8ed..a6a0e6fb9099ade5c160f60375e67ed85734ae85 100644 GIT binary patch delta 17547 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 delta 17029 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�gwWoBAP>%;k!xVAXHuyoRahw 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 E3lYAwjsO4v From ff5b007b2534aa9a5dada95a2b8d6553646a72a5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 27 Oct 2023 01:43:23 +0100 Subject: [PATCH 198/199] Automatic changelog for PR #4702 [ci skip] --- html/changelogs/AutoChangeLog-pr-4702.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4702.yml diff --git a/html/changelogs/AutoChangeLog-pr-4702.yml b/html/changelogs/AutoChangeLog-pr-4702.yml new file mode 100644 index 000000000000..5554ecbf0fd3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4702.yml @@ -0,0 +1,4 @@ +author: "SASoperative" +delete-after: True +changes: + - rscadd: "Added donator item and sprites" \ No newline at end of file From 2588df1208dc3991d176b4f0fbc02d139a4aea13 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 27 Oct 2023 01:07:08 +0000 Subject: [PATCH 199/199] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4641.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4696.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4702.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4759.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4762.yml | 6 ----- html/changelogs/AutoChangeLog-pr-4763.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4772.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4783.yml | 7 ------ html/changelogs/AutoChangeLog-pr-4784.yml | 4 ---- html/changelogs/archive/2023-10.yml | 27 +++++++++++++++++++++++ 10 files changed, 27 insertions(+), 43 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4641.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4696.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4702.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4759.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4762.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4763.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4772.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4783.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4784.yml diff --git a/html/changelogs/AutoChangeLog-pr-4641.yml b/html/changelogs/AutoChangeLog-pr-4641.yml deleted file mode 100644 index 96049a37d160..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4641.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - refactor: "Refactored praetorian pierce ability" - - bugfix: "Praetorian vanguard can no longer pierce through windowed doors" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4696.yml b/html/changelogs/AutoChangeLog-pr-4696.yml deleted file mode 100644 index 3cec02591554..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4696.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed various issues in the Networking between Turing machine and Smartfridges." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4702.yml b/html/changelogs/AutoChangeLog-pr-4702.yml deleted file mode 100644 index 5554ecbf0fd3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4702.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SASoperative" -delete-after: True -changes: - - rscadd: "Added donator item and sprites" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4759.yml b/html/changelogs/AutoChangeLog-pr-4759.yml deleted file mode 100644 index 42a30db9e677..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4759.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "fira" -delete-after: True -changes: - - code_imp: "Rewrote Xeno Acid ticking code." - - bugfix: "Weather updates won't cause turfs to acid melt more rapidly anymore" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4762.yml b/html/changelogs/AutoChangeLog-pr-4762.yml deleted file mode 100644 index 9d3c3f7a6cbd..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4762.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "fira" -delete-after: True -changes: - - rscadd: "Bloody footprints are now slightly offset to break long visual straight lines." - - bugfix: "Items do not align back to the center of turfs anymore when picked from a surface (table or rack)" - - rscadd: "Some more items now have offsets on the map display, and they all can be slightly offset." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4763.yml b/html/changelogs/AutoChangeLog-pr-4763.yml deleted file mode 100644 index cf9158bbf92c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4763.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Backsea" -delete-after: True -changes: - - bugfix: "Fixed the incorrectly placed shutters at req and that one light near CIC" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4772.yml b/html/changelogs/AutoChangeLog-pr-4772.yml deleted file mode 100644 index bf0c0ef5b0b4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4772.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - rscadd: "Added about 50 new tips." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4783.yml b/html/changelogs/AutoChangeLog-pr-4783.yml deleted file mode 100644 index ebded74b04de..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4783.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - bugfix: "Fixes custom ERT calling broadcasting when it should not." - - code_imp: "Removes unused vars from ERT procs." - - code_imp: "Renames the announce var in ERT procs to be more indicative of what it does." - - rscadd: "Added a setting on custom ERTs for announcing beacon was received." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4784.yml b/html/changelogs/AutoChangeLog-pr-4784.yml deleted file mode 100644 index 6ee8c2d91ee8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4784.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - rscdel: "Re-removed CO/XO bridge coat" \ No newline at end of file diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index fb4ed664fdfd..1afc45c37aad 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -380,3 +380,30 @@ XDinka: - rscadd: 'Added four new haircuts: gentle ponytail, edgar haircut, emo bun, taper haircut.' +2023-10-27: + Backsea: + - bugfix: Fixed the incorrectly placed shutters at req and that one light near CIC + Birdtalon: + - refactor: Refactored praetorian pierce ability + - bugfix: Praetorian vanguard can no longer pierce through windowed doors + SASoperative: + - rscadd: Added donator item and sprites + Zonespace27: + - rscdel: Re-removed CO/XO bridge coat + fira: + - rscadd: Added about 50 new tips. + - rscadd: Bloody footprints are now slightly offset to break long visual straight + lines. + - bugfix: Items do not align back to the center of turfs anymore when picked from + a surface (table or rack) + - rscadd: Some more items now have offsets on the map display, and they all can + be slightly offset. + - code_imp: Rewrote Xeno Acid ticking code. + - bugfix: Weather updates won't cause turfs to acid melt more rapidly anymore + - bugfix: Fixed various issues in the Networking between Turing machine and Smartfridges. + realforest2001: + - bugfix: Fixes custom ERT calling broadcasting when it should not. + - code_imp: Removes unused vars from ERT procs. + - code_imp: Renames the announce var in ERT procs to be more indicative of what + it does. + - rscadd: Added a setting on custom ERTs for announcing beacon was received.