From 614a462176f83de33db456cbce4251d45ea89627 Mon Sep 17 00:00:00 2001
From: Fermi <33956696+Thalpy@users.noreply.github.com>
Date: Sun, 24 Nov 2019 03:33:02 +0000
Subject: [PATCH] Revert "Revert "Merge remote-tracking branch
'upstream/master'""
This reverts commit 1509d9d183cbfbea42431bbd21a1c5881ccd36d5.
---
code/__DEFINES/_globals.dm | 6 +
code/__DEFINES/inventory.dm | 6 +-
code/__HELPERS/cmp.dm | 6 +
code/_globalvars/lists/flavor_misc.dm | 6 +-
code/_globalvars/lists/mapping.dm | 2 +-
code/_globalvars/lists/poll_ignore.dm | 4 +
code/controllers/subsystem/persistence.dm | 24 ++++
code/controllers/subsystem/vis_overlays.dm | 9 +-
code/controllers/subsystem/vote.dm | 10 +-
code/datums/components/storage/storage.dm | 1 +
code/datums/martial.dm | 1 +
code/datums/martial/boxing.dm | 10 +-
code/datums/martial/cqc.dm | 2 +
code/datums/martial/krav_maga.dm | 11 +-
code/datums/martial/psychotic_brawl.dm | 1 +
code/datums/martial/sleeping_carp.dm | 2 +
code/datums/martial/wrestling.dm | 19 ++-
code/datums/outfit.dm | 10 +-
code/game/gamemodes/clock_cult/clock_cult.dm | 4 -
code/game/gamemodes/clown_ops/clown_ops.dm | 2 +-
code/game/gamemodes/dynamic/dynamic.dm | 8 +-
.../dynamic/dynamic_rulesets_events.dm | 3 +-
.../dynamic/dynamic_rulesets_midround.dm | 10 +-
.../dynamic/dynamic_rulesets_roundstart.dm | 2 +-
code/game/gamemodes/nuclear/nuclear.dm | 2 +-
code/game/machinery/computer/camera.dm | 49 +++----
code/game/objects/items/RCD.dm | 15 +-
code/game/objects/items/clown_items.dm | 10 +-
code/game/objects/items/devices/PDA/PDA.dm | 50 +++----
code/game/objects/items/storage/backpack.dm | 2 +-
code/game/objects/items/storage/toolbox.dm | 4 +-
.../game/objects/items/storage/uplink_kits.dm | 10 ++
code/game/objects/items/weaponry.dm | 6 +-
.../crates_lockers/closets/fitness.dm | 3 +
.../crates_lockers/closets/job_closets.dm | 1 +
.../crates_lockers/closets/secure/cargo.dm | 3 +-
.../closets/secure/engineering.dm | 1 +
.../crates_lockers/closets/secure/medical.dm | 3 +-
.../closets/secure/scientist.dm | 1 +
.../crates_lockers/closets/secure/security.dm | 2 +
.../crates_lockers/closets/wardrobe.dm | 37 ++---
.../objects/structures/ghost_role_spawners.dm | 2 +-
code/game/objects/structures/holosign.dm | 9 +-
code/game/objects/structures/plasticflaps.dm | 6 +-
.../antagonists/_common/antag_spawner.dm | 4 +-
.../abductor/equipment/abduction_outfits.dm | 4 +-
.../clock_structures/traps/brass_skewer.dm | 2 +-
code/modules/antagonists/wizard/wizard.dm | 2 +-
code/modules/awaymissions/capture_the_flag.dm | 6 +-
code/modules/awaymissions/corpse.dm | 2 +-
code/modules/client/preferences.dm | 4 -
code/modules/client/verbs/suicide.dm | 2 +-
code/modules/clothing/gloves/_gloves.dm | 2 +-
code/modules/clothing/outfits/ert.dm | 20 +--
code/modules/clothing/outfits/event.dm | 2 +-
code/modules/clothing/outfits/standard.dm | 22 +--
code/modules/clothing/outfits/vr.dm | 9 +-
code/modules/clothing/outfits/vv_outfit.dm | 4 +-
code/modules/clothing/shoes/_shoes.dm | 2 +-
code/modules/clothing/suits/miscellaneous.dm | 129 ++++++++++++++++++
.../crafting/recipes/recipes_clothing.dm | 28 ++++
code/modules/events/_event.dm | 2 +-
code/modules/events/major_dust.dm | 1 +
code/modules/events/meteor_wave.dm | 1 +
code/modules/events/processor_overload.dm | 1 +
code/modules/holiday/holidays.dm | 7 +
code/modules/jobs/job_types/_job.dm | 15 +-
code/modules/jobs/job_types/assistant.dm | 7 +-
code/modules/jobs/job_types/clown.dm | 13 +-
code/modules/jobs/job_types/cook.dm | 4 +-
code/modules/jobs/job_types/curator.dm | 2 +-
code/modules/jobs/job_types/detective.dm | 2 +-
code/modules/jobs/job_types/lawyer.dm | 2 +-
code/modules/jobs/job_types/mime.dm | 8 +-
code/modules/jobs/job_types/shaft_miner.dm | 2 +-
code/modules/mining/aux_base_camera.dm | 10 +-
.../mining/equipment/regenerative_core.dm | 16 +++
code/modules/mining/mine_items.dm | 4 +
.../modules/mob/dead/new_player/new_player.dm | 5 +-
code/modules/mob/dead/observer/observer.dm | 1 +
code/modules/mob/living/carbon/carbon.dm | 1 +
.../modules/mob/living/carbon/damage_procs.dm | 2 +-
code/modules/mob/living/carbon/human/human.dm | 2 +-
.../mob/living/carbon/human/human_defense.dm | 4 +-
.../mob/living/carbon/human/human_defines.dm | 2 -
.../mob/living/carbon/human/inventory.dm | 4 +-
.../mob/living/carbon/human/species.dm | 11 +-
.../carbon/human/species_types/bugmen.dm | 71 ++++------
code/modules/mob/living/living_defense.dm | 3 +
code/modules/mob/living/silicon/pai/pai.dm | 5 +-
.../mob/living/simple_animal/bot/bot.dm | 5 +-
.../mob/living/simple_animal/bot/honkbot.dm | 1 +
.../mob/living/simple_animal/bot/medbot.dm | 2 +-
code/modules/mob/mob_helpers.dm | 4 +-
code/modules/ninja/outfit.dm | 2 +-
code/modules/projectiles/projectile/beams.dm | 4 +-
.../chemistry/machinery/chem_dispenser.dm | 6 +-
.../chemistry/reagents/other_reagents.dm | 1 +
.../reagents/reagent_containers/spray.dm | 2 +-
.../machine_designs_service.dm | 8 ++
.../modules/research/machinery/_production.dm | 5 +-
code/modules/research/techweb/all_nodes.dm | 6 +-
code/modules/ruins/lavaland_ruin_code.dm | 2 +-
code/modules/surgery/bodyparts/bodyparts.dm | 8 +-
.../surgery/experimental_dissection.dm | 2 +-
code/modules/surgery/organs/heart.dm | 1 -
code/modules/surgery/organs/organ_internal.dm | 3 -
code/modules/uplink/uplink_items.dm | 15 ++
code/modules/vending/wardrobes.dm | 5 +
html/changelogs/AutoChangeLog-pr-9323.yml | 4 +
html/changelogs/AutoChangeLog-pr-9518.yml | 4 +
html/changelogs/AutoChangeLog-pr-9530.yml | 5 +
html/changelogs/AutoChangeLog-pr-9681.yml | 4 +
html/changelogs/AutoChangeLog-pr-9703.yml | 4 +
html/changelogs/AutoChangeLog-pr-9720.yml | 4 +
html/changelogs/AutoChangeLog-pr-9749.yml | 4 +
html/changelogs/AutoChangeLog-pr-9812.yml | 4 +
html/changelogs/AutoChangeLog-pr-9823.yml | 6 +
html/changelogs/AutoChangeLog-pr-9828.yml | 4 +
html/changelogs/AutoChangeLog-pr-9831.yml | 4 +
html/changelogs/AutoChangeLog-pr-9864.yml | 5 +
html/changelogs/AutoChangeLog-pr-9865.yml | 4 +
html/changelogs/AutoChangeLog-pr-9866.yml | 4 +
html/changelogs/AutoChangeLog-pr-9868.yml | 4 +
html/changelogs/AutoChangeLog-pr-9869.yml | 4 +
html/changelogs/AutoChangeLog-pr-9871.yml | 5 +
html/changelogs/AutoChangeLog-pr-9873.yml | 5 +
html/changelogs/AutoChangeLog-pr-9874.yml | 4 +
html/changelogs/AutoChangeLog-pr-9875.yml | 4 +
html/changelogs/AutoChangeLog-pr-9876.yml | 4 +
html/changelogs/AutoChangeLog-pr-9877.yml | 4 +
html/changelogs/AutoChangeLog-pr-9880.yml | 4 +
html/changelogs/AutoChangeLog-pr-9881.yml | 4 +
html/changelogs/AutoChangeLog-pr-9886.yml | 5 +
html/changelogs/AutoChangeLog-pr-9887.yml | 7 +
html/changelogs/AutoChangeLog-pr-9889.yml | 4 +
html/changelogs/AutoChangeLog-pr-9891.yml | 4 +
html/changelogs/AutoChangeLog-pr-9896.yml | 4 +
html/changelogs/AutoChangeLog-pr-9898.yml | 4 +
html/changelogs/AutoChangeLog-pr-9908.yml | 4 +
html/changelogs/AutoChangeLog-pr-9909.yml | 5 +
icons/mob/head.dmi | Bin 197892 -> 203857 bytes
icons/mob/pai.dmi | Bin 29273 -> 74491 bytes
icons/mob/suit.dmi | Bin 362740 -> 388475 bytes
icons/mob/wings.dmi | Bin 98722 -> 68434 bytes
icons/obj/clothing/hats.dmi | Bin 95104 -> 96522 bytes
icons/obj/clothing/suits.dmi | Bin 126176 -> 132273 bytes
icons/obj/guns/energy.dmi | Bin 38789 -> 38780 bytes
icons/obj/power.dmi | Bin 33196 -> 33308 bytes
icons/obj/storage.dmi | Bin 69491 -> 69489 bytes
icons/obj/tools.dmi | Bin 26077 -> 27040 bytes
.../crates_lockers/closets/fitness.dm | 5 -
.../closets/secure/citadel_lockers.dm | 7 -
.../crates_lockers/closets/wardrobe.dm | 37 -----
modular_citadel/code/game/objects/tools.dm | 18 ---
.../code/modules/arousal/arousal.dm | 2 +-
.../living/silicon/robot/dogborg_equipment.dm | 4 +-
.../reagents/chemistry/reagents/MKUltra.dm | 6 +-
.../chemistry/reagents/eigentstasium.dm | 4 +-
.../reagents/chemistry/recipes/fermi.dm | 30 ++--
.../icons/mob/mutant_bodyparts.dmi | Bin 6734 -> 7023 bytes
modular_citadel/icons/mob/pai.dmi | Bin 74491 -> 0 bytes
modular_citadel/icons/mob/suit_digi.dmi | Bin 377958 -> 396555 bytes
modular_citadel/icons/obj/power.dmi | Bin 1782 -> 0 bytes
modular_citadel/icons/obj/tools.dmi | Bin 18598 -> 0 bytes
sound/weapons/Gunshot.ogg | Bin 13653 -> 16221 bytes
sound/weapons/Gunshot2.ogg | Bin 13967 -> 15961 bytes
sound/weapons/Gunshot3.ogg | Bin 12899 -> 14917 bytes
sound/weapons/Gunshot4.ogg | Bin 13876 -> 16197 bytes
sound/weapons/Gunshot_silenced.ogg | Bin 16205 -> 19687 bytes
sound/weapons/Gunshot_smg.ogg | Bin 8789 -> 18259 bytes
sound/weapons/IonRifle.ogg | Bin 10920 -> 22251 bytes
sound/weapons/Laser.ogg | Bin 17121 -> 24485 bytes
sound/weapons/LaserSlugv3.ogg | Bin 19168 -> 19680 bytes
sound/weapons/Taser.ogg | Bin 10230 -> 13094 bytes
sound/weapons/laser3.ogg | Bin 20077 -> 23269 bytes
sound/weapons/lasercannonfire.ogg | Bin 7642 -> 22227 bytes
sound/weapons/magpistol.ogg | Bin 20376 -> 24579 bytes
sound/weapons/magrifle.ogg | Bin 18877 -> 22118 bytes
sound/weapons/pulse.ogg | Bin 13752 -> 13446 bytes
sound/weapons/pulse2.ogg | Bin 15572 -> 19652 bytes
sound/weapons/pulse3.ogg | Bin 14560 -> 18902 bytes
sound/weapons/smg_empty_alarm.ogg | Bin 54294 -> 34988 bytes
sound/weapons/taser2.ogg | Bin 6558 -> 14915 bytes
strings/clockwork_cult_changelog.txt | 4 +
tgstation.dme | 4 -
186 files changed, 764 insertions(+), 405 deletions(-)
create mode 100644 html/changelogs/AutoChangeLog-pr-9323.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9518.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9530.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9681.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9703.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9720.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9749.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9812.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9823.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9828.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9831.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9864.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9865.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9866.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9868.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9869.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9871.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9873.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9874.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9875.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9876.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9877.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9880.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9881.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9886.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9887.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9889.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9891.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9896.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9898.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9908.yml
create mode 100644 html/changelogs/AutoChangeLog-pr-9909.yml
delete mode 100644 modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm
delete mode 100644 modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm
delete mode 100644 modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
delete mode 100644 modular_citadel/code/game/objects/tools.dm
delete mode 100644 modular_citadel/icons/mob/pai.dmi
delete mode 100644 modular_citadel/icons/obj/power.dmi
delete mode 100644 modular_citadel/icons/obj/tools.dmi
diff --git a/code/__DEFINES/_globals.dm b/code/__DEFINES/_globals.dm
index 874223a612..cc3e385f9f 100644
--- a/code/__DEFINES/_globals.dm
+++ b/code/__DEFINES/_globals.dm
@@ -41,6 +41,12 @@
//Create a list global that is initialized as an empty list
#define GLOBAL_LIST_EMPTY(X) GLOBAL_LIST_INIT(X, list())
+// Create a typed list global with an initializer expression
+#define GLOBAL_LIST_INIT_TYPED(X, Typepath, InitValue) GLOBAL_RAW(/list##Typepath/X); GLOBAL_MANAGED(X, InitValue)
+
+// Create a typed list global that is initialized as an empty list
+#define GLOBAL_LIST_EMPTY_TYPED(X, Typepath) GLOBAL_LIST_INIT_TYPED(X, Typepath, list())
+
//Create a typed global with an initializer expression
#define GLOBAL_DATUM_INIT(X, Typepath, InitValue) GLOBAL_RAW(Typepath/##X); GLOBAL_MANAGED(X, InitValue)
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 632e4adef9..f5ea8d835f 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -4,9 +4,9 @@
#define WEIGHT_CLASS_TINY 1 //Usually items smaller then a human hand, ex: Playing Cards, Lighter, Scalpel, Coins/Money
#define WEIGHT_CLASS_SMALL 2 //Pockets can hold small and tiny items, ex: Flashlight, Multitool, Grenades, GPS Device
#define WEIGHT_CLASS_NORMAL 3 //Standard backpacks can carry tiny, small & normal items, ex: Fire extinguisher, Stunbaton, Gas Mask, Metal Sheets
-#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in an inventory, ex: Defibrillator, Backpack, Space Suits
-#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons
-#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe
+#define WEIGHT_CLASS_BULKY 4 //Items that can be weilded or equipped but not stored in a normal bag, ex: Defibrillator, Backpack, Space Suits
+#define WEIGHT_CLASS_HUGE 5 //Usually represents objects that require two hands to operate, ex: Shotgun, Two Handed Melee Weapons - Can not fit in Boh
+#define WEIGHT_CLASS_GIGANTIC 6 //Essentially means it cannot be picked up or placed in an inventory, ex: Mech Parts, Safe - Can not fit in Boh
//Inventory depth: limits how many nested storage items you can access directly.
//1: stuff in mob, 2: stuff in backpack, 3: stuff in box in backpack, etc
diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm
index 37f36a7e0d..c0501b4e41 100644
--- a/code/__HELPERS/cmp.dm
+++ b/code/__HELPERS/cmp.dm
@@ -84,3 +84,9 @@ GLOBAL_VAR_INIT(cmp_field, "name")
/proc/cmp_job_display_asc(datum/job/A, datum/job/B)
return A.display_order - B.display_order
+
+/proc/cmp_numbered_displays_name_asc(datum/numbered_display/A, datum/numbered_display/B)
+ return sorttext(A.sample_object.name, B.sample_object.name)
+
+/proc/cmp_numbered_displays_name_dsc(datum/numbered_display/A, datum/numbered_display/B)
+ return sorttext(B.sample_object.name, A.sample_object.name)
\ No newline at end of file
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index a2135b93b2..0ac8a61183 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -7,15 +7,15 @@ GLOBAL_LIST_EMPTY(facial_hair_styles_list) //stores /datum/sprite_accessory/faci
GLOBAL_LIST_EMPTY(facial_hair_styles_male_list) //stores only hair names
GLOBAL_LIST_EMPTY(facial_hair_styles_female_list) //stores only hair names
//Underwear
-GLOBAL_LIST_EMPTY(underwear_list) //stores /datum/sprite_accessory/underwear/bottom indexed by name
+GLOBAL_LIST_EMPTY_TYPED(underwear_list, /datum/sprite_accessory/underwear/bottom) //stores bottoms indexed by name
GLOBAL_LIST_EMPTY(underwear_m) //stores only underwear name
GLOBAL_LIST_EMPTY(underwear_f) //stores only underwear name
//Undershirts
-GLOBAL_LIST_EMPTY(undershirt_list) //stores /datum/sprite_accessory/underwear/top indexed by name
+GLOBAL_LIST_EMPTY_TYPED(undershirt_list, /datum/sprite_accessory/underwear/top) //stores tops indexed by name
GLOBAL_LIST_EMPTY(undershirt_m) //stores only undershirt name
GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
//Socks
-GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/underwear/socks indexed by name
+GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name
//Lizard Bits (all datum lists indexed by name)
GLOBAL_LIST_EMPTY(body_markings_list)
GLOBAL_LIST_EMPTY(tails_list_lizard)
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm
index f0479cd8aa..6b8d91acf9 100644
--- a/code/_globalvars/lists/mapping.dm
+++ b/code/_globalvars/lists/mapping.dm
@@ -45,6 +45,6 @@ GLOBAL_LIST_EMPTY(vr_spawnpoints)
//used by jump-to-area etc. Updated by area/updateName()
GLOBAL_LIST_EMPTY(sortedAreas)
/// An association from typepath to area instance. Only includes areas with `unique` set.
-GLOBAL_LIST_EMPTY(areas_by_type)
+GLOBAL_LIST_EMPTY_TYPED(areas_by_type, /area)
GLOBAL_LIST_EMPTY(all_abstract_markers)
diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm
index 626bba9fc3..3a026d2aa5 100644
--- a/code/_globalvars/lists/poll_ignore.dm
+++ b/code/_globalvars/lists/poll_ignore.dm
@@ -13,6 +13,8 @@
#define POLL_IGNORE_GOLEM "golem"
#define POLL_IGNORE_SWARMER "swarmer"
#define POLL_IGNORE_DRONE "drone"
+#define POLL_IGNORE_DEMON "demon"
+#define POLL_IGNORE_WIZARD "wizard"
#define POLL_IGNORE_CLONE "clone"
GLOBAL_LIST_INIT(poll_ignore_desc, list(
@@ -29,6 +31,8 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list(
POLL_IGNORE_GOLEM = "Golems",
POLL_IGNORE_SWARMER = "Swarmer shells",
POLL_IGNORE_DRONE = "Drone shells",
+ POLL_IGNORE_DEMON = "Demons",
+ POLL_IGNORE_WIZARD = "Wizards",
POLL_IGNORE_CLONE = "Defective/SDGF clones"
))
GLOBAL_LIST_INIT(poll_ignore, init_poll_ignore())
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index 1b7cade71f..c3db8552c6 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -12,6 +12,7 @@ SUBSYSTEM_DEF(persistence)
var/list/obj/structure/chisel_message/chisel_messages = list()
var/list/saved_messages = list()
var/list/saved_modes = list(1,2,3)
+ var/list/saved_threat_levels = list(1,1,1)
var/list/saved_maps
var/list/saved_trophies = list()
var/list/spawned_objects = list()
@@ -27,6 +28,7 @@ SUBSYSTEM_DEF(persistence)
LoadChiselMessages()
LoadTrophies()
LoadRecentModes()
+ LoadRecentThreats()
LoadRecentMaps()
LoadPhotoPersistence()
if(CONFIG_GET(flag/use_antag_rep))
@@ -166,6 +168,15 @@ SUBSYSTEM_DEF(persistence)
return
saved_modes = json["data"]
+/datum/controller/subsystem/persistence/proc/LoadRecentThreats()
+ var/json_file = file("data/RecentThreatLevels.json")
+ if(!fexists(json_file))
+ return
+ var/list/json = json_decode(file2text(json_file))
+ if(!json)
+ return
+ saved_threat_levels = json["data"]
+
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
var/json_file = file("data/RecentMaps.json")
if(!fexists(json_file))
@@ -216,6 +227,7 @@ SUBSYSTEM_DEF(persistence)
CollectSecretSatchels()
CollectTrophies()
CollectRoundtype()
+ CollectThreatLevel()
RecordMaps()
SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
if(CONFIG_GET(flag/use_antag_rep))
@@ -372,6 +384,18 @@ SUBSYSTEM_DEF(persistence)
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
+/datum/controller/subsystem/persistence/proc/CollectThreatLevel()
+ if(istype(SSticker.mode, /datum/game_mode/dynamic))
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ saved_threat_levels[3] = saved_threat_levels[2]
+ saved_threat_levels[2] = saved_threat_levels [1]
+ saved_threat_levels[1] = mode.threat_level
+ var/json_file = file("data/RecentThreatLevels.json")
+ var/list/file_data = list()
+ file_data["data"] = saved_threat_levels
+ fdel(json_file)
+ WRITE_FILE(json_file, json_encode(file_data))
+
/datum/controller/subsystem/persistence/proc/RecordMaps()
saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]")
var/json_file = file("data/RecentMaps.json")
diff --git a/code/controllers/subsystem/vis_overlays.dm b/code/controllers/subsystem/vis_overlays.dm
index 107d65a558..0635709074 100644
--- a/code/controllers/subsystem/vis_overlays.dm
+++ b/code/controllers/subsystem/vis_overlays.dm
@@ -29,8 +29,8 @@ SUBSYSTEM_DEF(vis_overlays)
return
//the "thing" var can be anything with vis_contents which includes images
-/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha=255)
- . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]"
+/datum/controller/subsystem/vis_overlays/proc/add_vis_overlay(atom/movable/thing, icon, iconstate, layer, plane, dir, alpha = 255, add_appearance_flags = NONE)
+ . = "[icon]|[iconstate]|[layer]|[plane]|[dir]|[alpha]|[add_appearance_flags]"
var/obj/effect/overlay/vis/overlay = vis_overlay_cache[.]
if(!overlay)
overlay = new
@@ -40,6 +40,7 @@ SUBSYSTEM_DEF(vis_overlays)
overlay.plane = plane
overlay.dir = dir
overlay.alpha = alpha
+ overlay.appearance_flags |= add_appearance_flags
vis_overlay_cache[.] = overlay
else
overlay.unused = 0
@@ -64,10 +65,12 @@ SUBSYSTEM_DEF(vis_overlays)
UnregisterSignal(thing, COMSIG_ATOM_DIR_CHANGE)
/datum/controller/subsystem/vis_overlays/proc/rotate_vis_overlay(atom/thing, old_dir, new_dir)
+ if(old_dir == new_dir)
+ return
var/rotation = dir2angle(old_dir) - dir2angle(new_dir)
var/list/overlays_to_remove = list()
for(var/i in thing.managed_vis_overlays)
var/obj/effect/overlay/vis/overlay = i
- add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation))
+ add_vis_overlay(thing, overlay.icon, overlay.icon_state, overlay.layer, overlay.plane, turn(overlay.dir, rotation), overlay.alpha, overlay.appearance_flags)
overlays_to_remove += overlay
remove_vis_overlay(thing, overlays_to_remove)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 50be61f91d..dee10e4998 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -153,6 +153,10 @@ SUBSYSTEM_DEF(vote)
if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = "dynamic"
+ if("extended" in choices)
+ if(. == "extended")
+ GLOB.dynamic_forced_extended = TRUE // we still do the rest of the stuff
+ choices[PEACE] += choices["extended"]
var/mean = 0
var/voters = 0
for(var/client/c in GLOB.clients)
@@ -253,7 +257,11 @@ SUBSYSTEM_DEF(vote)
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
choices.Add("secret", "extended")
if("dynamic")
- choices.Add(PEACE,CHAOS)
+ var/saved_threats = SSpersistence.saved_threat_levels
+ if((saved_threats[1]+saved_threats[2]+saved_threats[3])>150)
+ choices.Add("extended",PEACE,CHAOS)
+ else
+ choices.Add(PEACE,CHAOS)
if("custom")
question = stripped_input(usr,"What is the vote for?")
if(!question)
diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm
index a92ae9e629..dd189137a5 100644
--- a/code/datums/components/storage/storage.dm
+++ b/code/datums/components/storage/storage.dm
@@ -309,6 +309,7 @@
else
var/datum/numbered_display/ND = .[I.type]
ND.number++
+ . = sortTim(., /proc/cmp_numbered_displays_name_asc, associative = TRUE)
//This proc determines the size of the inventory to be displayed. Please touch it only if you know what you're doing.
/datum/component/storage/proc/orient2hud(mob/user, maxcolumns)
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index d119759efc..26a709590c 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -11,6 +11,7 @@
var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not
var/help_verb
var/no_guns = FALSE
+ var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist.
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
/datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 7399528e1c..b98bc4f951 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -1,6 +1,7 @@
/datum/martial_art/boxing
name = "Boxing"
id = MARTIALART_BOXING
+ pacifism_check = FALSE //Let's pretend pacifists can boxe the heck out of other people, it only deals stamina damage right now.
/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
to_chat(A, "Can't disarm while boxing! ")
@@ -16,14 +17,15 @@
var/atk_verb = pick("left hook","right hook","straight punch")
- var/damage = rand(5, 8) + A.dna.species.punchdamagelow
- if(!damage)
+ var/damage = rand(10, 13)
+ var/extra_damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ if(extra_damage == A.dna.species.punchdamagelow)
playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1)
D.visible_message("[A] has attempted to [atk_verb] [D]! ", \
"[A] has attempted to [atk_verb] [D]! ", null, COMBAT_MESSAGE_RANGE)
log_combat(A, D, "attempted to hit", atk_verb)
- return 0
-
+ return TRUE
+ damage += extra_damage
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
var/armor_block = D.run_armor_check(affecting, "melee")
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index c7644997ee..73173a4a9a 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -124,6 +124,8 @@
add_to_streak("G",D)
if(check_streak(A,D))
return TRUE
+ if(A == D) // no self grab.
+ return FALSE
if(A.grab_state >= GRAB_AGGRESSIVE)
D.grabbedby(A, 1)
else
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 6379d481ca..4e8dacaef9 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -19,6 +19,9 @@
owner.visible_message("[owner] assumes a neutral stance. ", "Your next attack is cleared. ")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people! ")
+ return
owner.visible_message("[owner] assumes the Neck Chop stance! ", "Your next attack will be a Neck Chop. ")
H.mind.martial_art.streak = "neck_chop"
@@ -36,6 +39,9 @@
owner.visible_message("[owner] assumes a neutral stance. ", "Your next attack is cleared. ")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people! ")
+ return
owner.visible_message("[owner] assumes the Leg Sweep stance! ", "Your next attack will be a Leg Sweep. ")
H.mind.martial_art.streak = "leg_sweep"
@@ -53,6 +59,9 @@
owner.visible_message("[owner] assumes a neutral stance. ", "Your next attack is cleared. ")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(H, TRAIT_PACIFISM))
+ to_chat(H, "You don't want to harm other people! ")
+ return
owner.visible_message("[owner] assumes the Lung Punch stance! ", "Your next attack will be a Lung Punch. ")
H.mind.martial_art.streak = "quick_choke"//internal name for lung punch
@@ -145,8 +154,6 @@
return 1
/datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- if(check_streak(A,D))
- return 1
var/obj/item/I = null
if(prob(60))
I = D.get_active_held_item()
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 34301516dc..45d73353f9 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -1,6 +1,7 @@
/datum/martial_art/psychotic_brawling
name = "Psychotic Brawling"
id = MARTIALART_PSYCHOBRAWL
+ pacifism_check = FALSE //Quite uncontrollable and unpredictable, people will still end up harming others with it.
/datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
return psycho_attack(A,D)
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 801e8c8c7a..f89374dc2a 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -105,6 +105,8 @@
add_to_streak("G",D)
if(check_streak(A,D))
return 1
+ if(A == D) //no self grab stun
+ return FALSE
if(A.grab_state >= GRAB_AGGRESSIVE)
D.grabbedby(A, 1)
else
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 81ec0bf977..c967779d03 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -49,6 +49,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to BODY SLAM! ", "Your next attack will be a BODY SLAM. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "slam"
@@ -61,6 +64,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to THROW! ", "Your next attack will be a THROW. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "throw"
@@ -73,6 +79,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to KICK! ", "Your next attack will be a KICK. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "kick"
@@ -85,6 +94,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to STRIKE! ", "Your next attack will be a STRIKE. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "strike"
@@ -97,6 +109,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT. ")
return
+ if(HAS_TRAIT(owner, TRAIT_PACIFISM))
+ to_chat(owner, "You are too HIPPIE to WRESTLE other living beings! ")
+ return
owner.visible_message("[owner] prepares to LEG DROP! ", "Your next attack will be a LEG DROP. ")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "drop"
@@ -433,8 +448,8 @@
/datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(check_streak(A,D))
return 1
- if(A.pulling == D)
- return 1
+ if(A.pulling == D || A == D) // don't stun grab yoursel
+ return FALSE
A.start_pulling(D)
D.visible_message("[A] gets [D] in a cinch! ", \
"[A] gets [D] in a cinch! ")
diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm
index 8386b59d97..da379b9851 100755
--- a/code/datums/outfit.dm
+++ b/code/datums/outfit.dm
@@ -28,16 +28,16 @@
var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns
-/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
//to be overridden for customization depending on client prefs,species etc
return
-/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/proc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
//to be overridden for toggling internals, id binding, access etc
return
-/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- pre_equip(H, visualsOnly)
+/datum/outfit/proc/equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ pre_equip(H, visualsOnly, preference_source)
//Start with uniform,suit,backpack for additional slots
if(uniform)
@@ -103,7 +103,7 @@
var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit
HS.ToggleHelmet()
- post_equip(H, visualsOnly)
+ post_equip(H, visualsOnly, preference_source)
if(!visualsOnly)
apply_fingerprints(H)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 76e6268977..30e53cdee8 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -339,10 +339,6 @@ Credit where due:
CLOCKCULTCHANGELOG\
\
\
- Zelus oil: A new reagent. It can be used to heal the faithful to Ratvar, or kill heretics and moreso stun blood cultists,\
- or splashed onto metal sheets to make brass. This chemical can be found in minimal quantities by grinding brass sheets.\
- Brass Flasks: Intended to store Zelus Oil in, but can also be used as fragile single use throwing weapons in a pinch! \
- These are crafted with a single sheet of brass and fit in the Clockwork Cuirass' suit storage.\
Good luck! "
/obj/item/paper/servant_primer/Initialize()
diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm
index 66de72bad2..49a336e16a 100644
--- a/code/game/gamemodes/clown_ops/clown_ops.dm
+++ b/code/game/gamemodes/clown_ops/clown_ops.dm
@@ -53,7 +53,7 @@
/datum/outfit/syndicate/clownop/no_crystals
tc = 0
-/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/syndicate/clownop/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm
index 83a3debfdc..25edd0c68b 100644
--- a/code/game/gamemodes/dynamic/dynamic.dm
+++ b/code/game/gamemodes/dynamic/dynamic.dm
@@ -409,7 +409,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
message_admins("Drafting players for forced ruleset [rule.name].")
log_game("DYNAMIC: Drafting players for forced ruleset [rule.name].")
rule.mode = src
- rule.acceptable(GLOB.player_list.len, threat_level) // Assigns some vars in the modes, running it here for consistency
+ rule.acceptable(roundstart_pop_ready, threat_level) // Assigns some vars in the modes, running it here for consistency
rule.candidates = candidates.Copy()
rule.trim_candidates()
if (rule.ready(TRUE))
@@ -421,7 +421,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
return TRUE
var/list/drafted_rules = list()
for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules)
- if (rule.acceptable(GLOB.player_list.len, threat_level) && threat >= rule.cost) // If we got the population and threat required
+ if (rule.acceptable(roundstart_pop_ready, threat_level) && threat >= rule.cost) // If we got the population and threat required
rule.candidates = candidates.Copy()
rule.trim_candidates()
if (rule.ready() && rule.candidates.len > 0)
@@ -429,12 +429,12 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
if(!drafted_rules.len)
message_admins("Not enough threat level for roundstart antags!")
log_game("DYNAMIC: Not enough threat level for roundstart antags!")
- var/indice_pop = min(10,round(GLOB.player_list.len/pop_per_requirement)+1)
+ var/indice_pop = min(10,round(roundstart_pop_ready/pop_per_requirement)+1)
extra_rulesets_amount = 0
if (GLOB.dynamic_classic_secret)
extra_rulesets_amount = 0
else
- if (GLOB.player_list.len > GLOB.dynamic_high_pop_limit)
+ if (roundstart_pop_ready > GLOB.dynamic_high_pop_limit)
message_admins("High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.")
log_game("DYNAMIC: High Population Override is in effect! Threat Level will have more impact on which roles will appear, and player population less.")
if (threat_level > high_pop_second_rule_req)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
index a20022cb71..4ac8cc91d3 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm
@@ -143,7 +143,6 @@
repeatable_weight_decrease = 2
requirements = list(60,50,40,30,30,30,30,30,30,30)
high_population_requirement = 30
- repeatable = TRUE
/datum/dynamic_ruleset/event/meteor_wave/ready()
if(mode.threat_level > 40 && mode.threat >= 25 && prob(20))
@@ -270,7 +269,7 @@
repeatable = TRUE
/datum/dynamic_ruleset/event/processor_overload
- name = "Processer Overload"
+ name = "Processor Overload"
config_tag = "processor_overload"
typepath = /datum/round_event/processor_overload
cost = 4
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
index 550ef043a0..41de85f7ee 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm
@@ -107,11 +107,11 @@
candidates = pollGhostCandidates("The mode is looking for volunteers to become a [name]", antag_flag, SSticker.mode, antag_flag, poll_time = 300)
- if(!candidates || candidates.len <= 0)
- message_admins("The ruleset [name] received no applications.")
- log_game("DYNAMIC: The ruleset [name] received no applications.")
+ if(!candidates || candidates.len <= required_candidates)
+ message_admins("The ruleset [name] did not receive enough applications.")
+ log_game("DYNAMIC: The ruleset [name] did not receive enough applications.")
mode.refund_threat(cost)
- mode.log_threat("Rule [name] refunded [cost] (no applications)",verbose=TRUE)
+ mode.log_threat("Rule [name] refunded [cost] (not receive enough applications)",verbose=TRUE)
mode.executed_rules -= src
return
@@ -150,7 +150,7 @@
finish_setup(new_character, i)
assigned += applicant
- notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT, header="Something Interesting!")
+ notify_ghosts("[new_character] has been picked for the ruleset [name]!", source = new_character, action = NOTIFY_ORBIT)
/datum/dynamic_ruleset/midround/from_ghosts/proc/generate_ruleset_body(mob/applicant)
var/mob/living/carbon/human/new_character = makeBody(applicant)
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index 16e48ada4a..56b02a1364 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -281,7 +281,7 @@
requirements = list(100,90,80,70,60,50,50,50,50,50)
high_population_requirement = 50
flags = HIGHLANDER_RULESET
- antag_cap = list(2,2,2,3,3,3,4,4,5,5)
+ antag_cap = list(1,1,2,3,4,5,5,5,5,5)
var/datum/team/nuclear/nuke_team
/datum/dynamic_ruleset/roundstart/nuclear/ready(forced = FALSE)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 1767d468ec..632d59c84d 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -144,7 +144,7 @@
/datum/outfit/syndicate/no_crystals
tc = 0
-/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
var/obj/item/radio/R = H.ears
R.set_frequency(FREQ_SYNDICATE)
R.freqlock = TRUE
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 11935e2bfc..1bafa73aaa 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -17,13 +17,7 @@
network += lowertext(i)
/obj/machinery/computer/security/check_eye(mob/user)
- if(CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE))
- user.unset_machine()
- return
- if(!(user in watchers))
- user.unset_machine()
- return
- if(!watchers[user])
+ if(!can_interact(user) || !(user in watchers) || !watchers[user])
user.unset_machine()
return
var/obj/machinery/camera/C = watchers[user]
@@ -41,55 +35,50 @@
M.unset_machine() //to properly reset the view of the users if the console is deleted.
return ..()
-/obj/machinery/computer/security/attack_hand(mob/user)
+/obj/machinery/computer/security/can_interact(mob/user)
+ if((!issilicon(user) && !Adjacent(user)) || is_blind(user) || !in_view_range(user, src))
+ return FALSE
+ return ..()
+
+/obj/machinery/computer/security/interact(mob/user, special_state)
. = ..()
- if(.)
- return
- if(stat)
+ if (ismob(user) && !isliving(user)) // ghosts don't need cameras
return
if (!network)
- throw EXCEPTION("No camera network")
+ CRASH("No camera network")
user.unset_machine()
- return
+ return FALSE
if (!(islist(network)))
- throw EXCEPTION("Camera network is not a list")
+ CRASH("Camera network is not a list")
user.unset_machine()
- return
- if(..())
- user.unset_machine()
- return
+ return FALSE
var/list/camera_list = get_available_cameras()
if(!(user in watchers))
for(var/Num in camera_list)
var/obj/machinery/camera/CAM = camera_list[Num]
- if(istype(CAM))
- if(CAM.can_use())
- watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants.
- break
+ if(istype(CAM) && CAM.can_use())
+ watchers[user] = CAM //let's give the user the first usable camera, and then let him change to the camera he wants.
+ break
if(!(user in watchers))
user.unset_machine() // no usable camera on the network, we disconnect the user from the computer.
- return
+ return FALSE
playsound(src, 'sound/machines/terminal_prompt.ogg', 25, 0)
use_camera_console(user)
/obj/machinery/computer/security/proc/use_camera_console(mob/user)
var/list/camera_list = get_available_cameras()
var/t = input(user, "Which camera should you change to?") as null|anything in camera_list
- if(user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine.
+ if(!src || user.machine != src) //while we were choosing we got disconnected from our computer or are using another machine.
return
- if(!t)
+ if(!t || t == "Cancel")
user.unset_machine()
playsound(src, 'sound/machines/terminal_off.ogg', 25, 0)
return
var/obj/machinery/camera/C = camera_list[t]
- if(t == "Cancel")
- user.unset_machine()
- playsound(src, 'sound/machines/terminal_off.ogg', 25, 0)
- return
- if(!C || !C.can_use() || CHECK_BITFIELD(stat, NOPOWER|BROKEN) || is_blind(user) || !in_view_range(user, src) || !user.canUseTopic(src, !issilicon(user), FALSE))
+ if(!C || !C.can_use() || !can_interact(user))
user.unset_machine()
return FALSE
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index 8d02c98d24..19cd5d66c4 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -163,8 +163,6 @@ RLD
var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses.
var/delay_mod = 1
var/canRturf = FALSE //Variable for R walls to deconstruct them
- var/adjacency_check = TRUE //Wheter it checks if the tool has to be in our hands or not. Wsed for the aux base construction drone's internal RCD
-
/obj/item/construction/rcd/suicide_act(mob/user)
user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide.. ")
@@ -227,11 +225,10 @@ RLD
t1 += "Close
\n"
- var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500)
+ var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500, src)
popup.set_content(t1)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
- onclose(user, "rcd_access")
/obj/item/construction/rcd/Topic(href, href_list)
..()
@@ -275,7 +272,7 @@ RLD
/obj/item/construction/rcd/proc/check_menu(mob/living/user)
if(!istype(user))
return FALSE
- if(user.incapacitated() || (adjacency_check && !user.Adjacent(src)))
+ if(user.incapacitated() || !user.Adjacent(src))
return FALSE
return TRUE
@@ -288,7 +285,7 @@ RLD
"SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"),
"WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest")
)
- var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check, tooltips = TRUE)
+ var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
switch(computerdirs)
@@ -347,13 +344,13 @@ RLD
"External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass)
)
- var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
+ var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
if(!check_menu(user))
return
switch(airlockcat)
if("Solid")
if(advanced_airlock_setting == 1)
- var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
+ var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
if(!check_menu(user))
return
switch(airlockpaint)
@@ -398,7 +395,7 @@ RLD
if("Glass")
if(advanced_airlock_setting == 1)
- var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check)
+ var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
if(!check_menu(user))
return
switch(airlockpaint)
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index d86354f195..0ff54d884f 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -112,11 +112,11 @@
throw_range = 7
attack_verb = list("HONKED")
var/moodlet = "honk" //used to define which kind of moodlet is added to the honked target
- var/honksound = 'sound/items/bikehorn.ogg'
+ var/list/honksounds = list('sound/items/bikehorn.ogg' = 1)
-/obj/item/bikehorn/Initialize()
+/obj/item/bikehorn/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/squeak, list(honksound=1), 50)
+ AddComponent(/datum/component/squeak, honksounds, 50)
/obj/item/bikehorn/attack(mob/living/carbon/M, mob/living/carbon/user)
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, moodlet, /datum/mood_event/honk)
@@ -124,7 +124,7 @@
/obj/item/bikehorn/suicide_act(mob/user)
user.visible_message("[user] solemnly points the horn at [user.p_their()] temple! It looks like [user.p_theyre()] trying to commit suicide! ")
- playsound(src, 'sound/items/bikehorn.ogg', 50, 1)
+ playsound(src, pickweight(honksounds), 50, 1)
return (BRUTELOSS)
//air horn
@@ -132,7 +132,7 @@
name = "air horn"
desc = "Damn son, where'd you find this?"
icon_state = "air_horn"
- honksound = 'sound/items/airhorn2.ogg'
+ honksounds = list('sound/items/airhorn2.ogg' = 1)
//golden bikehorn
/obj/item/bikehorn/golden
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 0c9ac4bb60..246dba9cb9 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -162,31 +162,33 @@ GLOBAL_LIST_EMPTY(PDAs)
/obj/item/pda/equipped(mob/user, slot)
. = ..()
- if(equipped)
+ if(equipped || !user.client)
return
- if(user.client)
- background_color = user.client.prefs.pda_color
- switch(user.client.prefs.pda_style)
- if(MONO)
- font_index = MODE_MONO
- font_mode = FONT_MONO
- if(SHARE)
- font_index = MODE_SHARE
- font_mode = FONT_SHARE
- if(ORBITRON)
- font_index = MODE_ORBITRON
- font_mode = FONT_ORBITRON
- if(VT)
- font_index = MODE_VT
- font_mode = FONT_VT
- else
- font_index = MODE_MONO
- font_mode = FONT_MONO
- var/pref_skin = GLOB.pda_reskins[user.client.prefs.pda_skin]
- if(icon != pref_skin)
- icon = pref_skin
- update_icon(FALSE, TRUE)
- equipped = TRUE
+ update_style(user.client)
+
+/obj/item/pda/proc/update_style(client/C)
+ background_color = C.prefs.pda_color
+ switch(C.prefs.pda_style)
+ if(MONO)
+ font_index = MODE_MONO
+ font_mode = FONT_MONO
+ if(SHARE)
+ font_index = MODE_SHARE
+ font_mode = FONT_SHARE
+ if(ORBITRON)
+ font_index = MODE_ORBITRON
+ font_mode = FONT_ORBITRON
+ if(VT)
+ font_index = MODE_VT
+ font_mode = FONT_VT
+ else
+ font_index = MODE_MONO
+ font_mode = FONT_MONO
+ var/pref_skin = GLOB.pda_reskins[C.prefs.pda_skin]
+ if(icon != pref_skin)
+ icon = pref_skin
+ update_icon(FALSE, TRUE)
+ equipped = TRUE
/obj/item/pda/proc/update_label()
name = "PDA-[owner] ([ownjob])" //Name generalisation
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index a79eb299da..f6e169a4d5 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -60,7 +60,7 @@
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
STR.allow_big_nesting = TRUE
- STR.max_w_class = WEIGHT_CLASS_GIGANTIC
+ STR.max_w_class = WEIGHT_CLASS_BULKY
STR.max_combined_w_class = 35
/obj/item/storage/backpack/holding/suicide_act(mob/living/user)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index ca7f7fe31a..1e37de2581 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -239,8 +239,8 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
/obj/item/storage/toolbox/gold_real
name = "golden toolbox"
desc = "A larger then normal toolbox made of gold plated plastitanium."
- item_state = "gold"
icon_state = "gold"
+ item_state = "toolbox_gold"
has_latches = FALSE
force = 16 // Less then a spear
throwforce = 14
@@ -266,7 +266,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons)
name = "golden toolbox"
desc = "A gold plated toolbox, fancy and harmless due to the gold plating being on cardboard!"
icon_state = "gold"
- item_state = "gold"
+ item_state = "toolbox_gold"
has_latches = FALSE
force = 0
throwforce = 0
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 84ebc28afa..223c8e9cf6 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -381,3 +381,13 @@
new /obj/item/gun/ballistic/automatic/pistol/m1911/kitchengun(src)
new /obj/item/ammo_box/magazine/m45/kitchengun(src)
new /obj/item/ammo_box/magazine/m45/kitchengun(src)
+
+
+/obj/item/storage/box/strange_seeds_10pack
+
+/obj/item/storage/box/strange_seeds_10pack/PopulateContents()
+ for(var/i in 1 to 10)
+ new /obj/item/seeds/random(src)
+
+ if(prob(50))
+ new /obj/item/seeds/random(src) //oops, an additional packet might have slipped its way into the box
\ No newline at end of file
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index fec17cfa69..d16453e02f 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -216,7 +216,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
force = 40
throwforce = 10
- w_class = WEIGHT_CLASS_HUGE
+ w_class = WEIGHT_CLASS_BULKY
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
block_chance = 50
@@ -427,7 +427,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
lefthand_file = 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
item_flags = ABSTRACT | DROPDEL
- w_class = WEIGHT_CLASS_HUGE
+ w_class = WEIGHT_CLASS_BULKY
force = 24
throwforce = 0
throw_range = 0
@@ -512,7 +512,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
force = 10
throwforce = 12
attack_verb = list("beat", "smacked")
- w_class = WEIGHT_CLASS_HUGE
+ w_class = WEIGHT_CLASS_BULKY
var/homerun_ready = 0
var/homerun_able = 0
total_mass = 2.7 //a regular wooden major league baseball bat weighs somewhere between 2 to 3.4 pounds, according to google
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index ad493dd6f5..0adfe77853 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -12,6 +12,9 @@
new /obj/item/clothing/under/shorts/blue(src)
new /obj/item/clothing/under/shorts/green(src)
new /obj/item/clothing/under/jabroni(src)
+ new /obj/item/clothing/under/polychromic/shortpants(src)
+ new /obj/item/clothing/under/polychromic/shortpants(src)
+ new /obj/item/clothing/under/polychromic/shortpants(src)
/obj/structure/closet/boxinggloves
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index b49d0a77d5..9deca71269 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -352,6 +352,7 @@
icon_door = "black"
/obj/structure/closet/wardrobe/curator/PopulateContents()
+ new /obj/item/clothing/accessory/pocketprotector/full(src)
new /obj/item/clothing/head/fedora/curator(src)
new /obj/item/clothing/suit/curator(src)
new /obj/item/clothing/under/rank/curator/treasure_hunter(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 18928424c0..b06073812a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -11,7 +11,7 @@
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/under/rank/cargo/skirt(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
- new /obj/item/radio/headset/headset_cargo(src)
+ new /obj/item/radio/headset/heads/qm(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/megaphone/cargo(src)
@@ -23,3 +23,4 @@
new /obj/item/circuitboard/machine/techfab/department/cargo(src)
new /obj/item/storage/photo_album/QM(src)
new /obj/item/circuitboard/machine/ore_silo(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/qm(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index f173ac0662..9abd81b787 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -34,6 +34,7 @@
new /obj/item/storage/photo_album/CE(src)
new /obj/item/storage/lockbox/medal/engineering(src)
new /obj/item/construction/rcd/loaded/upgraded(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/ce(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 0f810225b3..9c4b58cd20 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -71,7 +71,7 @@
new /obj/item/storage/belt/medical(src)
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/assembly/flash/handheld(src)
-// new /obj/item/reagent_containers/hypospray/CMO(src) // CITADEL EDIT comments out the hypospray mk I. the MK II kit is modularized
+ new /obj/item/storage/hypospraykit/cmo(src)
new /obj/item/autosurgeon/cmo(src)
new /obj/item/door_remote/chief_medical_officer(src)
new /obj/item/clothing/neck/petcollar(src)
@@ -81,6 +81,7 @@
new /obj/item/circuitboard/machine/techfab/department/medical(src)
new /obj/item/storage/photo_album/CMO(src)
new /obj/item/storage/lockbox/medal/medical(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/cmo(src)
/obj/structure/closet/secure_closet/animal
name = "animal control"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index efcc2aa7ca..97c0c8f3e2 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -30,3 +30,4 @@
new /obj/item/door_remote/research_director(src)
new /obj/item/circuitboard/machine/techfab/department/science(src)
new /obj/item/storage/photo_album/RD(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/rd(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 3cb8ceb22b..e87cb22f31 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -61,6 +61,7 @@
new /obj/item/door_remote/civillian(src)
new /obj/item/circuitboard/machine/techfab/department/service(src)
new /obj/item/storage/photo_album/HoP(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hop(src)
/obj/structure/closet/secure_closet/hos
name = "\proper head of security's locker"
req_access = list(ACCESS_HOS)
@@ -94,6 +95,7 @@
new /obj/item/pinpointer/nuke(src)
new /obj/item/circuitboard/machine/techfab/department/security(src)
new /obj/item/storage/photo_album/HoS(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/hos(src)
/obj/structure/closet/secure_closet/warden
name = "\proper warden's locker"
req_access = list(ACCESS_ARMORY)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index d83922d708..9d554181eb 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -142,28 +142,21 @@
new /obj/item/clothing/suit/jacket(src)
if(prob(40))
new /obj/item/clothing/suit/jacket(src)
- new /obj/item/clothing/under/color/white(src)
- new /obj/item/clothing/under/skirt/color/white(src)
- new /obj/item/clothing/under/color/blue(src)
- new /obj/item/clothing/under/skirt/color/blue(src)
- new /obj/item/clothing/under/color/yellow(src)
- new /obj/item/clothing/under/skirt/color/yellow(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/skirt/color/green(src)
- new /obj/item/clothing/under/color/orange(src)
- new /obj/item/clothing/under/skirt/color/orange(src)
- new /obj/item/clothing/under/color/pink(src)
- new /obj/item/clothing/under/skirt/color/pink(src)
- new /obj/item/clothing/under/color/red(src)
- new /obj/item/clothing/under/skirt/color/red(src)
- new /obj/item/clothing/under/color/darkblue(src)
- new /obj/item/clothing/under/skirt/color/darkblue(src)
- new /obj/item/clothing/under/color/teal(src)
- new /obj/item/clothing/under/skirt/color/teal(src)
- new /obj/item/clothing/under/color/lightpurple(src)
- new /obj/item/clothing/under/skirt/color/lightpurple(src)
- new /obj/item/clothing/under/color/green(src)
- new /obj/item/clothing/under/skirt/color/green(src)
+ new /obj/item/clothing/under/polychromic/jumpsuit(src)
+ new /obj/item/clothing/under/polychromic/jumpsuit(src)
+ new /obj/item/clothing/under/polychromic/jumpsuit(src)
+ new /obj/item/clothing/under/polychromic/shirt(src)
+ new /obj/item/clothing/under/polychromic/shirt(src)
+ new /obj/item/clothing/under/polychromic/shirt(src)
+ new /obj/item/clothing/under/polychromic/kilt(src)
+ new /obj/item/clothing/under/polychromic/kilt(src)
+ new /obj/item/clothing/under/polychromic/kilt(src)
+ new /obj/item/clothing/under/polychromic/skirt(src)
+ new /obj/item/clothing/under/polychromic/skirt(src)
+ new /obj/item/clothing/under/polychromic/skirt(src)
+ new /obj/item/clothing/under/polychromic/shorts(src)
+ new /obj/item/clothing/under/polychromic/shorts(src)
+ new /obj/item/clothing/under/polychromic/shorts(src)
new /obj/item/clothing/mask/bandana/red(src)
new /obj/item/clothing/mask/bandana/red(src)
new /obj/item/clothing/mask/bandana/blue(src)
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 10f1f30e13..e3585b601e 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -422,7 +422,7 @@
implants = list(/obj/item/implant/weapons_auth)
id = /obj/item/card/id/syndicate
-/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H)
+/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= ROLE_SYNDICATE
/obj/effect/mob_spawn/human/syndicate/battlecruiser
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 609384cdda..4d56b1ef6f 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -9,11 +9,13 @@
armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
var/obj/item/holosign_creator/projector
-/obj/structure/holosign/New(loc, source_projector)
+/obj/structure/holosign/Initialize(mapload, source_projector)
+ . = ..()
if(source_projector)
projector = source_projector
projector.signs += src
- ..()
+ alpha = 0
+ SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
/obj/structure/holosign/Destroy()
if(projector)
@@ -71,10 +73,8 @@
desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out."
icon_state = "holo_firelock"
density = FALSE
- layer = ABOVE_MOB_LAYER
anchored = TRUE
CanAtmosPass = ATMOS_PASS_NO
- layer = ABOVE_MOB_LAYER
alpha = 150
/obj/structure/holosign/barrier/atmos/Initialize()
@@ -100,7 +100,6 @@
desc = "A holobarrier that uses biometrics to detect human viruses. Denies passing to personnel with easily-detected, malicious viruses. Good for quarantines."
icon_state = "holo_medical"
alpha = 125 //lazy :)
- layer = ABOVE_MOB_LAYER
var/force_allaccess = FALSE
var/buzzcd = 0
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index e3862ed924..fd4f3abf15 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -6,12 +6,16 @@
armor = list("melee" = 100, "bullet" = 80, "laser" = 80, "energy" = 100, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 50, "acid" = 50)
density = FALSE
anchored = TRUE
- layer = ABOVE_MOB_LAYER
CanAtmosPass = ATMOS_PASS_NO
/obj/structure/plasticflaps/opaque
opacity = TRUE
+/obj/structure/plasticflaps/Initialize()
+ . = ..()
+ alpha = 0
+ SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
+
/obj/structure/plasticflaps/examine(mob/user)
. = ..()
if(anchored)
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index 6eaa4320ca..3723b99f4e 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -56,7 +56,7 @@
if(used)
to_chat(H, "You already used this contract!")
return
- var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
+ var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src, ignore_category = POLL_IGNORE_WIZARD)
if(LAZYLEN(candidates))
if(QDELETED(src))
return
@@ -241,7 +241,7 @@
return
if(used)
return
- var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src)
+ var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src, ignore_category = POLL_IGNORE_DEMON)
if(LAZYLEN(candidates))
if(used || QDELETED(src))
return
diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
index 7e03bbf57a..7bfadf6f3b 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm
@@ -24,7 +24,7 @@
for(var/obj/item/abductor/gizmo/G in B.contents)
console.AddGizmo(G)
-/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(!visualsOnly)
link_to_console(H)
@@ -49,7 +49,7 @@
/obj/item/abductor/gizmo = 1
)
-/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(!visualsOnly)
var/obj/item/implant/abductor/beamplant = new
diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
index ebfb219c9a..2f0db73bfc 100644
--- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
+++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm
@@ -113,7 +113,7 @@
"You start tenderly lifting [skewee] off of [src]... ")
if(!do_after(user, 60, target = skewee))
skewee.visible_message("[skewee] painfully slides back down [src]. ")
- skewee.emote("moan")
+ skewee.say("Oof, ouch owwie!!", forced = "fail brass skewer removal")
return
skewee.visible_message("[skewee] comes free of [src] with a squelching pop! ", \
"You come free of [src]! ")
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 89324f0691..9b2532c71b 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -165,7 +165,7 @@
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball(null))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball.")
if(APPRENTICE_BLUESPACE)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
if(APPRENTICE_HEALING)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 84f08197b4..bd4e716357 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -487,7 +487,7 @@
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_hand = /obj/item/gun/ballistic/automatic/laser/ctf
-/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
+/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
var/list/no_drops = list()
@@ -529,7 +529,7 @@
r_hand = /obj/item/gun/energy/laser/instakill/blue
shoes = /obj/item/clothing/shoes/jackboots/fast
-/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H)
+/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/obj/item/radio/R = H.ears
R.set_frequency(FREQ_CTF_RED)
@@ -537,7 +537,7 @@
R.independent = TRUE
H.dna.species.stunmod = 0
-/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H)
+/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/obj/item/radio/R = H.ears
R.set_frequency(FREQ_CTF_BLUE)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index a0b917a87b..0d5fa6bc8a 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -440,7 +440,7 @@
uniform = /obj/item/clothing/under/pants/youngfolksjeans
id = /obj/item/card/id
-/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/beachbum/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 5aaf589393..e91d379ddd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -2299,10 +2299,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.shirt_color = shirt_color
character.socks_color = socks_color
-
- character.backbag = backbag
- character.jumpsuit_style = jumpsuit_style
-
var/datum/species/chosen_species
if(!roundstart_checks || (pref_species.id in GLOB.roundstart_races))
chosen_species = pref_species.type
diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm
index 90c692c60e..2e643cc05d 100644
--- a/code/modules/client/verbs/suicide.dm
+++ b/code/modules/client/verbs/suicide.dm
@@ -49,7 +49,7 @@
if(!(damagetype & (BRUTELOSS | FIRELOSS | TOXLOSS | OXYLOSS) ))
adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
- death(FALSE, penalize = TRUE)
+ death(FALSE)
return
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 6b674c8595..ac491c2bc5 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -14,7 +14,7 @@
/obj/item/clothing/gloves/ComponentInitialize()
. = ..()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/gloves/clean_blood)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
/obj/item/clothing/gloves/clean_blood(datum/source, strength)
. = ..()
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 88cc7123fd..1532f50808 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -6,7 +6,7 @@
gloves = /obj/item/clothing/gloves/combat
ears = /obj/item/radio/headset/headset_cent/alt
-/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -35,7 +35,7 @@
/obj/item/gun/energy/e_gun=1)
l_pocket = /obj/item/switchblade
-/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -46,7 +46,7 @@
/datum/outfit/ert/commander/alert
name = "ERT Commander - Amber Alert"
-
+
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
glasses = /obj/item/clothing/glasses/thermal/eyepatch
backpack_contents = list(/obj/item/storage/box/engineer=1,\
@@ -76,7 +76,7 @@
/obj/item/gun/energy/e_gun/stun=1,\
/obj/item/melee/baton/loaded=1)
-/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -88,7 +88,7 @@
/datum/outfit/ert/security/alert
name = "ERT Security - Amber Alert"
-
+
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
backpack_contents = list(/obj/item/storage/box/engineer=1,\
/obj/item/storage/box/handcuffs=1,\
@@ -120,7 +120,7 @@
/obj/item/reagent_containers/hypospray/combat=1,\
/obj/item/gun/medbeam=1)
-/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -166,7 +166,7 @@
/obj/item/gun/energy/e_gun=1,\
/obj/item/construction/rcd/loaded=1)
-/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -214,7 +214,7 @@
l_hand = /obj/item/storage/toolbox/plastitanium
gloves = /obj/item/clothing/gloves/color/yellow
-/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/greybois/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
var/obj/item/card/id/W = H.wear_id
@@ -238,7 +238,7 @@
l_hand = /obj/item/clipboard
id = /obj/item/card/id
-/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -288,7 +288,7 @@
/obj/item/reagent_containers/hypospray/combat/heresypurge=1,
/obj/item/gun/medbeam=1)
-/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm
index 347fc5c2d7..0ca2a11c50 100644
--- a/code/modules/clothing/outfits/event.dm
+++ b/code/modules/clothing/outfits/event.dm
@@ -12,7 +12,7 @@
belt = /obj/item/tank/internals/emergency_oxygen/double
id = /obj/item/card/id/gold
-/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
H.fully_replace_character_name(H.real_name, "Santa Claus")
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 6c961dc250..29fd06dcaf 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -48,7 +48,7 @@
l_pocket = /obj/item/grenade/chem_grenade/cleaner
backpack_contents = list(/obj/item/stack/tile/plasteel=6)
-/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/tournament/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -97,7 +97,7 @@
/datum/outfit/pirate/space/captain
head = /obj/item/clothing/head/helmet/space/pirate
-/datum/outfit/pirate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/pirate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= "pirate"
var/obj/item/radio/R = H.ears
@@ -125,7 +125,7 @@
id = /obj/item/card/id
r_hand = /obj/item/twohanded/fireaxe
-/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/tunnel_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -150,7 +150,7 @@
r_pocket = /obj/item/scalpel
r_hand = /obj/item/twohanded/fireaxe
-/datum/outfit/psycho/post_equip(mob/living/carbon/human/H)
+/datum/outfit/psycho/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
carried_item.add_mob_blood(H)//Oh yes, there will be blood...
for(var/obj/item/I in H.held_items)
@@ -170,7 +170,7 @@
id = /obj/item/card/id/syndicate
belt = /obj/item/pda/heads
-/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
var/obj/item/clothing/under/U = H.w_uniform
U.attach_accessory(new /obj/item/clothing/accessory/waistcoat(H))
@@ -216,7 +216,7 @@
back = /obj/item/storage/backpack/satchel/leather
id = /obj/item/card/id
-/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -244,7 +244,7 @@
back = /obj/item/storage/backpack/satchel/leather
id = /obj/item/card/id
-/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -283,7 +283,7 @@
back = /obj/item/storage/backpack
backpack_contents = list(/obj/item/storage/box=1)
-/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/wizard/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -325,7 +325,7 @@
id = /obj/item/card/id
-/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/soviet/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -349,7 +349,7 @@
r_hand = /obj/item/gun/ballistic/automatic/tommygun
id = /obj/item/card/id
-/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/mobster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -391,7 +391,7 @@
/obj/item/flashlight=1,\
/obj/item/grenade/plastic/x4=1)
-/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm
index cd8115ac7d..ee350e3891 100644
--- a/code/modules/clothing/outfits/vr.dm
+++ b/code/modules/clothing/outfits/vr.dm
@@ -5,10 +5,10 @@
ears = /obj/item/radio/headset
id = /obj/item/card/id
-/datum/outfit/vr/pre_equip(mob/living/carbon/human/H)
+/datum/outfit/vr/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.dna.species.before_equip_job(null, H)
-/datum/outfit/vr/post_equip(mob/living/carbon/human/H)
+/datum/outfit/vr/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
var/obj/item/card/id/id = H.wear_id
if (istype(id))
id.access |= get_all_accesses()
@@ -25,9 +25,10 @@
backpack_contents = list(/obj/item/storage/box/syndie=1,\
/obj/item/kitchen/knife/combat/survival)
-/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/vr/syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
. = ..()
- var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80)
+ var/key = H.key ? H.key : preference_source ? preference_source.key : null
+ var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, key, 80)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
var/obj/item/implant/weapons_auth/W = new
W.implant(H)
diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm
index 103a152ec8..0bc8c87a45 100644
--- a/code/modules/clothing/outfits/vv_outfit.dm
+++ b/code/modules/clothing/outfits/vv_outfit.dm
@@ -4,7 +4,7 @@
var/list/vv_values
var/list/stored_access
-/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly)
+/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.delete_equipment() //Applying VV to wrong objects is not reccomended.
. = ..()
@@ -120,7 +120,7 @@
GLOB.custom_outfits += O
to_chat(usr,"Outfit registered, use select equipment to equip it.")
-/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly)
+/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
. = ..()
//Apply VV
for(var/slot in vv_values)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 37ab2b2bf4..91d8d51801 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -23,7 +23,7 @@
/obj/item/clothing/shoes/ComponentInitialize()
. = ..()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /obj/item/clothing/shoes/clean_blood)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
if(rand(2)>1)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 2a8d762ec0..53800615e9 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -519,6 +519,16 @@
/obj/item/clothing/head/hooded/winterhood/captain
icon_state = "winterhood_captain"
+/obj/item/clothing/suit/hooded/wintercoat/hop
+ name = "head of personnel's winter coat"
+ icon_state = "coathop"
+ item_state = "coathop"
+ armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hop
+
+/obj/item/clothing/head/hooded/winterhood/hop
+ icon_state = "winterhood_hop"
+
/obj/item/clothing/suit/hooded/wintercoat/security
name = "security winter coat"
icon_state = "coatsecurity"
@@ -533,6 +543,20 @@
/obj/item/clothing/head/hooded/winterhood/security
icon_state = "winterhood_security"
+/obj/item/clothing/suit/hooded/wintercoat/hos
+ name = "head of security's winter coat"
+ icon_state = "coathos"
+ item_state = "coathos"
+ armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/hos
+
+/obj/item/clothing/suit/hooded/wintercoat/hos/Initialize()
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
+
+/obj/item/clothing/head/hooded/winterhood/hos
+ icon_state = "winterhood_hos"
+
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
icon_state = "coatmedical"
@@ -544,6 +568,39 @@
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "winterhood_medical"
+/obj/item/clothing/suit/hooded/wintercoat/cmo
+ name = "chief medical officer's winter coat"
+ icon_state = "coatcmo"
+ item_state = "coatcmo"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo
+
+/obj/item/clothing/head/hooded/winterhood/cmo
+ icon_state = "winterhood_cmo"
+
+/obj/item/clothing/suit/hooded/wintercoat/chemistry
+ name = "chemistry winter coat"
+ icon_state = "coatchemistry"
+ item_state = "coatchemistry"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry
+
+/obj/item/clothing/head/hooded/winterhood/chemistry
+ icon_state = "winterhood_chemistry"
+
+/obj/item/clothing/suit/hooded/wintercoat/viro
+ name = "virology winter coat"
+ icon_state = "coatviro"
+ item_state = "coatviro"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/viro
+
+/obj/item/clothing/head/hooded/winterhood/viro
+ icon_state = "winterhood_viro"
+
/obj/item/clothing/suit/hooded/wintercoat/science
name = "science winter coat"
icon_state = "coatscience"
@@ -555,6 +612,49 @@
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "winterhood_science"
+/obj/item/clothing/suit/hooded/wintercoat/robotics
+ name = "robotics winter coat"
+ icon_state = "coatrobotics"
+ item_state = "coatrobotics"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics
+
+/obj/item/clothing/head/hooded/winterhood/robotics
+ icon_state = "winterhood_robotics"
+
+/obj/item/clothing/suit/hooded/wintercoat/genetics
+ name = "genetics winter coat"
+ icon_state = "coatgenetics"
+ item_state = "coatgenetics"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics
+
+/obj/item/clothing/head/hooded/winterhood/genetics
+ icon_state = "winterhood_genetics"
+
+/obj/item/clothing/suit/hooded/wintercoat/rd
+ name = "research director's winter coat"
+ icon_state = "coatrd"
+ item_state = "coatrd"
+ allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5,"energy" = 0, "bomb" = 15, "bio" = 5, "rad" = 5, "fire" = 0, "acid" = 0)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/rd
+
+/obj/item/clothing/head/hooded/winterhood/rd
+ icon_state = "winterhood_rd"
+
+/obj/item/clothing/suit/hooded/wintercoat/ce
+ name = "chief engineer's winter coat"
+ icon_state = "coatce"
+ item_state = "coatce"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/ce
+
+/obj/item/clothing/head/hooded/winterhood/ce
+ icon_state = "winterhood_ce"
+
/obj/item/clothing/suit/hooded/wintercoat/engineering
name = "engineering winter coat"
icon_state = "coatengineer"
@@ -585,6 +685,26 @@
/obj/item/clothing/head/hooded/winterhood/hydro
icon_state = "winterhood_hydro"
+/obj/item/clothing/suit/hooded/wintercoat/cosmic
+ name = "cosmic winter coat"
+ icon_state = "coatcosmic"
+ item_state = "coatcosmic"
+ allowed = list(/obj/item/flashlight)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic
+
+/obj/item/clothing/head/hooded/winterhood/cosmic
+ icon_state = "winterhood_cosmic"
+
+/obj/item/clothing/suit/hooded/wintercoat/janitor
+ name = "janitors winter coat"
+ icon_state = "coatjanitor"
+ item_state = "coatjanitor"
+ allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/grenade/chem_grenade,/obj/item/lightreplacer,/obj/item/flashlight,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/spray,/obj/item/soap,/obj/item/holosign_creator,/obj/item/key/janitor,/obj/item/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor
+
+/obj/item/clothing/head/hooded/winterhood/janitor
+ icon_state = "winterhood_janitor"
+
/obj/item/clothing/suit/hooded/wintercoat/cargo
name = "cargo winter coat"
icon_state = "coatcargo"
@@ -594,6 +714,15 @@
/obj/item/clothing/head/hooded/winterhood/cargo
icon_state = "winterhood_cargo"
+/obj/item/clothing/suit/hooded/wintercoat/qm
+ name = "quartermaster's winter coat"
+ icon_state = "coatqm"
+ item_state = "coatqm"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/qm
+
+/obj/item/clothing/head/hooded/winterhood/qm
+ icon_state = "winterhood_qm"
+
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/modules/crafting/recipes/recipes_clothing.dm
index f48ee87316..4f06a44811 100644
--- a/code/modules/crafting/recipes/recipes_clothing.dm
+++ b/code/modules/crafting/recipes/recipes_clothing.dm
@@ -158,3 +158,31 @@
time = 50
always_availible = TRUE
category = CAT_CLOTHING
+
+/datum/crafting_recipe/wintercoat_cosmic
+ name = "Cosmic Winter Coat"
+ result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
+ reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/captain = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hop = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hos = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/rd = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/ce = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/cmo = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/qm = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/robotics = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/science = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/genetics = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/chemistry = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/medical = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/viro = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/janitor = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/security = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
+ /obj/item/clothing/suit/hooded/wintercoat/miner = 1)
+ time = 60
+ always_availible = TRUE
+ category = CAT_CLOTHING
diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm
index 815f640fde..e2125964e4 100644
--- a/code/modules/events/_event.dm
+++ b/code/modules/events/_event.dm
@@ -57,7 +57,7 @@
/datum/round_event_control/wizard/canSpawnEvent(var/players_amt, var/gamemode)
if(istype(SSticker.mode, /datum/game_mode/dynamic))
- var/var/datum/game_mode/dynamic/mode = SSticker.mode
+ var/datum/game_mode/dynamic/mode = SSticker.mode
if (locate(/datum/dynamic_ruleset/midround/from_ghosts/wizard) in mode.executed_rules)
return can_be_midround_wizard && ..()
return ..()
diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm
index d7d8f1aec8..c594d7b3c0 100644
--- a/code/modules/events/major_dust.dm
+++ b/code/modules/events/major_dust.dm
@@ -2,6 +2,7 @@
name = "Major Space Dust"
typepath = /datum/round_event/meteor_wave/major_dust
weight = 8
+ gamemode_blacklist = list("dynamic")
/datum/round_event/meteor_wave/major_dust
wave_name = "space dust"
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
index 31ea9dcb03..26591547c0 100644
--- a/code/modules/events/meteor_wave.dm
+++ b/code/modules/events/meteor_wave.dm
@@ -10,6 +10,7 @@
min_players = 15
max_occurrences = 3
earliest_start = 25 MINUTES
+ gamemode_blacklist = list("dynamic")
/datum/round_event/meteor_wave
startWhen = 6
diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm
index 74d9bb273e..67848bf941 100644
--- a/code/modules/events/processor_overload.dm
+++ b/code/modules/events/processor_overload.dm
@@ -3,6 +3,7 @@
typepath = /datum/round_event/processor_overload
weight = 15
min_players = 20
+ gamemode_blacklist = list("dynamic")
/datum/round_event/processor_overload
announceWhen = 1
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index 9d075857a7..9dd016c235 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -546,3 +546,10 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and
/datum/holiday/easter/getStationPrefix()
return pick("Fluffy","Bunny","Easter","Egg")
+
+//Random citadel thing for halloween species
+/proc/force_enable_halloween_species()
+ var/list/oldlist = SSevents.holidays
+ SSevents.holidays = list(HALLOWEEN = new /datum/holiday/halloween)
+ generate_selectable_species(FALSE)
+ SSevents.holidays = oldlist
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index a52b8589c3..507c8a5026 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -101,8 +101,9 @@
//Equip the rest of the gear
H.dna.species.before_equip_job(src, H, visualsOnly)
- if(outfit_override || outfit)
- H.equipOutfit(outfit_override ? outfit_override : outfit, visualsOnly)
+ var/datum/outfit/job/O = outfit_override || outfit
+ if(O)
+ H.equipOutfit(O, visualsOnly, preference_source) //mob doesn't have a client yet.
H.dna.species.after_equip_job(src, H, visualsOnly)
@@ -177,8 +178,8 @@
var/pda_slot = SLOT_BELT
-/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- switch(H.backbag)
+/datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ switch(preference_source?.prefs.backbag)
if(GBACKPACK)
back = /obj/item/storage/backpack //Grey backpack
if(GSATCHEL)
@@ -196,7 +197,7 @@
//converts the uniform string into the path we'll wear, whether it's the skirt or regular variant
var/holder
- if(H.jumpsuit_style == PREF_SKIRT)
+ if(preference_source && preference_source.prefs.jumpsuit_style == PREF_SKIRT)
holder = "[uniform]/skirt"
if(!text2path(holder))
holder = "[uniform]"
@@ -204,7 +205,7 @@
holder = "[uniform]"
uniform = text2path(holder)
-/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
return
@@ -232,6 +233,8 @@
PDA.owner = H.real_name
PDA.ownjob = J.title
PDA.update_label()
+ if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences.
+ PDA.update_style(preference_source)
/datum/outfit/job/get_chameleon_disguise_info()
var/list/types = ..()
diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm
index da8c2aa3b9..ce2dce9053 100644
--- a/code/modules/jobs/job_types/assistant.dm
+++ b/code/modules/jobs/job_types/assistant.dm
@@ -28,15 +28,16 @@ Assistant
name = "Assistant"
jobtype = /datum/job/assistant
-/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H)
+/datum/outfit/job/assistant/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
+ var/suited = !preference_source || preference_source.prefs.jumpsuit_style == PREF_SUIT
if (CONFIG_GET(flag/grey_assistants))
- if(H.jumpsuit_style == PREF_SUIT)
+ if(suited)
uniform = /obj/item/clothing/under/color/grey
else
uniform = /obj/item/clothing/under/skirt/color/grey
else
- if(H.jumpsuit_style == PREF_SUIT)
+ if(suited)
uniform = /obj/item/clothing/under/color/random
else
uniform = /obj/item/clothing/under/skirt/color/random
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index d8b88ae871..922b335a39 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -16,11 +16,6 @@
display_order = JOB_DISPLAY_ORDER_CLOWN
-
-/datum/job/clown/after_spawn(mob/living/carbon/human/H, mob/M)
- . = ..()
- H.apply_pref_name("clown", M.client)
-
/datum/outfit/job/clown
name = "Clown"
jobtype = /datum/job/clown
@@ -48,11 +43,15 @@
chameleon_extras = /obj/item/stamp/clown
-/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
- H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly.
+ var/client/C = H.client || preference_source
+ if(C)
+ H.apply_pref_name("clown", C) //rename the mob AFTER they're equipped so their ID gets updated properly.
+ else
+ H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names))
H.dna.add_mutation(CLOWNMUT)
H.dna.add_mutation(SMILE)
diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm
index c213d4dffc..b5def54061 100644
--- a/code/modules/jobs/job_types/cook.dm
+++ b/code/modules/jobs/job_types/cook.dm
@@ -29,7 +29,7 @@
mask = /obj/item/clothing/mask/fakemoustache/italian
backpack_contents = list(/obj/item/sharpener = 1)
-/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/cook/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/datum/job/cook/J = SSjob.GetJobType(jobtype)
if(J) // Fix for runtime caused by invalid job being passed
@@ -39,7 +39,7 @@
if(!visualsOnly)
J.cooks++
-/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/cook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm
index 35fa8483d5..0c762637ac 100644
--- a/code/modules/jobs/job_types/curator.dm
+++ b/code/modules/jobs/job_types/curator.dm
@@ -34,7 +34,7 @@
/obj/item/barcodescanner = 1
)
-/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/curator/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index 27a54fbd1f..13cb5e01e3 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -46,7 +46,7 @@
chameleon_extras = list(/obj/item/gun/ballistic/revolver/detective, /obj/item/clothing/glasses/sunglasses)
-/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/detective/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
var/obj/item/clothing/mask/cigarette/cig = H.wear_mask
if(istype(cig)) //Some species specfic changes can mess this up (plasmamen)
diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm
index 0b8be52116..654af6a05d 100644
--- a/code/modules/jobs/job_types/lawyer.dm
+++ b/code/modules/jobs/job_types/lawyer.dm
@@ -35,7 +35,7 @@
chameleon_extras = /obj/item/stamp/law
-/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/lawyer/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm
index 1347da7125..4e6e982fb9 100644
--- a/code/modules/jobs/job_types/mime.dm
+++ b/code/modules/jobs/job_types/mime.dm
@@ -36,7 +36,7 @@
satchel = /obj/item/storage/backpack/mime
-/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
@@ -47,3 +47,9 @@
H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
H.mind.miming = 1
+ var/client/C = H.client || preference_source
+ if(C)
+ H.apply_pref_name("mime", C)
+ else
+ H.fully_replace_character_name(H.real_name, pick(GLOB.mime_names))
+
diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm
index 771fc02862..915e9d1cea 100644
--- a/code/modules/jobs/job_types/shaft_miner.dm
+++ b/code/modules/jobs/job_types/shaft_miner.dm
@@ -64,7 +64,7 @@
/obj/item/gun/energy/kinetic_accelerator=1,\
/obj/item/stack/marker_beacon/ten=1)
-/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
..()
if(visualsOnly)
return
diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm
index d901e1eb0c..d461523744 100644
--- a/code/modules/mining/aux_base_camera.dm
+++ b/code/modules/mining/aux_base_camera.dm
@@ -25,7 +25,6 @@
max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
no_ammo_message = "Internal matter exhausted. Please add additional materials. "
delay_mod = 0.5
- adjacency_check = FALSE
upgrade = TRUE
var/obj/machinery/computer/camera_advanced/base_construction/console
@@ -207,19 +206,14 @@
to_chat(owner, "Build mode is now [buildmode].")
/datum/action/innate/aux_base/airlock_type
- name = "Change Airlock Settings"
+ name = "Select Airlock Type"
button_icon_state = "airlock_select"
/datum/action/innate/aux_base/airlock_type/Activate()
if(..())
return
- var/mode = alert("Modify Type or Access?", "Airlock Settings", "Type", "Access", "None")
- switch(mode)
- if("Type")
- B.RCD.change_airlock_setting(usr)
- if("Access")
- B.RCD.change_airlock_access(usr)
+ B.RCD.change_airlock_access(usr)
/datum/action/innate/aux_base/window_type
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index d6e99f7361..4429c8426f 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -59,6 +59,7 @@
to_chat(owner, "[src] breaks down as it tries to activate. ")
else
owner.revive(full_heal = 1)
+ owner.log_message("[owner] used an implanted [src] to heal themselves! Keep fighting, it's just a flesh wound!", LOG_ATTACK, color="green") //Logging for implanted legion core use
qdel(src)
/obj/item/organ/regenerative_core/on_life()
@@ -85,6 +86,21 @@
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
H.revive(full_heal = 1)
qdel(src)
+ user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another.
+
+/obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target'
+ if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal
+ var/mob/living/carbon/human/H = user //Set H to user rather than target
+ if(inert) //Inert cores are useless
+ to_chat(user, "[src] has decayed and can no longer be used to heal. ")
+ return
+ else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself!
+ to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments. ")
+ SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
+ H.revive(full_heal = 1)
+ qdel(src)
+ H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand.
+
/obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
. = ..()
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 8de5f76a56..950ae7dda1 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -37,6 +37,9 @@
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/gloves/color/black(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //yes, even both mining locker types
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src)
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
@@ -61,6 +64,7 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/survivalcapsule(src)
new /obj/item/assault_pod/mining(src)
+ new /obj/item/clothing/suit/hooded/wintercoat/miner(src) //because you know you want it
/**********************Shuttle Computer**************************/
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 4d253a4693..d789fc6f5a 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -473,10 +473,7 @@
var/free_space = 0
for(var/list/category in list(GLOB.command_positions) + list(GLOB.supply_positions) + list(GLOB.engineering_positions) + list(GLOB.nonhuman_positions - "pAI") + list(GLOB.civilian_positions) + list(GLOB.medical_positions) + list(GLOB.science_positions) + list(GLOB.security_positions))
var/cat_color = "fff" //random default
- if(SSjob.name_occupations && SSjob.name_occupations[category[1]])
- cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
- else
- cat_color = SSjob.occupations[category[1]].selection_color
+ cat_color = SSjob.name_occupations[category[1]].selection_color //use the color of the first job in the category (the department head) as the category color
dat += ""
dat += "[SSjob.name_occupations[category[1]].exp_type_department] "
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 8ea295c6c4..42277e925b 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -264,6 +264,7 @@ Works together with spawning an observer, noted above.
*/
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE)
+ penalize = suiciding || penalize // suicide squad.
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & COMPONENT_BLOCK_GHOSTING))
return //mob has no key, is an aghost or some component hijacked.
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f2b02b81fb..23ccc665b6 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -170,6 +170,7 @@
stop_pulling()
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "You gently let go of [throwable_mob]. ")
+ return
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 7d1e5320fc..a8a69be0f1 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -43,7 +43,7 @@
adjustStaminaLoss(damage_amount, forced = forced)
//citadel code
if(AROUSAL)
- adjustArousalLoss(damage_amount, forced = forced)
+ adjustArousalLoss(damage_amount)
return TRUE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d460482d6f..9eab9054f5 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -32,7 +32,7 @@
if(CONFIG_GET(flag/disable_stambuffer))
togglesprint()
- RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood)
+ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /atom.proc/clean_blood)
/mob/living/carbon/human/ComponentInitialize()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2ab7c6d404..327ad6760c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -339,8 +339,10 @@
apply_damage(damage, BRUTE, affecting, armor_block)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
-
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings! ")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index b1f11f6463..9ffa994066 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -34,8 +34,6 @@
var/shirt_color = "FFFFFF"
var/socks = "Nude" //Which socks the player wants
var/socks_color = "FFFFFF"
- var/backbag = DBACKPACK //Which backpack type the player has chosen.
- var/jumpsuit_style = PREF_SUIT //suit/skirt
//Equipment slots
var/obj/item/wear_suit = null
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 084dbd83ef..26703977d2 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -251,7 +251,7 @@
sec_hud_set_security_status()
..()
-/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE)
+/mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE, client/preference_source)
var/datum/outfit/O = null
if(ispath(outfit))
@@ -263,7 +263,7 @@
if(!O)
return 0
- return O.equip(src, visualsOnly)
+ return O.equip(src, visualsOnly, preference_source)
//delete all equipment without dropping anything
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 49ae178d8c..7ff4f355d5 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -118,11 +118,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
..()
-/proc/generate_selectable_species()
+/proc/generate_selectable_species(clear = FALSE)
+ if(clear)
+ GLOB.roundstart_races = list()
+ GLOB.roundstart_race_names = list()
for(var/I in subtypesof(/datum/species))
var/datum/species/S = new I
if(S.check_roundstart_eligible())
- GLOB.roundstart_races += S.id
+ GLOB.roundstart_races |= S.id
GLOB.roundstart_race_names["[S.name]"] = S.id
qdel(S)
if(!GLOB.roundstart_races.len)
@@ -1476,7 +1479,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ if(!attacker_style && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]! ")
return FALSE
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
@@ -1678,6 +1681,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return
if(M.mind)
attacker_style = M.mind.martial_art
+ if(attacker_style?.pacifism_check && HAS_TRAIT(M, TRAIT_PACIFISM)) // most martial arts are quite harmful, alas.
+ attacker_style = null
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
log_combat(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]! ")
diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
index d264f11b73..02163eaaed 100644
--- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm
@@ -1,9 +1,8 @@
/datum/species/insect
name = "Anthromorphic Insect"
id = "insect"
- say_mod = "flutters"
default_color = "00FF00"
- species_traits = list(LIPS,NOEYES,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR)
+ species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_ears", "mam_snout", "mam_tail", "taur", "insect_wings", "mam_snouts", "insect_fluff","horns")
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None",
@@ -12,54 +11,36 @@
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect
- liked_food = VEGETABLES | DAIRY
- disliked_food = FRUIT | GROSS
- toxic_food = MEAT | RAW
- mutanteyes = /obj/item/organ/eyes/insect
+ liked_food = MEAT | FRUIT
+ disliked_food = TOXIC
should_draw_citadel = TRUE
- exotic_bloodtype = "BUG"
-/datum/species/insect/on_species_gain(mob/living/carbon/C)
+/datum/species/insect/spec_death(gibbed, mob/living/carbon/human/H)
+ if(H)
+ stop_wagging_tail(H)
+
+/datum/species/insect/spec_stun(mob/living/carbon/human/H,amount)
+ if(H)
+ stop_wagging_tail(H)
. = ..()
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(!H.dna.features["insect_wings"])
- H.dna.features["insect_wings"] = "[(H.client && H.client.prefs && LAZYLEN(H.client.prefs.features) && H.client.prefs.features["insect_wings"]) ? H.client.prefs.features["insect_wings"] : "None"]"
- handle_mutant_bodyparts(H)
-/datum/species/insect/random_name(gender,unique,lastname)
- if(unique)
- return random_unique_moth_name()
+/datum/species/insect/can_wag_tail(mob/living/carbon/human/H)
+ return ("mam_tail" in mutant_bodyparts) || ("mam_waggingtail" in mutant_bodyparts)
- var/randname = moth_name()
+/datum/species/insect/is_wagging_tail(mob/living/carbon/human/H)
+ return ("mam_waggingtail" in mutant_bodyparts)
- if(lastname)
- randname += " [lastname]"
+/datum/species/insect/start_wagging_tail(mob/living/carbon/human/H)
+ if("mam_tail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_tail"
+ mutant_bodyparts |= "mam_waggingtail"
+ H.update_body()
- return randname
+/datum/species/insect/stop_wagging_tail(mob/living/carbon/human/H)
+ if("mam_waggingtail" in mutant_bodyparts)
+ mutant_bodyparts -= "mam_waggingtail"
+ mutant_bodyparts |= "mam_tail"
+ H.update_body()
-/datum/species/insect/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
- ..()
- if(H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
- to_chat(H, "Your precious wings burn to a crisp! ")
- if(H.dna.features["insect_wings"] != "None")
- H.dna.features["insect_wings"] = "Burnt Off"
- handle_mutant_bodyparts(H)
-
-/datum/species/insect/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
- . = ..()
- if(chem.id == "pestkiller")
- H.adjustToxLoss(3)
- H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
-
-/datum/species/insect/check_weakness(obj/item/weapon, mob/living/attacker)
- if(istype(weapon, /obj/item/melee/flyswatter))
- return 9 //flyswatters deal 10x damage to insects
- return 0
-
-/datum/species/insect/space_move(mob/living/carbon/human/H)
- . = ..()
- if(H.loc && !isspaceturf(H.loc) && (H.dna.features["insect_wings"] != "Burnt Off" && H.dna.features["insect_wings"] != "None"))
- var/datum/gas_mixture/current = H.loc.return_air()
- if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
- return TRUE
+/datum/species/insect/qualifies_for_rank(rank, list/features)
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 93e64fd4cc..722c984309 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -92,6 +92,9 @@
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings! ")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 0f8687397d..371e92413b 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -58,7 +58,10 @@
var/canholo = TRUE
var/obj/item/card/id/access_card = null
var/chassis = "repairbot"
- var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE) //assoc value is whether it can be picked up.
+ var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE,
+ "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "borgi" = FALSE ,
+ "parrot" = FALSE, "bear" = FALSE , "mushroom" = FALSE, "crow" = FALSE ,
+ "fairy" = FALSE , "spiderbot" = FALSE) //assoc value is whether it can be picked up.
var/static/item_head_icon = 'icons/mob/pai_item_head.dmi'
var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi'
var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi'
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index a5943aa0e6..4f12250ef0 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -37,6 +37,7 @@
var/obj/item/paicard/paicard // Inserted pai card.
var/allow_pai = 1 // Are we even allowed to insert a pai card.
var/bot_name
+ var/oil_spill_type = /obj/effect/decal/cleanable/oil
var/list/player_access = list() //Additonal access the bots gets when player controlled
var/emagged = FALSE
@@ -216,9 +217,9 @@
to_chat(user, "[src] is in pristine condition.")
/mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- if(amount>0 && prob(10))
- new /obj/effect/decal/cleanable/oil(loc)
. = ..()
+ if(. && prob(10))
+ new oil_spill_type(loc)
/mob/living/simple_animal/bot/updatehealth()
..()
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index 1c19cd82a1..724abea214 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -16,6 +16,7 @@
bot_core_type = /obj/machinery/bot_core/honkbot
window_id = "autohonk"
window_name = "Honkomatic Bike Horn Unit v1.0.7"
+ oil_spill_type = /obj/effect/decal/cleanable/oil/slippery //slip and slide fun for the whole family
data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs
path_image_color = "#FF69B4"
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 50c331940a..fed770d0b0 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -440,7 +440,7 @@
var/reagent_id = null
if(emagged == 2) //Emagged! Time to poison everybody.
- reagent_id = "toxin"
+ reagent_id = HAS_TRAIT(C, TRAIT_TOXINLOVER)? "charcoal" : "toxin"
else
if(treat_virus)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 550593e316..c18fc36e9a 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -522,10 +522,10 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
//gets ID card object from special clothes slot or null.
/mob/proc/get_idcard(hand_first = TRUE)
var/obj/item/held_item = get_active_held_item()
- . = held_item?.GetID()
+ . = held_item ? held_item.GetID() : null
if(!.) //If so, then check the inactive hand
held_item = get_inactive_held_item()
- . = held_item?.GetID()
+ . = held_item ? held_item.GetID() : null
/mob/proc/get_id_in_hand()
var/obj/item/held_item = get_active_held_item()
diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm
index ad63f55b90..7ee71db1f1 100644
--- a/code/modules/ninja/outfit.dm
+++ b/code/modules/ninja/outfit.dm
@@ -16,7 +16,7 @@
implants = list(/obj/item/implant/explosive)
-/datum/outfit/ninja/post_equip(mob/living/carbon/human/H)
+/datum/outfit/ninja/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(istype(H.wear_suit, suit))
var/obj/item/clothing/suit/space/space_ninja/S = H.wear_suit
if(istype(H.belt, belt))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index e43eb5a3bc..ceb9b7a0fc 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -69,12 +69,12 @@
/obj/item/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
- damage = 24 // Citadel change for balance from 36
+ damage = 28 // Citadel change for balance from 36
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
eyeblur = 0
- speed = 0.7
+ speed = 0.6
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_BLUE
tracer_type = /obj/effect/projectile/tracer/disabler
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 1eb75e042b..3a20501832 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -382,9 +382,10 @@
/obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker)
if(beaker)
- beaker.forceMove(drop_location())
+ var/obj/item/reagent_containers/B = beaker
+ B.forceMove(drop_location())
if(user && Adjacent(user) && !issiliconoradminghost(user))
- user.put_in_hands(beaker)
+ user.put_in_hands(B)
if(new_beaker)
beaker = new_beaker
else
@@ -396,7 +397,6 @@
cell = null
if(beaker)
beaker.forceMove(drop_location())
- beaker = null
return ..()
/obj/machinery/chem_dispenser/proc/get_macro_resolution()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 30d432ce55..e91719504e 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -515,6 +515,7 @@
///Stronger kind of lube. Applies TURF_WET_SUPERLUBE.
/datum/reagent/lube/superlube
name = "Super Duper Lube"
+ id = "superlube"
description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]."
lube_kind = TURF_WET_SUPERLUBE
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index b3f9ef8202..ddbc6cf92b 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -230,7 +230,7 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "clownflower"
volume = 30
- list_reagents = list(/datum/reagent/lube/superlube = 30)
+ list_reagents = list("superlube" = 30)
/obj/item/reagent_containers/spray/waterflower/cyborg
reagent_flags = NONE
diff --git a/code/modules/research/designs/machine_desings/machine_designs_service.dm b/code/modules/research/designs/machine_desings/machine_designs_service.dm
index 895ad032ba..5cbff1c66a 100644
--- a/code/modules/research/designs/machine_desings/machine_designs_service.dm
+++ b/code/modules/research/designs/machine_desings/machine_designs_service.dm
@@ -41,6 +41,14 @@
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+/datum/design/board/ayyplantgenes
+ name = "Machine Design (Alien Plant DNA Manipulator Board)"
+ desc = "The circuit board for an advanced plant DNA manipulator, utilizing alien technologies."
+ id = "ayyplantgenes"
+ build_path = /obj/item/circuitboard/machine/plantgenes/vault
+ category = list ("Misc. Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
/datum/design/board/deepfryer
name = "Machine Design (Deep Fryer)"
desc = "The circuit board for a Deep Fryer."
diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm
index 5f457a3cd7..836b574f86 100644
--- a/code/modules/research/machinery/_production.dm
+++ b/code/modules/research/machinery/_production.dm
@@ -84,8 +84,9 @@
investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH)
message_admins("[ADMIN_LOOKUPFLW(user)] has built [amount] of [path] at a [src]([type]).")
for(var/i in 1 to amount)
- var/obj/item/I = new path(get_turf(src))
- if(efficient_with(I.type))
+ var/obj/O = new path(get_turf(src))
+ if(efficient_with(O.type) && isitem(O))
+ var/obj/item/I = O
I.materials = matlist.Copy()
SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]"))
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 5f286c4237..a2482c49a8 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -616,7 +616,7 @@
/datum/techweb_node/botany
id = "botany"
display_name = "Botanical Engineering"
- description = "Botanical tools"
+ description = "Botanical tools."
prereq_ids = list("adv_engi", "biotech")
design_ids = list("diskplantgene", "portaseeder", "plantgenes", "flora_gun", "hydro_tray", "biogenerator", "seed_extractor")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750)
@@ -1047,14 +1047,14 @@
display_name = "Alien Biological Tools"
description = "Advanced biological tools."
prereq_ids = list("alientech", "advance_surgerytools")
- design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery")
+ design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery", "ayyplantgenes")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
export_price = 10000
/datum/techweb_node/alien_engi
id = "alien_engi"
display_name = "Alien Engineering"
- description = "Alien engineering tools"
+ description = "Alien engineering tools."
prereq_ids = list("alientech", "exp_tools")
design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 92a637ce43..d12195cc52 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -135,7 +135,7 @@
id = /obj/item/card/id/syndicate/anyone
implants = list(/obj/item/implant/weapons_auth)
-/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H)
+/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.faction |= ROLE_SYNDICATE
/obj/effect/mob_spawn/human/lavaland_syndicate/comms
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 9aa89dcaf5..3fba237c23 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -354,7 +354,7 @@
if("legs" in S.default_features)
if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG)
if(DIGITIGRADE in S.species_traits)
- digitigrade_type = lowertext(H.dna.features.["legs"])
+ digitigrade_type = lowertext(H.dna.features["legs"])
else
digitigrade_type = null
@@ -363,9 +363,9 @@
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
if(Smark)
body_markings_icon = Smark.icon
- if(H.dna.features.["mam_body_markings"] != "None")
- body_markings = lowertext(H.dna.features.["mam_body_markings"])
- aux_marking = lowertext(H.dna.features.["mam_body_markings"])
+ if(H.dna.features["mam_body_markings"] != "None")
+ body_markings = lowertext(H.dna.features["mam_body_markings"])
+ aux_marking = lowertext(H.dna.features["mam_body_markings"])
else
body_markings = "plain"
aux_marking = "plain"
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index 3172496146..40fe90a829 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -110,4 +110,4 @@
requires_tech = TRUE
replaced_by = null
-#undef EXPDIS_FAIL_MSG
\ No newline at end of file
+#undef BASE_HUMAN_REWARD
\ No newline at end of file
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index a9830f36df..94512dc597 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -212,7 +212,6 @@ obj/item/organ/heart/cybernetic/upgraded/on_life()
ramount += regen_amount
/obj/item/organ/heart/cybernetic/upgraded/proc/used_dose()
- . = ..()
addtimer(VARSET_CALLBACK(src, dose_available, TRUE), 5 MINUTES)
ramount = 0
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 194a10f4c4..466f618cf3 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -1,6 +1,3 @@
-#define STANDARD_ORGAN_THRESHOLD 100
-#define STANDARD_ORGAN_HEALING 0.001
-
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 01505a940f..aef3b31895 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1804,6 +1804,21 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes
cost = 4
restricted_roles = list("Cook", "Botanist", "Clown", "Mime")
+/datum/uplink_item/role_restricted/strange_seeds
+ name = "Pack of strange seeds"
+ desc = "Mysterious seeds as strange as their name implies. Spooky."
+ item = /obj/item/seeds/random
+ cost = 2
+ restricted_roles = list("Botanist")
+ illegal_tech = FALSE
+
+/datum/uplink_item/role_restricted/strange_seeds_10pack
+ name = "Pack of strange seeds x10"
+ desc = "Mysterious seeds as strange as their name implies. Spooky. These come in bulk"
+ item = /obj/item/storage/box/strange_seeds_10pack
+ cost = 20
+ restricted_roles = list("Botanist")
+
/datum/uplink_item/role_restricted/ez_clean_bundle
name = "EZ Clean Grenade Bundle"
desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index e64435accc..adaa56fc6d 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -125,6 +125,7 @@
products = list(/obj/item/clothing/glasses/hud/diagnostic = 3,
/obj/item/clothing/under/rank/roboticist = 3,
/obj/item/clothing/under/rank/roboticist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/robotics = 3,
/obj/item/clothing/suit/toggle/labcoat = 3,
/obj/item/clothing/shoes/sneakers/black = 3,
/obj/item/clothing/gloves/fingerless = 3,
@@ -258,6 +259,7 @@
vend_reply = "Thank you for using the JaniDrobe!"
products = list(/obj/item/clothing/under/rank/janitor = 2,
/obj/item/clothing/under/rank/janitor/skirt = 2,
+ /obj/item/clothing/suit/hooded/wintercoat/janitor = 3,
/obj/item/cartridge/janitor = 3,
/obj/item/clothing/gloves/color/black = 2,
/obj/item/clothing/head/soft/purple = 2,
@@ -340,6 +342,7 @@
vend_reply = "Thank you for using the ChemDrobe!"
products = list(/obj/item/clothing/under/rank/chemist = 3,
/obj/item/clothing/under/rank/chemist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/chemistry = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/chemist = 3,
/obj/item/storage/backpack/chemistry = 3,
@@ -359,6 +362,7 @@
vend_reply = "Thank you for using the GeneDrobe!"
products = list(/obj/item/clothing/under/rank/geneticist = 3,
/obj/item/clothing/under/rank/geneticist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/genetics = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/genetics = 3,
/obj/item/storage/backpack/genetics = 3,
@@ -376,6 +380,7 @@
vend_reply = "Thank you for using the ViroDrobe"
products = list(/obj/item/clothing/under/rank/virologist = 3,
/obj/item/clothing/under/rank/virologist/skirt = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/viro = 3,
/obj/item/clothing/shoes/sneakers/white = 3,
/obj/item/clothing/suit/toggle/labcoat/virologist = 3,
/obj/item/clothing/mask/surgical = 3,
diff --git a/html/changelogs/AutoChangeLog-pr-9323.yml b/html/changelogs/AutoChangeLog-pr-9323.yml
new file mode 100644
index 0000000000..19e91deaf5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9323.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "you can now choose never for this round for magical antags"
diff --git a/html/changelogs/AutoChangeLog-pr-9518.yml b/html/changelogs/AutoChangeLog-pr-9518.yml
new file mode 100644
index 0000000000..67a2c25938
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9518.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (original PR by nicbn and Menshin)"
+delete-after: True
+changes:
+ - bugfix: "You can click on things that are under flaps or holo barriers."
diff --git a/html/changelogs/AutoChangeLog-pr-9530.yml b/html/changelogs/AutoChangeLog-pr-9530.yml
new file mode 100644
index 0000000000..ace41e9e97
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9530.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed the little issue of PDA skins not updating on job equip."
+ - tweak: "Anomaly Crystals of the clowning type will now rename the victim to their clown name preference when triggered, instead of giving them a random clown name."
diff --git a/html/changelogs/AutoChangeLog-pr-9681.yml b/html/changelogs/AutoChangeLog-pr-9681.yml
new file mode 100644
index 0000000000..c4c289425b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9681.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "bluespace wizard apprentice now has blink instead of targeted area teleportation"
diff --git a/html/changelogs/AutoChangeLog-pr-9703.yml b/html/changelogs/AutoChangeLog-pr-9703.yml
new file mode 100644
index 0000000000..312057c2c6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9703.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "Emagged medibots now charcoal toxinlovers."
diff --git a/html/changelogs/AutoChangeLog-pr-9720.yml b/html/changelogs/AutoChangeLog-pr-9720.yml
new file mode 100644
index 0000000000..f4c4aade36
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9720.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - balance: "disablers buffed 0.7 --> 0.6 speed 24 --> 28 damage"
diff --git a/html/changelogs/AutoChangeLog-pr-9749.yml b/html/changelogs/AutoChangeLog-pr-9749.yml
new file mode 100644
index 0000000000..3113fa08c3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9749.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "Boh cant hold WEIGHT_CLASS_GIGANTIC, just Bulky. Makes katana, chainsaw and base ball bat into bulky items so they may fit"
diff --git a/html/changelogs/AutoChangeLog-pr-9812.yml b/html/changelogs/AutoChangeLog-pr-9812.yml
new file mode 100644
index 0000000000..d669d20343
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9812.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed missing delivery packages sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-9823.yml b/html/changelogs/AutoChangeLog-pr-9823.yml
new file mode 100644
index 0000000000..3408f04171
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9823.yml
@@ -0,0 +1,6 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - rscadd: "Added nine winter coats"
+ - imageadd: "added images for the winter coats"
+ - tweak: "adds the mining winter coat to mining wardrobes and mining lockers"
diff --git a/html/changelogs/AutoChangeLog-pr-9828.yml b/html/changelogs/AutoChangeLog-pr-9828.yml
new file mode 100644
index 0000000000..53dbebba28
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9828.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "Meteor wave is no longer repeatable in dynamic."
diff --git a/html/changelogs/AutoChangeLog-pr-9831.yml b/html/changelogs/AutoChangeLog-pr-9831.yml
new file mode 100644
index 0000000000..569fd14f69
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9831.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - tweak: "tweaked nuke ops"
diff --git a/html/changelogs/AutoChangeLog-pr-9864.yml b/html/changelogs/AutoChangeLog-pr-9864.yml
new file mode 100644
index 0000000000..ff1f4f6508
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9864.yml
@@ -0,0 +1,5 @@
+author: "Knouli"
+delete-after: True
+changes:
+ - rscadd: "attack_self proc for the legion core which triggers a self-heal al la the previous 'afterattack' proc, as if clicking on the character's own sprite to self-heal"
+ - rscadd: "admin logging for all three use cases of legion core healing - afterattack, attack_self, and implanted ui_action_click"
diff --git a/html/changelogs/AutoChangeLog-pr-9865.yml b/html/changelogs/AutoChangeLog-pr-9865.yml
new file mode 100644
index 0000000000..6bef9d6b5b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9865.yml
@@ -0,0 +1,4 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - bugfix: "numbered storages now are sorted in a consistent way, instead of depending on ordering of their contents var"
diff --git a/html/changelogs/AutoChangeLog-pr-9866.yml b/html/changelogs/AutoChangeLog-pr-9866.yml
new file mode 100644
index 0000000000..1e6e8d0e88
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9866.yml
@@ -0,0 +1,4 @@
+author: "Useroth"
+delete-after: True
+changes:
+ - rscadd: "strange seeds as a buyable traitor botanist item"
diff --git a/html/changelogs/AutoChangeLog-pr-9868.yml b/html/changelogs/AutoChangeLog-pr-9868.yml
new file mode 100644
index 0000000000..18c4388dcd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9868.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixed superlube waterflower, my bad."
diff --git a/html/changelogs/AutoChangeLog-pr-9869.yml b/html/changelogs/AutoChangeLog-pr-9869.yml
new file mode 100644
index 0000000000..ecb3ac6cb7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9869.yml
@@ -0,0 +1,4 @@
+author: "Hatterhat"
+delete-after: True
+changes:
+ - rscadd: "The seedvault/alien plant DNA manipulator can now be printed off with Alien Biotechnology."
diff --git a/html/changelogs/AutoChangeLog-pr-9871.yml b/html/changelogs/AutoChangeLog-pr-9871.yml
new file mode 100644
index 0000000000..3940d256c2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9871.yml
@@ -0,0 +1,5 @@
+author: "dzahlus"
+delete-after: True
+changes:
+ - soundadd: "added a new gun sounds"
+ - sounddel: "removed an old gun sounds"
diff --git a/html/changelogs/AutoChangeLog-pr-9873.yml b/html/changelogs/AutoChangeLog-pr-9873.yml
new file mode 100644
index 0000000000..b0568bad14
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9873.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixed closing the aux base construction RCD's door access settings window throwing you out of camera mode when closed."
+ - rscdel: "Removed not functional aux base RCD's door type menu. Use airlock painters, maybe."
diff --git a/html/changelogs/AutoChangeLog-pr-9874.yml b/html/changelogs/AutoChangeLog-pr-9874.yml
new file mode 100644
index 0000000000..2e932c458b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9874.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "Honkbot oil spills are of the slippery kind now. Honk."
diff --git a/html/changelogs/AutoChangeLog-pr-9875.yml b/html/changelogs/AutoChangeLog-pr-9875.yml
new file mode 100644
index 0000000000..4e14a561e7
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9875.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - bugfix: "From-ghosts dynamic rulesets now actually listen to \"required candidates\""
diff --git a/html/changelogs/AutoChangeLog-pr-9876.yml b/html/changelogs/AutoChangeLog-pr-9876.yml
new file mode 100644
index 0000000000..4bc0a19954
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9876.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - imageadd: "local code scavenger finds forgotten slighty improved apc sprites left buried in old dusty folders."
diff --git a/html/changelogs/AutoChangeLog-pr-9877.yml b/html/changelogs/AutoChangeLog-pr-9877.yml
new file mode 100644
index 0000000000..c84cb7aa92
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9877.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Seven old and otherwordly pAI holochassis icons have crawled their way out of the modular citadel catacombs."
diff --git a/html/changelogs/AutoChangeLog-pr-9880.yml b/html/changelogs/AutoChangeLog-pr-9880.yml
new file mode 100644
index 0000000000..0f9dfa58f3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9880.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - bugfix: "Every dynamic-triggered event is now blacklisted from being triggered by the random events system when dynamic can trigger them."
diff --git a/html/changelogs/AutoChangeLog-pr-9881.yml b/html/changelogs/AutoChangeLog-pr-9881.yml
new file mode 100644
index 0000000000..3ff9081e66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9881.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - rscadd: "Dynamic voting now features extended, if recent rounds have been chaotic."
diff --git a/html/changelogs/AutoChangeLog-pr-9886.yml b/html/changelogs/AutoChangeLog-pr-9886.yml
new file mode 100644
index 0000000000..64c011e37c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9886.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "chem dispenser beakers end up in your hand yet again."
+ - bugfix: "Bikehorns squeak yet again, the world is safe."
diff --git a/html/changelogs/AutoChangeLog-pr-9887.yml b/html/changelogs/AutoChangeLog-pr-9887.yml
new file mode 100644
index 0000000000..c76016575b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9887.yml
@@ -0,0 +1,7 @@
+author: "Fox McCloud, Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Fixes being able to mech-punch other mobs, as a pacifist"
+ - bugfix: "Fixes being able to hurt people, as a pacifist, by throwing them into a wall or other mob, or by using most martial arts (save for the unpredictable psychotic brawl, and the stamina-damage-only boxing)."
+ - balance: "Buffs boxing to outdamage natural stamina regeneration. Made the chance of outright missing your opponent actually possible."
+ - tweak: "Pacifists can now engage in the (laughably not harmful) sweet sweet art of boxing now."
diff --git a/html/changelogs/AutoChangeLog-pr-9889.yml b/html/changelogs/AutoChangeLog-pr-9889.yml
new file mode 100644
index 0000000000..68094bd33d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9889.yml
@@ -0,0 +1,4 @@
+author: "GrayRachnid"
+delete-after: True
+changes:
+ - bugfix: "Fixes golden toolbox missing inhand sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-9891.yml b/html/changelogs/AutoChangeLog-pr-9891.yml
new file mode 100644
index 0000000000..105749ea29
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9891.yml
@@ -0,0 +1,4 @@
+author: "Putnam"
+delete-after: True
+changes:
+ - tweak: "Roundstart rulesets now scale on population ready rather than total population."
diff --git a/html/changelogs/AutoChangeLog-pr-9896.yml b/html/changelogs/AutoChangeLog-pr-9896.yml
new file mode 100644
index 0000000000..378129d227
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9896.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Cyborgs can now actually use cameras from a distance."
diff --git a/html/changelogs/AutoChangeLog-pr-9898.yml b/html/changelogs/AutoChangeLog-pr-9898.yml
new file mode 100644
index 0000000000..002e3b544d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9898.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Suicides are yet again painful and instant and won't throw people in deep crit from full health."
diff --git a/html/changelogs/AutoChangeLog-pr-9908.yml b/html/changelogs/AutoChangeLog-pr-9908.yml
new file mode 100644
index 0000000000..fb0ae06238
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9908.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - bugfix: "fixed rogue pixels on the energy gu- ahem blaster carbine... and a few apc lights states being neigh-indistinguishable."
diff --git a/html/changelogs/AutoChangeLog-pr-9909.yml b/html/changelogs/AutoChangeLog-pr-9909.yml
new file mode 100644
index 0000000000..7cfb6ce5b2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9909.yml
@@ -0,0 +1,5 @@
+author: "kiwedespars"
+delete-after: True
+changes:
+ - rscdel: "removed moth fluff coloring you like your wings"
+ - balance: "made insect not so bad."
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 69e75e7d2874d8f01b6c34807ae9f5d6070f8561..e9f32c428aad8d0d569b56bf5a844b15e433c9e9 100644
GIT binary patch
literal 203857
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