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 69e75e7d28..e9f32c428a 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/pai.dmi b/icons/mob/pai.dmi
index 94fb2ee6e7..d8162cb5a7 100644
Binary files a/icons/mob/pai.dmi and b/icons/mob/pai.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index c469773993..07467f9770 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index 105da7d865..7d95805dc5 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 195742c68c..695e623c66 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index f62e546ed2..42f85bb69e 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index ca339b5262..d23af6c9b4 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index 1da5a66546..1ba953d284 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index fedb6c828e..3b8b67ea5c 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index efd7974897..ee703fc70b 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm b/modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm
deleted file mode 100644
index 1ef2285878..0000000000
--- a/modular_citadel/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/obj/structure/closet/athletic_mixed/PopulateContents()
- ..()
- new /obj/item/clothing/under/polychromic/shortpants(src)
- new /obj/item/clothing/under/polychromic/shortpants(src)
- new /obj/item/clothing/under/polychromic/shortpants(src)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm b/modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm
deleted file mode 100644
index 40a8224627..0000000000
--- a/modular_citadel/code/game/objects/structures/crates_lockers/closets/secure/citadel_lockers.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/obj/structure/closet/secure_closet/quartermaster/PopulateContents()
- ..()
- new /obj/item/radio/headset/heads/qm(src)
-
-/obj/structure/closet/secure_closet/CMO/PopulateContents()
- ..()
- new /obj/item/storage/hypospraykit/cmo(src)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
deleted file mode 100644
index ba4fa3787b..0000000000
--- a/modular_citadel/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ /dev/null
@@ -1,37 +0,0 @@
-/obj/structure/closet/wardrobe/mixed/PopulateContents()
- if(prob(40))
- new /obj/item/clothing/suit/jacket(src)
- if(prob(40))
- new /obj/item/clothing/suit/jacket(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)
- new /obj/item/clothing/mask/bandana/blue(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/mask/bandana/gold(src)
- new /obj/item/clothing/shoes/sneakers/black(src)
- new /obj/item/clothing/shoes/sneakers/brown(src)
- new /obj/item/clothing/shoes/sneakers/white(src)
- if(prob(30))
- new /obj/item/clothing/suit/hooded/wintercoat(src)
- new /obj/item/clothing/shoes/winterboots(src)
- return
-
-/obj/structure/closet/wardrobe/curator/PopulateContents()
- ..()
- new /obj/item/clothing/accessory/pocketprotector/full(src)
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/tools.dm b/modular_citadel/code/game/objects/tools.dm
deleted file mode 100644
index 5a6cd9bf42..0000000000
--- a/modular_citadel/code/game/objects/tools.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-// OVERRIDES FOR TOOL SPRITES GO HERE
-*/
-
-//CROWBAR
-
-/obj/item/crowbar
- icon = 'modular_citadel/icons/obj/tools.dmi'
-
-//WIRECUTTERS disabled pending better sprites
-/*
-/obj/item/wirecutters
- icon = 'modular_citadel/icons/obj/tools.dmi'
-*/
-//WRENCH
-
-/obj/item/wrench
- icon = 'modular_citadel/icons/obj/tools.dmi'
\ No newline at end of file
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 6c9da17289..ed28185bb7 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -159,7 +159,7 @@
to_chat(M, "Arousal is disabled. Feature is unavailable. ")
-/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
+/mob/living/proc/mob_climax(forced_climax = FALSE)//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
set category = "IC"
if(canbearoused && !restrained() && !stat)
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
index 39d1de1fa7..e0f589ac3e 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm
@@ -253,7 +253,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
if(!do_after(R, 50, target = target))
return //If they moved away, you can't eat them.
to_chat(R, "You finish off \the [target.name]. ")
- var/obj/item/stock_parts/cell.C = target
+ var/obj/item/stock_parts/cell/C = target
R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf
qdel(target)
return
@@ -322,7 +322,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm !
/obj/item/soap/tongue/flavour/afterattack(atom/target, mob/user, proximity)
if(!proximity)
return
- var/mob/living/silicon/robot.R = user
+ var/mob/living/silicon/robot/R = user
if(ishuman(target))
var/mob/living/L = target
if(status == 0 && check_zone(R.zone_selected) == "head")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 35474f4c69..ce254d1b12 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -163,9 +163,9 @@ Creating a chem with a low purity will make you permanently fall in love with so
creator = get_mob_by_key(creatorID)
/datum/reagent/fermi/enthrall/on_new(list/data)
- creatorID = data.["creatorID"]
- creatorGender = data.["creatorGender"]
- creatorName = data.["creatorName"]
+ creatorID = data["creatorID"]
+ creatorGender = data["creatorGender"]
+ creatorName = data["creatorName"]
creator = get_mob_by_key(creatorID)
/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
index dba09b28a6..5f3fc61fa7 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/eigentstasium.dm
@@ -32,7 +32,7 @@
can_synth = TRUE
/datum/reagent/fermi/eigenstate/on_new(list/data)
- location_created = data.["location_created"]
+ location_created = data["location_created"]
//Main functions
/datum/reagent/fermi/eigenstate/on_mob_life(mob/living/M) //Teleports to chemistry!
@@ -54,7 +54,7 @@
to_chat(M, "You feel your wavefunction split! ")
if(cached_purity > 0.9) //Teleports you home if it's pure enough
if(!location_created && data) //Just in case
- location_created = data.["location_created"]
+ location_created = data["location_created"]
log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
do_sparks(5,FALSE,M)
do_teleport(M, location_created, 0, asoundin = 'sound/effects/phasein.ogg')
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index d2f86e7919..76f29cb887 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -131,7 +131,7 @@
var/turf/open/location = get_turf(my_atom)
if(location)
E.location_created = location
- E.data.["location_created"] = location
+ E.data["location_created"] = location
//serum
@@ -312,16 +312,16 @@
for(var/mob/M in seen)
to_chat(M, "The reaction splutters and fails to react properly. ") //Just in case
E.purity = 0
- if (B.data.["gender"] == "female")
- E.data.["creatorGender"] = "Mistress"
+ if (B.data["gender"] == "female")
+ E.data["creatorGender"] = "Mistress"
E.creatorGender = "Mistress"
else
- E.data.["creatorGender"] = "Master"
+ E.data["creatorGender"] = "Master"
E.creatorGender = "Master"
- E.data["creatorName"] = B.data.["real_name"]
- E.creatorName = B.data.["real_name"]
- E.data.["creatorID"] = B.data.["ckey"]
- E.creatorID = B.data.["ckey"]
+ E.data["creatorName"] = B.data["real_name"]
+ E.creatorName = B.data["real_name"]
+ E.data["creatorID"] = B.data["ckey"]
+ E.creatorID = B.data["ckey"]
//So slimes can play too.
/datum/chemical_reaction/fermi/enthrall/slime
@@ -335,16 +335,16 @@
for(var/mob/M in seen)
to_chat(M, "The reaction splutters and fails to react. ") //Just in case
E.purity = 0
- if (B.data.["gender"] == "female")
- E.data.["creatorGender"] = "Mistress"
+ if (B.data["gender"] == "female")
+ E.data["creatorGender"] = "Mistress"
E.creatorGender = "Mistress"
else
- E.data.["creatorGender"] = "Master"
+ E.data["creatorGender"] = "Master"
E.creatorGender = "Master"
- E.data["creatorName"] = B.data.["real_name"]
- E.creatorName = B.data.["real_name"]
- E.data.["creatorID"] = B.data.["ckey"]
- E.creatorID = B.data.["ckey"]
+ E.data["creatorName"] = B.data["real_name"]
+ E.creatorName = B.data["real_name"]
+ E.data["creatorID"] = B.data["ckey"]
+ E.creatorID = B.data["ckey"]
/datum/chemical_reaction/fermi/enthrall/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)
var/turf/T = get_turf(my_atom)
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
index a66895f864..8ff4a3ddb5 100644
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and b/modular_citadel/icons/mob/mutant_bodyparts.dmi differ
diff --git a/modular_citadel/icons/mob/pai.dmi b/modular_citadel/icons/mob/pai.dmi
deleted file mode 100644
index d8162cb5a7..0000000000
Binary files a/modular_citadel/icons/mob/pai.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi
index fdcedac095..a5d37ba4a2 100644
Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ
diff --git a/modular_citadel/icons/obj/power.dmi b/modular_citadel/icons/obj/power.dmi
deleted file mode 100644
index d0066b96de..0000000000
Binary files a/modular_citadel/icons/obj/power.dmi and /dev/null differ
diff --git a/modular_citadel/icons/obj/tools.dmi b/modular_citadel/icons/obj/tools.dmi
deleted file mode 100644
index 7b99880799..0000000000
Binary files a/modular_citadel/icons/obj/tools.dmi and /dev/null differ
diff --git a/sound/weapons/Gunshot.ogg b/sound/weapons/Gunshot.ogg
index 4fd082ce7f..46369bbb62 100644
Binary files a/sound/weapons/Gunshot.ogg and b/sound/weapons/Gunshot.ogg differ
diff --git a/sound/weapons/Gunshot2.ogg b/sound/weapons/Gunshot2.ogg
index 2dfc6fc1e9..4801989d3d 100644
Binary files a/sound/weapons/Gunshot2.ogg and b/sound/weapons/Gunshot2.ogg differ
diff --git a/sound/weapons/Gunshot3.ogg b/sound/weapons/Gunshot3.ogg
index 97799dff10..66da509083 100644
Binary files a/sound/weapons/Gunshot3.ogg and b/sound/weapons/Gunshot3.ogg differ
diff --git a/sound/weapons/Gunshot4.ogg b/sound/weapons/Gunshot4.ogg
index 2d971f7b1a..322e5c0cbd 100644
Binary files a/sound/weapons/Gunshot4.ogg and b/sound/weapons/Gunshot4.ogg differ
diff --git a/sound/weapons/Gunshot_silenced.ogg b/sound/weapons/Gunshot_silenced.ogg
index ef250d86aa..13f3702fd4 100644
Binary files a/sound/weapons/Gunshot_silenced.ogg and b/sound/weapons/Gunshot_silenced.ogg differ
diff --git a/sound/weapons/Gunshot_smg.ogg b/sound/weapons/Gunshot_smg.ogg
index 5c0000bb32..ce03376b52 100644
Binary files a/sound/weapons/Gunshot_smg.ogg and b/sound/weapons/Gunshot_smg.ogg differ
diff --git a/sound/weapons/IonRifle.ogg b/sound/weapons/IonRifle.ogg
index b808068e55..37647c081f 100644
Binary files a/sound/weapons/IonRifle.ogg and b/sound/weapons/IonRifle.ogg differ
diff --git a/sound/weapons/Laser.ogg b/sound/weapons/Laser.ogg
index 0fbb611f9c..4ff9e82ff9 100644
Binary files a/sound/weapons/Laser.ogg and b/sound/weapons/Laser.ogg differ
diff --git a/sound/weapons/LaserSlugv3.ogg b/sound/weapons/LaserSlugv3.ogg
index dbb8f4b954..0c3de3d4fd 100644
Binary files a/sound/weapons/LaserSlugv3.ogg and b/sound/weapons/LaserSlugv3.ogg differ
diff --git a/sound/weapons/Taser.ogg b/sound/weapons/Taser.ogg
index 8992b71f50..4181715240 100644
Binary files a/sound/weapons/Taser.ogg and b/sound/weapons/Taser.ogg differ
diff --git a/sound/weapons/laser3.ogg b/sound/weapons/laser3.ogg
index 134be315fc..03d4d933f2 100644
Binary files a/sound/weapons/laser3.ogg and b/sound/weapons/laser3.ogg differ
diff --git a/sound/weapons/lasercannonfire.ogg b/sound/weapons/lasercannonfire.ogg
index 612d608db8..cbbc3ce53c 100644
Binary files a/sound/weapons/lasercannonfire.ogg and b/sound/weapons/lasercannonfire.ogg differ
diff --git a/sound/weapons/magpistol.ogg b/sound/weapons/magpistol.ogg
index c130714962..4b94aa1e0a 100644
Binary files a/sound/weapons/magpistol.ogg and b/sound/weapons/magpistol.ogg differ
diff --git a/sound/weapons/magrifle.ogg b/sound/weapons/magrifle.ogg
index 2ec2e72af6..67d6500a6c 100644
Binary files a/sound/weapons/magrifle.ogg and b/sound/weapons/magrifle.ogg differ
diff --git a/sound/weapons/pulse.ogg b/sound/weapons/pulse.ogg
index 617b903231..df7f96f7cf 100644
Binary files a/sound/weapons/pulse.ogg and b/sound/weapons/pulse.ogg differ
diff --git a/sound/weapons/pulse2.ogg b/sound/weapons/pulse2.ogg
index 44c46fc715..2e93bfd17f 100644
Binary files a/sound/weapons/pulse2.ogg and b/sound/weapons/pulse2.ogg differ
diff --git a/sound/weapons/pulse3.ogg b/sound/weapons/pulse3.ogg
index b275fba2a8..0484b2cc81 100644
Binary files a/sound/weapons/pulse3.ogg and b/sound/weapons/pulse3.ogg differ
diff --git a/sound/weapons/smg_empty_alarm.ogg b/sound/weapons/smg_empty_alarm.ogg
index f031b4e1d8..325cabe9d8 100644
Binary files a/sound/weapons/smg_empty_alarm.ogg and b/sound/weapons/smg_empty_alarm.ogg differ
diff --git a/sound/weapons/taser2.ogg b/sound/weapons/taser2.ogg
index 2cdab84378..e522043e9b 100644
Binary files a/sound/weapons/taser2.ogg and b/sound/weapons/taser2.ogg differ
diff --git a/strings/clockwork_cult_changelog.txt b/strings/clockwork_cult_changelog.txt
index 3c5e5f5ef6..10e924ff00 100644
--- a/strings/clockwork_cult_changelog.txt
+++ b/strings/clockwork_cult_changelog.txt
@@ -2,3 +2,7 @@ Stargazers have been removed. Integration cogs are now the primary way of creati
Brass Skewers now deal damage to mechs.
Mech Sensors are now available. They're similar to pressure sensors, but trigger if a mech steps on them, and can be built the same way.
Power nullifiers are now available. Upon triggering, they send out a small 3x3 EMP, affecting cultists and enemies alike.
+Zelus oil: A new reagent. It can be used to heal the faithful to Ratvar, 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.
diff --git a/tgstation.dme b/tgstation.dme
index f90c6a6b42..f5dc622315 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3010,7 +3010,6 @@
#include "modular_citadel\code\game\machinery\wishgranter.dm"
#include "modular_citadel\code\game\objects\cit_screenshake.dm"
#include "modular_citadel\code\game\objects\items.dm"
-#include "modular_citadel\code\game\objects\tools.dm"
#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
@@ -3026,9 +3025,6 @@
#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm"
#include "modular_citadel\code\modules\admin\admin.dm"
#include "modular_citadel\code\modules\admin\chat_commands.dm"
#include "modular_citadel\code\modules\admin\holder2.dm"