", "\[cell\]")
text = replacetext(text, "", "\[logo\]")
return text
+
+#define string2charlist(string) (splittext(string, regex("(\\x0A|.)")) - splittext(string, ""))
\ No newline at end of file
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 20c707b38f7..35d271461df 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -170,9 +170,12 @@ Turf and target are seperate in case you want to teleport some distance from a t
// Checks if doors are open
/proc/DirBlocked(turf/loc,var/dir)
for(var/obj/structure/window/D in loc)
- if(!D.density) continue
- if(D.is_fulltile()) return 1
- if(D.dir == dir) return 1
+ if(!D.density)
+ continue
+ if(D.fulltile)
+ return 1
+ if(D.dir == dir)
+ return 1
for(var/obj/machinery/door/D in loc)
if(!D.density)//if the door is open
@@ -1052,6 +1055,8 @@ proc/get_mob_with_client_list()
//Find coordinates
var/turf/T = get_turf(AM) //use AM's turfs, as it's coords are the same as AM's AND AM's coords are lost if it is inside another atom
+ if(!T)
+ return null
var/final_x = T.x + rough_x
var/final_y = T.y + rough_y
@@ -1500,6 +1505,22 @@ var/mob/dview/dview_mob = new
return TRUE
return FALSE
+//can a window be here, or is there a window blocking it?
+/proc/valid_window_location(turf/T, dir_to_check)
+ if(!T)
+ return FALSE
+ for(var/obj/O in T)
+ if(istype(O, /obj/machinery/door/window) && (O.dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR))
+ return FALSE
+ if(istype(O, /obj/structure/windoor_assembly))
+ var/obj/structure/windoor_assembly/W = O
+ if(W.ini_dir == dir_to_check || dir_to_check == FULLTILE_WINDOW_DIR)
+ return FALSE
+ if(istype(O, /obj/structure/window))
+ var/obj/structure/window/W = O
+ if(W.ini_dir == dir_to_check || W.ini_dir == FULLTILE_WINDOW_DIR || dir_to_check == FULLTILE_WINDOW_DIR)
+ return FALSE
+ return TRUE
//Get the dir to the RIGHT of dir if they were on a clock
//NORTH --> NORTHEAST
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index d26dc711339..1e35e150a25 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -2,6 +2,7 @@ var/datum/configuration/config = null
var/host = null
var/join_motd = null
+GLOBAL_VAR(join_tos)
var/game_version = "Custom ParaCode"
var/changelog_hash = md5('html/changelog.html') //used to check if the CL changed
var/game_year = (text2num(time2text(world.realtime, "YYYY")) + 544)
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index f96e83cb7a1..c48600ca40c 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -10,7 +10,6 @@ GLOBAL_VAR(world_href_log)
GLOBAL_PROTECT(world_href_log)
var/list/jobMax = list()
-var/list/bombers = list( )
var/list/admin_log = list ( )
var/list/lastsignalers = list( ) //keeps last 100 signals here in format: "[src] used \ref[src] @ location [src.loc]: [freq]/[code]"
var/list/lawchanges = list( ) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
@@ -20,4 +19,4 @@ var/list/IClog = list()
var/list/OOClog = list()
var/list/adminlog = list()
-var/list/investigate_log_subjects = list("notes", "watchlist", "hrefs")
\ No newline at end of file
+var/list/investigate_log_subjects = list("notes", "watchlist", "hrefs")
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index d88ff6201f8..b2521527a98 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -35,6 +35,17 @@
return
var/turf/pixel_turf = get_turf_pixel(A)
+ if(isnull(pixel_turf))
+ return
+ if(!can_see(A))
+ if(isturf(A)) //On unmodified clients clicking the static overlay clicks the turf underneath
+ return // So there's no point messaging admins
+ message_admins("[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
+ var/message = "[key_name(src)] might be running a modified client! (failed can_see on AI click of [A]([COORD(pixel_turf)]))"
+ log_admin(message)
+ send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
+
+
var/turf_visible
if(pixel_turf)
turf_visible = cameranet.checkTurfVis(pixel_turf)
@@ -157,9 +168,6 @@
return
/atom/proc/AICtrlClick(var/mob/living/silicon/ai/user)
- if(user.holo)
- var/obj/machinery/hologram/holopad/H = user.holo
- H.face_atom(src)
return
/obj/machinery/door/airlock/AICtrlClick() // Bolts doors
diff --git a/code/_onclick/click_override.dm b/code/_onclick/click_override.dm
index 5fb4757a74f..7dfa8020cb8 100644
--- a/code/_onclick/click_override.dm
+++ b/code/_onclick/click_override.dm
@@ -39,7 +39,7 @@
var/atom/movable/newObject = new summon_path
newObject.loc = get_turf(A)
to_chat(user, "You release the power you had stored up, summoning \a [newObject.name]! ")
- usr.loc.visible_message("[user] waves \his hand and summons \a [newObject.name]")
+ usr.loc.visible_message("[user] waves [user.p_their()] hand and summons \a [newObject.name]")
..()
/datum/middleClickOverride/power_gloves
diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm
index 315fce5bf65..668e0e67fc7 100644
--- a/code/_onclick/hud/movable_screen_objects.dm
+++ b/code/_onclick/hud/movable_screen_objects.dm
@@ -11,6 +11,8 @@
/obj/screen/movable
var/snap2grid = FALSE
var/moved = FALSE
+ var/x_off = -16
+ var/y_off = -16
//Snap Screen Object
//Tied to the grid, snaps to the nearest turf
@@ -39,8 +41,8 @@
screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]"
else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off)
- var/pix_X = text2num(screen_loc_X[2]) - 16
- var/pix_Y = text2num(screen_loc_Y[2]) - 16
+ var/pix_X = text2num(screen_loc_X[2]) + x_off
+ var/pix_Y = text2num(screen_loc_Y[2]) + y_off
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
moved = screen_loc
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index bf01bca6e3c..ddd6e14a5b0 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -65,7 +65,8 @@
user.do_attack_animation(M)
M.attacked_by(src, user, def_zone)
- add_attack_logs(user, M, "Attacked with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])", admin_notify = (force > 0 && damtype != STAMINA))
+ add_attack_logs(user, M, "Attacked with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])", (M.ckey && force > 0 && damtype != STAMINA) ? null : ATKLOG_ALMOSTALL)
+
add_fingerprint(user)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 87b78259593..dcac994c7c7 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -12,6 +12,11 @@
if(proximity && istype(G) && G.Touch(A, 1))
return
+ if(HULK in mutations)
+ if(proximity) //no telekinetic hulk attack
+ if(A.attack_hulk(src))
+ return
+
A.attack_hand(src)
/atom/proc/attack_hand(mob/user as mob)
diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm
deleted file mode 100644
index 1667af943da..00000000000
--- a/code/controllers/Processes/nanoui.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/datum/controller/process/nanoui/setup()
- name = "nanoui"
- schedule_interval = 20 // every 2 seconds
-
-/datum/controller/process/nanoui/statProcess()
- ..()
- stat(null, "[nanomanager.processing_uis.len] UIs")
-
-/datum/controller/process/nanoui/doWork()
- for(last_object in nanomanager.processing_uis)
- var/datum/nanoui/NUI = last_object
- if(istype(NUI) && isnull(NUI.gcDestroyed))
- try
- NUI.process()
- catch(var/exception/e)
- catchException(e, NUI)
- else
- catchBadType(NUI)
- nanomanager.processing_uis -= NUI
diff --git a/code/controllers/Processes/weather.dm b/code/controllers/Processes/weather.dm
deleted file mode 100644
index 919352313c6..00000000000
--- a/code/controllers/Processes/weather.dm
+++ /dev/null
@@ -1,54 +0,0 @@
-//Used for all kinds of weather, ex. lavaland ash storms.
-// TODO: This could probably be better-integrated with the space manager
-var/global/datum/controller/process/weather/weather_master
-
-/datum/controller/process/weather
- var/list/processing_weather = list()
- var/list/existing_weather = list()
- var/list/eligible_zlevels = list()
-
-/datum/controller/process/weather/setup()
- name = "weather"
- schedule_interval = 10
-
- for(var/V in subtypesof(/datum/weather))
- var/datum/weather/W = V
- existing_weather |= new W
-
-/datum/controller/process/weather/statProcess()
- ..()
- stat(null, "[processing_weather.len] weather")
-
-/datum/controller/process/weather/doWork()
- for(var/V in processing_weather)
- var/datum/weather/W = V
- if(W.aesthetic)
- continue
- for(var/mob/living/L in mob_list)
- if(W.can_impact(L))
- W.impact(L)
- SCHECK
- for(var/Z in eligible_zlevels)
- var/list/possible_weather_for_this_z = list()
- for(var/V in existing_weather)
- var/datum/weather/WE = V
- if(WE.target_z == Z && WE.probability) //Another check so that it doesn't run extra weather
- possible_weather_for_this_z[WE] = WE.probability
- var/datum/weather/W = pickweight(possible_weather_for_this_z)
- run_weather(W.name)
- eligible_zlevels -= Z
- addtimer(CALLBACK(src, .proc/make_z_eligible, Z), rand(3000, 6000) + W.weather_duration_upper, TIMER_UNIQUE) //Around 5-10 minutes between weathers
-
-DECLARE_GLOBAL_CONTROLLER(weather, weather_master)
-
-/datum/controller/process/weather/proc/run_weather(weather_name)
- if(!weather_name)
- return
- for(var/V in existing_weather)
- var/datum/weather/W = V
- if(W.name == weather_name)
- W.telegraph()
- SCHECK
-
-/datum/controller/process/weather/proc/make_z_eligible(zlevel)
- eligible_zlevels |= zlevel
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 4c2774d58db..d46ec164e35 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -367,5 +367,5 @@ SUBSYSTEM_DEF(air)
#undef SSAIR_ACTIVETURFS
#undef SSAIR_EXCITEDGROUPS
#undef SSAIR_HIGHPRESSURE
-#undef SSAIR_HOTSPOT
+#undef SSAIR_HOTSPOTS
#undef SSAIR_SUPERCONDUCTIVITY
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
new file mode 100644
index 00000000000..4f5798e4ae4
--- /dev/null
+++ b/code/controllers/subsystem/weather.dm
@@ -0,0 +1,83 @@
+#define STARTUP_STAGE 1
+#define MAIN_STAGE 2
+#define WIND_DOWN_STAGE 3
+#define END_STAGE 4
+
+//Used for all kinds of weather, ex. lavaland ash storms.
+SUBSYSTEM_DEF(weather)
+ name = "Weather"
+ flags = SS_BACKGROUND
+ wait = 10
+ runlevels = RUNLEVEL_GAME
+ var/list/processing = list()
+ var/list/eligible_zlevels = list()
+ var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
+
+/datum/controller/subsystem/weather/fire()
+ // process active weather
+ for(var/V in processing)
+ var/datum/weather/W = V
+ if(W.aesthetic || W.stage != MAIN_STAGE)
+ continue
+ for(var/i in living_mob_list)
+ var/mob/living/L = i
+ if(W.can_weather_act(L))
+ W.weather_act(L)
+
+ // start random weather on relevant levels
+ for(var/z in eligible_zlevels)
+ var/possible_weather = eligible_zlevels[z]
+ var/datum/weather/W = pickweight(possible_weather)
+ run_weather(W, list(text2num(z)))
+ eligible_zlevels -= z
+ var/randTime = rand(3000, 6000)
+ addtimer(CALLBACK(src, .proc/make_eligible, z, possible_weather), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
+ next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
+
+/datum/controller/subsystem/weather/Initialize(start_timeofday)
+ for(var/V in subtypesof(/datum/weather))
+ var/datum/weather/W = V
+ var/probability = initial(W.probability)
+ var/target_trait = initial(W.target_trait)
+
+ // any weather with a probability set may occur at random
+ if(probability)
+ for(var/z in levels_by_trait(target_trait))
+ LAZYINITLIST(eligible_zlevels["[z]"])
+ eligible_zlevels["[z]"][W] = probability
+ ..()
+
+/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels)
+ if(istext(weather_datum_type))
+ for(var/V in subtypesof(/datum/weather))
+ var/datum/weather/W = V
+ if(initial(W.name) == weather_datum_type)
+ weather_datum_type = V
+ break
+ if(!ispath(weather_datum_type, /datum/weather))
+ CRASH("run_weather called with invalid weather_datum_type: [weather_datum_type || "null"]")
+ return
+
+ if(isnull(z_levels))
+ z_levels = levels_by_trait(initial(weather_datum_type.target_trait))
+ else if(isnum(z_levels))
+ z_levels = list(z_levels)
+ else if(!islist(z_levels))
+ CRASH("run_weather called with invalid z_levels: [z_levels || "null"]")
+ return
+
+ var/datum/weather/W = new weather_datum_type(z_levels)
+ W.telegraph()
+
+/datum/controller/subsystem/weather/proc/make_eligible(z, possible_weather)
+ eligible_zlevels[z] = possible_weather
+ next_hit_by_zlevel["[z]"] = null
+
+/datum/controller/subsystem/weather/proc/get_weather(z, area/active_area)
+ var/datum/weather/A
+ for(var/V in processing)
+ var/datum/weather/W = V
+ if((z in W.impacted_z_levels) && W.area_type == active_area.type)
+ A = W
+ break
+ return A
\ No newline at end of file
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 3315cafb399..4e9380e2fed 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -94,7 +94,7 @@
debug_variables(SStimer)
feedback_add_details("admin_verb","DTimer")
if("Weather")
- debug_variables(weather_master)
+ debug_variables(SSweather)
feedback_add_details("admin_verb","DWeather")
if("Space")
debug_variables(space_manager)
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 71c1bd74a28..435ccad80cd 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -438,5 +438,3 @@ var/list/advance_cures = list(
var/datum/symptom/S = i
total_transmittable += S.transmittable
return total_transmittable
-
-#undef RANDOM_STARTING_LEVEL
diff --git a/code/datums/diseases/berserker.dm b/code/datums/diseases/berserker.dm
index 646d64b78f2..3efb4d9e06a 100644
--- a/code/datums/diseases/berserker.dm
+++ b/code/datums/diseases/berserker.dm
@@ -48,8 +48,8 @@
var/damage = rand(1, 5)
if(prob(80))
playsound(affected_mob.loc, "punch", 25, 1, -1)
- affected_mob.visible_message("[affected_mob] hits [M] with their thrashing!")
+ affected_mob.visible_message("[affected_mob] hits [M] with [affected_mob.p_their()] thrashing!")
M.adjustBruteLoss(damage)
else
playsound(affected_mob.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- affected_mob.visible_message("[affected_mob] fails to hit [M] with their thrashing!")
\ No newline at end of file
+ affected_mob.visible_message("[affected_mob] fails to hit [M] with [affected_mob.p_their()] thrashing!")
\ No newline at end of file
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
new file mode 100644
index 00000000000..a98a65cb1a2
--- /dev/null
+++ b/code/datums/holocall.dm
@@ -0,0 +1,190 @@
+#define HOLOPAD_MAX_DIAL_TIME 200
+
+/mob/camera/aiEye/remote/holo/setLoc()
+ . = ..()
+ var/obj/machinery/hologram/holopad/H = origin
+ H.move_hologram(eye_user, loc)
+
+//this datum manages it's own references
+
+/datum/holocall
+ var/mob/living/user //the one that called
+ var/obj/machinery/hologram/holopad/calling_holopad //the one that sent the call
+ var/obj/machinery/hologram/holopad/connected_holopad //the one that answered the call (may be null)
+ var/list/dialed_holopads //all things called, will be cleared out to just connected_holopad once answered
+
+ var/mob/camera/aiEye/remote/holo/eye //user's eye, once connected
+ var/obj/effect/overlay/holo_pad_hologram/hologram //user's hologram, once connected
+ var/datum/action/innate/end_holocall/hangup //hangup action
+
+ var/call_start_time
+
+//creates a holocall made by `caller` from `calling_pad` to `callees`
+/datum/holocall/New(mob/living/caller, obj/machinery/hologram/holopad/calling_pad, list/callees)
+ call_start_time = world.time
+ user = caller
+ calling_pad.outgoing_call = src
+ calling_holopad = calling_pad
+ dialed_holopads = list()
+
+ for(var/I in callees)
+ var/obj/machinery/hologram/holopad/H = I
+ if(!QDELETED(H) && !(H.stat & NOPOWER))
+ dialed_holopads += H
+ var/area/area = get_area(H)
+ LAZYADD(H.holo_calls, src)
+ H.atom_say("[area] pad beeps: Incoming call from [caller]!")
+
+ if(!dialed_holopads.len)
+ calling_holopad.atom_say("Connection failure.")
+ qdel(src)
+ return
+
+//cleans up ALL references :)
+/datum/holocall/Destroy()
+ QDEL_NULL(hangup)
+
+ var/user_good = !QDELETED(user)
+ if(user_good)
+ user.reset_perspective()
+ user.remote_control = null
+
+ if(!QDELETED(eye))
+ eye.RemoveImages()
+ QDEL_NULL(eye)
+
+ if(connected_holopad && !QDELETED(hologram))
+ hologram = null
+ connected_holopad.clear_holo(user)
+
+ user = null
+
+ //Hologram survived holopad destro
+ if(!QDELETED(hologram))
+ hologram.HC = null
+ QDEL_NULL(hologram)
+
+
+ for(var/I in dialed_holopads)
+ var/obj/machinery/hologram/holopad/H = I
+ LAZYREMOVE(H.holo_calls, src)
+ dialed_holopads.Cut()
+
+ if(calling_holopad)
+ calling_holopad.outgoing_call = null
+ calling_holopad.SetLightsAndPower()
+ calling_holopad = null
+ if(connected_holopad)
+ connected_holopad.SetLightsAndPower()
+ connected_holopad = null
+
+
+ return ..()
+
+
+//Gracefully disconnects a holopad `H` from a call. Pads not in the call are ignored. Notifies participants of the disconnection
+/datum/holocall/proc/Disconnect(obj/machinery/hologram/holopad/H)
+ if(H == connected_holopad)
+ var/area/A = get_area(connected_holopad)
+ calling_holopad.atom_say("[A] holopad disconnected.")
+ else if(H == calling_holopad && connected_holopad)
+ connected_holopad.atom_say("[user] disconnected.")
+
+ user.unset_machine(H)
+ if(istype(hangup))
+ hangup.Remove(user)
+
+ ConnectionFailure(H, TRUE)
+
+//Forcefully disconnects a holopad `H` from a call. Pads not in the call are ignored.
+/datum/holocall/proc/ConnectionFailure(obj/machinery/hologram/holopad/H, graceful = FALSE)
+ if(H == connected_holopad || H == calling_holopad)
+ if(!graceful && H != calling_holopad)
+ calling_holopad.atom_say("Connection failure.")
+ qdel(src)
+ return
+
+ LAZYREMOVE(H.holo_calls, src)
+ dialed_holopads -= H
+ if(!dialed_holopads.len)
+ if(graceful)
+ calling_holopad.atom_say("Call rejected.")
+ qdel(src)
+
+//Answers a call made to a holopad `H` which cannot be the calling holopad. Pads not in the call are ignored
+/datum/holocall/proc/Answer(obj/machinery/hologram/holopad/H)
+ if(H == calling_holopad)
+ return
+
+ if(!(H in dialed_holopads))
+ return
+
+ if(connected_holopad)
+ return
+
+ for(var/I in dialed_holopads)
+ if(I == H)
+ continue
+ Disconnect(I)
+
+ for(var/I in H.holo_calls)
+ var/datum/holocall/HC = I
+ if(HC != src)
+ HC.Disconnect(H)
+
+ connected_holopad = H
+
+ if(!Check())
+ return
+
+ hologram = H.activate_holo(user)
+ hologram.HC = src
+
+ user.unset_machine(H)
+ //eyeobj code is horrid, this is the best copypasta I could make
+ eye = new()
+ eye.origin = H
+ eye.eye_initialized = TRUE
+ eye.eye_user = user
+ eye.name = "Camera Eye ([user.name])"
+ user.remote_control = eye
+ user.remote_view = 1
+ user.reset_perspective(eye)
+ eye.setLoc(get_turf(H))
+
+ hangup = new(eye,src)
+ hangup.Grant(user)
+
+//Checks the validity of a holocall and qdels itself if it's not. Returns TRUE if valid, FALSE otherwise
+/datum/holocall/proc/Check()
+ for(var/I in dialed_holopads)
+ var/obj/machinery/hologram/holopad/H = I
+ if((H.stat & NOPOWER))
+ ConnectionFailure(H)
+
+ if(QDELETED(src))
+ return FALSE
+
+ . = !QDELETED(user) && !user.incapacitated() && !QDELETED(calling_holopad) && !(calling_holopad.stat & NOPOWER) && user.loc == calling_holopad.loc
+
+ if(.)
+ if(!connected_holopad)
+ . = world.time < (call_start_time + HOLOPAD_MAX_DIAL_TIME)
+ if(!.)
+ calling_holopad.atom_say("No answer received.")
+ calling_holopad.temp = ""
+
+ else if(!.)
+ qdel(src)
+
+/datum/action/innate/end_holocall
+ name = "End Holocall"
+ button_icon_state = "camera_off"
+ var/datum/holocall/hcall
+
+/datum/action/innate/end_holocall/New(Target, datum/holocall/HC)
+ ..()
+ hcall = HC
+
+/datum/action/innate/end_holocall/Activate()
+ hcall.Disconnect(hcall.calling_holopad)
diff --git a/code/datums/looping_sounds/weather.dm b/code/datums/looping_sounds/weather.dm
new file mode 100644
index 00000000000..d355bc59c14
--- /dev/null
+++ b/code/datums/looping_sounds/weather.dm
@@ -0,0 +1,47 @@
+/datum/looping_sound/active_outside_ashstorm
+ mid_sounds = list(
+ 'sound/weather/ashstorm/outside/active_mid1.ogg' = 1,
+ 'sound/weather/ashstorm/outside/active_mid1.ogg' = 1,
+ 'sound/weather/ashstorm/outside/active_mid1.ogg' = 1
+ )
+ mid_length = 80
+ start_sound = 'sound/weather/ashstorm/outside/active_start.ogg'
+ start_length = 130
+ end_sound = 'sound/weather/ashstorm/outside/active_end.ogg'
+ volume = 80
+
+/datum/looping_sound/active_inside_ashstorm
+ mid_sounds = list(
+ 'sound/weather/ashstorm/inside/active_mid1.ogg' = 1,
+ 'sound/weather/ashstorm/inside/active_mid2.ogg' = 1,
+ 'sound/weather/ashstorm/inside/active_mid3.ogg' = 1
+ )
+ mid_length = 80
+ start_sound = 'sound/weather/ashstorm/inside/active_start.ogg'
+ start_length = 130
+ end_sound = 'sound/weather/ashstorm/inside/active_end.ogg'
+ volume = 60
+
+/datum/looping_sound/weak_outside_ashstorm
+ mid_sounds = list(
+ 'sound/weather/ashstorm/outside/weak_mid1.ogg' = 1,
+ 'sound/weather/ashstorm/outside/weak_mid2.ogg' = 1,
+ 'sound/weather/ashstorm/outside/weak_mid3.ogg' = 1
+ )
+ mid_length = 80
+ start_sound = 'sound/weather/ashstorm/outside/weak_start.ogg'
+ start_length = 130
+ end_sound = 'sound/weather/ashstorm/outside/weak_end.ogg'
+ volume = 50
+
+/datum/looping_sound/weak_inside_ashstorm
+ mid_sounds = list(
+ 'sound/weather/ashstorm/inside/weak_mid1.ogg' = 1,
+ 'sound/weather/ashstorm/inside/weak_mid2.ogg' = 1,
+ 'sound/weather/ashstorm/inside/weak_mid3.ogg' = 1
+ )
+ mid_length = 80
+ start_sound = 'sound/weather/ashstorm/inside/weak_start.ogg'
+ start_length = 130
+ end_sound = 'sound/weather/ashstorm/inside/weak_end.ogg'
+ volume = 30
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 08bd6252d99..3f62c8ffaed 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -177,7 +177,7 @@
if(ismindshielded(H))
text = "Mindshield Implant:Remove|Implanted"
else
- text = "Mindshield Implant:No Implant|Implant him!"
+ text = "Mindshield Implant:No Implant|Implant [H.p_them()]!"
sections["implant"] = text
/** REVOLUTION ***/
text = "revolution"
@@ -483,9 +483,11 @@
var/new_memo = copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN)
if(isnull(new_memo))
return
- memory = new_memo
- log_admin("[key_name(usr)] has edited [key_name(current)]'s memory")
- message_admins("[key_name_admin(usr)] has edited [key_name_admin(current)]'s memory")
+ var/confirmed = alert(usr, "Are you sure?", "Edit Memory", "Yes", "No")
+ if(confirmed == "Yes") // Because it is too easy to accidentally wipe someone's memory
+ memory = new_memo
+ log_admin("[key_name(usr)] has edited [key_name(current)]'s memory")
+ message_admins("[key_name_admin(usr)] has edited [key_name_admin(current)]'s memory")
else if(href_list["obj_edit"] || href_list["obj_add"])
var/datum/objective/objective
@@ -630,7 +632,7 @@
new_objective = new /datum/objective/escape/escape_with_identity
new_objective.owner = src
new_objective.target = new_target
- new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing their identification card."
+ new_objective.explanation_text = "Escape on the shuttle or an escape pod with the identity of [targ.current.real_name], the [targ.assigned_role] while wearing [targ.current.p_their()] identification card."
if("custom")
var/expl = sanitize(copytext(input("Custom objective:", "Objective", objective ? objective.explanation_text : "") as text|null,1,MAX_MESSAGE_LEN))
if(!expl)
@@ -742,7 +744,7 @@
if(src in ticker.mode.revolutionaries)
ticker.mode.revolutionaries -= src
ticker.mode.update_rev_icons_removed(src)
- to_chat(current, "\red You have proven your devotion to revolution! You are a head revolutionary now!")
+ to_chat(current, "You have proven your devotion to revolution! You are a head revolutionary now!")
else if(!(src in ticker.mode.head_revolutionaries))
to_chat(current, "You are a member of the revolutionaries' leadership now!")
else
@@ -1217,12 +1219,8 @@
message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] an uplink")
else if(href_list["obj_announce"])
- var/obj_count = 1
- to_chat(current, " Your current objectives:")
- for(var/datum/objective/objective in objectives)
- to_chat(current, "Objective #[obj_count]: [objective.explanation_text]")
- obj_count++
- current << 'sound/ambience/alarm4.ogg'
+ announce_objectives()
+ SEND_SOUND(current, sound('sound/ambience/alarm4.ogg'))
log_admin("[key_name(usr)] has announced [key_name(current)]'s objectives")
message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives")
@@ -1282,6 +1280,14 @@
else if(A.type == datum_type)
return A
+/datum/mind/proc/announce_objectives()
+ var/obj_count = 1
+ to_chat(current, "Your current objectives:")
+ for(var/objective in objectives)
+ var/datum/objective/O = objective
+ to_chat(current, "Objective #[obj_count]: [O.explanation_text]")
+ obj_count++
+
/datum/mind/proc/find_syndicate_uplink()
var/list/L = current.get_contents()
for(var/obj/item/I in L)
@@ -1294,7 +1300,7 @@
if(H)
qdel(H)
-/datum/mind/proc/make_Tratior()
+/datum/mind/proc/make_Traitor()
if(!(src in ticker.mode.traitors))
ticker.mode.traitors += src
special_role = SPECIAL_ROLE_TRAITOR
@@ -1334,7 +1340,16 @@
ticker.mode.equip_syndicate(current)
-/datum/mind/proc/make_Changling()
+/datum/mind/proc/make_Vampire()
+ if(!(src in ticker.mode.vampires))
+ ticker.mode.vampires += src
+ ticker.mode.grant_vampire_powers(current)
+ special_role = SPECIAL_ROLE_VAMPIRE
+ ticker.mode.forge_vampire_objectives(src)
+ ticker.mode.greet_vampire(src)
+ ticker.mode.update_change_icons_added(src)
+
+/datum/mind/proc/make_Changeling()
if(!(src in ticker.mode.changelings))
ticker.mode.changelings += src
ticker.mode.grant_changeling_powers(current)
@@ -1363,42 +1378,6 @@
ticker.mode.greet_wizard(src)
ticker.mode.update_wiz_icons_added(src)
-
-/datum/mind/proc/make_Cultist()
- if(!(src in ticker.mode.cult))
- ticker.mode.cult += src
- ticker.mode.update_cult_icons_added(src)
- special_role = SPECIAL_ROLE_CULTIST
- to_chat(current, "You catch a glimpse of the Realm of [ticker.cultdat.entity_name], [ticker.cultdat.entity_title2]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.cultdat.entity_name].")
- to_chat(current, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.")
- var/datum/game_mode/cult/cult = ticker.mode
- if(GAMEMODE_IS_CULT)
- cult.memorize_cult_objectives(src)
- else
- var/explanation = "Summon [ticker.cultdat.entity_name] via the use of the appropriate rune. It will only work if nine cultists stand on and around it."
- to_chat(current, "Objective #1: [explanation]")
- current.memory += "Objective #1: [explanation] "
-
-
- var/mob/living/carbon/human/H = current
- if(istype(H))
- var/obj/item/tome/T = new(H)
-
- var/list/slots = list (
- "backpack" = slot_in_backpack,
- "left pocket" = slot_l_store,
- "right pocket" = slot_r_store,
- "left hand" = slot_l_hand,
- "right hand" = slot_r_hand,
- )
- var/where = H.equip_in_one_of_slots(T, slots)
- if(!where)
- else
- to_chat(H, "A tome, a message from your new master, appears in your [where].")
-
- if(!ticker.mode.equip_cultist(current))
- to_chat(H, "Summoning an amulet from your Master failed.")
-
/datum/mind/proc/make_Rev()
if(ticker.mode.head_revolutionaries.len>0)
// copy targets
@@ -1549,7 +1528,7 @@
ticker.mode.implanter[ref] = implanters
ticker.mode.traitors += src
special_role = "traitor"
- to_chat(current, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect them and assist in their goals at any cost.")
+ to_chat(current, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect [missionary.p_them()] and assist in [missionary.p_their()] goals at any cost.")
var/datum/objective/protect/mindslave/MS = new
MS.owner = src
MS.target = missionary.mind
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index cc3b85bf94e..e46ad460490 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -171,10 +171,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
/obj/effect/proc_holder/spell/proc/invocation(mob/user = usr) //spelling the spell out and setting it on recharge/reducing charges amount
switch(invocation_type)
if("shout")
- if(prob(50))//Auto-mute? Fuck that noise
- user.say(invocation)
+ if(!user.IsVocal())
+ user.emote("makes frantic gestures!")
else
- user.say(replacetext(invocation," ","`"))
+ if(prob(50))//Auto-mute? Fuck that noise
+ user.say(invocation)
+ else
+ user.say(replacetext(invocation," ","`"))
if("whisper")
if(prob(50))
user.whisper(invocation)
diff --git a/code/datums/spells/emplosion.dm b/code/datums/spells/emplosion.dm
index 1ba430ad27e..b2f0a228282 100644
--- a/code/datums/spells/emplosion.dm
+++ b/code/datums/spells/emplosion.dm
@@ -10,6 +10,6 @@
/obj/effect/proc_holder/spell/targeted/emplosion/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
- empulse(target.loc, emp_heavy, emp_light)
+ empulse(target.loc, emp_heavy, emp_light, 1)
- return
\ No newline at end of file
+ return
diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm
index 296521405a0..19b30674bf6 100644
--- a/code/datums/spells/mime.dm
+++ b/code/datums/spells/mime.dm
@@ -21,7 +21,7 @@
if(!usr.mind.miming)
to_chat(usr, "You must dedicate yourself to silence first.")
return
- invocation = "[usr.real_name] looks as if a wall is in front of them."
+ invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]."
else
invocation_type ="none"
..()
diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm
index 2a8408dfe4a..d6a48d25c68 100644
--- a/code/datums/spells/mind_transfer.dm
+++ b/code/datums/spells/mind_transfer.dm
@@ -32,7 +32,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
if(!target.key || !target.mind)
- to_chat(user, "They appear to be catatonic. Not even magic can affect their vacant mind.")
+ to_chat(user, "[target.p_they(TRUE)] appear[target.p_s()] to be catatonic. Not even magic can affect [target.p_their()] vacant mind.")
return
if(user.suiciding)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 103885c0c8c..ad805374751 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -100,6 +100,7 @@ var/list/uplink_items = list()
if(I)
if(ishuman(user))
var/mob/living/carbon/human/A = user
+ log_game("[key_name(user)] purchased [I.name]")
A.put_in_any_hand_if_possible(I)
if(istype(I,/obj/item/storage/box/) && I.contents.len>0)
@@ -1337,7 +1338,7 @@ var/list/uplink_items = list()
/datum/uplink_item/badass/rapid
name = "Gloves of the North Star"
- desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed."
+ desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
reference = "RPGD"
item = /obj/item/clothing/gloves/fingerless/rapid
cost = 8
@@ -1424,6 +1425,7 @@ var/list/uplink_items = list()
for(var/category in temp_uplink_list)
buyable_items += temp_uplink_list[category]
var/list/bought_items = list()
+ var/list/itemlog = list()
U.uses -= cost
U.used_TC = 20
var/remaining_TC = 50
@@ -1439,8 +1441,10 @@ var/list/uplink_items = list()
continue
bought_items += I.item
remaining_TC -= I.cost
+ itemlog += I.name // To make the name more readable for the log compared to just i.item
U.purchase_log += "[bicon(C)]"
for(var/item in bought_items)
new item(C)
U.purchase_log += "[bicon(item)]"
+ log_game("[key_name(usr)] purchased a surplus crate with [jointext(itemlog, ", ")]")
diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm
index 320cc137806..7ee152648c2 100644
--- a/code/datums/weather/weather.dm
+++ b/code/datums/weather/weather.dm
@@ -1,10 +1,5 @@
//The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures.
-#define STARTUP_STAGE 1
-#define MAIN_STAGE 2
-#define WIND_DOWN_STAGE 3
-#define END_STAGE 4
-
/datum/weather
var/name = "space wind"
var/desc = "Heavy gusts of wind blanket the area, periodically knocking down anyone caught in the open."
@@ -29,24 +24,25 @@
var/area_type = /area/space //Types of area to affect
var/list/impacted_areas = list() //Areas to be affected by the weather, calculated when the weather begins
- var/target_z = MAIN_STATION //The z-level to affect
var/list/protected_areas = list()//Areas that are protected and excluded from the affected areas.
+ var/impacted_z_levels // The list of z-levels that this weather is actively affecting
- var/overlay_layer = 10 //Since it's above everything else, this is the layer used by default. 2 is below mobs and walls if you need to use that.
+ var/overlay_layer = AREA_LAYER //Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that.
var/aesthetic = FALSE //If the weather has no purpose other than looks
var/immunity_type = "storm" //Used by mobs to prevent them from being affected by the weather
var/stage = END_STAGE //The stage of the weather, from 1-4
- var/probability = FALSE //Percent chance to happen if there are other possible weathers on the z-level
+ // These are read by the weather subsystem and used to determine when and where to run the weather.
+ var/probability = 0 // Weight amongst other eligible weather. If zero, will never happen randomly.
+ var/target_trait = STATION_LEVEL // The z-level trait to affect when run randomly or when not overridden.
-/datum/weather/New()
+ var/barometer_predictable = FALSE
+ var/next_hit_time = 0 //For barometers to know when the next storm will hit
+
+/datum/weather/New(z_levels)
..()
- weather_master.existing_weather |= src
-
-/datum/weather/Destroy()
- weather_master.existing_weather -= src
- return ..()
+ impacted_z_levels = z_levels
/datum/weather/proc/telegraph()
if(stage == STARTUP_STAGE)
@@ -59,17 +55,18 @@
affectareas -= get_areas(V)
for(var/V in affectareas)
var/area/A = V
- if(is_on_level_name(A,target_z))
+ if(A.z in impacted_z_levels)
impacted_areas |= A
weather_duration = rand(weather_duration_lower, weather_duration_upper)
+ START_PROCESSING(SSweather, src)
update_areas()
- for(var/V in player_list)
- var/mob/M = V
- if(is_on_level_name(M,target_z))
+ for(var/M in player_list)
+ var/turf/mob_turf = get_turf(M)
+ if(mob_turf && (mob_turf.z in impacted_z_levels))
if(telegraph_message)
to_chat(M, telegraph_message)
if(telegraph_sound)
- M << sound(telegraph_sound)
+ SEND_SOUND(M, sound(telegraph_sound))
addtimer(CALLBACK(src, .proc/start), telegraph_duration)
/datum/weather/proc/start()
@@ -77,14 +74,13 @@
return
stage = MAIN_STAGE
update_areas()
- for(var/V in player_list)
- var/mob/M = V
- if(is_on_level_name(M,target_z))
+ for(var/M in player_list)
+ var/turf/mob_turf = get_turf(M)
+ if(mob_turf && (mob_turf.z in impacted_z_levels))
if(weather_message)
to_chat(M, weather_message)
if(weather_sound)
- M << sound(weather_sound)
- weather_master.processing_weather |= src
+ SEND_SOUND(M, sound(weather_sound))
addtimer(CALLBACK(src, .proc/wind_down), weather_duration)
/datum/weather/proc/wind_down()
@@ -92,24 +88,25 @@
return
stage = WIND_DOWN_STAGE
update_areas()
- for(var/V in player_list)
- var/mob/M = V
- if(is_on_level_name(M,target_z))
+ for(var/M in player_list)
+ var/turf/mob_turf = get_turf(M)
+ if(mob_turf && (mob_turf.z in impacted_z_levels))
if(end_message)
to_chat(M, end_message)
if(end_sound)
- M << sound(end_sound)
- weather_master.processing_weather -= src
+ SEND_SOUND(M, sound(end_sound))
addtimer(CALLBACK(src, .proc/end), end_duration)
/datum/weather/proc/end()
if(stage == END_STAGE)
- return
+ return 1
stage = END_STAGE
+ STOP_PROCESSING(SSweather, src)
update_areas()
-/datum/weather/proc/can_impact(mob/living/L) //Can this weather impact a mob?
- if(!is_on_level_name(L,target_z))
+/datum/weather/proc/can_weather_act(mob/living/L) //Can this weather impact a mob?
+ var/turf/mob_turf = get_turf(L)
+ if(mob_turf && !(mob_turf.z in impacted_z_levels))
return
if(immunity_type in L.weather_immunities)
return
@@ -117,7 +114,7 @@
return
return 1
-/datum/weather/proc/impact(mob/living/L) //What effect does this weather have on the hapless mob?
+/datum/weather/proc/weather_act(mob/living/L) //What effect does this weather have on the hapless mob?
return
/datum/weather/proc/update_areas()
@@ -136,8 +133,8 @@
N.icon_state = end_overlay
if(END_STAGE)
N.color = null
- N.icon_state = initial(N.icon_state)
+ N.icon_state = ""
N.icon = 'icons/turf/areas.dmi'
- N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial
+ N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial
N.invisibility = INVISIBILITY_MAXIMUM
- N.opacity = 0
+ N.set_opacity(FALSE)
diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm
deleted file mode 100644
index 1581938bd96..00000000000
--- a/code/datums/weather/weather_types.dm
+++ /dev/null
@@ -1,118 +0,0 @@
-//Different types of weather.
-
-/datum/weather/floor_is_lava //The Floor is Lava: Makes all turfs damage anyone on them unless they're standing on a solid object.
- name = "the floor is lava"
- desc = "The ground turns into surprisingly cool lava, lightly damaging anything on the floor."
-
- telegraph_message = "Waves of heat emanate from the ground..."
- telegraph_duration = 150
-
- weather_message = "The floor is lava! Get on top of something!"
- weather_duration_lower = 300
- weather_duration_upper = 600
- weather_overlay = "lava"
-
- end_message = "The ground cools and returns to its usual form."
- end_duration = 0
-
- area_type = /area
- target_z = MAIN_STATION
-
- overlay_layer = 2 //Covers floors only
- immunity_type = "lava"
-
-/datum/weather/floor_is_lava/impact(mob/living/L)
- for(var/obj/structure/O in L.loc)
- if(O.density)
- return
- if(L.loc.density)
- return
- if(!L.client) //Only sentient people are going along with it!
- return
- L.adjustFireLoss(3)
-
-/datum/weather/floor_is_lava/fake
- name = "fake lava"
- aesthetic = TRUE
-
-/datum/weather/advanced_darkness //Advanced Darkness: Restricts the vision of all affected mobs to a single tile in the cardinal directions.
- name = "advanced darkness"
- desc = "Everything in the area is effectively blinded, unable to see more than a foot or so around itself."
-
- telegraph_message = "The lights begin to dim... is the power going out?"
- telegraph_duration = 150
-
- weather_message = "This isn't your everyday darkness... this is advanced darkness!"
- weather_duration_lower = 300
- weather_duration_upper = 300
-
- end_message = "At last, the darkness recedes."
- end_duration = 0
-
- area_type = /area
- target_z = MAIN_STATION
-
-/datum/weather/advanced_darkness/update_areas()
- for(var/V in impacted_areas)
- var/area/A = V
- if(stage == MAIN_STAGE)
- A.invisibility = 0
- A.opacity = 1
- A.layer = overlay_layer
- A.icon = 'icons/effects/weather_effects.dmi'
- A.icon_state = "darkness"
- else
- A.invisibility = INVISIBILITY_MAXIMUM
- A.opacity = 0
-
-
-/datum/weather/ash_storm //Ash Storms: Common happenings on lavaland. Heavily obscures vision and deals heavy fire damage to anyone caught outside.
- name = "ash storm"
- desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected."
-
- telegraph_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter."
- telegraph_duration = 300
- telegraph_sound = 'sound/lavaland/ash_storm_windup.ogg'
- telegraph_overlay = "light_ash"
-
- weather_message = "Smoldering clouds of scorching ash billow down around you! Get inside!"
- weather_duration_lower = 600
- weather_duration_upper = 1500
- weather_sound = 'sound/lavaland/ash_storm_start.ogg'
- weather_overlay = "ash_storm"
-
- end_message = "The shrieking wind whips away the last of the ash falls to its usual murmur. It should be safe to go outside now."
- end_duration = 300
- end_sound = 'sound/lavaland/ash_storm_end.ogg'
- end_overlay = "light_ash"
-
- area_type = /area/mine/dangerous
- target_z = MINING
-
- immunity_type = "ash"
-
- probability = 90
-
-/datum/weather/ash_storm/impact(mob/living/L)
- if(istype(L.loc, /obj/mecha))
- return
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- var/thermal_protection = H.get_thermal_protection()
- if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
- return
- L.adjustFireLoss(4)
-
-/datum/weather/ash_storm/emberfall //Emberfall: An ash storm passes by, resulting in harmless embers falling like snow. 10% to happen in place of an ash storm.
- name = "emberfall"
- desc = "A passing ash storm blankets the area in harmless embers."
-
- weather_message = "Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by..."
- weather_sound = 'sound/lavaland/ash_storm_windup.ogg'
- weather_overlay = "light_ash"
-
- end_message = "The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet."
-
- aesthetic = TRUE
-
- probability = 10
diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm
new file mode 100644
index 00000000000..3f4c57c4196
--- /dev/null
+++ b/code/datums/weather/weather_types/ash_storm.dm
@@ -0,0 +1,108 @@
+//Ash storms happen frequently on lavaland. They heavily obscure vision, and cause high fire damage to anyone caught outside.
+/datum/weather/ash_storm
+ name = "ash storm"
+ desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected."
+
+ telegraph_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter."
+ telegraph_duration = 300
+ telegraph_overlay = "light_ash"
+
+ weather_message = "Smoldering clouds of scorching ash billow down around you! Get inside!"
+ weather_duration_lower = 600
+ weather_duration_upper = 1200
+ weather_overlay = "ash_storm"
+
+ end_message = "The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now."
+ end_duration = 300
+ end_overlay = "light_ash"
+
+ area_type = /area/mine/dangerous // /area/lavaland/surface/outdoors
+ target_trait = ORE_LEVEL
+
+ immunity_type = "ash"
+
+// probability = 90
+
+ barometer_predictable = TRUE
+
+ var/datum/looping_sound/active_outside_ashstorm/sound_ao = new(list(), FALSE, TRUE)
+ var/datum/looping_sound/active_inside_ashstorm/sound_ai = new(list(), FALSE, TRUE)
+ var/datum/looping_sound/weak_outside_ashstorm/sound_wo = new(list(), FALSE, TRUE)
+ var/datum/looping_sound/weak_inside_ashstorm/sound_wi = new(list(), FALSE, TRUE)
+
+/datum/weather/ash_storm/telegraph()
+ . = ..()
+ var/list/inside_areas = list()
+ var/list/outside_areas = list()
+ var/list/eligible_areas = list()
+ for(var/z in impacted_z_levels)
+ eligible_areas += space_manager.areas_in_z["[z]"]
+ for(var/i in 1 to eligible_areas.len)
+ var/area/place = eligible_areas[i]
+ if(place.outdoors)
+ outside_areas += place
+ else
+ inside_areas += place
+ CHECK_TICK
+
+ sound_ao.output_atoms = outside_areas
+ sound_ai.output_atoms = inside_areas
+ sound_wo.output_atoms = outside_areas
+ sound_wi.output_atoms = inside_areas
+
+ sound_wo.start()
+ sound_wi.start()
+
+/datum/weather/ash_storm/start()
+ . = ..()
+ sound_wo.stop()
+ sound_wi.stop()
+
+ sound_ao.start()
+ sound_ai.start()
+
+/datum/weather/ash_storm/wind_down()
+ . = ..()
+ sound_ao.stop()
+ sound_ai.stop()
+
+ sound_wo.start()
+ sound_wi.start()
+
+/datum/weather/ash_storm/end()
+ . = ..()
+ sound_wo.stop()
+ sound_wi.stop()
+
+/datum/weather/ash_storm/proc/is_ash_immune(atom/L)
+ while(L && !isturf(L))
+ if(ismecha(L)) //Mechs are immune
+ return TRUE
+ if(ishuman(L)) //Are you immune?
+ var/mob/living/carbon/human/H = L
+ var/thermal_protection = H.get_thermal_protection()
+ if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
+ return TRUE
+ L = L.loc //Matryoshka check
+ return FALSE //RIP you
+
+/datum/weather/ash_storm/weather_act(mob/living/L)
+ if(is_ash_immune(L))
+ return
+ L.adjustFireLoss(4)
+
+
+//Emberfalls are the result of an ash storm passing by close to the playable area of lavaland. They have a 10% chance to trigger in place of an ash storm.
+/datum/weather/ash_storm/emberfall
+ name = "emberfall"
+ desc = "A passing ash storm blankets the area in harmless embers."
+
+ weather_message = "Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by..."
+ weather_overlay = "light_ash"
+
+ end_message = "The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet."
+ end_sound = null
+
+ aesthetic = TRUE
+
+// probability = 10
\ No newline at end of file
diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm
new file mode 100644
index 00000000000..fe7391ec9f0
--- /dev/null
+++ b/code/datums/weather/weather_types/floor_is_lava.dm
@@ -0,0 +1,39 @@
+//Causes fire damage to anyone not standing on a dense object.
+/datum/weather/floor_is_lava
+ name = "the floor is lava"
+ desc = "The ground turns into surprisingly cool lava, lightly damaging anything on the floor."
+
+ telegraph_message = "You feel the ground beneath you getting hot. Waves of heat distort the air."
+ telegraph_duration = 150
+
+ weather_message = "The floor is lava! Get on top of something!"
+ weather_duration_lower = 300
+ weather_duration_upper = 600
+ weather_overlay = "lava"
+
+ end_message = "The ground cools and returns to its usual form."
+ end_duration = 0
+
+ area_type = /area
+ protected_areas = list(/area/space)
+ target_trait = STATION_LEVEL
+
+ overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only
+ immunity_type = "lava"
+
+
+/datum/weather/floor_is_lava/weather_act(mob/living/L)
+ if(issilicon(L))
+ return
+ for(var/obj/structure/O in L.loc)
+ if(O.density || O.buckled_mob && istype(O, /obj/structure/stool/bed))
+ return
+ if(L.loc.density)
+ return
+ if(!L.client) //Only sentient people are going along with it!
+ return
+ L.adjustFireLoss(3)
+
+/datum/weather/floor_is_lava/fake
+ name = "the floor is lava (fake)"
+ aesthetic = TRUE
\ No newline at end of file
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
new file mode 100644
index 00000000000..acd155e7560
--- /dev/null
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -0,0 +1,61 @@
+//Radiation storms occur when the station passes through an irradiated area, and irradiate anyone not standing in protected areas (maintenance, emergency storage, etc.)
+/datum/weather/rad_storm
+ name = "radiation storm"
+ desc = "A cloud of intense radiation passes through the area dealing rad damage to those who are unprotected."
+
+ telegraph_duration = 400
+ telegraph_message = "The air begins to grow warm."
+
+ weather_message = "You feel waves of heat wash over you! Find shelter!"
+ weather_overlay = "ash_storm"
+ weather_duration_lower = 600
+ weather_duration_upper = 1500
+ weather_color = "green"
+ weather_sound = 'sound/misc/bloblarm.ogg'
+
+ end_duration = 100
+ end_message = "The air seems to be cooling off again."
+
+ area_type = /area
+ protected_areas = list(/area/maintenance, /area/turret_protected/ai_upload, /area/turret_protected/ai_upload_foyer,
+ /area/turret_protected/ai, /area/storage/emergency, /area/storage/emergency2, /area/crew_quarters/sleep, /area/security/brig, /area/shuttle)
+ target_trait = STATION_LEVEL
+
+ immunity_type = "rad"
+
+/datum/weather/rad_storm/telegraph()
+ ..()
+ status_alarm(TRUE)
+ make_maint_all_access()
+
+
+/datum/weather/rad_storm/weather_act(mob/living/L)
+ var/resist = L.getarmor(null, "rad")
+ if(prob(40))
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(!(RADIMMUNE in H.species.species_traits))
+ if(prob(max(0, 100 - resist)))
+ randmuti(H) // Applies bad mutation
+ if(prob(50))
+ if(prob(90))
+ randmutb(H)
+ else
+ randmutg(H)
+ domutcheck(H, null, 1)
+
+ L.apply_effect(20, IRRADIATE, resist)
+
+/datum/weather/rad_storm/end()
+ if(..())
+ return
+ priority_announcement.Announce("The radiation threat has passed. Please return to your workplaces.", "Anomaly Alert")
+ status_alarm(FALSE)
+ revoke_maint_all_access()
+
+/datum/weather/rad_storm/proc/status_alarm(active) //Makes the status displays show the radiation warning for those who missed the announcement.
+ if(active)
+ post_status("alert", "radiation")
+ else
+ post_status("blank")
+ post_status("shuttle")
\ No newline at end of file
diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm
new file mode 100644
index 00000000000..4e4d5aab59d
--- /dev/null
+++ b/code/datums/weather/weather_types/snow_storm.dm
@@ -0,0 +1,28 @@
+/datum/weather/snow_storm
+ name = "snow storm"
+ desc = "Harsh snowstorms roam the topside of this arctic planet, burying any area unfortunate enough to be in its path."
+// probability = 90
+
+ telegraph_message = "Drifting particles of snow begin to dust the surrounding area.."
+ telegraph_duration = 300
+ telegraph_overlay = "light_snow"
+
+ weather_message = "Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!"
+ weather_overlay = "snow_storm"
+ weather_duration_lower = 600
+ weather_duration_upper = 1500
+
+ end_duration = 100
+ end_message = "The snowfall dies down, it should be safe to go outside again."
+
+// area_type = /area/awaymission/snowdin/outside
+ target_trait = AWAY_LEVEL
+
+ immunity_type = "snow"
+
+ barometer_predictable = TRUE
+
+
+/datum/weather/snow_storm/weather_act(mob/living/L)
+ L.adjust_bodytemperature(-rand(5, 15))
+
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 286ac454efc..054a7e4f669 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -1,5 +1,3 @@
-#define CAT_HIDDEN 2 // Also in code/game/machinery/vending.dm
-
/datum/wires/vending
holder_type = /obj/machinery/vending
wire_count = 4
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index 0f2a2bd4393..cdf25ce9651 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -76,6 +76,10 @@
var/message = "[key_name(whom, 1)] [isLivingSSD(whom) ? "(SSD!)" : ""] ([admin_jump_link(whom)])"
return message
+/proc/key_name_log(whom)
+ // Key_name_admin, but does not include (?) or jump link - For logging purpose to reduce clutter while figuring out who is SSD and/or antag when being attacked. Also remove formatting since it is not displayed
+ var/message = "[key_name(whom, 0)][isAntag(whom) ? "(ANTAG)" : ""][isLivingSSD(whom) ? "(SSD!)": ""]"
+ return message
/proc/log_and_message_admins(var/message as text)
log_admin("[key_name(usr)] " + message)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 90b45a19170..e331376a0dc 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -20,13 +20,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/atmosalm = ATMOS_ALARM_NONE
var/poweralm = 1
var/party = null
- var/radalert = 0
var/report_alerts = 1 // Should atmos alerts notify the AI/computers
level = null
name = "Space"
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
- layer = 10
+ layer = AREA_LAYER
luminosity = 0
mouse_opacity = 0
invisibility = INVISIBILITY_LIGHTING
@@ -141,9 +140,6 @@ var/list/ghostteleportlocs = list()
/area/space/readyalert()
return
-/area/space/radiation_alert()
- return
-
/area/space/partyalert()
return
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 8a9a108c7b3..44a9ae7e522 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -22,7 +22,7 @@
..()
icon_state = ""
- layer = 10
+ layer = AREA_LAYER
uid = ++global_uid
all_areas += src
map_name = name // Save the initial (the name set in the map) name of the area.
@@ -45,7 +45,24 @@
blend_mode = BLEND_MULTIPLY // Putting this in the constructor so that it stops the icons being screwed up in the map editor.
/area/Initialize()
- ..()
+ . = ..()
+
+ if(contents.len)
+ var/list/areas_in_z = space_manager.areas_in_z
+ var/z
+ for(var/i in 1 to contents.len)
+ var/atom/thing = contents[i]
+ if(!thing)
+ continue
+ z = thing.z
+ break
+ if(!z)
+ WARNING("No z found for [src]")
+ return
+ if(!areas_in_z["[z]"])
+ areas_in_z["[z]"] = list()
+ areas_in_z["[z]"] += src
+
return INITIALIZE_HINT_LATELOAD
/area/LateInitialize()
@@ -160,16 +177,6 @@
eject = 0
updateicon()
-/area/proc/radiation_alert()
- if(!radalert)
- radalert = 1
- updateicon()
-
-/area/proc/reset_radiation_alert()
- if(radalert)
- radalert = 0
- updateicon()
-
/area/proc/partyalert()
if(!party)
party = 1
@@ -183,11 +190,8 @@
updateicon()
/area/proc/updateicon()
- if(radalert) // always show the radiation alert, regardless of power
- icon_state = "radiation"
- invisibility = INVISIBILITY_LIGHTING
- else if((fire || eject || party) && (!requires_power||power_environ))//If it doesn't require power, can still activate this proc.
- if(fire && !radalert && !eject && !party)
+ if((fire || eject || party) && (!requires_power||power_environ))//If it doesn't require power, can still activate this proc.
+ if(fire && !eject && !party)
icon_state = "red"
else if(!fire && eject && !party)
icon_state = "red"
@@ -197,9 +201,15 @@
icon_state = "blue-red"
invisibility = INVISIBILITY_LIGHTING
else
- // new lighting behaviour with obj lights
- icon_state = null
- invisibility = INVISIBILITY_MAXIMUM
+ var/weather_icon
+ for(var/V in SSweather.processing)
+ var/datum/weather/W = V
+ if(W.stage != END_STAGE && (src in W.impacted_areas))
+ W.update_areas()
+ weather_icon = TRUE
+ if(!weather_icon)
+ icon_state = null
+ invisibility = INVISIBILITY_MAXIMUM
/area/space/updateicon()
icon_state = null
@@ -384,4 +394,4 @@
for(var/obj/machinery/door/airlock/temp_airlock in src)
temp_airlock.prison_open()
for(var/obj/machinery/door/window/temp_windoor in src)
- temp_windoor.open()
+ temp_windoor.open()
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 19af319aa20..136c8950028 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -143,6 +143,12 @@
/atom/proc/setDir(newdir)
dir = newdir
+/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(does_attack_animation)
+ user.changeNext_move(CLICK_CD_MELEE)
+ add_attack_logs(user, src, "Punched with hulk powers")
+ user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
+
/atom/proc/CheckParts(list/parts_list)
for(var/A in parts_list)
if(istype(A, /datum/reagent))
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 99355320491..93d9977b5e8 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -192,7 +192,7 @@
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
- to_chat(usr, "[L.name] will not fit into the [src] because they have a slime latched onto their head.")
+ to_chat(usr, "[L.name] will not fit into the [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.")
return
if(L == user)
visible_message("[user] climbs into the [src].")
diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm
index 6fbc30883ca..37292beb8fe 100644
--- a/code/game/dna/genes/goon_powers.dm
+++ b/code/game/dna/genes/goon_powers.dm
@@ -179,8 +179,7 @@
C.ExtinguishMob()
C.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [C]!")
- log_attack(user, C, "Used cryokinesis on a victim without internals or a suit")
- msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)] (NO SUIT)")
+ add_attack_logs(user, C, "Cryokinesis- NO SUIT/INTERNALS")
//playsound(user.loc, 'bamf.ogg', 50, 0)
@@ -318,14 +317,6 @@
var/atom/movable/the_item = targets[1]
if(ishuman(the_item))
- //My gender
- var/m_his = "his"
- if(user.gender == FEMALE)
- m_his = "her"
- // Their gender
- var/t_his = "his"
- if(the_item.gender == FEMALE)
- t_his = "her"
var/mob/living/carbon/human/H = the_item
var/obj/item/organ/external/limb = H.get_organ(user.zone_sel.selecting)
if(!istype(limb))
@@ -334,15 +325,15 @@
return 0
if(istype(limb,/obj/item/organ/external/head))
// Bullshit, but prevents being unable to clone someone.
- to_chat(user, "You try to put \the [limb] in your mouth, but [t_his] ears tickle your throat!")
+ to_chat(user, "You try to put \the [limb] in your mouth, but [the_item.p_their()] ears tickle your throat!")
revert_cast()
return 0
if(istype(limb,/obj/item/organ/external/chest))
// Bullshit, but prevents being able to instagib someone.
- to_chat(user, "You try to put their [limb] in your mouth, but it's too big to fit!")
+ to_chat(user, "You try to put [the_item.p_their()] [limb] in your mouth, but it's too big to fit!")
revert_cast()
return 0
- user.visible_message("[user] begins stuffing [the_item]'s [limb.name] into [m_his] gaping maw!")
+ user.visible_message("[user] begins stuffing [the_item]'s [limb.name] into [user.p_their()] gaping maw!")
var/oldloc = H.loc
if(!do_mob(user,H,EAT_MOB_DELAY))
to_chat(user, "You were interrupted before you could eat [the_item]!")
@@ -434,7 +425,7 @@
user.flying = prevFlying
if(FAT in user.mutations && prob(66))
- user.visible_message("[user.name] crashes due to their heavy weight!")
+ user.visible_message("[user.name] crashes due to [user.p_their()] heavy weight!")
//playsound(user.loc, 'zhit.wav', 50, 1)
user.AdjustWeakened(10)
user.AdjustStunned(5)
@@ -559,10 +550,10 @@
return
if(M.stat == 2)
- to_chat(user, "[M.name] is dead and cannot have their mind read.")
+ to_chat(user, "[M.name] is dead and cannot have [M.p_their()] mind read.")
return
if(M.health < 0)
- to_chat(user, "[M.name] is dying, and their thoughts are too scrambled to read.")
+ to_chat(user, "[M.name] is dying, and [M.p_their()] thoughts are too scrambled to read.")
return
to_chat(user, "Mind Reading of [M.name]:")
@@ -570,8 +561,8 @@
var/pain_condition = M.health / M.maxHealth
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
- "their hair","what to do next","their job","space","amusing things","sad things",
- "annoying things","happy things","something incoherent","something they did wrong")
+ "[M.p_their()] hair","what to do next","[M.p_their()] job","space","amusing things","sad things",
+ "annoying things","happy things","something incoherent","something [M.p_they()] did wrong")
var/thoughts = "thinking about [pick(randomthoughts)]"
if(M.fire_stacks)
@@ -592,7 +583,7 @@
to_chat(user, "Condition: [M.name] is suffering severe pain.")
else
to_chat(user, "Condition: [M.name] is suffering excruciating pain.")
- thoughts = "haunted by their own mortality"
+ thoughts = "haunted by [M.p_their()] own mortality"
switch(M.a_intent)
if(INTENT_HELP)
@@ -655,7 +646,7 @@
action_icon_state = "superfart"
/obj/effect/proc_holder/spell/aoe_turf/superfart/invocation(mob/user = usr)
- invocation = "[user] hunches down and grits their teeth!"
+ invocation = "[user] hunches down and grits [user.p_their()] teeth!"
invocation_emote_self = "You hunch down and grit your teeth!"
..(user)
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index bfd75f486e0..3e709560a45 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -173,7 +173,7 @@
M.update_dna()
- M.visible_message("[src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
+ M.visible_message("[src] morphs and changes [p_their()] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
/datum/dna/gene/basic/grant_spell/remotetalk
name="Telepathy"
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index 93fe05ffa10..eb32bed006d 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -191,7 +191,7 @@
//message_admins("The probability of a new traitor is [traitor_prob]%")
if(prob(traitor_prob))
message_admins("New traitor roll passed. Making a new Traitor.")
- character.mind.make_Tratior() //TEMP: Add proper checks for loyalty here. uc_guy
+ character.mind.make_Traitor() //TEMP: Add proper checks for loyalty here. uc_guy
//else
//message_admins("New traitor roll failed. No new traitor.")
//else
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 0bcd942b7a0..80bba117a20 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -119,7 +119,7 @@ var/list/blob_nodes = list()
if(!is_station_level(location.z) || istype(location, /turf/space))
if(!warned)
to_chat(C, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!")
- message_admins("[key_name_admin(C)] was in space when the blobs burst, and will die if he doesn't return to the station.")
+ message_admins("[key_name_admin(C)] was in space when the blobs burst, and will die if [C.p_they()] [C.p_do()] not return to the station.")
spawn(300)
burst_blob(blob, 1)
else
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index e53a74c8daa..15a3b2e222f 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -147,6 +147,9 @@
..()
take_damage(power/400, BURN)
+/obj/structure/blob/hulk_damage()
+ return 15
+
/obj/structure/blob/attackby(var/obj/item/W, var/mob/living/user, params)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index a9c5882094d..329408bffce 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -113,7 +113,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
identity_theft.target_real_name = kill_objective.target.current.real_name //Whoops, forgot this.
var/mob/living/carbon/human/H = identity_theft.target.current
if(can_absorb_species(H.species)) // For species that can't be absorbed - should default to an escape objective
- identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing their identification card."
+ identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing [identity_theft.target.p_their()] identification card."
changeling.objectives += identity_theft
else
qdel(identity_theft)
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index d690f095236..a7af2b94482 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -20,7 +20,7 @@ var/list/sting_paths
/obj/effect/proc_holder/changeling/evolution_menu/proc/create_menu(var/datum/changeling/changeling)
var/dat
- dat +="Changling Evolution Menu"
+ dat +="Changeling Evolution Menu"
//javascript, the part that does most of the work~
dat += {"
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index e9ae34d2cfa..b60cfee4718 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -73,8 +73,8 @@
recent_speech = target.say_log.Copy()
if(recent_speech.len)
- user.mind.store_memory("Some of [target]'s speech patterns, we should study these to better impersonate them!")
- to_chat(user, "Some of [target]'s speech patterns, we should study these to better impersonate them!")
+ user.mind.store_memory("Some of [target]'s speech patterns. We should study these to better impersonate [target.p_them()]!")
+ to_chat(user, "Some of [target]'s speech patterns. We should study these to better impersonate [target.p_them()]!")
for(var/spoken_memory in recent_speech)
user.mind.store_memory("\"[spoken_memory]\"")
to_chat(user, "\"[spoken_memory]\"")
diff --git a/code/game/gamemodes/changeling/powers/biodegrade.dm b/code/game/gamemodes/changeling/powers/biodegrade.dm
index 3103416b9e4..5142734183b 100644
--- a/code/game/gamemodes/changeling/powers/biodegrade.dm
+++ b/code/game/gamemodes/changeling/powers/biodegrade.dm
@@ -16,7 +16,7 @@
var/obj/O = user.get_item_by_slot(slot_handcuffed)
if(!istype(O))
return FALSE
- user.visible_message("[user] vomits a glob of acid on \his [O]!", \
+ user.visible_message("[user] vomits a glob of acid on [user.p_their()] [O.name]!", \
"We vomit acidic ooze onto our restraints!")
addtimer(CALLBACK(src, .proc/dissolve_handcuffs, user, O), 30)
used = TRUE
@@ -25,7 +25,7 @@
var/obj/item/clothing/suit/S = user.get_item_by_slot(slot_wear_suit)
if(!istype(S))
return FALSE
- user.visible_message("[user] vomits a glob of acid across the front of \his [S]!", \
+ user.visible_message("[user] vomits a glob of acid across the front of [user.p_their()] [S.name]!", \
"We vomit acidic ooze onto our straight jacket!")
addtimer(CALLBACK(src, .proc/dissolve_straightjacket, user, S), 30)
used = TRUE
diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm
index 4b59c255128..52de921d7ec 100644
--- a/code/game/gamemodes/changeling/powers/linglink.dm
+++ b/code/game/gamemodes/changeling/powers/linglink.dm
@@ -47,7 +47,7 @@
to_chat(user, "We stealthily stab [target] with a minor proboscis...")
to_chat(target, "You experience a stabbing sensation and your ears begin to ring...")
if(3)
- to_chat(user, "You mold the [target]'s mind like clay, they can now speak in the hivemind!")
+ to_chat(user, "You mold the [target]'s mind like clay, [target.p_they()] can now speak in the hivemind!")
to_chat(target, "A migraine throbs behind your eyes, you hear yourself screaming - but your mouth has not opened!")
for(var/mob/M in mob_list)
if(all_languages["Changeling"] in M.languages)
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 8f0aa4d210f..4cf998cf043 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -25,13 +25,13 @@
if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh
qdel(user.l_hand)
if(!silent)
- user.visible_message("With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms his [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!")
+ H.visible_message("[H] casts off [H.p_their()] [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!")
qdel(H.wear_suit)
qdel(H.head)
H.update_inv_wear_suit()
@@ -138,7 +138,7 @@
loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!")
/obj/item/melee/arm_blade/dropped(mob/user)
- user.visible_message("With a sickening crunch, [user] reforms his blade into an arm!", "We assimilate the blade back into our body.", "With a sickening crunch, [user] reforms [user.p_their()] blade into an arm!", "We assimilate the blade back into our body.", "[user] forces the airlock to open with \his [src]!", "We force the airlock to open.", "You hear a metal screeching sound.")
+ user.visible_message("[user] forces the airlock to open with [user.p_their()] [name]!", "We force the airlock to open.", "You hear a metal screeching sound.")
A.open(2)
/***************************************\
@@ -219,7 +219,7 @@
to_chat(user, "The [name] is not ready yet.")
/obj/item/gun/magic/tentacle/suicide_act(mob/user)
- user.visible_message("[user] coils [src] tightly around \his neck! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide.")
return (OXYLOSS)
/obj/item/ammo_casing/magic/tentacle
@@ -386,7 +386,7 @@
if(remaining_uses < 1)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
- H.visible_message("With a sickening crunch, [H] reforms his shield into an arm!", "We assimilate our shield into our body", "With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!", "We assimilate our shield into our body", "[loc.name]\'s flesh rapidly inflates, forming a bloated mass around their body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!")
+ loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!")
processing_objects += src
/obj/item/clothing/suit/space/changeling/process()
@@ -485,4 +485,4 @@
icon_state = "lingarmorhelmet"
flags = BLOCKHAIR | NODROP | DROPDEL
armor = list(melee = 30, bullet = 30, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0)
- flags_inv = HIDEEARS
\ No newline at end of file
+ flags_inv = HIDEEARS
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 23efc38b403..b3881ee54fb 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -24,13 +24,13 @@
user.CureNearsighted()
user.reagents.clear_reagents()
user.germ_level = 0
- user.next_pain_time = 0
user.timeofdeath = 0
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.restore_blood()
H.traumatic_shock = 0
H.shock_stage = 0
+ H.next_pain_time = 0
H.species.create_organs(H)
// Now that recreating all organs is necessary, the rest of this organ stuff probably
// isn't, but I don't want to remove it, just in case.
diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm
index 99eb634a2ff..9015677c70e 100644
--- a/code/game/gamemodes/changeling/powers/swap_form.dm
+++ b/code/game/gamemodes/changeling/powers/swap_form.dm
@@ -36,7 +36,7 @@
to_chat(user, "The body swap has been interrupted!")
return
- to_chat(target, "[user] tightens their grip as a painful sensation invades your body.")
+ to_chat(target, "[user] tightens [user.p_their()] grip as a painful sensation invades your body.")
changeling.absorbed_dna -= changeling.find_dna(user.dna)
changeling.protected_dna -= changeling.find_dna(user.dna)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index b12a50bce13..f2e8db26b40 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -203,7 +203,7 @@ var/global/list/all_cults = list()
update_cult_icons_removed(cult_mind)
if(show_message)
for(var/mob/M in viewers(cult_mind.current))
- to_chat(M, "[cult_mind.current] looks like they just reverted to their old faith!")
+ to_chat(M, "[cult_mind.current] looks like [cult_mind.current.p_they()] just reverted to [cult_mind.current.p_their()] old faith!")
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index 5ddc8ccdf98..34955ed42d4 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -24,7 +24,7 @@
spilltarget = 100 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles."
if("sacrifice")
- explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for their blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
+ explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
for(var/datum/mind/cult_mind in cult)
to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
@@ -81,7 +81,7 @@
spilltarget = 100 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles."
if("sacrifice")
- explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for their blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
+ explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for [sacrifice_target.p_their()] blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
for(var/datum/mind/cult_mind in cult)
if(cult_mind)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index d8d7d03b6c4..84941f4d7a7 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -161,7 +161,7 @@
var/obj/item/organ/external/head/head = C.get_organ("head")
if(head)
C.apply_damage(30, BURN, "head") //30 fire damage because it's FUCKING LAVA
- head.disfigure("burn") //Your face is unrecognizable because it's FUCKING LAVA
+ head.disfigure() //Your face is unrecognizable because it's FUCKING LAVA
return 1
else
..()
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 19f9f57e9e7..a16cf76d9f1 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -294,7 +294,7 @@
var/mob/living/carbon/human/H = user
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
- user.visible_message("[user] cuts open their [affecting] and begins writing in their own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.cultdat.entity_title3].")
+ user.visible_message("[user] cuts open [user.p_their()] [affecting] and begins writing in [user.p_their()] own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.cultdat.entity_title3].")
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE , affecting)
if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user)))
for(var/V in shields)
@@ -305,7 +305,7 @@
if(locate(/obj/effect/rune) in runeturf)
to_chat(user, "There is already a rune here.")
return
- user.visible_message("[user] creates a strange circle in their own blood.", \
+ user.visible_message("[user] creates a strange circle in [user.p_their()] own blood.", \
"You finish drawing the arcane markings of [ticker.cultdat.entity_title3].")
for(var/V in shields)
var/obj/machinery/shield/S = V
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 2bf4933e108..087bfbb4008 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,4 +1,4 @@
-/var/list/sacrificed = list()
+var/list/sacrificed = list()
var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
/*
@@ -153,7 +153,10 @@ structure_check() searches for nearby cultist structures required for the invoca
for(var/M in invokers)
var/mob/living/L = M
if(invocation)
- L.say(invocation)
+ if(!L.IsVocal())
+ L.emote("gestures ominously.")
+ else
+ L.say(invocation)
L.changeNext_move(CLICK_CD_MELEE)//THIS IS WHY WE CAN'T HAVE NICE THINGS
if(invoke_damage)
L.apply_damage(invoke_damage, BRUTE)
@@ -473,7 +476,6 @@ var/list/teleport_runes = list()
rune_in_use = 0
-
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
/obj/effect/rune/narsie
cultist_name = "Tear Reality (God)"
@@ -700,7 +702,7 @@ var/list/teleport_runes = list()
return
mob_to_revive.revive() //This does remove disabilities and such, but the rune might actually see some use because of it!
to_chat(mob_to_revive, "\"PASNAR SAVRAE YAM'TOTH. Arise.\"")
- mob_to_revive.visible_message("[mob_to_revive] draws in a huge breath, red light shining from their eyes.", \
+ mob_to_revive.visible_message("[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.", \
"You awaken suddenly from the void. You're alive!")
rune_in_use = 0
@@ -740,7 +742,7 @@ var/list/teleport_runes = list()
to_chat(L, "You chant in unison and a colossal burst of energy knocks you backward!")
L.Weaken(2)
qdel(src) //delete before pulsing because it's a delay reee
- empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters
+ empulse(E, 9*invokers.len, 12*invokers.len, 1) // Scales now, from a single room to most of the station depending on # of chanters
//Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active.
/obj/effect/rune/astral
@@ -787,11 +789,11 @@ var/list/teleport_runes = list()
return
affecting.apply_damage(1, BRUTE)
if(!(user in T.contents))
- user.visible_message("A spectral tendril wraps around [user] and pulls them back to the rune!")
+ user.visible_message("A spectral tendril wraps around [user] and pulls [user.p_them()] back to the rune!")
Beam(user,icon_state="drainbeam",time=2)
user.forceMove(get_turf(src)) //NO ESCAPE :^)
if(user.key)
- user.visible_message("[user] slowly relaxes, the glow around them dimming.", \
+ user.visible_message("[user] slowly relaxes, the glow around [user.p_them()] dimming.", \
"You are re-united with your physical form. [src] releases its hold over you.")
user.color = initial(user.color)
user.Weaken(3)
@@ -833,7 +835,7 @@ var/list/teleport_runes = list()
var/mob/living/user = invokers[1]
..()
density = !density
- user.visible_message("[user] places their hands on [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].", \
+ user.visible_message("[user] places [user.p_their()] hands on [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].", \
"You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.")
if(iscarbon(user))
var/mob/living/carbon/C = user
@@ -875,7 +877,7 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Summon Cultist rune failed - target in away mission")
return
- if((cultist_to_summon.reagents.has_reagent("holywater") || cultist_to_summon.restrained()) && invokers < 3)
+ if((cultist_to_summon.reagents.has_reagent("holywater") || cultist_to_summon.restrained()) && invokers.len < 3)
to_chat(user, "The summoning of [cultist_to_summon] is being blocked somehow! You need 3 chanters to counter it!")
fail_invoke()
new /obj/effect/temp_visual/cult/sparks(get_turf(cultist_to_summon)) //observer warning
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index e909a33410f..8d858c6fade 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -151,7 +151,7 @@
if(!src || QDELETED(src) || !user || user.l_hand != src && user.r_hand != src || user.incapacitated() || !actual_selected_rune)
return ..(user, 0)
- user.visible_message("Dust flows from [user]'s hand, and they disappear in a flash of red light!", \
+ user.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] in a flash of red light!", \
"You speak the words of the talisman and find yourself somewhere else!")
user.forceMove(get_turf(actual_selected_rune))
return ..()
@@ -220,7 +220,7 @@
. = ..()
user.visible_message("[user]'s hand flashes a bright blue!", \
"You speak the words of the talisman, emitting an EMP blast.")
- empulse(src, 4, 8)
+ empulse(src, 4, 8, 1)
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
@@ -419,4 +419,4 @@
/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \
"Your [src] shatters in a discharge of dark magic!")
- . = ..()
\ No newline at end of file
+ . = ..()
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 702b59853dc..760868e8435 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -490,7 +490,7 @@ proc/display_roundstart_logout_report()
M.ghostize()
M.key = theghost.key
else
- message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take their place.")
+ message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take [M.p_their()] place.")
to_chat(M, "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban.")
/proc/printplayer(datum/mind/ply, fleecheck)
@@ -510,7 +510,7 @@ proc/display_roundstart_logout_report()
if(ply.current.real_name != ply.name)
text += " as [ply.current.real_name]"
else
- text += " had their body destroyed"
+ text += " had [ply.p_their()] body destroyed"
return text
/proc/printobjectives(datum/mind/ply)
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 0b1962b1717..9a43df56926 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -176,7 +176,7 @@
if(ishuman(target))
if(console!=null)
console.AddSnapshot(target)
- to_chat(user, "You scan [target] and add them to the database.")
+ to_chat(user, "You scan [target] and add [target.p_them()] to the database.")
/obj/item/abductor/gizmo/proc/mark(atom/target, mob/living/user)
if(marked == target)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 588900bb3e8..8682b50fc05 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -29,7 +29,7 @@
return
for(var/mob/living/carbon/slime/M in range(1, target))
if(M.Victim == target)
- to_chat(user, "[target] has a slime attached to them, deal with that first.")
+ to_chat(user, "[target] has a slime attached to [target.p_them()], deal with that first.")
return
visible_message("[user] puts [target] into the [src].")
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 00bf335c576..11ec158db84 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -325,7 +325,7 @@
to_chat(src, "You cannot infest someone who is already infested!")
return
- to_chat(src, "You slither up [M] and begin probing at their ear canal...")
+ to_chat(src, "You slither up [M] and begin probing at [M.p_their()] ear canal...")
if(!do_after(src, 50, target = M))
to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
@@ -500,7 +500,7 @@
to_chat(src, "You cannot dominate someone who is already infested!")
return
- to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.")
+ to_chat(src, "You focus your psychic lance on [M] and freeze [M.p_their()] limbs with a wave of terrible dread.")
to_chat(M, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.")
M.Weaken(3)
@@ -531,7 +531,7 @@
to_chat(src, "You decide against leaving your host.")
return
- to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.")
+ to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at [host.p_their()] internal ear canal.")
leaving = TRUE
@@ -623,7 +623,7 @@
to_chat(src,"You are feeling far too docile to do that.")
return
else
- to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.")
+ to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with [host.p_their()] nervous system.")
to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.")
var/borer_key = src.key
add_attack_logs(src, host, "Assumed control of (borer)")
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index de015cfa099..ab3af13e98d 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -451,6 +451,14 @@
Support:Has two modes. Combat: Medium power attacks and damage resist. Healer: Attacks heal damage, but low damage resist and slow movemen. Can deploy a bluespace beacon and warp targets to it (including you) in either mode.
Explosive: High damage resist and medium power attack. Can turn any object into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered.
+
+ Assassin: Medium damage with no damage resistance, can enter stealth which massively increases the damage of the next attack causing it to ignore armour.
+
+ Charger: Medium damage and defense, very fast and has a special charge attack which damages a target and knocks items out of their hands.
+
+ Lightning: Applies lightning chains to any targets on attack with a link to your summoner, lightning chains will shock anyone nearby.
+
+ Protector: You will become leashed to your holoparasite instead of them to you. Has two modes, a medium attack/defense mode and a protection mode which greatly reduces incoming damage to the holoparasite.
"}
/obj/item/paper/guardian/update_icon()
diff --git a/code/game/gamemodes/miniantags/guardian/types/charger.dm b/code/game/gamemodes/miniantags/guardian/types/charger.dm
index abdc349f175..17ed569f256 100644
--- a/code/game/gamemodes/miniantags/guardian/types/charger.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/charger.dm
@@ -6,7 +6,7 @@
ranged_cooldown_time = 40
speed = -1
damage_transfer = 0.6
- playstyle_string = "As a Charger type you do medium damage, have medium damage resistance, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding."
+ playstyle_string = "As a Charger type you do medium damage, have medium damage resistance, move very fast, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding. (Click a tile to use your charge ability)"
magic_fluff_string = "..And draw the Hunter, an alien master of rapid assault."
tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online."
bio_fluff_string = "Your scarab swarm finishes mutating and stirs to life, ready to deal damage."
diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm
index fe8b4897c42..9206b0d1b0b 100644
--- a/code/game/gamemodes/miniantags/guardian/types/protector.dm
+++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm
@@ -51,7 +51,7 @@
Recall(TRUE)
else
to_chat(summoner, "You moved out of range, and were pulled back! You can only move [range] meters from [src]!")
- summoner.visible_message("[summoner] jumps back to their protector.")
+ summoner.visible_message("[summoner] jumps back to [summoner.p_their()] protector.")
new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner))
summoner.forceMove(get_turf(src))
new /obj/effect/temp_visual/guardian/phase(get_turf(summoner))//Protector
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 32d51b579c4..5a7825c0cfe 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -73,7 +73,7 @@
icon_state = "revenant_draining"
reveal(27)
stun(27)
- target.visible_message("[target] suddenly rises slightly into the air, their skin turning an ashy gray.")
+ target.visible_message("[target] suddenly rises slightly into the air, [target.p_their()] skin turning an ashy gray.")
target.Beam(src,icon_state="drain_life",icon='icons/effects/effects.dmi',time=26)
if(do_after(src, 30, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining.
change_essence_amount(essence_drained, 0, target)
@@ -263,8 +263,8 @@
new/obj/effect/temp_visual/revenant(T)
T.ChangeTurf(/turf/simulated/wall/r_wall/rust)
for(var/obj/structure/window/window in T.contents)
- window.hit(rand(30,80))
- if(window && window.is_fulltile())
+ window.take_damage(rand(30,80))
+ if(window && window.fulltile)
new/obj/effect/temp_visual/revenant/cracks(window.loc)
for(var/obj/structure/closet/closet in T.contents)
closet.open()
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index aeb26f58822..6b5705cfa7f 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -149,7 +149,7 @@
if(!A)
to_chat(usr, "You could not locate any sapient heretics for the Slaughter.")
return 0
- to_chat(usr, "You sense a terrified soul at [A]. Show them the error of their ways.")
+ to_chat(usr, "You sense a terrified soul at [A]. Show [A.p_them()] the error of [A.p_their()] ways.")
/mob/living/simple_animal/slaughter/cult/New()
..()
@@ -241,7 +241,7 @@
return // Just so people don't accidentally waste it
/obj/item/organ/internal/heart/demon/attack_self(mob/living/user)
- user.visible_message("[user] raises [src] to their mouth and tears into it with their teeth!", \
+ user.visible_message("[user] raises [src] to [user.p_their()] mouth and tears into it with [user.p_their()] teeth!", \
"An unnatural hunger consumes you. You raise [src] to your mouth and devour it!")
playsound(user, 'sound/misc/Demon_consume.ogg', 50, 1)
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm
index 6bb181b4136..8fbeb2d9690 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -20,7 +20,7 @@
return
declaring_war = TRUE
- var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No")
+ var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No")
declaring_war = FALSE
if(!check_allowed(user))
@@ -30,7 +30,7 @@
to_chat(user, "On second thought, the element of surprise isn't so bad after all.")
return
- var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
+ var/war_declaration = "[user.real_name] has declared [user.p_their()] intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
declaring_war = TRUE
var/custom_threat = alert(user, "Do you want to customize your declaration?", "Customize?", "Yes", "No")
@@ -71,7 +71,7 @@
if(!is_admin_level(user.z))
to_chat(user, "You have to be at your base to use this.")
return FALSE
- if(world.time > CHALLENGE_TIME_LIMIT)
+ if((world.time - round_start_time) > CHALLENGE_TIME_LIMIT) // Only count after the round started
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
return FALSE
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 6a38b36b3df..e9bea1d8b1d 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -341,7 +341,7 @@
if(active)
active = FALSE
icon_state = icon_off
- user.visible_message("[user] deactivates their pinpointer.", "You deactivate your pinpointer.")
+ user.visible_message("[user] deactivates [user.p_their()] pinpointer.", "You deactivate your pinpointer.")
return
var/list/name_counts = list()
@@ -373,7 +373,7 @@
var/target = names[A]
active = TRUE
- user.visible_message("[user] activates their pinpointer.", "You activate your pinpointer.")
+ user.visible_message("[user] activates [user.p_their()] pinpointer.", "You activate your pinpointer.")
point_at(target)
/obj/item/pinpointer/crew/point_at(atom/target, spawnself = 1)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 151f7606351..07395aa0578 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -287,7 +287,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
target = pick(possible_targets)
if(target && target.current)
target_real_name = target.current.real_name
- explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role] while wearing their identification card."
+ explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role] while wearing [target.p_their()] identification card."
else
explanation_text = "Free Objective"
@@ -528,7 +528,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
target = pick(possible_targets)
if(target && target.current)
- explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
+ explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take [target.current.p_them()] alive."
else
explanation_text = "Free Objective"
return target
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 4f500825065..089cad71a3a 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -279,7 +279,7 @@
to_chat(M, "The frame beeps contentedly, purging the hostile memory engram from the MMI before initalizing it.")
else
- to_chat(M, "[rev_mind.current] looks like they just remembered their real allegiance!")
+ to_chat(M, "[rev_mind.current] looks like [rev_mind.current.p_they()] just remembered [rev_mind.current.p_their()] real allegiance!")
/////////////////////////////////////
//Adds the rev hud to a new convert//
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index ed8603360fe..1d0bb3adf03 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -188,7 +188,7 @@ Made by Xhuis
M.audible_message("[M] lets out a short blip.", \
"You have been turned into a robot! You are no longer a thrall! Though you try, you cannot remember anything about your servitude...")
else
- M.visible_message("[M] looks like their mind is their own again!", \
+ M.visible_message("[M] looks like [M.p_their()] mind is [M.p_their()] own again!", \
"A piercing white light floods your eyes. Your mind is your own again! Though you try, you cannot remember anything about the shadowlings or your time \
under their command...")
return 1
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 06f7bc9440c..89aee290422 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -40,9 +40,9 @@
return
var/mob/living/carbon/human/M = target
user.visible_message("[user]'s eyes flash a blinding red!")
- target.visible_message("[target] freezes in place, their eyes glazing over...")
+ target.visible_message("[target] freezes in place, [target.p_their()] eyes glazing over...")
if(in_range(target, user))
- to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by their heavenly beauty...")
+ to_chat(target, "Your gaze is forcibly drawn into [user]'s eyes, and you are mesmerized by [user.p_their()] heavenly beauty...")
else //Only alludes to the shadowling if the target is close by
to_chat(target, "Red lights suddenly dance in your vision, and you are mesmerized by the heavenly lights...")
target.Stun(10)
@@ -306,7 +306,7 @@
switch(progress)
if(1)
to_chat(user, "You place your hands to [target]'s head...")
- user.visible_message("[user] places their hands onto the sides of [target]'s head!")
+ user.visible_message("[user] places [user.p_their()] hands onto the sides of [target]'s head!")
if(2)
to_chat(user, "You begin preparing [target]'s mind as a blank slate...")
user.visible_message("[user]'s palms flare a bright red against [target]'s temples!")
@@ -315,7 +315,7 @@
sleep(20)
if(ismindshielded(target))
to_chat(user, "They have a mindshield implant. You begin to deactivate it - this will take some time.")
- user.visible_message("[user] pauses, then dips their head in concentration!")
+ user.visible_message("[user] pauses, then dips [user.p_their()] head in concentration!")
to_chat(target, "Your mindshield implant becomes hot as it comes under attack!")
sleep(100) //10 seconds - not spawn() so the enthralling takes longer
to_chat(user, "The nanobots composing the mindshield implant have been rendered inert. Now to continue.")
@@ -361,7 +361,7 @@
if(!istype(target) || !ishuman(target))
return
var/mob/living/carbon/human/H = target
- H.visible_message("[H]'s skin suddenly bubbles and shifts around their body!", \
+ H.visible_message("[H]'s skin suddenly bubbles and shifts around [H.p_their()] body!", \
"You regenerate your protective armor and cleanse your form of defects.")
H.adjustCloneLoss(-target.getCloneLoss())
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(H), slot_w_uniform)
@@ -493,7 +493,7 @@
to_chat(M, "You breathe in the black smoke, and your eyes burn horribly!")
M.EyeBlind(5)
if(prob(25))
- M.visible_message("[M] claws at their eyes!")
+ M.visible_message("[M] claws at [M.p_their()] eyes!")
M.Stun(3)
else
to_chat(M, "You breathe in the black smoke, and you feel revitalized!")
@@ -540,9 +540,7 @@
sp.start()
S.Weaken(6)
for(var/obj/structure/window/W in T.contents)
- W.hit(rand(80, 100))
-
-
+ W.take_damage(rand(80, 100))
/obj/effect/proc_holder/spell/aoe_turf/drainLife
name = "Drain Life"
@@ -627,9 +625,9 @@
to_chat(user, "You cannot spare this much energy. There are too many empowered thralls.")
charge_counter = charge_max
return
- user.visible_message("[user] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \
+ user.visible_message("[user] places [user.p_their()] hands over [thrallToRevive]'s face, red light shining from beneath.", \
"You place your hands on [thrallToRevive]'s face and begin gathering energy...")
- to_chat(thrallToRevive, "[user] places their hands over your face. You feel energy gathering. Stand still...")
+ to_chat(thrallToRevive, "[user] places [user.p_their()] hands over your face. You feel energy gathering. Stand still...")
if(!do_mob(user, thrallToRevive, 80))
to_chat(user, "Your concentration snaps. The flow of energy ebbs.")
charge_counter = charge_max
@@ -640,7 +638,7 @@
playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
thrallToRevive.Weaken(5)
- thrallToRevive.visible_message("[thrallToRevive] collapses, their skin and face distorting!", \
+ thrallToRevive.visible_message("[thrallToRevive] collapses, [thrallToRevive.p_their()] skin and face distorting!", \
"AAAAAAAAAAAAAAAAAAAGH-")
sleep(20)
thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \
@@ -659,7 +657,7 @@
to_chat(user, "[thrallToRevive] is not dead.")
charge_counter = charge_max
return
- user.visible_message("[user] kneels over [thrallToRevive], placing their hands on \his chest.", \
+ user.visible_message("[user] kneels over [thrallToRevive], placing [user.p_their()] hands on [thrallToRevive.p_their()] chest.", \
"You crouch over the body of your thrall and begin gathering energy...")
thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.", source = thrallToRevive)
if(!do_mob(user, thrallToRevive, 30))
@@ -673,7 +671,7 @@
user.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
sleep(10)
if(thrallToRevive.revive())
- thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes.", \
+ thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in [thrallToRevive.p_their()] eyes.", \
"You have returned. One of your masters has brought you from the darkness beyond.")
thrallToRevive.Weaken(4)
thrallToRevive.emote("gasp")
@@ -710,7 +708,7 @@
var/mob/living/carbon/human/M = target
user.visible_message("[user]'s eyes flash a bright red!", \
"You begin to draw [M]'s life force.")
- M.visible_message("[M]'s face falls slack, their jaw slightly distending.", \
+ M.visible_message("[M]'s face falls slack, [M.p_their()] jaw slightly distending.", \
"You are suddenly transported... far, far away...")
if(!do_after(user, 50, target = M))
to_chat(M, "You are snapped back to reality, your haze dissipating!")
@@ -754,7 +752,7 @@
to_chat(user, "Making an ally explode seems unwise.")
charge_counter = charge_max
return
- user.visible_message("[user]'s markings flare as they gesture at [boom]!", \
+ user.visible_message("[user]'s markings flare as [user.p_they()] gesture[user.p_s()] at [boom]!", \
"You direct a lance of telekinetic energy at [boom].")
sleep(4)
if(iscarbon(boom))
@@ -798,7 +796,7 @@
charge_counter = charge_max
return
- to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing them into a thrall.")
+ to_chat(user, "You instantly rearrange [target]'s memories, hyptonitizing [target.p_them()] into a thrall.")
to_chat(target, "An agonizing spike of pain drives into your mind, and--")
ticker.mode.add_thrall(target.mind)
target.mind.special_role = SPECIAL_ROLE_SHADOWLING_THRALL
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 5c05a028df0..4239b5db327 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -43,7 +43,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
var/temp_flags = H.status_flags
H.status_flags |= GODMODE //Can't die while hatching
- H.visible_message("A chrysalis forms around [H], sealing them inside.", \
+ H.visible_message("A chrysalis forms around [H], sealing [H.p_them()] inside.", \
"You create your chrysalis and begin to contort within.")
sleep(100)
@@ -51,7 +51,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
"Spines pierce your back. Your claws break apart your fingers. You feel excruciating pain as your true form begins its exit.")
sleep(90)
- H.visible_message("[H], skin shifting, begins tearing at the walls around them.", \
+ H.visible_message("[H], skin shifting, begins tearing at the walls around [H.p_them()].", \
"Your false skin slips away. You begin tearing at the fragile membrane protecting you.")
sleep(80)
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index ec8a1643c27..9234043976c 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -346,7 +346,7 @@
// Tell them about people they might want to contact.
var/mob/living/carbon/human/M = get_nt_opposed()
if(M && M != traitor_mob)
- to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.")
+ to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting [M.p_them()].")
traitor_mob.mind.store_memory("Potential Collaborator: [M.real_name]")
//let's also inform their contact that they might be called upon, but leave it vague.
inform_collab(M)
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index c2431f17318..14ba6fb9dd0 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -279,8 +279,8 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
to_chat(owner, "[owner.wear_mask] prevents you from biting [H]!")
draining = null
return
- add_attack_logs(owner, H, "vampirebit & is draining their blood.", FALSE)
- owner.visible_message("[owner] grabs [H]'s neck harshly and sinks in their fangs!", "You sink your fangs into [H] and begin to drain their blood.", "You hear a soft puncture and a wet sucking noise.")
+ add_attack_logs(owner, H, "vampirebit & is draining their blood.", ATKLOG_ALMOSTALL)
+ owner.visible_message("[owner] grabs [H]'s neck harshly and sinks in [owner.p_their()] fangs!", "You sink your fangs into [H] and begin to drain [owner.p_their()] blood.", "You hear a soft puncture and a wet sucking noise.")
if(!iscarbon(owner))
H.LAssailant = null
else
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index e9a249d8412..c9dad5c510d 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -175,7 +175,7 @@
/obj/effect/proc_holder/spell/vampire/targetted/hypnotise/cast(list/targets, mob/user = usr)
for(var/mob/living/target in targets)
- user.visible_message("[user]'s eyes flash briefly as he stares into [target]'s eyes")
+ user.visible_message("[user]'s eyes flash briefly as [user.p_they()] stare[user.p_s()] into [target]'s eyes")
if(do_mob(user, target, 50))
if(!affects(target))
to_chat(user, "Your piercing gaze fails to knock out [target].")
@@ -270,7 +270,7 @@
C.Stun(4)
C.Jitter(150)
for(var/obj/structure/window/W in view(4))
- W.destroy()
+ W.deconstruct(FALSE)
playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
@@ -345,8 +345,8 @@
ticker.mode.vampire_enthralled.Add(H.mind)
ticker.mode.vampire_enthralled[H.mind] = user.mind
H.mind.special_role = SPECIAL_ROLE_VAMPIRE_THRALL
- to_chat(H, "You have been Enthralled by [user]. Follow their every command.")
- to_chat(user, "You have successfully Enthralled [H]. If they refuse to do as you say just adminhelp.")
+ to_chat(H, "You have been Enthralled by [user]. Follow [user.p_their()] every command.")
+ to_chat(user, "You have successfully Enthralled [H]. If [H.p_they()] refuse[H.p_s()] to do as you say just adminhelp.")
add_attack_logs(user, H, "Vampire-thralled")
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 2e99f0238c5..7c1a3526002 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -56,7 +56,7 @@
new /obj/effect/particle_effect/smoke(H.loc)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(H.loc)
M.key = C.key
- to_chat(M, "You are the [H.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals.")
+ to_chat(M, "You are the [H.real_name]'s apprentice! You are bound by magic contract to follow [H.p_their()] orders and help [H.p_them()] in accomplishing their goals.")
switch(href_list["school"])
if("destruction")
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
@@ -213,7 +213,7 @@
/obj/item/scrying/attack_self(mob/user as mob)
to_chat(user, " You can see...everything!")
- visible_message("[user] stares into [src], their eyes glazing over.")
+ visible_message("[user] stares into [src], [user.p_their()] eyes glazing over.")
user.ghostize(1)
/////////////////////Multiverse Blade////////////////////
@@ -277,7 +277,7 @@ var/global/list/multiverse = list()
var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
hijack_objective.owner = usr.mind
usr.mind.objectives += hijack_objective
- hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!"
+ hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!"
to_chat(usr, "Objective #[1]: [hijack_objective.explanation_text]")
ticker.mode.traitors += usr.mind
usr.mind.special_role = "[usr.real_name] Prime"
@@ -318,7 +318,7 @@ var/global/list/multiverse = list()
C.prefs.copy_to(M)
M.key = C.key
M.mind.name = user.real_name
- to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help them accomplish their goals at all costs.")
+ to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help [user.p_them()] accomplish [user.p_their()] goals at all costs.")
M.faction = list("[user.real_name]")
if(duplicate_self)
M.set_species(user.get_species()) //duplicate the sword user's species.
@@ -342,7 +342,7 @@ var/global/list/multiverse = list()
var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
hijack_objective.owner = M.mind
M.mind.objectives += hijack_objective
- hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!"
+ hijack_objective.explanation_text = "Ensure only [usr.real_name] and [usr.p_their()] copies are on the shuttle!"
to_chat(M, "Objective #[1]: [hijack_objective.explanation_text]")
M.mind.special_role = SPECIAL_ROLE_MULTIVERSE
log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.")
@@ -350,7 +350,7 @@ var/global/list/multiverse = list()
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = M.mind
new_objective.target = usr.mind
- new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones."
+ new_objective.explanation_text = "Protect [usr.real_name], your copy, and help [usr.p_them()] defend the innocent from the mobs of multiverse clones."
M.mind.objectives += new_objective
to_chat(M, "Objective #[1]: [new_objective.explanation_text]")
M.mind.special_role = SPECIAL_ROLE_MULTIVERSE
@@ -652,7 +652,7 @@ var/global/list/multiverse = list()
equip_skeleton(M)
spooky_scaries |= M
to_chat(M, "You have been revived by [user.real_name]!")
- to_chat(M, "They are your master now, assist them even if it costs you your new life!")
+ to_chat(M, "[user.p_theyre(TRUE)] your master now, assist them even if it costs you your new life!")
desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]"
/obj/item/necromantic_stone/proc/check_spooky()
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index cb303a90932..4bd7f3004d8 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -167,9 +167,9 @@
icon_state = "soulstone"
name = initial(name)
if(iswizard(usr) || usability)
- to_chat(A, "You have been released from your prison, but you are still bound to [usr.real_name]'s will. Help them succeed in their goals at all costs.")
+ to_chat(A, "You have been released from your prison, but you are still bound to [usr.real_name]'s will. Help [usr.p_them()] succeed in [usr.p_their()] goals at all costs.")
else if(iscultist(usr))
- to_chat(A, "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.")
+ to_chat(A, "You have been released from your prison, but you are still bound to the cult's will. Help [usr.p_them()] succeed in [usr.p_their()] goals at all costs.")
was_used()
attack_self(U)
@@ -280,7 +280,7 @@
ticker.mode.update_cult_icons_added(Z.mind)
qdel(T)
to_chat(Z, "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike.")
- to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
+ to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.")
Z.cancel_camera()
qdel(C)
@@ -296,7 +296,7 @@
ticker.mode.update_cult_icons_added(Z.mind)
qdel(T)
to_chat(Z, "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.")
- to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
+ to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.")
Z.cancel_camera()
qdel(C)
@@ -312,7 +312,7 @@
ticker.mode.update_cult_icons_added(Z.mind)
qdel(T)
to_chat(Z, "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone).")
- to_chat(Z, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
+ to_chat(Z, "You are still bound to serve your creator, follow [U.p_their()] orders and help [U.p_them()] complete [U.p_their()] goals at all costs.")
Z.cancel_camera()
qdel(C)
else
@@ -332,11 +332,11 @@
ticker.mode.cult+=newstruct.mind
ticker.mode.update_cult_icons_added(newstruct.mind)
if(stoner && iswizard(stoner))
- to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
+ to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
else if(stoner && iscultist(stoner))
- to_chat(newstruct, "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs.")
+ to_chat(newstruct, "You are still bound to serve the cult, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
else
- to_chat(newstruct, "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.")
+ to_chat(newstruct, "You are still bound to serve your creator, follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
newstruct.cancel_camera()
/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
@@ -362,11 +362,11 @@
name = "soulstone: Shade of [T.real_name]"
icon_state = "soulstone2"
if(U && iswizard(U))
- to_chat(S, "Your soul has been captured! You are now bound to [U.real_name]'s will. Help them succeed in their goals at all costs.")
+ to_chat(S, "Your soul has been captured! You are now bound to [U.real_name]'s will. Help [U.p_them()] succeed in their goals at all costs.")
else if(U && iscultist(U))
- to_chat(S, "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs.")
+ to_chat(S, "Your soul has been captured! You are now bound to the cult's will. Help [U.p_them()] succeed in their goals at all costs.")
if(vic && U)
- to_chat(U, "Capture successful!: [T.real_name]'s soul has been ripped from their body and stored within the soul stone.")
+ to_chat(U, "Capture successful!: [T.real_name]'s soul has been ripped from [U.p_their()] body and stored within the soul stone.")
/obj/item/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
var/mob/dead/observer/chosen_ghost
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 40c303ea36f..b5e798b95c7 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -141,15 +141,10 @@
wizard_mob.equip_to_slot_or_del(new /obj/item/radio/headset(wizard_mob), slot_l_ear)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes)
- if(!wizard_mob.get_species() == "Plasmaman")//handled in the species file for plasmen on the afterjob equip proc for now
+ if(wizard_mob.get_species() != "Plasmaman") //handled in the species file for plasmen on the afterjob equip proc for now
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
- if(wizard_mob.backbag == 2)
- wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack(wizard_mob), slot_back)
- if(wizard_mob.backbag == 3)
- wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel_norm(wizard_mob), slot_back)
- if(wizard_mob.backbag == 4)
- wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(wizard_mob), slot_back)
+ wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(wizard_mob), slot_back)
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/box/survival(wizard_mob), slot_in_backpack)
wizard_mob.equip_to_slot_or_del(new /obj/item/teleportation_scroll(wizard_mob), slot_r_store)
var/obj/item/spellbook/spellbook = new /obj/item/spellbook(wizard_mob)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 61c14efc2e5..0e315e03b2c 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -1,10 +1,6 @@
var/global/datum/controller/occupations/job_master
-#define GET_RANDOM_JOB 0
-#define BE_ASSISTANT 1
-#define RETURN_TO_LOBBY 2
-
/datum/controller/occupations
//List of all jobs
var/list/occupations = list()
diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm
index 036d289a848..90bac6d8383 100644
--- a/code/game/jobs/job_objective.dm
+++ b/code/game/jobs/job_objective.dm
@@ -68,7 +68,7 @@
count++
if(tasks_completed >= 1)
- text += " [employee.name] did their fucking job!"
+ text += " [employee.name] did [employee.p_their()] fucking job!"
feedback_add_details("employee_success","SUCCESS")
else
feedback_add_details("employee_success","FAIL")
diff --git a/code/game/jobs/job_scaling.dm b/code/game/jobs/job_scaling.dm
new file mode 100644
index 00000000000..7d8804783f1
--- /dev/null
+++ b/code/game/jobs/job_scaling.dm
@@ -0,0 +1,11 @@
+/hook/roundstart/proc/jobscaling()
+ sleep(10 SECONDS) // give everyone time to finish spawning, and the lag to die down
+ var/playercount = length(clients)
+ var/highpop_trigger = 80
+
+ if(playercount >= highpop_trigger)
+ log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - loading highpop job config");
+ job_master.LoadJobs("config/jobs_highpop.txt")
+ else
+ log_debug("Playercount: [playercount] versus trigger: [highpop_trigger] - keeping standard job config");
+ return 1
\ No newline at end of file
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 3c9c27f1590..f7925fecda5 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -54,13 +54,12 @@
if(prob(75))
qdel(src)
-/obj/machinery/optable/attack_hand(mob/user as mob)
- if(HULK in usr.mutations)
- to_chat(usr, text("You destroy the table."))
- visible_message("[usr] destroys the operating table!")
- src.density = 0
+/obj/machinery/optable/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ ..(user, TRUE)
+ visible_message("[user] destroys the operating table!")
qdel(src)
- return
+ return TRUE
/obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0) return 1
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 7d386ddfb1a..24311a8b12e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -257,7 +257,7 @@
if(href_list["chemical"])
if(occupant)
if(occupant.stat == DEAD)
- to_chat(usr, "This person has no life for to preserve anymore. Take them to a department capable of reanimating them.")
+ to_chat(usr, "This person has no life for to preserve anymore. Take [occupant.p_them()] to a department capable of reanimating them.")
else if(occupant.health > min_health || (href_list["chemical"] in emergency_chems))
inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"]))
else
@@ -327,34 +327,35 @@
return
if(istype(G, /obj/item/grab))
+ var/obj/item/grab/GG = G
if(panel_open)
to_chat(user, "Close the maintenance panel first.")
return
- if(!ismob(G:affecting))
+ if(!ismob(GG.affecting))
return
if(src.occupant)
to_chat(user, "The sleeper is already occupied!")
return
- for(var/mob/living/carbon/slime/M in range(1,G:affecting))
- if(M.Victim == G:affecting)
- to_chat(usr, "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head.")
+ for(var/mob/living/carbon/slime/M in range(1,GG.affecting))
+ if(M.Victim == GG.affecting)
+ to_chat(usr, "[GG.affecting.name] will not fit into the sleeper because [GG.affecting.p_they()] [GG.affecting.p_have()] a slime latched onto [GG.affecting.p_their()] head.")
return
- visible_message("[user] starts putting [G:affecting:name] into the sleeper.")
+ visible_message("[user] starts putting [GG.affecting.name] into the sleeper.")
- if(do_after(user, 20, target = G:affecting))
+ if(do_after(user, 20, target = GG.affecting))
if(src.occupant)
to_chat(user, "The sleeper is already occupied!")
return
- if(!G || !G:affecting) return
- var/mob/M = G:affecting
+ if(!GG || !GG.affecting) return
+ var/mob/M = GG.affecting
M.forceMove(src)
src.occupant = M
src.icon_state = "[base_icon]"
to_chat(M, "You feel cool air surround you. You go numb as your senses turn inward.")
src.add_fingerprint(user)
- qdel(G)
+ qdel(GG)
return
return
@@ -496,7 +497,7 @@
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
- to_chat(usr, "[L.name] will not fit into the sleeper because they have a slime latched onto their head.")
+ to_chat(usr, "[L.name] will not fit into the sleeper because [L.p_they()] [L.p_have()] a slime latched onto their head.")
return
if(L == user)
visible_message("[user] starts climbing into the sleeper.")
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index f2dc8c8bfa2..59009e9930f 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -95,7 +95,7 @@
return
for(var/mob/living/carbon/slime/M in range(1, TYPECAST_YOUR_SHIT.affecting))
if(M.Victim == TYPECAST_YOUR_SHIT.affecting)
- to_chat(user, "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to them, deal with that first.")
+ to_chat(user, "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to [TYPECAST_YOUR_SHIT.affecting.p_them()], deal with that first.")
return
var/mob/M = TYPECAST_YOUR_SHIT.affecting
if(M.abiotic())
@@ -133,7 +133,7 @@
return 0
for(var/mob/living/carbon/slime/M in range(1, O))
if(M.Victim == O)
- to_chat(user, "[O] has a fucking slime attached to them, deal with that first.")
+ to_chat(user, "[O] has a fucking slime attached to [O.p_them()], deal with that first.")
return 0
if(O == user)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index f9d83ff43f6..f24197009bd 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -118,6 +118,8 @@
var/report_danger_level = 1
+ var/automatic_emergency = 1 //Does the alarm automaticly respond to an emergency condition
+
/obj/machinery/alarm/monitor
report_danger_level = 0
@@ -236,9 +238,11 @@
elect_master()
/obj/machinery/alarm/proc/master_is_operating()
- if(! alarm_area)
+ if(!alarm_area)
alarm_area = areaMaster
-
+ if(!alarm_area)
+ log_runtime(EXCEPTION("Air alarm /obj/machinery/alarm lacks alarm_area and areaMaster vars during proc/master_is_operating()"), src)
+ return FALSE
return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN))
@@ -304,7 +308,7 @@
if(old_danger_level!=danger_level)
apply_danger_level()
- if(mode == AALARM_MODE_SCRUBBING && danger_level == ATMOS_ALARM_DANGER)
+ if(automatic_emergency && mode == AALARM_MODE_SCRUBBING && danger_level == ATMOS_ALARM_DANGER)
if(pressure_dangerlevel == ATMOS_ALARM_DANGER)
mode = AALARM_MODE_OFF
if(temperature_dangerlevel == ATMOS_ALARM_DANGER && cur_tlv.max2 <= environment.temperature)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 1e207e3bdde..eebae34b9ea 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -814,7 +814,7 @@
if(ORION_TRAIL_SPACEPORT)
if(spaceport_raided)
- eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!"
+ eventdat += "The Spaceport is on high alert! They wont let you dock since you tried to attack them!"
if(last_spaceport_action)
eventdat += " Last Spaceport Action: [last_spaceport_action]"
eventdat += "
"
@@ -1051,7 +1048,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ResetJobs()
SetChoices(user)
if("random")
- if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN)
+ if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_ASSISTANT)
alternate_option += 1
else if(alternate_option == RETURN_TO_LOBBY)
alternate_option = 0
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index f2a9d739cfe..a175e39bc71 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -17,7 +17,8 @@
windowflashing,
ghost_anonsay,
exp,
- clientfps
+ clientfps,
+ atklog
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -48,6 +49,7 @@
ghost_anonsay = text2num(query.item[15])
exp = query.item[16]
clientfps = text2num(query.item[17])
+ atklog = text2num(query.item[18])
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -66,6 +68,7 @@
ghost_anonsay = sanitize_integer(ghost_anonsay, 0, 1, initial(ghost_anonsay))
exp = sanitize_text(exp, initial(exp))
clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps))
+ atklog = sanitize_integer(atklog, 0, 100, initial(atklog))
return 1
/datum/preferences/proc/save_preferences(client/C)
@@ -85,6 +88,7 @@
be_role='[sanitizeSQL(list2params(be_special))]',
default_slot='[default_slot]',
toggles='[toggles]',
+ atklog='[atklog]',
sound='[sound]',
randomslot='[randomslot]',
volume='[volume]',
@@ -93,7 +97,8 @@
lastchangelog='[lastchangelog]',
windowflashing='[windowflashing]',
ghost_anonsay='[ghost_anonsay]',
- clientfps='[clientfps]'
+ clientfps='[clientfps]',
+ atklog='[atklog]'
WHERE ckey='[C.ckey]'"}
)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 282603a8879..060e53df5b7 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -411,7 +411,7 @@ BLIND // can't see anything
desc = "[desc] They have had their toes opened up."
update_icon()
else
- to_chat(user, "[src] have already had their toes cut open!")
+ to_chat(user, "[src] have already had [p_their()] toes cut open!")
return
else
..()
@@ -489,7 +489,7 @@ BLIND // can't see anything
for(var/obj/item/I in O.contents) //Dump the pocket out onto the floor below the user.
user.unEquip(I,1)
- user.visible_message("[user] bellows, [pick("shredding", "ripping open", "tearing off")] their jacket in a fit of rage!","You accidentally [pick("shred", "rend", "tear apart")] \the [src] with your [pick("excessive", "extreme", "insane", "monstrous", "ridiculous", "unreal", "stupendous")] [pick("power", "strength")]!")
+ user.visible_message("[user] bellows, [pick("shredding", "ripping open", "tearing off")] [user.p_their()] jacket in a fit of rage!","You accidentally [pick("shred", "rend", "tear apart")] [src] with your [pick("excessive", "extreme", "insane", "monstrous", "ridiculous", "unreal", "stupendous")] [pick("power", "strength")]!")
user.unEquip(src)
qdel(src) //Now that the pockets have been emptied, we can safely destroy the jacket.
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index dc1504b80b6..40c29c1d991 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -134,7 +134,7 @@
update_icon()
/obj/item/clothing/gloves/fingerless/rapid
- name = "Gloves of the north star"
+ name = "Gloves of the North Star"
desc = "Just looking at these fills you with an urge to beat the shit out of people."
/obj/item/clothing/gloves/fingerless/rapid/Touch(mob/living/target, proximity = TRUE)
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 10f5a348318..dc8c4b59a4d 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -222,7 +222,7 @@
return 1
/obj/item/clothing/head/fedora/proc/tip_fedora(mob/user)
- user.visible_message("[user] tips their fedora.", "You tip your fedora")
+ user.visible_message("[user] tips [user.p_their()] fedora.", "You tip your fedora")
/obj/item/clothing/head/fez
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 60cbfff3dd9..22f293aedfc 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -8,7 +8,7 @@
gas_transfer_coefficient = 0.90
put_on_delay = 20
var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove
- var/mute = MUTE_ALL
+ var/mute = MUZZLE_MUTE_ALL
var/security_lock = FALSE // Requires brig access to remove 0 - Remove as normal
var/locked = FALSE //Indicates if a mask is locked, should always start as 0.
species_fit = list("Vox")
@@ -22,8 +22,8 @@
return 0
else if(security_lock && locked)
if(do_unlock(user))
- visible_message("[user] unlocks their [src.name].", \
- "[user] unlocks their [src.name].")
+ visible_message("[user] unlocks [user.p_their()] [src.name].", \
+ "[user] unlocks [user.p_their()] [src.name].")
..()
return 1
@@ -93,7 +93,7 @@
item_state = null
w_class = WEIGHT_CLASS_TINY
resist_time = 150
- mute = MUTE_MUFFLE
+ mute = MUZZLE_MUTE_MUFFLE
flags = DROPDEL
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
@@ -117,7 +117,7 @@
name = "safety muzzle"
desc = "A muzzle designed to prevent biting."
resist_time = 600
- mute = MUTE_NONE
+ mute = MUZZLE_MUTE_NONE
security_lock = TRUE
locked = FALSE
@@ -169,7 +169,7 @@
return 1
/obj/item/clothing/mask/fakemoustache/proc/pontificate(mob/user)
- user.visible_message("\ [user] twirls \his moustache and laughs [pick("fiendishly","maniacally","diabolically","evilly")]!")
+ user.visible_message("\ [user] twirls [user.p_their()] moustache and laughs [pick("fiendishly","maniacally","diabolically","evilly")]!")
//scarves (fit in in mask slot)
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 123b4e5fd5e..91884eeba2d 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -9,9 +9,10 @@
var/obj/machinery/camera/camera
var/has_camera = TRUE
strip_delay = 130
- species_fit = list("Grey")
+ species_fit = list("Grey", "Vox")
sprite_sheets = list(
- "Grey" = 'icons/mob/species/grey/helmet.dmi'
+ "Grey" = 'icons/mob/species/grey/helmet.dmi',
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
)
/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user)
@@ -41,9 +42,10 @@
/obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \
/obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun)
strip_delay = 130
- species_fit = list("Drask")
+ species_fit = list("Drask", "Vox")
sprite_sheets = list(
- "Drask" = 'icons/mob/species/drask/suit.dmi'
+ "Drask" = 'icons/mob/species/drask/suit.dmi',
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
)
//Commander
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index f5a6176a6c4..8ee357b1ffb 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -71,6 +71,11 @@
allowed = list(/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/tank,/obj/item/kitchen/knife/combat)
armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
strip_delay = 120
+ species_restricted = list("exclude", "Diona", "Wryn")
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer's beret"
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 7a2d9e5e495..eab5aa0c5bb 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -366,7 +366,7 @@
correct_piece.icon_state = "[initial(icon_state)]"
switch(msg_type)
if("boots")
- to_chat(wearer, "\The [correct_piece] relax their grip on your legs.")
+ to_chat(wearer, "\The [correct_piece] relax [correct_piece.p_their()] grip on your legs.")
if(user != wearer)
to_chat(user, "\The [correct_piece] has been unsealed.")
wearer.update_inv_shoes()
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 74d07164101..7880dcc1dd3 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -9,6 +9,10 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
burn_state = FIRE_PROOF
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
+ )
/obj/item/clothing/suit/bio_suit
name = "bio suit"
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 6aa79584fc7..e0b444afcd0 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -77,7 +77,7 @@
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/head.dmi'
+ "Vox" = 'icons/mob/species/vox/helmet.dmi'
)
/obj/item/clothing/suit/bomb_suit
@@ -108,16 +108,12 @@
/obj/item/clothing/head/bomb_hood/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
- species_fit = null
- sprite_sheets = null
/obj/item/clothing/suit/bomb_suit/security
icon_state = "bombsuitsec"
item_state = "bombsuitsec"
allowed = list(/obj/item/gun/energy,/obj/item/melee/baton,/obj/item/restraints/handcuffs)
- species_fit = null
- sprite_sheets = null
/*
* Radiation protection
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 6d2e0363138..aac34032dfb 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -131,7 +131,7 @@
/obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user)
if(ishuman(M) && isliving(user))
if(user == M)
- user.visible_message("[user] places \the [src] against \his chest and listens attentively.", "You place \the [src] against your chest...")
+ user.visible_message("[user] places [src] against [user.p_their()] chest and listens attentively.", "You place [src] against your chest...")
else
user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
@@ -250,7 +250,7 @@
to_chat(user, "Waving around a badge before swiping an ID would be pretty pointless.")
return
if(isliving(user))
- user.visible_message("[user] displays their Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","You display your Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.")
+ user.visible_message("[user] displays [user.p_their()] Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.","You display your Nanotrasen Internal Security Legal Authorization Badge.\nIt reads: [stored_name], NT Security.")
/obj/item/clothing/accessory/holobadge/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/card/id) || istype(O, /obj/item/pda))
@@ -284,7 +284,7 @@
/obj/item/clothing/accessory/holobadge/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
- user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently.","You invade [M]'s personal space, thrusting [src] into their face insistently. You are the law.")
+ user.visible_message("[user] invades [M]'s personal space, thrusting [src] into [M.p_their()] face insistently.","You invade [M]'s personal space, thrusting [src] into [M.p_their()] face insistently. You are the law.")
/obj/item/storage/box/holobadge
name = "holobadge box"
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 1fe849a4cb0..a229b72f745 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -46,7 +46,7 @@
var/mob/living/carbon/human/target = M
if(istype(target.species, /datum/species/machine))
- to_chat(user, "[target] has no skin, how do you expect to tattoo them?")
+ to_chat(user, "[target] has no skin, how do you expect to tattoo [target.p_them()]?")
return
if(target.m_styles["body"] != "None")
@@ -1370,4 +1370,13 @@
/obj/item/clothing/suit/fluff/vetcoat/navy //Furasian: Fillmoore Grayson
icon_state = "alchemistcoatnavy"
- item_state = "alchemistcoatnavy"
\ No newline at end of file
+ item_state = "alchemistcoatnavy"
+
+/obj/item/clothing/accessory/medal/fluff/panzermedal //PanzerSkull: GRN-DER
+ name = "Cross of Valor"
+ desc = "A medal from the bygone Asteroid Wars. Its Ruby shines with a strange intensity."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "panzermedal"
+ item_state = "panzermedal"
+ item_color = "panzermedal"
+ slot_flags = SLOT_TIE
\ No newline at end of file
diff --git a/code/modules/economy/Economy.dm b/code/modules/economy/Economy.dm
index 028c2810ae7..57d76e98c5c 100644
--- a/code/modules/economy/Economy.dm
+++ b/code/modules/economy/Economy.dm
@@ -38,7 +38,7 @@
#define MINERALS 8
#define EMERGENCY 9
-#define GAS 10
+#define EGAS 10
#define MAINTENANCE 11
#define ELECTRICAL 12
#define ROBOTICS 13
diff --git a/code/modules/economy/Economy_Events.dm b/code/modules/economy/Economy_Events.dm
index c1e5b95273e..10e0d574f98 100644
--- a/code/modules/economy/Economy_Events.dm
+++ b/code/modules/economy/Economy_Events.dm
@@ -29,16 +29,16 @@
if(INDUSTRIAL_ACCIDENT)
dearer_goods = list(EMERGENCY, BIOMEDICAL, ROBOTICS)
if(BIOHAZARD_OUTBREAK)
- dearer_goods = list(BIOMEDICAL, GAS)
+ dearer_goods = list(BIOMEDICAL, EGAS)
if(PIRATES)
dearer_goods = list(SECURITY, MINERALS)
if(CORPORATE_ATTACK)
dearer_goods = list(SECURITY, MAINTENANCE)
if(ALIEN_RAIDERS)
dearer_goods = list(BIOMEDICAL, ANIMALS)
- cheaper_goods = list(GAS, MINERALS)
+ cheaper_goods = list(EGAS, MINERALS)
if(AI_LIBERATION)
- dearer_goods = list(EMERGENCY, GAS, MAINTENANCE)
+ dearer_goods = list(EMERGENCY, EGAS, MAINTENANCE)
if(MOURNING)
cheaper_goods = list(MINERALS, MAINTENANCE)
if(CULT_CELL_REVEALED)
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index b514924abfa..cf2e3621498 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -11,7 +11,7 @@
/datum/event/disease_outbreak/start()
if(!virus_type)
- virus_type = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis)
+ virus_type = pick(/datum/disease/advance/flu, /datum/disease/advance/cold, /datum/disease/brainrot, /datum/disease/magnitis, /datum/disease/beesease, /datum/disease/anxiety, /datum/disease/fake_gbs, /datum/disease/fluspanish, /datum/disease/pierrot_throat, /datum/disease/lycan)
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
if(issmall(H)) //don't infect monkies; that's a waste
diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm
index c5a5873afa0..d11a1227ddf 100644
--- a/code/modules/events/infestation.dm
+++ b/code/modules/events/infestation.dm
@@ -107,7 +107,6 @@
#undef LOC_HYDRO
#undef LOC_VAULT
#undef LOC_TECH
-#undef LOC_TACTICAL
#undef VERM_MICE
#undef VERM_LIZARDS
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 0f2da54818c..4b822dd718e 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -1,70 +1,11 @@
-/datum/event/radiation_storm
- announceWhen = 1
- var/safe_zones = list(
- /area/maintenance,
- /area/crew_quarters/sleep,
- /area/security/brig,
- /area/shuttle,
- /area/vox_station,
- /area/syndicate_station
- )
-
+/datum/event/radiation_storm/setup()
+ startWhen = 3
+ endWhen = startWhen + 1
+ announceWhen = 1
/datum/event/radiation_storm/announce()
- // Don't do anything, we want to pack the announcement with the actual event
-
-/datum/event/radiation_storm/proc/is_safe_zone(var/area/A)
- for(var/szt in safe_zones)
- if(istype(A, szt))
- return 1
- return 0
+ priority_announcement.Announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", 'sound/ai/radiation.ogg')
+ //sound not longer matches the text, but an audible warning is probably good
/datum/event/radiation_storm/start()
- spawn()
- event_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg')
-
- for(var/area/A in world)
- if(!is_station_level(A.z) || is_safe_zone(A))
- continue
- A.radiation_alert()
-
- make_maint_all_access()
-
- sleep(600)
-
- event_announcement.Announce("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
-
- for(var/i = 0, i < 10, i++)
- for(var/mob/living/carbon/human/H in living_mob_list)
- var/armor = H.getarmor(type = "rad")
- if((RADIMMUNE in H.species.species_traits) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected
- continue
- var/turf/T = get_turf(H)
- if(!T)
- continue
- if(!is_station_level(T.z) || is_safe_zone(T.loc))
- continue
-
- if(istype(H,/mob/living/carbon/human))
- H.apply_effect((rand(15,35)),IRRADIATE,0)
- if(prob(5))
- H.apply_effect((rand(40,70)),IRRADIATE,0)
- if(prob(75))
- randmutb(H) // Applies bad mutation
- domutcheck(H,null,1)
- else
- randmutg(H) // Applies good mutation
- domutcheck(H,null,1)
-
- sleep(100)
-
- event_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
-
- for(var/area/A in world)
- if(!is_station_level(A.z) || is_safe_zone(A))
- continue
- A.reset_radiation_alert()
-
- sleep(600) // Want to give them time to get out of maintenance.
-
- revoke_maint_all_access()
+ SSweather.run_weather(/datum/weather/rad_storm)
\ No newline at end of file
diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm
index 58566f9872d..63a4b668930 100644
--- a/code/modules/fish/fish_items.dm
+++ b/code/modules/fish/fish_items.dm
@@ -26,7 +26,7 @@
throw_range = 7
suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw
- to_chat(viewers(user), "[user] places the [src.name] on top of \his head, \his fingers tangled in the netting! It looks like \he's trying to commit suicide.")
+ to_chat(viewers(user), "[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.")
return(OXYLOSS)
/obj/item/fishfood
@@ -52,7 +52,7 @@
attack_verb = list("scrubbed", "brushed", "scraped")
suicide_act(mob/user)
- to_chat(viewers(user), "[user] is vigorously scrubbing \himself raw with the [src.name]! It looks like \he's trying to commit suicide.")
+ to_chat(viewers(user), "[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.")
return(BRUTELOSS|FIRELOSS)
//////////////////////////////////////////////
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 584fdd5b93c..412c5407ddc 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -1,6 +1,6 @@
//////////////////////////////
-// Fish Tanks! //
+// Fish Tanks //
//////////////////////////////
@@ -9,44 +9,41 @@
desc = "So generic, it might as well have no description at all."
icon = 'icons/obj/fish_items.dmi'
icon_state = "tank1"
- density = 0
- anchored = 0
+ density = FALSE
+ anchored = FALSE
pass_flags = 0
var/tank_type = "" // Type of aquarium, used for icon updating
var/water_capacity = 0 // Number of units the tank holds (varies with tank type)
var/water_level = 0 // Number of units currently in the tank (new tanks start empty)
var/light_switch = 0 // 0 = off, 1 = on (off by default)
- var/filth_level = 0.0 // How dirty the tank is (max 10)
+ var/filth_level = 0 // How dirty the tank is (max 10)
var/lid_switch = 0 // 0 = open, 1 = closed (open by default)
var/max_fish = 0 // How many fish the tank can support (varies with tank type, 1 fish per 50 units sounds reasonable)
var/food_level = 0 // Amount of fishfood floating in the tank (max 10)
var/fish_count = 0 // Number of fish in the tank
- var/list/fish_list = null // Tracks the current types of fish in the tank
+ var/list/fish_list = list() // Tracks the current types of fish in the tank
var/egg_count = 0 // How many fish eggs can be harvested from the tank (capped at the max_fish value)
- var/list/egg_list = null // Tracks the current types of harvestable eggs in the tank
+ var/list/egg_list = list() // Tracks the current types of harvestable eggs in the tank
- var/has_lid = 0 // 0 if the tank doesn't have a lid/light, 1 if it does
- var/max_health = 0 // Can handle a couple hits
- var/cur_health = 0 // Current health, starts at max_health
- var/leaking = 0 // 0 if not leaking, 1 if minor leak, 2 if major leak (not leaking by default)
+ var/has_lid = FALSE // 0 if the tank doesn't have a lid/light, 1 if it does
+ var/leaking = FALSE // 0 if not leaking, 1 if minor leak, 2 if major leak (not leaking by default)
var/shard_count = 0 // Number of glass shards to salvage when broken (1 less than the number of sheets to build the tank)
/obj/machinery/fishtank/bowl
name = "fish bowl"
desc = "A small bowl capable of housing a single fish, commonly found on desks. This one has a tiny treasure chest in it!"
icon_state = "bowl1"
- density = 0 // Small enough to not block stuff
- anchored = 0 // Small enough to move even when filled
+ density = FALSE // Small enough to not block stuff
+ anchored = FALSE // Small enough to move even when filled
pass_flags = PASSTABLE | LETPASSTHROW // Just like at the county fair, you can't seem to throw the ball in to win the goldfish, and it's small enough to pull onto a table
tank_type = "bowl"
water_capacity = 50 // Not very big, therefore it can't hold much
max_fish = 1 // What a lonely fish
- has_lid = 0
- max_health = 15 // Not very sturdy
- cur_health = 15
+ has_lid = FALSE
+ max_integrity = 15 // Not very sturdy
shard_count = 0 // No salvageable shards
/obj/machinery/fishtank/tank
@@ -54,17 +51,16 @@
desc = "A large glass tank designed to house aquatic creatures. Contains an integrated water circulation system."
icon = 'icons/obj/fish_items.dmi'
icon_state = "tank1"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
pass_flags = LETPASSTHROW
tank_type = "tank"
water_capacity = 200 // Decent sized, holds almost 2 full buckets
max_fish = 4 // Room for a few fish
- has_lid = 1
- max_health = 50 // Average strength, will take a couple hits from a toolbox.
- cur_health = 50
+ has_lid = TRUE
+ max_integrity = 50 // Average strength, will take a couple hits from a toolbox.
shard_count = 2
@@ -72,17 +68,16 @@
name = "wall aquarium"
desc = "This aquarium is massive! It completely occupies the same space as a wall, and looks very sturdy too!"
icon_state = "wall1"
- density = 1
- anchored = 1
+ density = TRUE
+ anchored = TRUE
pass_flags = 0 // This thing is the size of a wall, you can't throw past it.
tank_type = "wall"
water_capacity = 500 // This thing fills an entire tile, it holds a lot.
max_fish = 10 // Plenty of room for a lot of fish
- has_lid = 1
- max_health = 100 // This thing is a freaking wall, it can handle abuse.
- cur_health = 100
+ has_lid = TRUE
+ max_integrity = 100 // This thing is a freaking wall, it can handle abuse.
shard_count = 3
@@ -94,9 +89,10 @@
set name = "Toggle Tank Lid"
set category = "Object"
set src in view(1)
- toggle_lid(usr)
-/obj/machinery/fishtank/proc/toggle_lid(var/mob/living/user)
+ toggle_lid()
+
+/obj/machinery/fishtank/proc/toggle_lid()
lid_switch = !lid_switch
update_icon()
@@ -104,12 +100,13 @@
set name = "Toggle Tank Light"
set category = "Object"
set src in view(1)
- toggle_light(usr)
-/obj/machinery/fishtank/proc/toggle_light(var/mob/living/user)
+ toggle_light()
+
+/obj/machinery/fishtank/proc/toggle_light()
light_switch = !light_switch
if(light_switch)
- set_light(2,2,"#a0a080")
+ set_light(2, 2, "#a0a080")
else
adjust_tank_light()
@@ -119,8 +116,6 @@
/obj/machinery/fishtank/New()
..()
- fish_list = new/list()
- egg_list = new/list()
if(!has_lid) //Tank doesn't have a lid/light, remove the verbs for then
verbs -= /obj/machinery/fishtank/verb/toggle_lid_verb
verbs -= /obj/machinery/fishtank/verb/toggle_light_verb
@@ -154,7 +149,8 @@
overlays += "over_leak_[leaking]" //Green if we aren't leaking, light blue and slow blink if minor link, dark blue and rapid flashing for major leak
//Update water overlay
- if(water_level == 0) return //Skip the rest of this if there is no water in the aquarium
+ if(!water_level)
+ return //Skip the rest of this if there is no water in the aquarium
var/water_type = "_clean" //Default to clean water
if(filth_level > 5) water_type = "_dirty" //Show dirty water above filth_level 5 (breeding threshold)
if(water_level > (water_capacity * 0.85)) //Show full if the water_level is over 85% of water_capacity
@@ -162,15 +158,13 @@
else if(water_level > (water_capacity * 0.35)) //Show half-full if the water_level is over 35% of water_capacity
overlays += "over_[tank_type]_half[water_type]"
- return
-
//////////////////////////////
// PROCESS PROC //
//////////////////////////////
//Stops atmos from passing wall tanks, since they are effectively full-windows.
-/obj/machinery/fishtank/wall/CanAtmosPass(var/turf/T)
- return 0
+/obj/machinery/fishtank/wall/CanAtmosPass(turf/T)
+ return FALSE
/obj/machinery/fishtank/process()
//Start by counting fish in the tank
@@ -238,9 +232,7 @@
adjust_tank_light()
/obj/machinery/fishtank/proc/adjust_tank_light()
- if(light_switch) //tank light overrides fish lights
- return
- else
+ if(!light_switch) //tank light overrides fish lights
var/glo_light = 0
for(var/datum/fish/fish in fish_list)
if(istype(fish, /datum/fish/glofish))
@@ -261,19 +253,13 @@
food_level = min(10, max(0, food_level + amount))
/obj/machinery/fishtank/proc/check_health()
- //Max value check
- if(cur_health > max_health) //Cur_health cannot exceed max_health, set it to max_health if it does
- cur_health = max_health
//Leaking status check
- if(cur_health <= (max_health * 0.25)) //Major leak at or below 25% health (-10 water/cycle)
+ if(obj_integrity <= (max_integrity * 0.25)) //Major leak at or below 25% health (-10 water/cycle)
leaking = 2
- else if(cur_health <= (max_health * 0.5)) //Minor leak at or below 50% health (-1 water/cycle)
+ else if(obj_integrity <= (max_integrity * 0.5)) //Minor leak at or below 50% health (-1 water/cycle)
leaking = 1
else //Not leaking above 50% health
leaking = 0
- //Destruction check
- if(cur_health <= 0) //The tank is broken, destroy it
- destroy()
/obj/machinery/fishtank/proc/kill_fish(datum/fish/fish_type = null)
//Check if we were passed a fish to kill, otherwise kill a random one
@@ -292,12 +278,12 @@
fish_list.Add(fish_type) //Add a fish of the specified type
fish_count++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine
//Announce the new fish
- visible_message("A new [fish_type.fish_name] has hatched in \the [src]!")
+ visible_message("A new [fish_type.fish_name] has hatched in [src]!")
//Null type fish are dud eggs, give a message to inform the player
else
to_chat(usr, "The eggs disolve in the water. They were duds!")
-/obj/machinery/fishtank/proc/harvest_eggs(var/mob/user)
+/obj/machinery/fishtank/proc/harvest_eggs(mob/user)
if(!egg_count) //Can't harvest non-existant eggs
return
@@ -312,62 +298,39 @@
egg_list.Cut() //Destroy any excess eggs, clearing the egg_list
-/obj/machinery/fishtank/proc/harvest_fish(var/mob/user)
- if(fish_count <= 0) //Can't catch non-existant fish!
- to_chat(usr, "There are no fish in \the [src] to catch!")
+/obj/machinery/fishtank/proc/harvest_fish(mob/user)
+ if(fish_count <= 0) //Can't catch non-existant fish!
+ to_chat(user, "There are no fish in [src] to catch!")
return
var/list/fish_names_list = list()
for(var/datum/fish/fish_type in fish_list)
fish_names_list += list("[fish_type.fish_name]" = fish_type)
var/caught_fish = input("Select a fish to catch.", "Fishing") as null|anything in fish_names_list //Select a fish from the tank
if(fish_count <= 0)
- to_chat(usr, "There are no fish in \the [src] to catch!")
+ to_chat(user, "There are no fish in [src] to catch!")
return
else if(caught_fish)
- user.visible_message("[user.name] harvests \a [caught_fish] from \the [src].", "You scoop \a [caught_fish] out of \the [src].")
+ user.visible_message("[user.name] harvests \a [caught_fish] from [src].", "You scoop \a [caught_fish] out of [src].")
var/datum/fish/fish_type = fish_names_list[caught_fish]
var/fish_item = fish_type.fish_item
if(fish_item)
new fish_item(get_turf(user)) //Spawn the appropriate fish_item at the user's feet.
kill_fish(fish_type) //Kill the caught fish from the tank
-
-/obj/machinery/fishtank/proc/destroy(var/deconstruct = 0)
- var/turf/T = get_turf(src) //Store the tank's turf for atmos updating after deletion of tank
- if(!deconstruct) //Check if we are deconstructing or breaking the tank
- var/shards_left = shard_count
- while(shards_left > 0) //Produce the appropriate number of glass shards
- new /obj/item/shard(get_turf(src))
- shards_left --
- if(water_level) //Spill any water that was left in the tank when it broke
- spill_water()
- else //We are deconstructing, make glass sheets instead of shards
- var/sheets = shard_count + 1 //Deconstructing it salvages all the glass used to build the tank
- new /obj/item/stack/sheet/glass(get_turf(src), sheets) //Produce the appropriate number of glass sheets, in a single stack
- qdel(src) //qdel the tank and it's contents
- T.air_update_turf(1) //Update the air for the turf, to avoid permanent atmos sealing with wall tanks
-
+ //Update the air for the turf, to avoid permanent atmos sealing with wall tanks
/obj/machinery/fishtank/proc/spill_water()
+ var/turf/simulated/T = get_turf(src)
switch(tank_type)
if("bowl") //Fishbowl: Wets it's own tile
- var/turf/T = get_turf(src)
- if(!istype(T, /turf/simulated)) return
- var/turf/simulated/S = T
- S.MakeSlippery()
+ if(istype(T))
+ T.MakeSlippery()
if("tank") //Fishtank: Wets it's own tile and the 4 adjacent tiles (cardinal directions)
- var/turf/ST = get_turf(src)
- if(istype(ST, /turf/simulated))
- var/turf/simulated/ST2 = ST
- ST2.MakeSlippery()
- var/list/L = ST.CardinalTurfs()
- for(var/turf/T in L)
- if(!istype(T, /turf/simulated)) continue
- var/turf/simulated/S = T
- S.MakeSlippery()
+ if(istype(T))
+ T.MakeSlippery()
+ for(var/turf/simulated/ST in T.CardinalTurfs())
+ ST.MakeSlippery()
if("wall") //Wall-tank: Wets it's own tile and the surrounding 8 tiles (3x3 square)
- for(var/turf/T in spiral_range_turfs(1, src.loc))
- if(!istype(T, /turf/simulated)) continue
- var/turf/simulated/S = T
- S.MakeSlippery()
+ for(var/turf/simulated/ST in spiral_range_turfs(1, loc))
+ ST.MakeSlippery()
/obj/machinery/fishtank/proc/breed_fish()
var/list/breed_candidates = fish_list.Copy()
@@ -412,20 +375,20 @@
examine_message += "Water level: "
- if(water_level == 0)
- examine_message += "\The [src] is empty! "
+ if(!water_level)
+ examine_message += "[src] is empty! "
else if(water_level < water_capacity * 0.1)
- examine_message += "\The [src] is nearly empty! "
+ examine_message += "[src] is nearly empty! "
else if(water_level <= water_capacity * 0.25)
- examine_message += "\The [src] is about one-quarter filled. "
+ examine_message += "[src] is about one-quarter filled. "
else if(water_level <= water_capacity * 0.5)
- examine_message += "\The [src] is about half filled. "
+ examine_message += "[src] is about half filled. "
else if(water_level <= water_capacity * 0.75)
- examine_message += "\The [src] is about three-quarters filled. "
+ examine_message += "[src] is about three-quarters filled. "
else if(water_level < water_capacity)
- examine_message += "\The [src] is nearly full! "
+ examine_message += "[src] is nearly full! "
else if(water_level == water_capacity)
- examine_message += "\The [src] is full! "
+ examine_message += "[src] is full! "
examine_message += " Cleanliness level: "
@@ -467,7 +430,7 @@
//Report the number and types of live fish if there is water in the tank
if(fish_count == 0)
- examine_message += "\The [src] doesn't contain any live fish. "
+ examine_message += "[src] doesn't contain any live fish. "
else
//Build a message reporting the types of fish
var/fish_num = fish_count
@@ -483,7 +446,7 @@
message +=", "
message +="." //No more fish, end the message with a period
//Display the number of fish and previously constructed message
- examine_message += "\The [src] contains [fish_count] live fish. [message] "
+ examine_message += "[src] contains [fish_count] live fish. [message] "
examine_message += " "
@@ -498,12 +461,16 @@
examine_message += " "
//Report if the tank is leaking/cracked
- if(water_level > 0) //Tank has water, so it's actually leaking
- if(leaking == 1) examine_message += "\The [src] is leaking."
- if(leaking == 2) examine_message += "\The [src] is leaking profusely!"
+ if(water_level) //Tank has water, so it's actually leaking
+ if(leaking == 1)
+ examine_message += "[src] is leaking."
+ if(leaking == 2)
+ examine_message += "[src] is leaking profusely!"
else //No water, report the cracks instead
- if(leaking == 1) examine_message += "\The [src] is cracked."
- if(leaking == 2) examine_message += "\The [src] is nearly shattered!"
+ if(leaking == 1)
+ examine_message += "[src] is cracked."
+ if(leaking == 2)
+ examine_message += "[src] is nearly shattered!"
//Finally, report the full examine_message constructed from the above reports
@@ -514,127 +481,113 @@
// ATACK PROCS //
//////////////////////////////
-/obj/machinery/fishtank/attack_animal(mob/living/simple_animal/M as mob)
+/obj/machinery/fishtank/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/pet/cat))
if(M.a_intent == INTENT_HELP) //Cats can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
- M.visible_message("[M.name] stares at into \the [src] while sitting perfectly still.", "The lid is closed, so you stare into \the [src] intently.")
+ M.visible_message("[M.name] stares at into [src] while sitting perfectly still.", "The lid is closed, so you stare into [src] intently.")
else
if(fish_count) //Tank must actually have fish to try catching one
- M.visible_message("[M.name] leaps up onto \the[src] and attempts to fish through the opening!", "You jump up onto \the [src] and begin fishing through the opening!")
- spawn(10)
- if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens
- M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
- if(istype(M, /mob/living/simple_animal/pet/cat/Syndi))
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- else //No water or didn't slip, get that fish!
- M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
- kill_fish() //Kill a random fish
- M.health = M.maxHealth //Eating fish heals the predator
+ M.visible_message("[M.name] leaps up onto [src] and attempts to fish through the opening!", "You jump up onto [src] and begin fishing through the opening!")
+ if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens
+ M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
+ if(istype(M, /mob/living/simple_animal/pet/cat/Syndi))
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ else //No water or didn't slip, get that fish!
+ M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
+ kill_fish() //Kill a random fish
+ M.health = M.maxHealth //Eating fish heals the predator
else
- to_chat(usr, "There are no fish in [src]!")
+ to_chat(M, "There are no fish in [src]!")
else
- attack_generic(M, M.harm_intent_damage)
+ return ..()
else if(istype(M, /mob/living/simple_animal/hostile/bear))
if(M.a_intent == INTENT_HELP) //Bears can try to fish in open tanks on help intent
if(lid_switch) //Can't fish in a closed tank. Fishbowls are ALWAYS open.
- M.visible_message("[M.name] scrapes it's claws along \the [src]'s lid.", "The lid is closed, so you scrape your claws against \the [src]'s lid.")
+ M.visible_message("[M.name] scrapes it's claws along [src]'s lid.", "The lid is closed, so you scrape your claws against [src]'s lid.")
else
if(fish_count) //Tank must actually have fish to try catching one
- M.visible_message("[M.name] reaches into \the[src] and attempts to fish through the opening!", "You reach into \the [src] and begin fishing through the opening!")
- spawn(5)
- if(water_level && prob(5)) //Bears are good at catching fish, only a 5% chance to fail
- M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!")
- else //No water or didn't slip, get that fish!
- M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
- kill_fish() //Kill a random fish
- M.health = M.maxHealth //Eating fish heals the predator
+ M.visible_message("[M.name] reaches into [src] and attempts to fish through the opening!", "You reach into [src] and begin fishing through the opening!")
+ if(water_level && prob(5)) //Bears are good at catching fish, only a 5% chance to fail
+ M.visible_message("[M.name] swipes at the water!", "You just barely missed that fish!")
+ else //No water or didn't slip, get that fish!
+ M.visible_message("[M.name] catches and devours a live fish!", "You catch and devour a live fish, yum!")
+ kill_fish() //Kill a random fish
+ M.health = M.maxHealth //Eating fish heals the predator
else
- to_chat(usr, "There are no fish in [src]!")
+ to_chat(M, "There are no fish in [src]!")
else
- attack_generic(M, M.harm_intent_damage)
+ return ..()
else
- if(M.melee_damage_upper > 0) //If the simple_animal has a melee_damage_upper defined, use that for the damage
- attack_generic(M, M.melee_damage_upper)
- else if(M.a_intent == INTENT_HARM) //Let any simple_animal try to break tanks when on harm intent
- if(M.harm_intent_damage <= 0) return //If it doesn't do damage, don't bother with the attack
- attack_generic(M, M.harm_intent_damage)
- check_health()
+ return ..()
-/obj/machinery/fishtank/attack_alien(mob/living/user as mob)
- if(islarva(user)) return
- attack_generic(user, 15)
-
-/obj/machinery/fishtank/attack_slime(mob/living/user as mob)
- var/mob/living/carbon/slime/S = user
- if(!S.is_adult)
- return
- attack_generic(user, rand(10, 15))
-
-/obj/machinery/fishtank/attack_hand(mob/user as mob)
- if(HULK in user.mutations)
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
- user.visible_message("[user] smashes through [src]!")
- destroy()
- else if(usr.a_intent == INTENT_HARM)
- user.changeNext_move(CLICK_CD_MELEE)
+/obj/machinery/fishtank/attack_hand(mob/user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ if(user.a_intent == INTENT_HARM)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
- usr.visible_message("[usr.name] bangs against the [src.name]!", \
- "You bang against the [src.name]!", \
+ user.visible_message("[user.name] bangs against the [name]!", \
+ "You bang against the [name]!", \
"You hear a banging sound.")
else
- user.changeNext_move(CLICK_CD_MELEE)
- playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
- usr.visible_message("[usr.name] taps on the [src.name].", \
- "You tap on the [src.name].", \
+ playsound(loc, 'sound/effects/glassknock.ogg', 80, 1)
+ user.visible_message("[user.name] taps on the [name].", \
+ "You tap on the [name].", \
"You hear a knocking sound.")
- return
-/obj/machinery/fishtank/proc/hit(var/damage, var/sound_effect = 1)
- cur_health = max(0, cur_health - damage)
- if(sound_effect)
- playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
- check_health()
-
-/obj/machinery/fishtank/attack_generic(mob/living/user, damage = 0) //used by attack_alien, attack_animal, and attack_slime
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- cur_health -= damage
- if(cur_health <= 0)
- user.visible_message("[user] smashes through \the [src]!")
- destroy()
- else //for nicer text~
- user.visible_message("[user] smashes into \the [src]!")
- playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
+/obj/machinery/fishtank/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ . = ..()
+ if(.) //received damage
check_health()
-/obj/machinery/fishtank/attackby(var/obj/item/O, var/mob/user as mob)
+/obj/machinery/fishtank/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
+
+/obj/machinery/fishtank/deconstruct(disassembled = TRUE)
+ if(QDELETED(src))
+ return
+ if(!disassembled)
+ playsound(src, "shatter", 70, 1)
+ for(var/i in 1 to shard_count) //Produce the appropriate number of glass shards
+ var/obj/item/shard/S = new /obj/item/shard(get_turf(src))
+ transfer_fingerprints_to(S)
+ if(water_level) //Spill any water that was left in the tank when it broke
+ spill_water()
+ else //We are deconstructing, make glass sheets instead of shards
+ new /obj/item/stack/sheet/glass(get_turf(src), shard_count + 1) //Produce the appropriate number of glass sheets, in a single stack
+ qdel(src)
+
+/obj/machinery/fishtank/attackby(obj/item/O, mob/user)
//Welders repair damaged tanks on help intent, damage on all others
- if(istype(O, /obj/item/weldingtool))
+ if(iswelder(O))
var/obj/item/weldingtool/W = O
if(user.a_intent == INTENT_HELP)
if(W.isOn())
- if(cur_health < max_health)
+ if(obj_integrity < max_integrity)
playsound(loc, W.usesound, 50, 1)
- to_chat(usr, "You repair some of the cracks on \the [src].")
- cur_health += 20
+ to_chat(user, "You repair some of the cracks on [src].")
+ obj_integrity = min(obj_integrity + 20, max_integrity)
check_health()
else
- to_chat(usr, "There is no damage to fix!")
+ to_chat(user, "There is no damage to fix!")
else
- if(cur_health < max_health)
- to_chat(usr, "[W.name] must be on to repair this damage.")
+ if(obj_integrity < max_integrity)
+ to_chat(user, "[W] must be on to repair this damage.")
else
- user.changeNext_move(CLICK_CD_MELEE)
- hit(W.force)
- return
+ return ..()
//Open reagent containers add and remove water
- if(O.is_open_container())
+ else if(O.is_open_container())
if(istype(O, /obj/item/reagent_containers/glass))
if(lid_switch)
- to_chat(usr, "Open the lid on \the [src] first!")
+ to_chat(user, "Open the lid on [src] first!")
return
var/obj/item/reagent_containers/glass/C = O
//Containers with any reagents will get dumped in
@@ -652,57 +605,52 @@
C.reagents.clear_reagents()
else
if(water_level == water_capacity)
- to_chat(usr, "[src] is already full!")
- return
+ to_chat(user, "[src] is already full!")
else
message = "The filtration process purifies the water, raising the water level."
if((water_level + water_value) == water_capacity)
- message += " You filled \the [src] to the brim!"
+ message += " You filled [src] to the brim!"
if((water_level + water_value) > water_capacity)
- message += " You overfilled \the [src] and some water runs down the side, wasted."
+ message += " You overfilled [src] and some water runs down the side, wasted."
C.reagents.clear_reagents()
adjust_water_level(water_value)
- user.visible_message("[user.name] pours the contents of [C.name] into \the [src].", "[message]")
- return
+ user.visible_message("[user.name] pours the contents of [C.name] into [src].", "[message]")
//Empty containers will scoop out water, filling the container as much as possible from the water_level
else
- if(water_level == 0)
- to_chat(usr, "[src] is empty!")
+ if(!water_level)
+ to_chat(user, "[src] is empty!")
else
if(water_level >= C.volume) //Enough to fill the container completely
C.reagents.add_reagent("fishwater", C.volume)
adjust_water_level(-C.volume)
- user.visible_message("[user.name] scoops out some water from \the [src].", "You completely fill [C.name] from \the [src].")
+ user.visible_message("[user.name] scoops out some water from [src].", "You completely fill [C.name] from [src].")
else //Fill the container as much as possible with the water_level
C.reagents.add_reagent("fishwater", water_level)
adjust_water_level(-water_level)
- user.visible_message("[user.name] scoops out some water from \the [src].", "You fill [C.name] with the last of the water in \the [src].")
- return
+ user.visible_message("[user.name] scoops out some water from [src].", "You fill [C.name] with the last of the water in [src].")
//Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
- if(istype(O, /obj/item/wrench))
- if(water_level == 0)
- to_chat(usr, "Now disassembling [src].")
- playsound(src.loc, O.usesound, 50, 1)
+ else if(iswrench(O))
+ if(!water_level)
+ to_chat(user, "Now disassembling [src].")
+ playsound(loc, O.usesound, 50, 1)
if(do_after(user, 50 * O.toolspeed, target = src))
- destroy(1)
+ deconstruct(TRUE)
else
- to_chat(usr, "[src] must be empty before you disassemble it!")
- return
+ to_chat(user, "[src] must be empty before you disassemble it!")
//Fish eggs
else if(istype(O, /obj/item/fish_eggs))
var/obj/item/fish_eggs/egg = O
//Don't add eggs if there is no water (they kinda need that to live)
- if(water_level == 0)
- to_chat(usr, "[src] has no water; [egg.name] won't hatch without water!")
+ if(!water_level)
+ to_chat(user, "[src] has no water; [egg.name] won't hatch without water!")
else
//Don't add eggs if the tank already has the max number of fish
if(fish_count >= max_fish)
- to_chat(usr, "[src] can't hold any more fish.")
+ to_chat(user, "[src] can't hold any more fish.")
else
add_fish(egg.fish_type)
qdel(egg)
- return
//Fish food
else if(istype(O, /obj/item/fishfood))
//Only add food if there is water and it isn't already full of food
@@ -711,33 +659,28 @@
if(fish_count == 0)
user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.")
else
- user.visible_message("[user.name] feeds the fish in \the [src]. The fish look excited!", "You feed the fish in \the [src]. They look excited!")
+ user.visible_message("[user.name] feeds the fish in [src]. The fish look excited!", "You feed the fish in [src]. They look excited!")
adjust_food_level(10)
else
- to_chat(usr, "[src] already has plenty of food in it. You decide to not add more.")
+ to_chat(user, "[src] already has plenty of food in it. You decide to not add more.")
else
- to_chat(usr, "[src] doesn't have any water in it. You should fill it with water first.")
- return
+ to_chat(user, "[src] doesn't have any water in it. You should fill it with water first.")
//Fish egg scoop
else if(istype(O, /obj/item/egg_scoop))
if(egg_count)
- user.visible_message("[user.name] harvests some fish eggs from \the [src].", "You scoop the fish eggs out of \the [src].")
+ user.visible_message("[user.name] harvests some fish eggs from [src].", "You scoop the fish eggs out of [src].")
harvest_eggs(user)
else
- user.visible_message("[user.name] fails to harvest any fish eggs from \the [src].", "There are no fish eggs in \the [src] to scoop out.")
- return
+ user.visible_message("[user.name] fails to harvest any fish eggs from [src].", "There are no fish eggs in [src] to scoop out.")
//Fish net
- if(istype(O, /obj/item/fish_net))
+ else if(istype(O, /obj/item/fish_net))
harvest_fish(user)
- return
//Tank brush
- if(istype(O, /obj/item/tank_brush))
+ else if(istype(O, /obj/item/tank_brush))
if(filth_level == 0)
- to_chat(usr, "[src] is already spotless!")
+ to_chat(user, "[src] is already spotless!")
else
adjust_filth_level(-filth_level)
- user.visible_message("[user.name] scrubs the inside of \the [src], cleaning the filth.", "You scrub the inside of \the [src], cleaning the filth.")
- else if(O && O.force)
- user.visible_message("\The [src] has been attacked by [user.name] with \the [O]!")
- hit(O.force)
- return
+ user.visible_message("[user.name] scrubs the inside of [src], cleaning the filth.", "You scrub the inside of [src], cleaning the filth.")
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm
index 6a1d28eaf87..b69ed4738b6 100644
--- a/code/modules/flufftext/Dreaming.dm
+++ b/code/modules/flufftext/Dreaming.dm
@@ -43,7 +43,7 @@
nightmare()
if(ishuman(src))
if(prob(10))
- emote("writhes in their sleep.")
+ emote("writhes in [p_their()] sleep.")
dir = pick(cardinal)
/mob/living/carbon/proc/experience_dream(dream_image, isNightmare)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index a5aa4662c63..91ee910c8d4 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -47,7 +47,7 @@
to_chat(chugger, "You need to open [src] first!")
return
if(istype(chugger) && loc == chugger && src == chugger.get_active_hand() && reagents.total_volume)
- chugger.visible_message("[chugger] raises the [src] to their mouth and starts [pick("chugging","gulping")] it down like [pick("a savage","a mad beast","it's going out of style","there's no tomorrow")]!", "You start chugging \the [src].", "You hear what sounds like gulping.")
+ chugger.visible_message("[chugger] raises the [src] to [chugger.p_their()] mouth and starts [pick("chugging","gulping")] it down like [pick("a savage","a mad beast","it's going out of style","there's no tomorrow")]!", "You start chugging [src].", "You hear what sounds like gulping.")
while(do_mob(chugger, chugger, 40)) //Between the default time for do_mob and the time it takes for a vampire to suck blood.
chugger.eat(src, chugger, 25) //Half of a glass, quarter of a bottle.
if(!reagents.total_volume) //Finish in style.
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index a7274c53f4e..d9c59a46d58 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -102,8 +102,8 @@
target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [name]!", \
"[user] has hit [target][head_attack_message] with a bottle of [name]!")
else
- user.visible_message("[target] hits \himself with a bottle of [name][head_attack_message]!", \
- "[target] hits \himself with a bottle of [name][head_attack_message]!")
+ user.visible_message("[target] hits [target.p_them()]self with a bottle of [name][head_attack_message]!", \
+ "[target] hits [target.p_them()]self with a bottle of [name][head_attack_message]!")
//Attack logs
add_attack_logs(user, target, "Hit with [src]")
diff --git a/code/modules/food_and_drinks/drinks/drinks/cans.dm b/code/modules/food_and_drinks/drinks/drinks/cans.dm
index 282278c990e..979acf473fd 100644
--- a/code/modules/food_and_drinks/drinks/drinks/cans.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/cans.dm
@@ -33,14 +33,14 @@
to_chat(user, "You need to open the drink!")
return
else if(M == user && !reagents.total_volume && user.a_intent == INTENT_HARM && user.zone_sel.selecting == "head")
- user.visible_message("[user] crushes ["\the [src]"] on \his forehead!", "You crush \the [src] on your forehead.")
+ user.visible_message("[user] crushes [src] on [user.p_their()] forehead!", "You crush [src] on your forehead.")
crush(user)
return
return ..()
/obj/item/reagent_containers/food/drinks/cans/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/storage/bag/trash/cyborg))
- user.visible_message("[user] crushes \the [src] in their trash compactor.", "You crush \the [src] in your trash compactor.")
+ user.visible_message("[user] crushes [src] in [user.p_their()] trash compactor.", "You crush [src] in your trash compactor.")
var/obj/can = crush(user)
can.attackby(I, user, params)
return 1
diff --git a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
index 24b50489402..393543b093c 100644
--- a/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/shotglass.dm
@@ -38,7 +38,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/proc/clumsilyDrink(mob/living/carbon/human/user) //Clowns beware
if(burn_state != ON_FIRE)
return
- user.visible_message("[user] pours [src] all over themself!", "You pour [src] all over yourself!", "You hear a 'whoompf' and a sizzle.")
+ user.visible_message("[user] pours [src] all over [user.p_them()]self!", "You pour [src] all over yourself!", "You hear a 'whoompf' and a sizzle.")
extinguish(TRUE)
reagents.reaction(user, TOUCH)
reagents.clear_reagents()
@@ -90,7 +90,7 @@
if((CLUMSY in user.mutations) && prob(50))
clumsilyDrink(user)
else
- user.visible_message("[user] places their hand over [src] to put it out!", "You use your hand to extinguish [src]!")
+ user.visible_message("[user] places [user.p_their()] hand over [src] to put it out!", "You use your hand to extinguish [src]!")
extinguish()
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/MouseDrop(mob/living/carbon/human/user)
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index f9ec698f196..2f9848a87ef 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -131,7 +131,7 @@
possible_states = list()
/obj/item/reagent_containers/food/condiment/saltshaker/suicide_act(mob/user)
- user.visible_message("[user] begins to swap forms with the salt shaker! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] begins to swap forms with the salt shaker! It looks like [user.p_theyre()] trying to commit suicide.")
var/newname = "[name]"
name = "[user.name]"
user.name = newname
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index bc442486d5c..5dc010bfae9 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -99,6 +99,7 @@
U.overlays += I
var/obj/item/reagent_containers/food/snacks/collected = new type
+ collected.name = name
collected.loc = U
collected.reagents.remove_any(collected.reagents.total_volume)
collected.trash = null
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index b4a787ea4c8..6f6d9132fdf 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -58,7 +58,7 @@
C.emote("scream")
user.changeNext_move(CLICK_CD_MELEE)
C.apply_damage(25, BURN, "head") //25 fire damage and disfigurement because your face was just deep fried!
- head.disfigure("burn")
+ head.disfigure()
add_attack_logs(user, G.affecting, "Deep-fried with [src]")
qdel(G) //Removes the grip so the person MIGHT have a small chance to run the fuck away and to prevent rapid dunks.
return 0
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index 0c2af905a74..a67b88f97d4 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -260,7 +260,7 @@
new /obj/effect/decal/cleanable/blood/gibs(src)
if(!UserOverride)
- add_attack_logs(user, occupant, "Gibbed in [src]", !!occupant.ckey)
+ add_attack_logs(user, occupant, "Gibbed in [src]", !!occupant.ckey ? ATKLOG_FEW : ATKLOG_ALL)
if(!iscarbon(user))
occupant.LAssailant = null
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 58cec86dc1c..950b873af55 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -179,7 +179,7 @@
visible_message("The [qb] refuses to settle down. Maybe it's something to do with its reagent?")
if(queen_bee)
- visible_message("[user] sets [qb] down inside the apiary, making it their new home.")
+ visible_message("[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.")
var/relocated = 0
for(var/b in bees)
var/mob/living/simple_animal/hostile/poison/bees/worker/B = b
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 36065efa298..6874038a7bf 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -25,7 +25,7 @@
bitesize = 5
/obj/item/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
- user.visible_message("[user] is aiming the [src.name] at themself! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is aiming the [name] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide.")
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
sleep(25)
if(!user)
@@ -34,7 +34,7 @@
sleep(25)
if(!user)
return (OXYLOSS)
- user.visible_message("[user] laughs so hard they begin to suffocate!")
+ user.visible_message("[user] laughs so hard [user.p_they()] begin[user.p_s()] to suffocate!")
return (OXYLOSS)
/obj/item/grown/bananapeel
@@ -49,7 +49,7 @@
throw_range = 7
/obj/item/grown/bananapeel/suicide_act(mob/user)
- user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.")
playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1)
return (BRUTELOSS)
diff --git a/code/modules/hydroponics/grown/citrus.dm b/code/modules/hydroponics/grown/citrus.dm
index 157a2813b8f..86bc8082661 100644
--- a/code/modules/hydroponics/grown/citrus.dm
+++ b/code/modules/hydroponics/grown/citrus.dm
@@ -109,7 +109,7 @@
var/area/A = get_area(user)
user.visible_message("[user] primes the [src]!", "You prime the [src]!")
var/message = "[ADMIN_LOOKUPFLW(user)] primed a combustible lemon for detonation at [A] [ADMIN_COORDJMP(user)]"
- bombers += message
+ investigate_log("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].", INVESTIGATE_BOMB)
message_admins(message)
log_game("[key_name(user)] primed a combustible lemon for detonation at [A] [COORD(user)].")
if(iscarbon(user))
diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm
index 0169e3bb5d9..09c16544396 100644
--- a/code/modules/hydroponics/grown/kudzu.dm
+++ b/code/modules/hydroponics/grown/kudzu.dm
@@ -22,7 +22,7 @@
return S
/obj/item/seeds/kudzu/suicide_act(mob/user)
- user.visible_message("[user] swallows the pack of kudzu seeds! It looks like \he's trying to commit suicide..")
+ user.visible_message("[user] swallows the pack of kudzu seeds! It looks like [user.p_theyre()] trying to commit suicide..")
plant(user)
return (BRUTELOSS)
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index c65c9dcf618..8bbe4a4e240 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -44,7 +44,7 @@
attack_verb = list("stung")
/obj/item/grown/nettle/suicide_act(mob/user)
- user.visible_message("[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is eating some of the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.")
return (BRUTELOSS|TOXLOSS)
/obj/item/grown/nettle/pickup(mob/living/user)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 7bb064f752e..6b2da2c29ae 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -33,7 +33,7 @@
reagents.add_reagent("atrazine", 100)
/obj/item/reagent_containers/spray/weedspray/suicide_act(mob/user)
- user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.")
return (TOXLOSS)
/obj/item/reagent_containers/spray/pestspray // -- Skie
@@ -55,7 +55,7 @@
reagents.add_reagent("pestkiller", 100)
/obj/item/reagent_containers/spray/pestspray/suicide_act(mob/user)
- user.visible_message("[user] is huffing the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is huffing the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.")
return (TOXLOSS)
/obj/item/cultivator
@@ -89,7 +89,7 @@
sharp = 1
/obj/item/hatchet/suicide_act(mob/user)
- user.visible_message("[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is chopping at [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.")
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return (BRUTELOSS)
@@ -119,7 +119,7 @@
var/swiping = FALSE
/obj/item/scythe/suicide_act(mob/user)
- user.visible_message("[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is beheading [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.")
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/affecting = H.get_organ("head")
diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm
index 0f0774aa1f4..fdcfee0e87a 100644
--- a/code/modules/library/computers/checkout.dm
+++ b/code/modules/library/computers/checkout.dm
@@ -49,7 +49,7 @@
if(src.arcanecheckout)
new /obj/item/tome(src.loc)
to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.")
- user.visible_message("[user] stares at the blank screen for a few moments, his expression frozen in fear. When he finally awakens from it, he looks a lot older.", 2)
+ user.visible_message("[user] stares at the blank screen for a few moments, [user.p_their()] expression frozen in fear. When [user.p_they()] finally awaken[user.p_s()] from it, [user.p_they()] look[user.p_s()] a lot older.", 2)
src.arcanecheckout = 0
if(1)
// Inventory
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index df1753e1dd7..f42b7963104 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -60,7 +60,7 @@
D.apply_damage(damage, BRUTE, affecting, armor_block)
- add_attack_logs(A, D, "Melee attacked with martial-art [src]", admin_notify = (damage > 0) ? TRUE : FALSE)
+ add_attack_logs(A, D, "Melee attacked with martial-art [src]", (damage > 0) ? null : ATKLOG_ALL)
if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
D.visible_message("[A] has weakened [D]!!", \
@@ -210,7 +210,7 @@
return ..()
var/mob/living/carbon/C = target
if(C.stat)
- to_chat(user, "It would be dishonorable to attack a foe while they cannot retaliate.")
+ to_chat(user, "It would be dishonorable to attack a foe while [C.p_they()] cannot retaliate.")
return
switch(user.a_intent)
if(INTENT_DISARM)
@@ -236,7 +236,7 @@
if(H.staminaloss && !H.sleeping)
var/total_health = (H.health - H.staminaloss)
if(total_health <= config.health_threshold_crit && !H.stat)
- H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \
+ H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking [H.p_them()] out cold!", \
"[user] knocks you unconscious!")
H.SetSleeping(30)
H.adjustBrainLoss(25)
diff --git a/code/modules/martial_arts/mimejutsu.dm b/code/modules/martial_arts/mimejutsu.dm
index 4d8edbf7236..38605c3538d 100644
--- a/code/modules/martial_arts/mimejutsu.dm
+++ b/code/modules/martial_arts/mimejutsu.dm
@@ -55,8 +55,8 @@
/datum/martial_art/mimejutsu/proc/mimePalm(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
- D.visible_message("[A] has barely touched [D] with their palm!", \
- "[A] hovers their palm over your face!")
+ D.visible_message("[A] has barely touched [D] with [A.p_their()] palm!", \
+ "[A] hovers [A.p_their()] palm over your face!")
var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
D.throw_at(throw_target, 200, 4,A)
diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm
index 1cd29ac2511..a6cd25d50c0 100644
--- a/code/modules/martial_arts/sleeping_carp.dm
+++ b/code/modules/martial_arts/sleeping_carp.dm
@@ -94,7 +94,7 @@
if(D.weakened || D.resting || D.stat)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("[A] elbow drops [D]!", \
- "[A] piledrives you with their elbow!")
+ "[A] piledrives you with [A.p_their()] elbow!")
if(D.stat)
D.death() //FINISH HIM!
D.apply_damage(50, BRUTE, "chest")
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index fba4725e5f0..ff0db975895 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -52,7 +52,7 @@
return
to_chat(user, "You call out for aid, attempting to summon spirits to your side.")
- notify_ghosts("[user] is raising their [src], calling for your help!", enter_link="(Click to help)", source = user, action = NOTIFY_FOLLOW)
+ notify_ghosts("[user] is raising [user.p_their()] [src], calling for your help!", enter_link="(Click to help)", source = user, action = NOTIFY_FOLLOW)
summon_cooldown = world.time + 600
diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm
index 03ee7eb0a8d..613239b58a9 100644
--- a/code/modules/mining/lavaland/loot/bubblegum_loot.dm
+++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm
@@ -75,7 +75,7 @@
for(var/mob/living/carbon/human/H in player_list)
if(H == L)
continue
- to_chat(H, "You have an overwhelming desire to kill [L]. They have been marked red! Go kill them!")
+ to_chat(H, "You have an overwhelming desire to kill [L]. [L.p_they(TRUE)] [L.p_have()] been marked red! Go kill [L.p_them()]!")
H.put_in_hands(new /obj/item/kitchen/knife/butcher(H))
qdel(src)
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm
index 62d72d4a0a9..1d66d59d316 100644
--- a/code/modules/mining/lavaland/loot/hierophant_loot.dm
+++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm
@@ -57,7 +57,7 @@
return
if(!rune)
if(isturf(user.loc))
- user.visible_message("[user] holds [src] carefully in front of them, moving it in a strange pattern...", \
+ user.visible_message("[user] holds [src] carefully in front of [user.p_them()], moving it in a strange pattern...", \
"You start creating a hierophant rune to teleport to...")
timer = world.time + 51
if(do_after(user, 50, target = user))
@@ -67,7 +67,7 @@
var/obj/effect/hierophant/H = new/obj/effect/hierophant(T)
rune = H
user.update_action_buttons_icon()
- user.visible_message("[user] creates a strange rune beneath them!", \
+ user.visible_message("[user] creates a strange rune beneath [user.p_them()]!", \
"You create a hierophant rune, which you can teleport yourself and any allies to at any time!\n\
You can remove the rune to place a new one by striking it with the staff.")
else
diff --git a/code/modules/mining/lavaland/loot/legion_loot.dm b/code/modules/mining/lavaland/loot/legion_loot.dm
index 210710db4d9..f11d6162f55 100644
--- a/code/modules/mining/lavaland/loot/legion_loot.dm
+++ b/code/modules/mining/lavaland/loot/legion_loot.dm
@@ -5,7 +5,6 @@
item_state = "staffofstorms"
icon = 'icons/obj/guns/magic.dmi'
slot_flags = SLOT_BACK
- item_state = "staffofstorms"
w_class = WEIGHT_CLASS_BULKY
force = 25
damtype = BURN
@@ -19,34 +18,36 @@
return
var/area/user_area = get_area(user)
+ var/turf/user_turf = get_turf(user)
+ if(!user_area || !user_turf)
+ to_chat(user, "Something is preventing you from using the staff here.")
+ return
var/datum/weather/A
- var/z_level_name = space_manager.levels_by_name[user.z]
- for(var/V in weather_master.existing_weather)
+ for(var/V in SSweather.processing)
var/datum/weather/W = V
- if(W.target_z == z_level_name && W.area_type == user_area.type)
+ if((user_turf.z in W.impacted_z_levels) && W.area_type == user_area.type)
A = W
break
- if(A)
+ if(A)
if(A.stage != END_STAGE)
if(A.stage == WIND_DOWN_STAGE)
to_chat(user, "The storm is already ending! It would be a waste to use the staff now.")
return
user.visible_message("[user] holds [src] skywards as an orange beam travels into the sky!", \
"You hold [src] skyward, dispelling the storm!")
- playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0)
+ playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
A.wind_down()
return
else
- A = new storm_type
+ A = new storm_type(list(user_turf.z))
A.name = "staff storm"
A.area_type = user_area.type
- A.target_z = z_level_name
A.telegraph_duration = 100
A.end_duration = 100
user.visible_message("[user] holds [src] skywards as red lightning crackles into the sky!", \
"You hold [src] skyward, calling down a terrible storm!")
- playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0)
+ playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
A.telegraph()
storm_cooldown = world.time + 200
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index 9c6ea675ba3..e1c6c7f28a9 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -355,7 +355,7 @@
if(cooldown < world.time)
feedback_add_details("immortality_talisman","U") // usage
cooldown = world.time + 600
- user.visible_message("[user] vanishes from reality, leaving a a hole in their place!")
+ user.visible_message("[user] vanishes from reality, leaving a a hole in [user.p_their()] place!")
var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc))
Z.name = "hole in reality"
Z.desc = "It's shaped an awful lot like [user.name]."
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 1ef887c2527..0a151babe67 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -341,20 +341,28 @@
//Pod turfs and objects
//Window
+/obj/structure/window/shuttle/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/smooth_structures/pod_window.dmi'
+ icon_state = "smooth"
+ dir = FULLTILE_WINDOW_DIR
+ max_integrity = 100
+ fulltile = TRUE
+ reinf = TRUE
+ heat_resistance = 1600
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
+ explosion_block = 3
+ level = 3
+ glass_type = /obj/item/stack/sheet/titaniumglass
+ glass_amount = 2
+
/obj/structure/window/reinforced/survival_pod
name = "pod window"
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "pwindow"
-// This override can be removed whenever we get rid of the stupid fucking `dir = 9` = full tile!!!! shit
-/obj/structure/window/reinforced/survival_pod/CanPass(atom/movable/mover, turf/target, height=0)
- if(istype(mover) && mover.checkpass(PASSGLASS))
- return 1
- if(get_dir(loc, target) == dir)
- return !density
- else
- return 1
-
//Floors
/turf/simulated/floor/pod
name = "pod floor"
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 711d4cea992..57be913c699 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -70,7 +70,7 @@
if(speaker == src)
to_chat(src, "You cannot hear yourself speak!")
else
- to_chat(src, "[speaker_name][alt_name] talks but you cannot hear them.")
+ to_chat(src, "[speaker_name][alt_name] talks but you cannot hear [speaker.p_them()].")
else
if(language)
to_chat(src, "[speaker_name][alt_name] [track][language.format_message(message, verb)]")
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index dc2e8ee7106..93bdfe30c27 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -310,12 +310,7 @@
to_chat(speaker,"You can't communicate while unable to move your hands to your head!")
return FALSE
- var/their = "their"
- if(speaker.gender == "female")
- their = "her"
- if(speaker.gender == "male")
- their = "his"
- speaker.visible_message("[speaker] touches [their] fingers to [their] temple.") //If placed in grey/broadcast, it will happen regardless of the success of the action.
+ speaker.visible_message("[speaker] touches [speaker.p_their()] fingers to [speaker.p_their()] temple.") //If placed in grey/broadcast, it will happen regardless of the success of the action.
return TRUE
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index e706b89ca85..8f74fbce413 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -1,7 +1,3 @@
-#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
-#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
-#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 1000K point
-
/mob/living/carbon/alien
name = "alien"
voice_name = "alien"
@@ -229,10 +225,6 @@ Des: Removes all infected images from the alien.
/mob/living/carbon/alien/can_use_vents()
return
-#undef HEAT_DAMAGE_LEVEL_1
-#undef HEAT_DAMAGE_LEVEL_2
-#undef HEAT_DAMAGE_LEVEL_3
-
/mob/living/carbon/alien/handle_footstep(turf/T)
if(..())
if(T.footstep_sounds["xeno"])
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 0d9c50ba5cc..72bf30ceedf 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -35,7 +35,7 @@ In all, this is a lot like the monkey code. /N
visible_message("[M.name] bites [src]!", \
"[M.name] bites [src]!")
adjustBruteLoss(damage)
- add_attack_logs(M, src, "Alien attack", FALSE)
+ add_attack_logs(M, src, "Alien attack", ATKLOG_ALL)
updatehealth()
else
to_chat(M, "[name] is too injured for that.")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index a2527317eec..7f23be77774 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -161,7 +161,7 @@ Doesn't work on other aliens/AI.*/
stomach_contents.Remove(M)
M.loc = loc
//Paralyse(10)
- src.visible_message("[src] hurls out the contents of their stomach!")
+ src.visible_message("[src] hurls out the contents of [p_their()] stomach!")
return
/mob/living/carbon/proc/getPlasma()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 41ebc8d8247..3fa08702605 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -1,16 +1,25 @@
+/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ ..(user, TRUE)
+ adjustBruteLoss(15)
+ var/hitverb = "punched"
+ if(mob_size < MOB_SIZE_LARGE)
+ Paralyse(1)
+ spawn(0)
+ step_away(src, user, 15)
+ sleep(1)
+ step_away(src, user, 15)
+ hitverb = "slammed"
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[user] has [hitverb] [src]!", "[user] has [hitverb] [src]!")
+ return TRUE
+
/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M)
if(..())
switch(M.a_intent)
if(INTENT_HARM)
var/damage = rand(1, 9)
if(prob(90))
- if(HULK in M.mutations)//HULK SMASH
- damage = 15
- spawn(0)
- Paralyse(1)
- step_away(src, M, 15)
- sleep(3)
- step_away(src, M, 15)
playsound(loc, "punch", 25, 1, -1)
visible_message("[M] has punched [src]!", \
"[M] has punched [src]!")
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index f1bcfc0eeaf..44287493718 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -3,7 +3,7 @@
#define X_SUIT_LAYER 2
#define X_L_HAND_LAYER 3
#define X_R_HAND_LAYER 4
-#define TARGETED_LAYER 5
+#define X_TARGETED_LAYER 5
#define X_FIRE_LAYER 6
#define X_TOTAL_LAYERS 6
/////////////////////////////////
@@ -161,6 +161,6 @@
#undef X_SUIT_LAYER
#undef X_L_HAND_LAYER
#undef X_R_HAND_LAYER
-#undef TARGETED_LAYER
+#undef X_TARGETED_LAYER
#undef X_FIRE_LAYER
#undef X_TOTAL_LAYERS
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index ef38327b5ee..919eecee8d8 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -2,13 +2,6 @@
if(..())
var/damage = rand(1, 9)
if(prob(90))
- if(HULK in M.mutations)
- damage += 5
- spawn(0)
- Paralyse(1)
- step_away(src, M, 15)
- sleep(3)
- step_away(src, M, 15)
playsound(loc, "punch", 25, 1, -1)
add_attack_logs(M, src, "Melee attacked with fists")
visible_message("[M] has kicked [src]!", \
@@ -23,6 +16,18 @@
visible_message("[M] has attempted to kick [src]!", \
"[M] has attempted to kick [src]!")
+
+/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ ..(user, TRUE)
+ adjustBruteLoss(5 + rand(1, 9))
+ spawn(0)
+ Paralyse(1)
+ step_away(src, user, 15)
+ sleep(3)
+ step_away(src, user, 15)
+ return TRUE
+
/mob/living/carbon/alien/larva/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect, end_pixel_y)
if(!no_effect && !visual_effect_icon)
visual_effect_icon = ATTACK_EFFECT_BITE
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 2abc612f758..8c02bac91d1 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -15,6 +15,7 @@
parent_organ = "head"
slot = "brain"
vital = 1
+ hidden_pain = TRUE //the brain has no pain receptors, and brain damage is meant to be a stealthy damage type.
var/mmi_icon = 'icons/obj/assemblies.dmi'
var/mmi_icon_state = "mmi_full"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a1e4b555412..aa890cbd17f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -201,7 +201,7 @@
swap_hand()
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
- add_attack_logs(M, src, "Shaked", admin_notify = FALSE)
+ add_attack_logs(M, src, "Shaked", ATKLOG_ALL)
if(health >= config.health_threshold_crit)
if(src == M && ishuman(src))
var/mob/living/carbon/human/H = src
@@ -256,14 +256,9 @@
H.play_xylophone()
else
if(player_logged)
- M.visible_message("[M] shakes [src], but they do not respond. Probably suffering from SSD.", \
- "You shake [src], but they are unresponsive. Probably suffering from SSD.")
+ M.visible_message("[M] shakes [src], but [p_they()] [p_do()] not respond. Probably suffering from SSD.", \
+ "You shake [src], but [p_theyre()] unresponsive. Probably suffering from SSD.")
if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
- var/t_him = "it"
- if(gender == MALE)
- t_him = "him"
- else if(gender == FEMALE)
- t_him = "her"
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.w_uniform)
@@ -277,8 +272,8 @@
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(!player_logged)
M.visible_message( \
- "[M] shakes [src] trying to wake [t_him] up!",\
- "You shake [src] trying to wake [t_him] up!",\
+ "[M] shakes [src] trying to wake [p_them()] up!",\
+ "You shake [src] trying to wake [p_them()] up!",\
)
// BEGIN HUGCODE - N3X
else
@@ -745,7 +740,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(restrained())
changeNext_move(CLICK_CD_BREAKOUT)
last_special = world.time + CLICK_CD_BREAKOUT
- visible_message("[src] attempts to unbuckle themself!", \
+ visible_message("[src] attempts to unbuckle [p_them()]self!", \
"You attempt to unbuckle yourself... (This will take around one minute and you need to stay still.)")
if(do_after(src, 600, 0, target = src))
if(!buckled)
@@ -762,11 +757,11 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
Weaken(3, 1, 1) //We dont check for CANWEAKEN, I don't care how immune to weakening you are, if you're rolling on the ground, you're busy.
update_canmove()
spin(32,2)
- visible_message("[src] rolls on the floor, trying to put themselves out!", \
+ visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \
"You stop, drop, and roll!")
sleep(30)
if(fire_stacks <= 0)
- visible_message("[src] has successfully extinguished themselves!", \
+ visible_message("[src] has successfully extinguished [p_them()]self!", \
"You extinguish yourself.")
ExtinguishMob()
@@ -1020,7 +1015,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return 1
/mob/living/carbon/proc/forceFedAttackLog(var/obj/item/reagent_containers/food/toEat, mob/user)
- add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagentlist(toEat)]")
+ add_attack_logs(user, src, "Fed [toEat]. Reagents: [toEat.reagentlist(toEat)]", ATKLOG_FEW)
if(!iscarbon(user))
LAssailant = null
else
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 84b4608b233..37749c0dd76 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -139,9 +139,11 @@
/mob/living/carbon/human/proc/makeSkeleton()
var/obj/item/organ/external/head/H = get_organ("head")
- if(SKELETON in src.mutations) return
+ if(SKELETON in src.mutations)
+ return
if(istype(H))
+ H.disfigured = TRUE
if(H.f_style)
H.f_style = initial(H.f_style)
if(H.h_style)
@@ -159,16 +161,17 @@
mutations.Add(SKELETON)
mutations.Add(NOCLONE)
- status_flags |= DISFIGURED
update_body(0)
update_mutantrace()
return
/mob/living/carbon/human/proc/ChangeToHusk()
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
- if(HUSK in mutations) return
+ if(HUSK in mutations)
+ return
if(istype(H))
+ H.disfigured = TRUE //makes them unknown without fucking up other stuff like admintools
if(H.f_style)
H.f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
if(H.h_style)
@@ -177,7 +180,6 @@
update_hair(0)
mutations.Add(HUSK)
- status_flags |= DISFIGURED //makes them unknown without fucking up other stuff like admintools
update_body(0)
update_mutantrace()
return
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index e9ae44bf433..be46cc9fa7d 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -173,14 +173,14 @@
if("clack", "clacks")
var/M = handle_emote_param(param)
- message = "[src] clacks their mandibles[M ? " at [M]" : ""]."
+ message = "[src] clacks [p_their()] mandibles[M ? " at [M]" : ""]."
playsound(loc, 'sound/effects/Kidanclack.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
if("click", "clicks")
var/M = handle_emote_param(param)
- message = "[src] clicks their mandibles[M ? " at [M]" : ""]."
+ message = "[src] clicks [p_their()] mandibles[M ? " at [M]" : ""]."
playsound(loc, 'sound/effects/Kidanclack2.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
m_type = 2
@@ -201,7 +201,7 @@
if("quill", "quills")
var/M = handle_emote_param(param)
- message = "[src] rustles their quills[M ? " at [M]" : ""]."
+ message = "[src] rustles [p_their()] quills[M ? " at [M]" : ""]."
playsound(loc, 'sound/effects/voxrustle.ogg', 50, 0) //Credit to sound-ideas (freesfx.co.uk) for the sound.
m_type = 2
@@ -222,12 +222,12 @@
if("wag", "wags")
if(body_accessory)
if(body_accessory.try_restrictions(src))
- message = "[src] starts wagging \his tail."
+ message = "[src] starts wagging [p_their()] tail."
start_tail_wagging(1)
else if(species.bodyflags & TAIL_WAGGING)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
- message = "[src] starts wagging \his tail."
+ message = "[src] starts wagging [p_their()] tail."
start_tail_wagging(1)
else
return
@@ -237,7 +237,7 @@
if("swag", "swags")
if(species.bodyflags & TAIL_WAGGING || body_accessory)
- message = "[src] stops wagging \his tail."
+ message = "[src] stops wagging [p_their()] tail."
stop_tail_wagging(1)
else
return
@@ -282,7 +282,7 @@
if("choke", "chokes")
if(miming)
- message = "[src] clutches \his throat desperately!"
+ message = "[src] clutches [p_their()] throat desperately!"
m_type = 1
else
if(!muzzled)
@@ -294,7 +294,7 @@
if("burp", "burps")
if(miming)
- message = "[src] opens their mouth rather obnoxiously."
+ message = "[src] opens [p_their()] mouth rather obnoxiously."
m_type = 1
else
if(!muzzled)
@@ -330,7 +330,7 @@
if("flap", "flaps")
if(!restrained())
- message = "[src] flaps \his wings."
+ message = "[src] flaps [p_their()] wings."
m_type = 2
if(miming)
m_type = 1
@@ -382,7 +382,7 @@
if("aflap", "aflaps")
if(!restrained())
- message = "[src] flaps \his wings ANGRILY!"
+ message = "[src] flaps [p_their()] wings ANGRILY!"
m_type = 2
if(miming)
m_type = 1
@@ -479,7 +479,7 @@
m_type = 2
if("deathgasp", "deathgasps")
- message = "[src] [species.death_message]"
+ message = "[src] [replacetext(species.death_message, "their", p_their())]"
m_type = 1
if("giggle", "giggles")
@@ -527,7 +527,7 @@
message = "[src] cries."
m_type = 2
else
- message = "[src] makes a weak noise. \He frowns."
+ message = "[src] makes a weak noise. [p_they(TRUE)] frown[p_s()]."
m_type = 2
if("sigh", "sighs")
@@ -605,7 +605,7 @@
message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke."
m_type = 1
else
- message = "[src] says, \"[M], please. They had a family.\" [name] takes a drag from a cigarette and blows their name out in smoke."
+ message = "[src] says, \"[M], please. They had a family.\" [name] takes a drag from a cigarette and blows [p_their()] name out in smoke."
m_type = 2
if("point", "points")
@@ -631,7 +631,7 @@
if("shake", "shakes")
var/M = handle_emote_param(param, 1) //Check to see if the param is valid (mob with the param name is in view) but exclude ourselves.
- message = "[src] shakes \his head[M ? " at [M]" : ""]."
+ message = "[src] shakes [p_their()] head[M ? " at [M]" : ""]."
m_type = 1
if("shrug", "shrugs")
@@ -742,7 +742,7 @@
if(M)
message = "[src] hugs [M]."
else
- message = "[src] hugs \himself."
+ message = "[src] hugs [p_them()]self."
if("handshake")
m_type = 1
@@ -753,7 +753,7 @@
if(M.canmove && !M.r_hand && !M.restrained())
message = "[src] shakes hands with [M]."
else
- message = "[src] holds out \his hand to [M]."
+ message = "[src] holds out [p_their()] hand to [M]."
if("dap", "daps")
m_type = 1
@@ -763,7 +763,7 @@
if(M)
message = "[src] gives daps to [M]."
else
- message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful."
+ message = "[src] sadly can't find anybody to give daps to, and daps [p_them()]self. Shameful."
if("slap", "slaps")
m_type = 1
@@ -773,7 +773,7 @@
if(M)
message = "[src] slaps [M] across the face. Ouch!"
else
- message = "[src] slaps \himself!"
+ message = "[src] slaps [p_them()]self!"
adjustFireLoss(4)
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
@@ -814,10 +814,10 @@
var/M = handle_emote_param(param)
- message = "[src] snaps \his fingers[M ? " at [M]" : ""]."
+ message = "[src] snaps [p_their()] fingers[M ? " at [M]" : ""]."
playsound(loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
else
- message = "[src] snaps \his fingers right off!"
+ message = "[src] snaps [p_their()] fingers right off!"
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
// Needed for M_TOXIC_FART
@@ -826,34 +826,34 @@
return
// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
if(locate(/obj/item/storage/bible) in get_turf(src))
- to_chat(viewers(src), "[src] farts on the Bible!")
- var/image/cross = image('icons/obj/storage.dmi',"bible")
- var/adminbfmessage = "\blue [bicon(cross)] Bible Fart: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SMITE):"
+ to_chat(viewers(src), "[src] farts on the Bible!")
+ var/image/cross = image('icons/obj/storage.dmi', "bible")
+ var/adminbfmessage = "[bicon(cross)] Bible Fart: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SMITE):"
for(var/client/X in admins)
- if(check_rights(R_EVENT,0,X.mob))
+ if(check_rights(R_EVENT, 0, X.mob))
to_chat(X, adminbfmessage)
else if(TOXIC_FARTS in mutations)
- message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
+ message = "[src] unleashes a [pick("horrible", "terrible", "foul", "disgusting", "awful")] fart."
else if(SUPER_FART in mutations)
- message = "[src] unleashes a [pick("loud","deafening")] fart."
- newtonian_move(dir)
+ message = "[src] unleashes a [pick("loud", "deafening")] fart."
else
- message = "[src] [pick("passes wind","farts")]."
+ message = "[src] [pick("passes wind", "farts")]."
m_type = 2
var/turf/location = get_turf(src)
- var/aoe_range=2 // Default
// Process toxic farts first.
if(TOXIC_FARTS in mutations)
- for(var/mob/M in range(location,aoe_range))
- if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
+ for(var/mob/living/carbon/C in range(location, 2))
+ if(C.internal != null && C.wear_mask && (C.wear_mask.flags & AIRTIGHT))
continue
- // Now, we don't have this:
- //new /obj/effects/fart_cloud(T,L)
- if(M == src)
+ if(C == src)
continue
- M.reagents.add_reagent("jenkem", 1)
+ C.reagents.add_reagent("jenkem", 1)
+
+ // Farting as a form of locomotion in space
+ if(SUPER_FART in mutations)
+ newtonian_move(dir)
if("hem")
message = "[src] hems."
@@ -941,7 +941,7 @@
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
- pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN))
+ pose = sanitize(copytext(input(usr, "This is [src]. [p_they(TRUE)] [p_are()]...", "Pose", null) as text, 1, MAX_MESSAGE_LEN))
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavour Text"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index c15f30f94bd..ef352b5a8f8 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -23,41 +23,10 @@
if(wear_mask)
skipface |= wear_mask.flags_inv & HIDEFACE
-
- // crappy hacks because you can't do \his[src] etc. I'm sorry this proc is so unreadable, blame the text macros :<
- var/t_He = "It" //capitalised for use at the start of each line.
- var/t_his = "its"
- var/t_him = "it"
- var/t_has = "has"
- var/t_is = "is"
-
var/msg = "*---------*\nThis is "
- if((skipjumpsuit && skipface)) //big suits/masks/helmets make it hard to tell their gender
- t_He = "They"
- t_his = "their"
- t_him = "them"
- t_has = "have"
- t_is = "are"
- else
- if(icon)
- msg += "[bicon(icon(icon, dir=SOUTH))] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
- switch(gender)
- if(MALE)
- t_He = "He"
- t_his = "his"
- t_him = "him"
- if(FEMALE)
- t_He = "She"
- t_his = "her"
- t_him = "her"
- if(PLURAL)
- t_He = "They"
- t_his = "their"
- t_him = "them"
- t_has = "have"
- t_is = "are"
-
+ if(!(skipjumpsuit && skipface) && icon) //big suits/masks/helmets make it hard to tell their gender
+ msg += "[bicon(icon(icon, dir=SOUTH))] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
msg += "[name]"
var/list/nospecies = list("Abductor", "Shadowling", "Neara", "Monkey", "Stok", "Farwa", "Wolpin") //species that won't show their race no matter what
@@ -86,129 +55,129 @@
tie_msg += " with [english_accessory_list(U)]"
if(w_uniform.blood_DNA)
- msg += "[t_He] [t_is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [w_uniform.blood_color != "#030303" ? "blood-stained":"oil-stained"] [w_uniform.name][tie_msg]!\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [w_uniform.blood_color != "#030303" ? "blood-stained":"oil-stained"] [w_uniform.name][tie_msg]!\n"
else
- msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][tie_msg].\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(w_uniform)] \a [w_uniform][tie_msg].\n"
//head
if(head && !(head.flags & ABSTRACT))
if(head.blood_DNA)
- msg += "[t_He] [t_is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] [head.blood_color != "#030303" ? "blood-stained":"oil-stained"] [head.name] on [t_his] head!\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] [head.blood_color != "#030303" ? "blood-stained":"oil-stained"] [head.name] on [p_their()] head!\n"
else
- msg += "[t_He] [t_is] wearing [bicon(head)] \a [head] on [t_his] head.\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(head)] \a [head] on [p_their()] head.\n"
//suit/armour
if(wear_suit && !(wear_suit.flags & ABSTRACT))
if(wear_suit.blood_DNA)
- msg += "[t_He] [t_is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [wear_suit.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_suit.name]!\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [wear_suit.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_suit.name]!\n"
else
- msg += "[t_He] [t_is] wearing [bicon(wear_suit)] \a [wear_suit].\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(wear_suit)] \a [wear_suit].\n"
//suit/armour storage
if(s_store && !skipsuitstorage)
if(s_store.blood_DNA)
- msg += "[t_He] [t_is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [s_store.blood_color != "#030303" ? "blood-stained":"oil-stained"] [s_store.name] on [t_his] [wear_suit.name]!\n"
+ msg += "[p_they(TRUE)] [p_are()] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [s_store.blood_color != "#030303" ? "blood-stained":"oil-stained"] [s_store.name] on [p_their()] [wear_suit.name]!\n"
else
- msg += "[t_He] [t_is] carrying [bicon(s_store)] \a [s_store] on [t_his] [wear_suit.name].\n"
+ msg += "[p_they(TRUE)] [p_are()] carrying [bicon(s_store)] \a [s_store] on [p_their()] [wear_suit.name].\n"
//back
if(back && !(back.flags & ABSTRACT))
if(back.blood_DNA)
- msg += "[t_He] [t_has] [bicon(back)] [back.gender==PLURAL?"some":"a"] [back.blood_color != "#030303" ? "blood-stained":"oil-stained"] [back] on [t_his] back.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(back)] [back.gender==PLURAL?"some":"a"] [back.blood_color != "#030303" ? "blood-stained":"oil-stained"] [back] on [p_their()] back.\n"
else
- msg += "[t_He] [t_has] [bicon(back)] \a [back] on [t_his] back.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(back)] \a [back] on [p_their()] back.\n"
//left hand
if(l_hand && !(l_hand.flags & ABSTRACT))
if(l_hand.blood_DNA)
- msg += "[t_He] [t_is] holding [bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [l_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [l_hand.name] in [t_his] left hand!\n"
+ msg += "[p_they(TRUE)] [p_are()] holding [bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [l_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [l_hand.name] in [p_their()] left hand!\n"
else
- msg += "[t_He] [t_is] holding [bicon(l_hand)] \a [l_hand] in [t_his] left hand.\n"
+ msg += "[p_they(TRUE)] [p_are()] holding [bicon(l_hand)] \a [l_hand] in [p_their()] left hand.\n"
//right hand
if(r_hand && !(r_hand.flags & ABSTRACT))
if(r_hand.blood_DNA)
- msg += "[t_He] [t_is] holding [bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [r_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [r_hand.name] in [t_his] right hand!\n"
+ msg += "[p_they(TRUE)] [p_are()] holding [bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [r_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [r_hand.name] in [p_their()] right hand!\n"
else
- msg += "[t_He] [t_is] holding [bicon(r_hand)] \a [r_hand] in [t_his] right hand.\n"
+ msg += "[p_they(TRUE)] [p_are()] holding [bicon(r_hand)] \a [r_hand] in [p_their()] right hand.\n"
//gloves
if(gloves && !skipgloves && !(gloves.flags & ABSTRACT))
if(gloves.blood_DNA)
- msg += "[t_He] [t_has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [gloves.blood_color != "#030303" ? "blood-stained":"oil-stained"] [gloves.name] on [t_his] hands!\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [gloves.blood_color != "#030303" ? "blood-stained":"oil-stained"] [gloves.name] on [p_their()] hands!\n"
else
- msg += "[t_He] [t_has] [bicon(gloves)] \a [gloves] on [t_his] hands.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(gloves)] \a [gloves] on [p_their()] hands.\n"
else if(blood_DNA)
- msg += "[t_He] [t_has] [hand_blood_color != "#030303" ? "blood-stained":"oil-stained"] hands!\n"
+ msg += "[p_they(TRUE)] [p_have()] [hand_blood_color != "#030303" ? "blood-stained":"oil-stained"] hands!\n"
//handcuffed?
if(handcuffed)
if(istype(handcuffed, /obj/item/restraints/handcuffs/cable/zipties))
- msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with zipties!\n"
+ msg += "[p_they(TRUE)] [p_are()] [bicon(handcuffed)] restrained with zipties!\n"
else if(istype(handcuffed, /obj/item/restraints/handcuffs/cable))
- msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with cable!\n"
+ msg += "[p_they(TRUE)] [p_are()] [bicon(handcuffed)] restrained with cable!\n"
else
- msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n"
+ msg += "[p_they(TRUE)] [p_are()] [bicon(handcuffed)] handcuffed!\n"
//belt
if(belt)
if(belt.blood_DNA)
- msg += "[t_He] [t_has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] [belt.blood_color != "#030303" ? "blood-stained":"oil-stained"] [belt.name] about [t_his] waist!\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] [belt.blood_color != "#030303" ? "blood-stained":"oil-stained"] [belt.name] about [p_their()] waist!\n"
else
- msg += "[t_He] [t_has] [bicon(belt)] \a [belt] about [t_his] waist.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(belt)] \a [belt] about [p_their()] waist.\n"
//shoes
if(shoes && !skipshoes && !(shoes.flags & ABSTRACT))
if(shoes.blood_DNA)
- msg += "[t_He] [t_is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [shoes.blood_color != "#030303" ? "blood-stained":"oil-stained"] [shoes.name] on [t_his] feet!\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [shoes.blood_color != "#030303" ? "blood-stained":"oil-stained"] [shoes.name] on [p_their()] feet!\n"
else
- msg += "[t_He] [t_is] wearing [bicon(shoes)] \a [shoes] on [t_his] feet.\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(shoes)] \a [shoes] on [p_their()] feet.\n"
else if(blood_DNA)
- msg += "[t_He] [t_has] [feet_blood_color != "#030303" ? "blood-stained":"oil-stained"] feet!\n"
+ msg += "[p_they(TRUE)] [p_have()] [feet_blood_color != "#030303" ? "blood-stained":"oil-stained"] feet!\n"
//mask
if(wear_mask && !skipmask && !(wear_mask.flags & ABSTRACT))
if(wear_mask.blood_DNA)
- msg += "[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [wear_mask.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_mask.name] on [t_his] face!\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [wear_mask.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_mask.name] on [p_their()] face!\n"
else
- msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] on [t_his] face.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(wear_mask)] \a [wear_mask] on [p_their()] face.\n"
//eyes
if(glasses && !skipeyes && !(glasses.flags & ABSTRACT))
if(glasses.blood_DNA)
- msg += "[t_He] [t_has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [t_his] eyes!\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [p_their()] eyes!\n"
else
- msg += "[t_He] [t_has] [bicon(glasses)] \a [glasses] covering [t_his] eyes.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(glasses)] \a [glasses] covering [p_their()] eyes.\n"
//left ear
if(l_ear && !skipears)
- msg += "[t_He] [t_has] [bicon(l_ear)] \a [l_ear] on [t_his] left ear.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(l_ear)] \a [l_ear] on [p_their()] left ear.\n"
//right ear
if(r_ear && !skipears)
- msg += "[t_He] [t_has] [bicon(r_ear)] \a [r_ear] on [t_his] right ear.\n"
+ msg += "[p_they(TRUE)] [p_have()] [bicon(r_ear)] \a [r_ear] on [p_their()] right ear.\n"
//ID
if(wear_id)
- msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n"
+ msg += "[p_they(TRUE)] [p_are()] wearing [bicon(wear_id)] \a [wear_id].\n"
//Jitters
switch(jitteriness)
if(300 to INFINITY)
- msg += "[t_He] [t_is] convulsing violently!\n"
+ msg += "[p_they(TRUE)] [p_are()] convulsing violently!\n"
if(200 to 300)
- msg += "[t_He] [t_is] extremely jittery.\n"
+ msg += "[p_they(TRUE)] [p_are()] extremely jittery.\n"
if(100 to 200)
- msg += "[t_He] [t_is] twitching ever so slightly.\n"
+ msg += "[p_they(TRUE)] [p_are()] twitching ever so slightly.\n"
var/appears_dead = FALSE
if(stat == DEAD || (status_flags & FAKEDEATH))
appears_dead = TRUE
if(suiciding)
- msg += "[t_He] appears to have committed suicide... there is no hope of recovery.\n"
- msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life"
+ msg += "[p_they(TRUE)] appear[p_s()] to have committed suicide... there is no hope of recovery.\n"
+ msg += "[p_they(TRUE)] [p_are()] limp and unresponsive; there are no signs of life"
if(get_int_organ(/obj/item/organ/internal/brain))
if(!key)
var/foundghost = FALSE
@@ -220,11 +189,11 @@
foundghost = FALSE
break
if(!foundghost)
- msg += " and [t_his] soul has departed"
+ msg += " and [p_their()] soul has departed"
msg += "...\n"
if(!get_int_organ(/obj/item/organ/internal/brain))
- msg += "It appears that [t_his] brain is missing...\n"
+ msg += "It appears that [p_their()] brain is missing...\n"
msg += ""
@@ -238,17 +207,17 @@
var/obj/item/organ/external/E = bodyparts_by_name[organ_tag]
if(!E)
- wound_flavor_text["[organ_tag]"] = "[t_He] [t_is] missing [t_his] [organ_descriptor].\n"
+ wound_flavor_text["[organ_tag]"] = "[p_they(TRUE)] [p_are()] missing [p_their()] [organ_descriptor].\n"
else
if(!isSynthetic())
if(E.status & ORGAN_ROBOT)
- wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
+ wound_flavor_text["[E.limb_name]"] = "[p_they(TRUE)] [p_have()] a robotic [E.name]!\n"
else if(E.status & ORGAN_SPLINTED)
- wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on [t_his] [E.name]!\n"
+ wound_flavor_text["[E.limb_name]"] = "[p_they(TRUE)] [p_have()] a splint on [p_their()] [E.name]!\n"
for(var/obj/item/I in E.embedded_objects)
- msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [E.name]!\n"
+ msg += "[p_they(TRUE)] [p_have()] \a [bicon(I)] [I] embedded in [p_their()] [E.name]!\n"
//Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
@@ -280,101 +249,101 @@
if(temp)
var/brute_message = !isSynthetic() ? "bruising" : "denting"
if(temp < 30)
- msg += "[t_He] [t_has] minor [brute_message ].\n"
+ msg += "[p_they(TRUE)] [p_have()] minor [brute_message ].\n"
else
- msg += "[t_He] [t_has] severe [brute_message ]!\n"
+ msg += "[p_they(TRUE)] [p_have()] severe [brute_message ]!\n"
temp = getFireLoss()
if(temp)
if(temp < 30)
- msg += "[t_He] [t_has] minor burns.\n"
+ msg += "[p_they(TRUE)] [p_have()] minor burns.\n"
else
- msg += "[t_He] [t_has] severe burns!\n"
+ msg += "[p_they(TRUE)] [p_have()] severe burns!\n"
temp = getCloneLoss()
if(temp)
if(temp < 30)
- msg += "[t_He] [t_has] minor cellular damage.\n"
+ msg += "[p_they(TRUE)] [p_have()] minor cellular damage.\n"
else
- msg += "[t_He] [t_has] severe cellular damage.\n"
+ msg += "[p_they(TRUE)] [p_have()] severe cellular damage.\n"
if(fire_stacks > 0)
- msg += "[t_He] [t_is] covered in something flammable.\n"
+ msg += "[p_they(TRUE)] [p_are()] covered in something flammable.\n"
if(fire_stacks < 0)
- msg += "[t_He] looks a little soaked.\n"
+ msg += "[p_they(TRUE)] looks a little soaked.\n"
switch(wetlevel)
if(1)
- msg += "[t_He] looks a bit damp.\n"
+ msg += "[p_they(TRUE)] looks a bit damp.\n"
if(2)
- msg += "[t_He] looks a little bit wet.\n"
+ msg += "[p_they(TRUE)] looks a little bit wet.\n"
if(3)
- msg += "[t_He] looks wet.\n"
+ msg += "[p_they(TRUE)] looks wet.\n"
if(4)
- msg += "[t_He] looks very wet.\n"
+ msg += "[p_they(TRUE)] looks very wet.\n"
if(5)
- msg += "[t_He] looks absolutely soaked.\n"
+ msg += "[p_they(TRUE)] looks absolutely soaked.\n"
if(nutrition < NUTRITION_LEVEL_STARVING - 50)
- msg += "[t_He] [t_is] severely malnourished.\n"
+ msg += "[p_they(TRUE)] [p_are()] severely malnourished.\n"
else if(nutrition >= NUTRITION_LEVEL_FAT)
if(user.nutrition < NUTRITION_LEVEL_STARVING - 50)
- msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
+ msg += "[p_they(TRUE)] [p_are()] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else
- msg += "[t_He] [t_is] quite chubby.\n"
+ msg += "[p_they(TRUE)] [p_are()] quite chubby.\n"
if(blood_volume < BLOOD_VOLUME_SAFE)
- msg += "[t_He] [t_has] pale skin.\n"
+ msg += "[p_they(TRUE)] [p_have()] pale skin.\n"
if(bleedsuppress)
- msg += "[t_He] [t_is] bandaged with something.\n"
+ msg += "[p_they(TRUE)] [p_are()] bandaged with something.\n"
else if(bleed_rate)
if(reagents.has_reagent("heparin"))
- msg += "[t_He] [t_is] bleeding uncontrollably!\n"
+ msg += "[p_they(TRUE)] [p_are()] bleeding uncontrollably!\n"
else
- msg += "[t_He] [t_is] bleeding!\n"
+ msg += "[p_they(TRUE)] [p_are()] bleeding!\n"
if(reagents.has_reagent("teslium"))
- msg += "[t_He] is emitting a gentle blue glow!\n"
+ msg += "[p_they(TRUE)] [p_are()] emitting a gentle blue glow!\n"
msg += ""
if(!appears_dead)
if(stat == UNCONSCIOUS)
- msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n"
+ msg += "[p_they(TRUE)] [p_are()]n't responding to anything around [p_them()] and seems to be asleep.\n"
else if(getBrainLoss() >= 60)
- msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
+ msg += "[p_they(TRUE)] [p_have()] a stupid expression on [p_their()] face.\n"
if(get_int_organ(/obj/item/organ/internal/brain))
if(istype(src, /mob/living/carbon/human/interactive))
var/mob/living/carbon/human/interactive/auto = src
if(auto.showexaminetext)
- msg += "[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.\n"
+ msg += "[p_they(TRUE)] [p_are()] appears to be some sort of sick automaton, [p_their()] eyes are glazed over and [p_their()] mouth is slightly agape.\n"
if(auto.debugexamine)
var/dodebug = auto.doing2string(auto.doing)
var/interestdebug = auto.interest2string(auto.interest)
- msg += "[t_He] [t_is] appears to be [interestdebug] and [dodebug].\n"
+ msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n"
else if(species.show_ssd)
if(!key)
- msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n"
+ msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n"
else if(!client)
- msg += "[t_He] [t_has] suddenly fallen asleep, suffering from Space Sleep Disorder. [t_He] may wake up soon.\n"
+ msg += "[p_they(TRUE)] [p_have()] suddenly fallen asleep, suffering from Space Sleep Disorder. [p_they(TRUE)] may wake up soon.\n"
if(digitalcamo)
- msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
+ msg += "[p_they(TRUE)] [p_are()] moving [p_their()] body in an unnatural and blatantly inhuman manner.\n"
if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
msg += "Their features seem unnaturally tight and drawn.\n"
if(decaylevel == 1)
- msg += "[t_He] [t_is] starting to smell.\n"
+ msg += "[p_they(TRUE)] [p_are()] starting to smell.\n"
if(decaylevel == 2)
- msg += "[t_He] [t_is] bloated and smells disgusting.\n"
+ msg += "[p_they(TRUE)] [p_are()] bloated and smells disgusting.\n"
if(decaylevel == 3)
- msg += "[t_He] [t_is] rotting and blackened, the skin sloughing off. The smell is indescribably foul.\n"
+ msg += "[p_they(TRUE)] [p_are()] rotting and blackened, the skin sloughing off. The smell is indescribably foul.\n"
if(decaylevel == 4)
- msg += "[t_He] [t_is] mostly dessicated now, with only bones remaining of what used to be a person.\n"
+ msg += "[p_they(TRUE)] [p_are()] mostly dessicated now, with only bones remaining of what used to be a person.\n"
if(hasHUD(user,"security"))
var/perpname = "wot"
@@ -429,7 +398,7 @@
if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
- msg += "\n[t_He] is [pose]"
+ msg += "\n[p_they(TRUE)] [p_are()] [pose]"
to_chat(user, msg)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e0f90aacdd0..cca71c1e8d6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -306,7 +306,7 @@
if(!prob(martial_art.deflection_chance))
return ..()
if(!src.lying && !(HULK in mutations)) //But only if they're not lying down, and hulks can't do it
- visible_message("[src] deflects the projectile; they can't be hit with ranged weapons!", "You deflect the projectile!")
+ visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!")
return 0
..()
@@ -513,7 +513,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/obj/item/organ/external/head = get_organ("head")
- if( !head || head.disfigured || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
+ if(!head || head.disfigured || cloneloss > 50 || !real_name || (HUSK in mutations)) //disfigured. use id-name if possible
return "Unknown"
return real_name
@@ -608,7 +608,7 @@
if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore
return
var/time_taken = I.embedded_unsafe_removal_time*I.w_class
- usr.visible_message("[usr] attempts to remove [I] from their [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)")
+ usr.visible_message("[usr] attempts to remove [I] from [usr.p_their()] [L.name].","You attempt to remove [I] from your [L.name]... (It will take [time_taken/10] seconds.)")
if(do_after(usr, time_taken, needhand = 1, target = src))
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
@@ -617,7 +617,7 @@
I.forceMove(get_turf(src))
usr.put_in_hands(I)
usr.emote("scream")
- usr.visible_message("[usr] successfully rips [I] out of their [L.name]!","You successfully remove [I] from your [L.name].")
+ usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!","You successfully remove [I] from your [L.name].")
if(!has_embedded_objects())
clear_alert("embeddedobject")
return
@@ -651,12 +651,12 @@
unEquip(pocket_item)
if(thief_mode)
usr.put_in_hands(pocket_item)
- add_attack_logs(usr, src, "Stripped of [pocket_item]", isLivingSSD(src))
+ add_attack_logs(usr, src, "Stripped of [pocket_item]", isLivingSSD(src) ? null : ATKLOG_ALL)
else
if(place_item)
usr.unEquip(place_item)
equip_to_slot_if_possible(place_item, pocket_id, 0, 1)
- add_attack_logs(usr, src, "Equipped with [pocket_item]", isLivingSSD(src))
+ add_attack_logs(usr, src, "Equipped with [pocket_item]", isLivingSSD(src) ? null : ATKLOG_ALL)
// Update strip window
if(usr.machine == src && in_range(src, usr))
@@ -665,7 +665,7 @@
// Display a warning if the user mocks up if they don't have pickpocket gloves.
if(!thief_mode)
to_chat(src, "You feel your [pocket_side] pocket being fumbled with!")
- add_attack_logs(usr, src, "Attempted strip of [pocket_item]", isLivingSSD(src))
+ add_attack_logs(usr, src, "Attempted strip of [pocket_item]", isLivingSSD(src) ? null : ATKLOG_ALL)
if(href_list["set_sensor"])
if(istype(w_uniform, /obj/item/clothing/under))
@@ -680,7 +680,7 @@
"You have dislodged everything from [src]'s headpocket!")
var/obj/item/organ/internal/headpocket/C = get_int_organ(/obj/item/organ/internal/headpocket)
C.empty_contents()
- add_attack_logs(usr, src, "Stripped of headpocket items", isLivingSSD(src))
+ add_attack_logs(usr, src, "Stripped of headpocket items", isLivingSSD(src) ? null : ATKLOG_ALL)
if(href_list["strip_accessory"])
if(istype(w_uniform, /obj/item/clothing/under))
@@ -1043,7 +1043,7 @@
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
- visible_message("[src] begins playing his ribcage like a xylophone. It's quite spooky.","You begin to play a spooky refrain on your ribcage.","You hear a spooky xylophone melody.")
+ visible_message("[src] begins playing [p_their()] ribcage like a xylophone. It's quite spooky.","You begin to play a spooky refrain on your ribcage.","You hear a spooky xylophone melody.")
var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg')
playsound(loc, song, 50, 1, -1)
xylophone = 1
@@ -1064,7 +1064,7 @@
var/fail_msg
if(!affecting)
. = 0
- fail_msg = "They are missing that limb."
+ fail_msg = "[p_they(TRUE)] [p_are()] missing that limb."
else if(affecting.status & ORGAN_ROBOT)
. = 0
fail_msg = "That limb is robotic."
@@ -1078,7 +1078,7 @@
. = 0
if(!. && error_msg && user)
if(!fail_msg)
- fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
+ fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on [p_their()] head" : "on [p_their()] body"] to inject into."
to_chat(user, "[fail_msg]")
/mob/living/carbon/human/proc/check_obscured_slots()
@@ -1114,8 +1114,10 @@
return 1
/mob/living/carbon/human/proc/get_visible_gender()
- if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask))
- return NEUTER
+ var/list/obscured = check_obscured_slots()
+ var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
+ if((slot_w_uniform in obscured) && skipface)
+ return PLURAL
return gender
/mob/living/carbon/human/proc/increase_germ_level(n)
@@ -1201,7 +1203,7 @@
return 0
if(!L.is_bruised())
- src.custom_pain("You feel a stabbing pain in your chest!", 1)
+ custom_pain("You feel a stabbing pain in your chest!")
L.damage = L.min_bruised_damage
//returns 1 if made bloody, returns 0 otherwise
@@ -1252,10 +1254,10 @@
if(usr == src)
self = 1
if(!self)
- usr.visible_message("[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\
+ usr.visible_message("[usr] kneels down, puts [usr.p_their()] hand on [src]'s wrist and begins counting [p_their()] pulse.",\
"You begin counting [src]'s pulse")
else
- usr.visible_message("[usr] begins counting their pulse.",\
+ usr.visible_message("[usr] begins counting [p_their()] pulse.",\
"You begin counting your pulse.")
if(src.pulse)
@@ -1746,7 +1748,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
to_chat(src, "Remove your mask first!")
return 0
if((H.head && (H.head.flags_cover & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags_cover & MASKCOVERSMOUTH) && !H.wear_mask.mask_adjusted))
- to_chat(src, "Remove their mask first!")
+ to_chat(src, "Remove [H.p_their()] mask first!")
return 0
visible_message("[src] is trying to perform CPR on [H.name]!", \
"You try to perform CPR on [H.name]!")
@@ -1760,7 +1762,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
to_chat(H, "You feel a breath of fresh air enter your lungs. It feels good.")
to_chat(src, "Repeat at least every 7 seconds.")
- add_attack_logs(src, H, "CPRed", FALSE)
+ add_attack_logs(src, H, "CPRed", ATKLOG_ALL)
return 1
else
to_chat(src, "You need to stay still while performing CPR!")
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index c45154e4931..5b78b450357 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -348,6 +348,18 @@ emp_act
if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam)
+/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ var/hulk_verb = pick("smash", "pummel")
+ if(check_shields(user, 15, "the [hulk_verb]ing"))
+ return
+ ..(user, TRUE)
+ playsound(loc, user.species.unarmed.attack_sound, 25, 1, -1)
+ var/message = "[user] has [hulk_verb]ed [src]!"
+ visible_message("[message]", "[message]")
+ adjustBruteLoss(15)
+ return TRUE
+
/mob/living/carbon/human/attack_hand(mob/user)
if(..()) //to allow surgery to return properly.
return
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 428fafeb71e..9a78eafadd8 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -20,7 +20,7 @@
//Moving around with fractured ribs won't do you any good
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/internal/I = pick(E.internal_organs)
- custom_pain("You feel broken bones moving in your [E.name]!", 1)
+ custom_pain("You feel broken bones moving in your [E.name]!")
I.receive_damage(rand(3,5))
//handle_stance()
@@ -90,7 +90,7 @@
continue
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
- custom_emote(1, "[(NO_PAIN in species.species_traits) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
+ custom_emote(1, "[(NO_PAIN in species.species_traits) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
else if(E.is_malfunctioning())
@@ -105,7 +105,7 @@
if(!unEquip(r_hand))
continue
- custom_emote(1, "drops what they were holding, their [E.name] malfunctioning!")
+ custom_emote(1, "drops what [p_they()] [p_were()] holding, [p_their()] [E.name] malfunctioning!")
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index eae754b5283..8e8c2c80013 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -87,11 +87,11 @@
if(inactivity_period <= 0)
inactivity_period = 9999 // technically infinite
if(do_after(src, 60, target = traitorTarget))
- custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming their body in a flaming explosion!")
+ custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming [p_their()] body in a flaming explosion!")
explosion(src, 6, 6, 6)
else
inactivity_period = 0
- custom_emote(1, "[src]'s chest closes, hiding their insides.")
+ custom_emote(1, "[src]'s chest closes, hiding [p_their()] insides.")
if(SNPC_PSYCHO)
var/choice = pick(typesof(/obj/item/grenade/chem_grenade) - /obj/item/grenade/chem_grenade)
@@ -469,7 +469,7 @@
if(!Adjacent(SF))
tryWalk(get_turf(SF))
else
- custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in it's mouth!")
+ custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")], grabbing various foodstuffs from [SF] and sticking them in its mouth!")
for(var/obj/item/A in SF.contents)
if(prob(smartness/2))
var/count = SF.item_quants[A.name]
@@ -631,7 +631,7 @@
TARGET = newSnack
newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1)
newSnack.name = "Synthetic [newSnack.name]"
- custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they vomit [newSnack] from their mouth!")
+ custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!")
catch(var/exception/e)
log_runtime(e, src, "Caught in SNPC cooking module")
doing &= ~SNPC_SPECIAL
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 00de7814170..22e2e0ffe25 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -150,7 +150,7 @@
AdjustSilence(2)
if(getBrainLoss() >= 120 && stat != 2) //they died from stupidity--literally. -Fox
- visible_message("[src] goes limp, their facial expression utterly blank.")
+ visible_message("[src] goes limp, [p_their()] facial expression utterly blank.")
death()
/mob/living/carbon/human/handle_mutations_and_radiation()
@@ -832,7 +832,8 @@
/mob/living/carbon/human/handle_vision()
if(machine)
- if(!machine.check_eye(src)) reset_perspective(null)
+ if(!machine.check_eye(src))
+ reset_perspective(null)
else
var/isRemoteObserve = 0
if((REMOTE_VIEW in mutations) && remoteview_target)
diff --git a/code/modules/mob/living/carbon/human/shock.dm b/code/modules/mob/living/carbon/human/shock.dm
index 05042a226d6..d8dc9356de7 100644
--- a/code/modules/mob/living/carbon/human/shock.dm
+++ b/code/modules/mob/living/carbon/human/shock.dm
@@ -43,7 +43,7 @@
if(shock_stage >= 30)
if(shock_stage == 30)
- custom_emote(1,"is having trouble keeping their eyes open.")
+ custom_emote(1,"is having trouble keeping [p_their()] eyes open.")
EyeBlurry(2)
Stuttering(5)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 25d3fd342c5..139f2f7c9bb 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -21,7 +21,7 @@
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/tail // Name of tail image in species effects icon file.
- var/unarmed //For empty hand harm-intent attack
+ var/datum/unarmed_attack/unarmed //For empty hand harm-intent attack
var/unarmed_type = /datum/unarmed_attack
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
var/silent_steps = 0 // Stops step noises
@@ -357,7 +357,7 @@
var/datum/unarmed_attack/attack = user.species.unarmed
user.do_attack_animation(target, attack.animation_type)
- add_attack_logs(user, target, "Melee attacked with fists", admin_notify = target.ckey ? TRUE : FALSE)
+ add_attack_logs(user, target, "Melee attacked with fists", target.ckey ? null : ATKLOG_ALL)
if(!iscarbon(user))
target.LAssailant = null
@@ -375,9 +375,6 @@
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
var/armor_block = target.run_armor_check(affecting, "melee")
- if(HULK in user.mutations)
- target.adjustBruteLoss(15)
-
playsound(target.loc, attack.attack_sound, 25, 1, -1)
target.visible_message("[user] [pick(attack.attack_verb)]ed [target]!")
@@ -395,7 +392,7 @@
if(attacker_style && attacker_style.disarm_act(user, target))
return 1
else
- add_attack_logs(user, target, "Disarmed", admin_notify = FALSE)
+ add_attack_logs(user, target, "Disarmed", ATKLOG_ALL)
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
if(target.w_uniform)
target.w_uniform.add_fingerprint(user)
@@ -405,7 +402,7 @@
target.apply_effect(2, WEAKEN, target.run_armor_check(affecting, "melee"))
playsound(target.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
target.visible_message("[user] has pushed [target]!")
- add_attack_logs(user, target, "Pushed over", admin_notify = FALSE)
+ add_attack_logs(user, target, "Pushed over", ATKLOG_ALL)
if(!iscarbon(user))
target.LAssailant = null
else
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 015f1515683..6b692601226 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -687,7 +687,7 @@
var/limb_select = input(src, "Choose a limb to regrow", "Limb Regrowth") as null|anything in missing_limbs
var/chosen_limb = missing_limbs[limb_select]
- visible_message("[src] begins to hold still and concentrate on their missing [limb_select]...", "You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)")
+ visible_message("[src] begins to hold still and concentrate on [p_their()] missing [limb_select]...", "You begin to focus on regrowing your missing [limb_select]... (This will take [round(SLIMEPERSON_REGROWTHDELAY/10)] seconds, and you must hold still.)")
if(do_after(src, SLIMEPERSON_REGROWTHDELAY, needhand=0, target = src))
if(stat || paralysis || stunned)
to_chat(src, "You cannot regenerate missing limbs in your current state.")
@@ -725,7 +725,7 @@
updatehealth()
UpdateDamageIcon()
nutrition -= SLIMEPERSON_HUNGERCOST
- visible_message("[src] finishes regrowing their missing [new_limb]!", "You finish regrowing your [limb_select]")
+ visible_message("[src] finishes regrowing [p_their()] missing [new_limb]!", "You finish regrowing your [limb_select]")
else
to_chat(src, "You need to hold still in order to regrow a limb!")
return
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index ec7592d4d3f..328e4c14ab8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -205,7 +205,7 @@ var/global/list/damage_icon_parts = list()
DI = damage_icon_parts[cache_index]
standing_image.overlays += DI
- overlays_standing[DAMAGE_LAYER] = standing_image
+ overlays_standing[H_DAMAGE_LAYER] = standing_image
if(update_icons) update_icons()
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 79bcd54775b..506cc804bd3 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -234,6 +234,24 @@
adjustBruteLoss(damage)
updatehealth()
+/mob/living/carbon/slime/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ if(Victim || Target)
+ Victim = null
+ Target = null
+ anchored = 0
+ if(prob(80) && !client)
+ Discipline++
+ spawn(0)
+ step_away(src, user, 15)
+ sleep(3)
+ step_away(src, user, 15)
+ ..(user, TRUE)
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[user] has punched [src]!", "[user] has punched [src]!")
+ adjustBruteLoss(15)
+ return TRUE
+
/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M)
if(Victim)
M.do_attack_animation(src, ATTACK_EFFECT_DISARM)
@@ -301,20 +319,6 @@
var/damage = rand(1, 9)
attacked += 10
if(prob(90))
- if(HULK in M.mutations)
- damage += 15
- if(Victim || Target)
- Victim = null
- Target = null
- anchored = 0
- if(prob(80) && !client)
- Discipline++
- spawn(0)
- step_away(src,M,15)
- sleep(3)
- step_away(src,M,15)
-
-
playsound(loc, "punch", 25, 1, -1)
add_attack_logs(M, src, "Melee attacked with fists")
visible_message("[M] has punched [src]!", \
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index d850caf658f..d9c7a9f12ef 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -188,15 +188,15 @@
switch(progress)
if(1)
to_chat(user, "You begin by introducing yourself and explaining what you're about.")
- user.visible_message("[user] introduces \himself and explains \his plans.")
+ user.visible_message("[user] introduces [user.p_them()]self and explains [user.p_their()] plans.")
if(2)
to_chat(user, "You begin the recruitment of [target].")
- user.visible_message("[user] leans over towards [target], whispering excitedly as he gives a speech.")
+ user.visible_message("[user] leans over towards [target], whispering excitedly as [user.p_they()] give[user.p_s()] a speech.")
to_chat(target, "You feel yourself agreeing with [user], and a surge of loyalty begins building.")
target.Weaken(12)
sleep(20)
if(ismindshielded(target))
- to_chat(user, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear.")
+ to_chat(user, "[target.p_they(TRUE)] are enslaved by Nanotrasen. You feel [target.p_their()] interest in your cause wane and disappear.")
user.visible_message("[user] stops talking for a moment, then moves back away from [target].")
to_chat(target, "Your mindshield implant activates, protecting you from conversion.")
return
@@ -214,7 +214,7 @@
recruiting = 0
to_chat(user, "You have recruited [target] as your henchman!")
to_chat(target, "You have decided to enroll as a henchman for [user]. You are now part of the feared 'Greyshirts'.")
- to_chat(target, "You must follow the orders of [user], and help him succeed in \his dastardly schemes.")
+ to_chat(target, "You must follow the orders of [user], and help [user.p_them()] succeed in [user.p_their()] dastardly schemes.")
to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.")
ticker.mode.greyshirts += target.mind
target.set_species("Human")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2f0d341f697..bff49e7c527 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -137,10 +137,12 @@
if(!AM.anchored)
now_pushing = 1
var/t = get_dir(src, AM)
- if(istype(AM, /obj/structure/window/full))
- for(var/obj/structure/window/win in get_step(AM, t))
- now_pushing = 0
- return
+ if(istype(AM, /obj/structure/window))
+ var/obj/structure/window/W = AM
+ if(W.fulltile)
+ for(var/obj/structure/window/win in get_step(W, t))
+ now_pushing = 0
+ return
if(pulling == AM)
stop_pulling()
var/current_dir
@@ -816,7 +818,7 @@
who.unEquip(what)
if(silent)
put_in_hands(what)
- add_attack_logs(src, who, "Stripped of [what]", isLivingSSD(who))
+ add_attack_logs(src, who, "Stripped of [what]")
// The src mob is trying to place an item on someone
// Override if a certain mob should be behave differently when placing items (can't, for example)
@@ -835,8 +837,7 @@
if(what && Adjacent(who))
unEquip(what)
who.equip_to_slot_if_possible(what, where, 0, 1)
- add_attack_logs(src, who, "Equipped [what]", isLivingSSD(who))
-
+ add_attack_logs(src, who, "Equipped [what]")
/mob/living/singularity_act()
var/gain = 20
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index d734272e905..aaeb26fe2c6 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -129,7 +129,7 @@
add_attack_logs(M.occupant, src, "Mecha-meleed with [M]")
else
step_away(src,M)
- add_attack_logs(M.occupant, src, "Mecha-pushed with [M]", FALSE)
+ add_attack_logs(M.occupant, src, "Mecha-pushed with [M]", ATKLOG_ALL)
M.occupant_message("You push [src] out of the way.")
visible_message("[M] pushes [src] out of the way.")
return
@@ -240,11 +240,11 @@
to_chat(user, "You already grabbed [src].")
return
- add_attack_logs(user, src, "Grabbed passively", admin_notify = FALSE)
+ add_attack_logs(user, src, "Grabbed passively", ATKLOG_ALL)
var/obj/item/grab/G = new /obj/item/grab(user, src)
if(buckled)
- to_chat(user, "You cannot grab [src], \he is buckled in!")
+ to_chat(user, "You cannot grab [src]; [p_they()] [p_are()] buckled in!")
if(!G) //the grab will delete itself in New if src is anchored
return 0
user.put_in_active_hand(G)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b2755e2b7d8..55e8536cd10 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -164,10 +164,10 @@ proc/get_radio_key_from_channel(var/channel)
if(is_muzzled())
var/obj/item/clothing/mask/muzzle/G = wear_mask
- if(G.mute == MUTE_ALL) //if the mask is supposed to mute you completely or just muffle you
+ if(G.mute == MUZZLE_MUTE_ALL) //if the mask is supposed to mute you completely or just muffle you
to_chat(src, "You're muzzled and cannot speak!")
return
- else if(G.mute == MUTE_MUFFLE)
+ else if(G.mute == MUZZLE_MUTE_MUFFLE)
message = muffledspeech(message)
verb = "mumbles"
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 09b62f1c89c..bf11356b3a5 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -87,11 +87,12 @@ var/list/ai_verbs_default = list(
var/mob/living/simple_animal/bot/Bot
var/turf/waypoint //Holds the turf of the currently selected waypoint.
var/waypoint_mode = 0 //Waypoint mode is for selecting a turf via clicking.
+ var/apc_override = FALSE //hack for letting the AI use its APC even when visionless
var/nuking = 0
var/obj/machinery/doomsday_device/doomsday_device
var/obj/machinery/hologram/holopad/holo = null
- var/mob/camera/aiEye/eyeobj = new()
+ var/mob/camera/aiEye/eyeobj
var/sprint = 10
var/cooldown = 0
var/acceleration = 1
@@ -191,9 +192,7 @@ var/list/ai_verbs_default = list(
spawn(5)
new /obj/machinery/ai_powersupply(src)
- eyeobj.ai = src
- eyeobj.name = "[src.name] (AI Eye)" // Give it a name
- eyeobj.loc = src.loc
+ create_eye()
builtInCamera = new /obj/machinery/camera/portable(src)
builtInCamera.c_tag = name
@@ -1163,6 +1162,17 @@ var/list/ai_verbs_default = list(
client.eye = eyeobj
return TRUE
+
+/mob/living/silicon/ai/proc/can_see(atom/A)
+ if(isturf(loc)) //AI in core, check if on cameras
+ //get_turf_pixel() is because APCs in maint aren't actually in view of the inner camera
+ //apc_override is needed here because AIs use their own APC when depowered
+ return (cameranet && cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override
+ //AI is carded/shunted
+ //view(src) returns nothing for carded/shunted AIs and they have x-ray vision so just use get_dist
+ var/list/viewscale = getviewsize(client.view)
+ return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5)
+
/mob/living/silicon/ai/proc/relay_speech(mob/living/M, text, verb, datum/language/speaking)
if(!say_understands(M, speaking))//The AI will be able to understand most mobs talking through the holopad.
if(speaking)
diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
index eeeeed8e8bb..6737be463d6 100644
--- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm
@@ -28,7 +28,7 @@
eye.visibleCameraChunks += src
visible++
seenby += eye
- if(changed && !updating)
+ if(changed)
update()
// Remove an AI eye from the chunk, then update if changed.
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 71a2e6cba36..2728a1af55e 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -20,7 +20,6 @@
// It will also stream the chunk that the new loc is in.
/mob/camera/aiEye/setLoc(T)
-
if(ai)
if(!isturf(ai.loc))
return
@@ -30,8 +29,9 @@
if(ai.client)
ai.client.eye = src
//Holopad
- if(ai.holo)
- ai.holo.move_hologram()
+ if(istype(ai.current, /obj/machinery/hologram/holopad))
+ var/obj/machinery/hologram/holopad/H = ai.current
+ H.move_hologram(ai, T)
/mob/camera/aiEye/Move()
return 0
@@ -41,8 +41,22 @@
return ai.client
return null
+
+/mob/camera/aiEye/proc/RemoveImages()
+ var/client/C = GetViewerClient()
+ if(C)
+ for(var/V in visibleCameraChunks)
+ var/datum/camerachunk/chunk = V
+ C.images -= chunk.obscured
+
+
/mob/camera/aiEye/Destroy()
- ai = null
+ if(ai)
+ //ai.all_eyes -= src
+ ai = null
+ for(var/V in visibleCameraChunks)
+ var/datum/camerachunk/chunk = V
+ chunk.remove(src)
return ..()
/atom/proc/move_camera_by_click()
@@ -102,12 +116,18 @@
src.eyeobj.loc = src.loc
else
to_chat(src, "ERROR: Eyeobj not found. Creating new eye...")
- src.eyeobj = new(src.loc)
- src.eyeobj.ai = src
- src.eyeobj.name = "[src.name] (AI Eye)" // Give it a name
+ create_eye()
eyeobj.setLoc(loc)
+/mob/living/silicon/ai/proc/create_eye()
+ if(eyeobj)
+ return
+ eyeobj = new /mob/camera/aiEye()
+ eyeobj.ai = src
+ eyeobj.setLoc(loc)
+ eyeobj.name = "[name] (AI Eye)"
+
/mob/living/silicon/ai/proc/toggle_acceleration()
set category = "AI Commands"
set name = "Toggle Camera Acceleration"
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 1755674b4f6..42f132e39d4 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -129,8 +129,10 @@
to_chat(src, "Receiving control information from APC.")
sleep(2)
//bring up APC dialog
- aiRestorePowerRoutine = 3
+ apc_override = 1
theAPC.attack_ai(src)
+ apc_override = 0
+ aiRestorePowerRoutine = 3
to_chat(src, "Here are your current laws:")
src.show_laws() //WHY THE FUCK IS THIS HERE
sleep(50)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 54ebdaf4da2..d24518d4888 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -599,7 +599,7 @@
var/mob/living/carbon/human/H = over_object //changed to human to avoid stupid issues like xenos holding pAIs.
if(!istype(H) || !Adjacent(H)) return ..()
if(usr == src)
- switch(alert(H, "[src] wants you to pick them up. Do it?",,"Yes","No"))
+ switch(alert(H, "[src] wants you to pick [p_them()] up. Do it?",,"Yes","No"))
if("Yes")
if(Adjacent(H))
get_scooped(H)
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 32bef5d7494..bf9e4eeab0d 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -71,7 +71,7 @@
if(answer == "Yes")
var/turf/T = get_turf_or_move(P.loc)
for(var/mob/v in viewers(T))
- v.show_message("[M] presses \his thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
+ v.show_message("[M] presses [M.p_their()] thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
var/datum/dna/dna = M.dna
to_chat(P, "
[M]'s UE string : [dna.unique_enzymes]
")
if(dna.unique_enzymes == P.master_dna)
@@ -79,7 +79,7 @@
else
to_chat(P, "DNA does not match stored Master DNA.")
else
- to_chat(P, "[M] does not seem like \he is going to provide a DNA sample willingly.")
+ to_chat(P, "[M] does not seem like [M.p_they()] [M.p_are()] going to provide a DNA sample willingly.")
return 1
/datum/pai_software/radio_config
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index bd06f7045ae..aaaeb15b283 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -142,7 +142,7 @@
to_chat(usr, "The reboot system is currently offline. Please wait another [cooldown_time] seconds.")
return
- user.visible_message("\the [user] swipes \his ID card through \the [src], attempting to reboot it.", "You swipe your ID card through \the [src], attempting to reboot it.")
+ user.visible_message("\the [user] swipes [user.p_their()] ID card through [src], attempting to reboot it.", "You swipe your ID card through [src], attempting to reboot it.")
last_reboot = world.time / 10
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
@@ -153,7 +153,7 @@
return
else
- user.visible_message("\the [user] swipes \his ID card through \the [src], attempting to shut it down.", "You swipe your ID card through \the [src], attempting to shut it down.")
+ user.visible_message("\the [user] swipes [user.p_their()] ID card through [src], attempting to shut it down.", "You swipe your ID card through \the [src], attempting to shut it down.")
if(emagged)
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 444c4c23949..5fb42f5f121 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -794,7 +794,7 @@ var/list/robot_verbs_default = list(
laws = new /datum/ai_laws/syndicate_override
var/time = time2text(world.realtime,"hh:mm:ss")
lawchanges.Add("[time] : [M.name]([M.key]) emagged [name]([key])")
- set_zeroth_law("Only [M.real_name] and people he designates as being such are Syndicate Agents.")
+ set_zeroth_law("Only [M.real_name] and people [M.p_they()] designate[M.p_s()] as being such are Syndicate Agents.")
to_chat(src, "ALERT: Foreign software detected.")
sleep(5)
to_chat(src, "Initiating diagnostics...")
@@ -810,7 +810,7 @@ var/list/robot_verbs_default = list(
to_chat(src, "ERRORERRORERROR")
to_chat(src, "Obey these laws:")
laws.show_laws(src)
- to_chat(src, "ALERT: [M.real_name] is your new master. Obey your new laws and his commands.")
+ to_chat(src, "ALERT: [M.real_name] is your new master. Obey your new laws and [M.p_their()] commands.")
SetLockdown(0)
if(src.module && istype(src.module, /obj/item/robot_module/miner))
for(var/obj/item/pickaxe/drill/cyborg/D in src.module.modules)
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 0de811224dc..0a3ed47b933 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -74,8 +74,8 @@
if(!message)
return
- var/obj/machinery/hologram/holopad/T = src.holo
- if(T && T.hologram && T.master == src)//If there is a hologram and its master is the user.
+ var/obj/machinery/hologram/holopad/T = current
+ if(istype(T) && T.masters[src])
//Human-like, sorta, heard by those who understand humans.
var/rendered_a
@@ -112,8 +112,8 @@
if(!message)
return
- var/obj/machinery/hologram/holopad/T = src.holo
- if(T && T.hologram && T.master == src)
+ var/obj/machinery/hologram/holopad/T = current
+ if(istype(T) && T.masters[src])
var/rendered = "[name][message]"
to_chat(src, "Holopad action relayed, [real_name][message]")
@@ -127,8 +127,8 @@
return 1
/mob/living/silicon/ai/emote(var/act, var/type, var/message)
- var/obj/machinery/hologram/holopad/T = src.holo
- if(T && T.hologram && T.master == src) //Is the AI using a holopad?
+ var/obj/machinery/hologram/holopad/T = current
+ if(istype(T) && T.masters[src])//Is the AI using a holopad?
src.holopad_emote(message)
else //Emote normally, then.
..()
diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm
index 070ed327163..a903b6999dc 100644
--- a/code/modules/mob/living/silicon/silicon_defense.dm
+++ b/code/modules/mob/living/silicon/silicon_defense.dm
@@ -41,6 +41,15 @@
if(L.a_intent == INTENT_HELP)
visible_message("[L.name] rubs its head against [src].")
+/mob/living/silicon/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ ..(user, TRUE)
+ adjustBruteLoss(rand(10, 15))
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[user] has punched [src]!", "[user] has punched [src]!")
+ return TRUE
+ return FALSE
+
/mob/living/silicon/attack_hand(mob/living/carbon/human/M)
switch(M.a_intent)
if(INTENT_HELP)
@@ -51,15 +60,6 @@
else
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
playsound(loc, 'sound/effects/bang.ogg', 10, 1)
- if(HULK in M.mutations)
- var/damage = rand(10,15)
- adjustBruteLoss(damage)
- add_attack_logs(M, src, "Melee attacked with fists")
- playsound(loc, "punch", 25, 1, -1)
- visible_message("[M] has punched [src]!", \
- "[M] has punched [src]!")
- return 1
- else
- visible_message("[M] punches [src], but doesn't leave a dent.", \
+ visible_message("[M] punches [src], but doesn't leave a dent.", \
"[M] punches [src], but doesn't leave a dent.!")
- return 0
+ return FALSE
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index 972759812b4..309a13468a3 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -19,6 +19,14 @@
updatehealth()
return 1
+/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ if(user.a_intent == INTENT_HARM)
+ ..(user, TRUE)
+ playsound(loc, "punch", 25, 1, -1)
+ visible_message("[user] has punched [src]!", "[user] has punched [src]!")
+ adjustBruteLoss(15)
+ return TRUE
+
/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M)
if(..()) //if harm or disarm intent.
var/damage = rand(15, 30)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 986795ccd1e..5e79c315f42 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -276,7 +276,7 @@
return
apply_damage(M.melee_damage_upper, BRUTE)
visible_message("[M] has [M.attacktext] [src]!")
- add_attack_logs(M, src, "Animal attacked", FALSE)
+ add_attack_logs(M, src, "Animal attacked", ATKLOG_ALL)
if(prob(10))
new /obj/effect/decal/cleanable/blood/oil(loc)
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 9e96a16fb0f..90c44f19286 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -282,73 +282,66 @@
log_game("[key_name(user)] has renamed a robot to [t]")
//Medbot Assembly
-/obj/item/firstaid_arm_assembly
- name = "incomplete medibot assembly."
- desc = "A first aid kit with a robot arm permanently grafted to it."
- icon = 'icons/obj/aibots.dmi'
- icon_state = "firstaid_arm"
- var/build_step = 0
- var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
- var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
- w_class = WEIGHT_CLASS_NORMAL
- var/treatment_brute = "salglu_solution"
- var/treatment_oxy = "salbutamol"
- var/treatment_fire = "salglu_solution"
- var/treatment_tox = "charcoal"
- var/treatment_virus = "spaceacillin"
- req_one_access = list(access_medical, access_robotics)
-
- /obj/item/firstaid_arm_assembly/New()
- ..()
- spawn(5)
- if(skin)
- overlays += image('icons/obj/aibots.dmi', "kit_skin_[skin]")
-
-/obj/item/storage/firstaid/attackby(obj/item/robot_parts/S, mob/user, params)
-
- if((!istype(S, /obj/item/robot_parts/l_arm)) && (!istype(S, /obj/item/robot_parts/r_arm)))
- ..()
- return
+/obj/item/storage/firstaid/attackby(obj/item/I, mob/user, params)
+ if(!istype(I, /obj/item/robot_parts/l_arm) && !istype(I, /obj/item/robot_parts/r_arm))
+ return ..()
//Making a medibot!
- if(contents.len >= 1)
+ if(contents.len)
to_chat(user, "You need to empty [src] out first!")
return
- var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly
- if(istype(src,/obj/item/storage/firstaid/fire))
- A.skin = "ointment"
- else if(istype(src,/obj/item/storage/firstaid/toxin))
- A.skin = "tox"
- else if(istype(src,/obj/item/storage/firstaid/o2))
- A.skin = "o2"
- else if(istype(src,/obj/item/storage/firstaid/brute))
- A.skin = "brute"
- else if(istype(src,/obj/item/storage/firstaid/adv))
- A.skin = "adv"
- else if(istype(src,/obj/item/storage/firstaid/tactical))
- A.skin = "bezerk"
- else if(istype(src,/obj/item/storage/firstaid/aquatic_kit))
- A.skin = "fish"
+ var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly(loc, med_bot_skin)
A.req_one_access = req_one_access
+ A.syndicate_aligned = syndicate_aligned
A.treatment_oxy = treatment_oxy
A.treatment_brute = treatment_brute
A.treatment_fire = treatment_fire
A.treatment_tox = treatment_tox
A.treatment_virus = treatment_virus
- qdel(S)
+ qdel(I)
user.put_in_hands(A)
to_chat(user, "You add the robot arm to the first aid kit.")
user.unEquip(src, 1)
qdel(src)
+/obj/item/firstaid_arm_assembly
+ name = "incomplete medibot assembly."
+ desc = "A first aid kit with a robot arm permanently grafted to it."
+ icon = 'icons/obj/aibots.dmi'
+ icon_state = "firstaid_arm"
+ w_class = WEIGHT_CLASS_NORMAL
+ req_one_access = list(access_medical, access_robotics)
+ var/build_step = 0
+ var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
+ var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
+ var/syndicate_aligned = FALSE
+ var/treatment_brute = "salglu_solution"
+ var/treatment_oxy = "salbutamol"
+ var/treatment_fire = "salglu_solution"
+ var/treatment_tox = "charcoal"
+ var/treatment_virus = "spaceacillin"
-/obj/item/firstaid_arm_assembly/attackby(obj/item/W, mob/user, params)
+/obj/item/firstaid_arm_assembly/New(loc, new_skin)
..()
- if(istype(W, /obj/item/pen))
- var/t = stripped_input(user, "Enter new robot name", name, created_name,MAX_NAME_LEN)
+ if(new_skin)
+ skin = new_skin
+ update_icon()
+
+/obj/item/firstaid_arm_assembly/update_icon()
+ overlays.Cut()
+ if(skin)
+ overlays += image('icons/obj/aibots.dmi', "kit_skin_[skin]")
+ if(build_step > 0)
+ overlays += image('icons/obj/aibots.dmi', "na_scanner")
+
+
+/obj/item/firstaid_arm_assembly/attackby(obj/item/I, mob/user, params)
+ ..()
+ if(istype(I, /obj/item/pen))
+ var/t = stripped_input(user, "Enter new robot name", name, created_name, MAX_NAME_LEN)
if(!t)
return
if(!in_range(src, user) && loc != user)
@@ -358,32 +351,34 @@
else
switch(build_step)
if(0)
- if(istype(W, /obj/item/healthanalyzer))
- if(!user.unEquip(W))
+ if(istype(I, /obj/item/healthanalyzer))
+ if(!user.drop_item())
return
- qdel(W)
+ qdel(I)
build_step++
to_chat(user, "You add the health sensor to [src].")
name = "First aid/robot arm/health analyzer assembly"
- overlays += image('icons/obj/aibots.dmi', "na_scanner")
+ update_icon()
if(1)
- if(isprox(W))
- if(!user.unEquip(W))
+ if(isprox(I))
+ if(!user.drop_item())
return
- qdel(W)
+ qdel(I)
build_step++
to_chat(user, "You complete the Medibot. Beep boop!")
var/turf/T = get_turf(src)
- var/mob/living/simple_animal/bot/medbot/S = new /mob/living/simple_animal/bot/medbot(T)
- S.skin = skin
- S.name = created_name
- S.bot_core.req_one_access = req_one_access
- S.treatment_oxy = treatment_oxy
- S.treatment_brute = treatment_brute
- S.treatment_fire = treatment_fire
- S.treatment_tox = treatment_tox
- S.treatment_virus = treatment_virus
+ if(!syndicate_aligned)
+ var/mob/living/simple_animal/bot/medbot/S = new /mob/living/simple_animal/bot/medbot(T, skin)
+ S.name = created_name
+ S.bot_core.req_one_access = req_one_access
+ S.treatment_oxy = treatment_oxy
+ S.treatment_brute = treatment_brute
+ S.treatment_fire = treatment_fire
+ S.treatment_tox = treatment_tox
+ S.treatment_virus = treatment_virus
+ else
+ new /mob/living/simple_animal/bot/medbot/syndicate(T) //Syndicate medibots are a special case that have so many unique vars on them, it's not worth passing them through construction phases
user.unEquip(src, 1)
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 576ad200d5c..9d7fa39ed87 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -17,7 +17,7 @@
bot_filter = RADIO_SECBOT
model = "ED-209"
bot_purpose = "seek out criminals, handcuff them, and report their location to security"
- bot_core = /obj/machinery/bot_core/secbot
+ bot_core_type = /obj/machinery/bot_core/secbot
window_id = "autoed209"
window_name = "Automatic Security Unit v2.6"
path_image_color = "#FF0000"
@@ -61,12 +61,14 @@
shot_delay = 6//Longer shot delay because JESUS CHRIST
check_records = 0//Don't actively target people set to arrest
arrest_type = 1//Don't even try to cuff
- bot_core.req_access = list(access_maint_tunnels, access_theatre)
- arrest_type = 1
- if((lasercolor == "b") && (name == "\improper ED-209 Security Robot"))//Picks a name if there isn't already a custome one
- name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
- if((lasercolor == "r") && (name == "\improper ED-209 Security Robot"))
- name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
+ declare_arrests = 0 // Don't spam sec
+ bot_core.req_access = list(access_maint_tunnels, access_theatre, access_robotics)
+
+ if(created_name == initial(name) || !created_name)
+ if(lasercolor == "b")
+ name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
+ else if (lasercolor == "r")
+ name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
//SECHUD
var/datum/atom_hud/secsensor = huds[DATA_HUD_SECURITY_ADVANCED]
@@ -94,37 +96,37 @@
/mob/living/simple_animal/bot/ed209/set_custom_texts()
text_hack = "You disable [name]'s combat inhibitor."
text_dehack = "You restore [name]'s combat inhibitor."
- text_dehack_fail = "[name] ignores your attempts to restrict him!"
+ text_dehack_fail = "[name] ignores your attempts to restrict [p_them()]!"
/mob/living/simple_animal/bot/ed209/get_controls(mob/user)
var/dat
dat += hack(user)
dat += showpai(user)
dat += text({"
-Security Unit v2.6 controls
-Status: []
-Behaviour controls are [locked ? "locked" : "unlocked"]
-Maintenance panel panel is [open ? "opened" : "closed"] "},
+ Security Unit v2.6 controls
+ Status: []
+ Behaviour controls are [locked ? "locked" : "unlocked"]
+ Maintenance panel panel is [open ? "opened" : "closed"] "},
-"[on ? "On" : "Off"]" )
+ "[on ? "On" : "Off"]" )
if(!locked || issilicon(user) || user.can_admin_interact())
+ dat += "Auto Patrol [auto_patrol ? "On" : "Off"] "
+
if(!lasercolor)
dat += text({"
-Arrest Unidentifiable Persons: []
-Arrest for Unauthorized Weapons: []
-Arrest for Warrant: []
-
-Operating Mode: []
-Report Arrests[]
-Auto Patrol[]"},
+ Arrest Unidentifiable Persons: []
+ Arrest for Unauthorized Weapons: []
+ Arrest for Warrant: []
+
+ Operating Mode: []
+ Report Arrests[] "},
-"[idcheck ? "Yes" : "No"]",
-"[weaponscheck ? "Yes" : "No"]",
-"[check_records ? "Yes" : "No"]",
-"[arrest_type ? "Detain" : "Arrest"]",
-"[declare_arrests ? "Yes" : "No"]",
-"[auto_patrol ? "On" : "Off"]" )
+ "[idcheck ? "Yes" : "No"]",
+ "[weaponscheck ? "Yes" : "No"]",
+ "[check_records ? "Yes" : "No"]",
+ "[arrest_type ? "Detain" : "Arrest"]",
+ "[declare_arrests ? "Yes" : "No"]")
return dat
@@ -239,13 +241,18 @@ Auto Patrol[]"},
if(target) // make sure target exists
if(Adjacent(target) && isturf(target.loc)) // if right next to perp
stun_attack(target)
+ if(!lasercolor)
+ mode = BOT_PREP_ARREST
+ anchored = 1
+ target_lastloc = target.loc
+ return
+ else
+ mode = BOT_HUNT
+ target = null
+ target_lastloc = null
+ return
- mode = BOT_PREP_ARREST
- anchored = 1
- target_lastloc = target.loc
- return
-
- else // not next to perp
+ else if(!disabled) // not next to perp
var/turf/olddist = get_dist(src, target)
walk_to(src, target,1,4)
if((get_dist(src, target)) >= (olddist))
@@ -406,7 +413,7 @@ Auto Patrol[]"},
shoot_sound = 'sound/weapons/laser.ogg'
if(emagged == 2)
if(lasercolor)
- projectile = /obj/item/projectile/beam/lasertag
+ projectile = /obj/item/projectile/beam/disabler
else
projectile = /obj/item/projectile/beam
else
@@ -501,6 +508,7 @@ Auto Patrol[]"},
if(lasertag_check)
icon_state = "[lasercolor]ed2090"
disabled = 1
+ walk_to(src, 0)
target = null
spawn(100)
disabled = 0
@@ -569,4 +577,4 @@ Auto Patrol[]"},
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
C.update_handcuffed()
- back_to_idle()
+ back_to_idle()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index c531a6ed067..b1133cb0e08 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -14,7 +14,7 @@
bot_filter = RADIO_FLOORBOT
model = "Floorbot"
bot_purpose = "seek out damaged or missing floor tiles, and repair or replace them as necessary"
- bot_core = /obj/machinery/bot_core/floorbot
+ bot_core_type = /obj/machinery/bot_core/floorbot
window_id = "autofloor"
window_name = "Automatic Station Floor Repairer v1.1"
path_image_color = "#FFA500"
@@ -58,7 +58,7 @@
/mob/living/simple_animal/bot/floorbot/set_custom_texts()
text_hack = "You corrupt [name]'s construction protocols."
- text_dehack = "You detect errors in [name] and reset his programming."
+ text_dehack = "You detect errors in [name] and reset [p_their()] programming."
text_dehack_fail = "[name] is not responding to reset commands!"
/mob/living/simple_animal/bot/floorbot/get_controls(mob/user)
@@ -98,7 +98,7 @@
T.use(loaded)
amount += loaded
if(loaded > 0)
- to_chat(user, "You load [loaded] tiles into the floorbot. He now contains [amount] tiles.")
+ to_chat(user, "You load [loaded] tiles into the floorbot. [p_they(TRUE)] now contains [amount] tiles.")
nagged = 0
update_icon()
else
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 7c737690ec0..6cdffd48f16 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -44,6 +44,7 @@
var/treatment_virus = "spaceacillin"
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
var/shut_up = 0 //self explanatory :)
+ var/syndicate_aligned = FALSE // Will it only treat operatives?
/mob/living/simple_animal/bot/medbot/tox
skin = "tox"
@@ -68,8 +69,8 @@
desc = "International Medibot of mystery."
skin = "bezerk"
treatment_oxy = "perfluorodecalin"
- treatment_brute = "styptic_powder"
- treatment_fire = "silver_sulfadiazine"
+ treatment_brute = "bicaridine"
+ treatment_fire = "kelotane"
treatment_tox = "charcoal"
/mob/living/simple_animal/bot/medbot/syndicate
@@ -77,9 +78,10 @@
desc = "You'd better have insurance!"
skin = "bezerk"
treatment_oxy = "perfluorodecalin"
- treatment_brute = "styptic_powder"
- treatment_fire = "silver_sulfadiazine"
+ treatment_brute = "bicaridine"
+ treatment_fire = "kelotane"
treatment_tox = "charcoal"
+ syndicate_aligned = TRUE
bot_core_type = /obj/machinery/bot_core/medbot/syndicate
control_freq = BOT_FREQ + 1000 // make it not show up on lists
radio_channel = "Syndicate"
@@ -90,6 +92,9 @@
Radio.syndie = 1
/mob/living/simple_animal/bot/medbot/update_icon()
+ overlays.Cut()
+ if(skin)
+ overlays += "medskin_[skin]"
if(!on)
icon_state = "medibot0"
return
@@ -101,22 +106,21 @@
else
icon_state = "medibot1"
-/mob/living/simple_animal/bot/medbot/New()
+/mob/living/simple_animal/bot/medbot/New(loc, new_skin)
..()
- update_icon()
-
- spawn(4)
- if(skin)
- overlays += image('icons/obj/aibots.dmi', "medskin_[skin]")
-
- var/datum/job/doctor/J = new/datum/job/doctor
- access_card.access += J.get_access()
- prev_access = access_card.access
+ var/datum/job/doctor/J = new /datum/job/doctor
+ access_card.access += J.get_access()
+ prev_access = access_card.access
+ qdel(J)
var/datum/atom_hud/medsensor = huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
permanent_huds |= medsensor
+ if(new_skin)
+ skin = new_skin
+ update_icon()
+
/mob/living/simple_animal/bot/medbot/bot_reset()
..()
patient = null
@@ -271,8 +275,10 @@
if(assess_patient(H))
last_found = world.time
if((last_newpatient_speak + 300) < world.time) //Don't spam these messages!
- var/message = pick("Hey, [H.name]! Hold on, I'm coming.","Wait [H.name]! I want to help!","[H.name], you appear to be injured!")
+ var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/mcoming.ogg', "Wait [H.name]! I want to help!" = 'sound/voice/mhelp.ogg', "[H.name], you appear to be injured!" = 'sound/voice/minjured.ogg')
+ var/message = pick(messagevoice)
speak(message)
+ playsound(loc, messagevoice[message], 50, 0)
last_newpatient_speak = world.time
return H
else
@@ -304,8 +310,10 @@
if(!patient)
if(!shut_up && prob(1))
- var/message = pick("Radar, put a mask on!","There's always a catch, and it's the best there is.","I knew it, I should've been a plastic surgeon.","What kind of medbay is this? Everyone's dropping like dead flies.","Delicious!")
+ var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/mradar.ogg', "There's always a catch, and I'm the best there is." = 'sound/voice/mcatch.ogg', "I knew it, I should've been a plastic surgeon." = 'sound/voice/msurgeon.ogg', "What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/mflies.ogg', "Delicious!" = 'sound/voice/mdelicious.ogg')
+ var/message = pick(messagevoice)
speak(message)
+ playsound(loc, messagevoice[message], 50, 0)
var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients.
patient = scan(/mob/living/carbon/human, oldpatient, scan_range)
oldpatient = patient
@@ -371,7 +379,7 @@
if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins)
return 1
- if((skin == "bezerk") && (!("syndicate" in C.faction)))
+ if(syndicate_aligned && (!("syndicate" in C.faction)))
return 0
if(declare_crit && C.health <= 0) //Critical condition! Call for help!
@@ -440,9 +448,11 @@
soft_reset()
return
- if(C.stat == 2)
- var/death_message = pick("No! NO!","Live, damnit! LIVE!","I...I've never lost a patient before. Not today, I mean.")
- speak(death_message)
+ if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
+ var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg', "Live, damnit! LIVE!" = 'sound/voice/mlive.ogg', "I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg')
+ var/message = pick(messagevoice)
+ speak(message)
+ playsound(loc, messagevoice[message], 50, 0)
oldpatient = patient
soft_reset()
return
@@ -492,8 +502,10 @@
break
if(!reagent_id) //If they don't need any of that they're probably cured!
- var/message = pick("All patched up!","An apple a day keeps me away.","Feel better soon!")
+ var/list/messagevoice = list("All patched up!" = 'sound/voice/mpatchedup.ogg', "An apple a day keeps me away." = 'sound/voice/mapple.ogg', "Feel better soon!" = 'sound/voice/mfeelbetter.ogg')
+ var/message = pick(messagevoice)
speak(message)
+ playsound(loc, messagevoice[message], 50, 0)
bot_reset()
return
else
@@ -554,7 +566,8 @@
if("adv")
new /obj/item/storage/firstaid/adv/empty(Tsec)
if("bezerk")
- new /obj/item/storage/firstaid/tactical/empty(Tsec)
+ var/obj/item/storage/firstaid/tactical/empty/T = new(Tsec)
+ T.syndicate_aligned = syndicate_aligned //This is a special case since Syndicate medibots and the mysterious medibot look the same; we also dont' want crew building Syndicate medibots if the mysterious medibot blows up.
if("fish")
new /obj/item/storage/firstaid/aquatic_kit(Tsec)
else
@@ -571,6 +584,9 @@
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
+ if(emagged && prob(25))
+ playsound(loc, 'sound/voice/minsult.ogg', 50, 0)
+
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -579,7 +595,7 @@
/mob/living/simple_animal/bot/medbot/proc/declare(crit_patient)
if(declare_cooldown)
return
- if((skin == "bezerk"))
+ if(syndicate_aligned)
return
var/area/location = get_area(src)
speak("Medical emergency! [crit_patient ? "[crit_patient]" : "A patient"] is in critical condition at [location]!", radio_channel)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 613f91e024c..2514af0eebd 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -75,10 +75,10 @@
//helmet and armor = 100% protection
if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) )
if( O.force )
- to_chat(user, "[src] is wearing too much armor! You can't cause \him any damage.")
+ to_chat(user, "[src] is wearing too much armor! You can't cause [p_them()] any damage.")
visible_message(" [user] hits [src] with [O], however [src] is too armored.")
else
- to_chat(user, "[src] is wearing too much armor! You can't reach \his skin.")
+ to_chat(user, "[src] is wearing too much armor! You can't reach [p_their()] skin.")
visible_message("[user] gently taps [src] with [O].")
if(health>0 && prob(15))
custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.")
@@ -180,7 +180,7 @@
)
if( ! ( item_to_add.type in allowed_types ) )
- to_chat(usr, "You set [item_to_add] on [src]'s back, but \he shakes it off!")
+ to_chat(usr, "You set [item_to_add] on [src]'s back, but [p_they()] shake[p_s()] it off!")
if(!usr.drop_item())
to_chat(usr, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s back!")
return
@@ -379,10 +379,10 @@
to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
return 0
if(health <= 0)
- to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on \him.")
+ to_chat(user, "There is merely a dull, lifeless look in [real_name]'s eyes as you put the [item_to_add] on [p_them()].")
else if(user)
user.visible_message("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once.",
- "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags \his tail once and barks.",
+ "You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks.",
"You hear a friendly-sounding bark.")
item_to_add.loc = src
src.inventory_head = item_to_add
@@ -392,7 +392,7 @@
if(user && !user.drop_item())
to_chat(user, "\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!")
return 0
- to_chat(user, "You set [item_to_add] on [src]'s head, but \he shakes it off!")
+ to_chat(user, "You set [item_to_add] on [src]'s head, but [p_they()] shake[p_s()] it off!")
item_to_add.loc = loc
if(prob(25))
step_rand(item_to_add)
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 70a64d2dbcb..b98d4181475 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -35,7 +35,7 @@
var/emagged = 0 //is it getting ready to explode?
var/obj/item/mmi/mmi = null
- var/emagged_master = null //for administrative purposes, to see who emagged the spiderbot; also for a holder for if someone emags an empty frame first then inserts an MMI.
+ var/mob/emagged_master = null //for administrative purposes, to see who emagged the spiderbot; also for a holder for if someone emags an empty frame first then inserts an MMI.
/mob/living/simple_animal/spiderbot/Destroy()
if(emagged)
@@ -135,8 +135,8 @@
else
emagged = 1
to_chat(user, "You short out the security protocols and rewrite [src]'s internal memory.")
- to_chat(src, "You have been emagged; you are now completely loyal to [user] and their every order!")
- emagged_master = user.name
+ to_chat(src, "You have been emagged; you are now completely loyal to [user] and [user.p_their()] every order!")
+ emagged_master = user
add_attack_logs(user, src, "Emagged")
maxHealth = 60
health = 60
@@ -150,7 +150,7 @@
ckey = M.brainmob.ckey
name = "Spider-bot ([M.brainmob.name])"
if(emagged)
- to_chat(src, "You have been emagged; you are now completely loyal to [emagged_master] and their every order!")
+ to_chat(src, "You have been emagged; you are now completely loyal to [emagged_master] and [emagged_master.p_their()] every order!")
/mob/living/simple_animal/spiderbot/proc/update_icon()
if(mmi)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 5c25e9820e1..6027070dfc9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -229,7 +229,7 @@ Difficulty: Medium
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
for(var/mob/living/L in orange(1, src))
if(L.stat)
- visible_message("[src] slams down on [L], crushing them!")
+ visible_message("[src] slams down on [L], crushing [L.p_them()]!")
L.gib()
else
L.adjustBruteLoss(75)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
index 982a0eaae90..377b8ff335a 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/black.dm
@@ -36,7 +36,7 @@
L.reagents.add_reagent("terror_black_toxin", 30) // inject our special poison
visible_message("[src] buries its long fangs deep into the [inject_target] of [target]!")
else
- visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!")
+ visible_message("[src] bites [target], but cannot inject venom into [target.p_their()] [inject_target]!")
L.attack_animal(src)
if(!ckey && (!(target in enemies) || L.reagents.has_reagent("terror_black_toxin", 60)))
step_away(src, L)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
index 06b28c6400e..43c0e7b0be5 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/gray.dm
@@ -33,7 +33,7 @@
if(W)
melee_damage_lower = initial(melee_damage_lower) * 2
melee_damage_upper = initial(melee_damage_upper) * 2
- visible_message("[src] savagely mauls [target] while they are stuck in the web!")
+ visible_message("[src] savagely mauls [target] while [L.p_theyre()] stuck in the web!")
else
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
index 9d6f977a1ae..64ef285ded8 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/green.dm
@@ -93,5 +93,5 @@
// instead of having a venom that only lasts seconds, we just add the eyeblur directly.
visible_message("[src] buries its fangs deep into the [inject_target] of [target]!")
else
- visible_message("[src] bites [target], but cannot inject venom into their [inject_target]!")
+ visible_message("[src] bites [target], but cannot inject venom into [target.p_their()] [inject_target]!")
L.attack_animal(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
index 21b1276425c..66e88af1e1b 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/prince.dm
@@ -43,7 +43,7 @@
/mob/living/simple_animal/hostile/poison/terror_spider/prince/spider_specialattack(mob/living/carbon/human/L)
if(prob(15))
- visible_message("[src] rams into [L], knocking them to the floor!")
+ visible_message("[src] rams into [L], knocking [L.p_them()] to the floor!")
L.Weaken(5)
L.Stun(5)
else
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
index 9133b8cc14c..532c2b7357a 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm
@@ -39,7 +39,7 @@
var/lastnestsetup = 0
var/neststep = 0
var/hasnested = 0
- var/spider_max_per_nest = 25 // above this, AI queens become stable
+ var/spider_max_per_nest = 35 // above this, AI queens become stable
var/canlay = 4 // main counter for egg-laying ability! # = num uses, incremented at intervals
var/eggslaid = 0
var/spider_can_fakelings = 3 // spawns defective spiderlings that don't grow up, used to freak out crew, atmosphere
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index ef456ddcb0e..235a161c595 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -201,11 +201,6 @@ var/global/list/ts_spiderling_list = list()
spider_specialattack(G,can_poison)
else
G.attack_animal(src)
- else if(istype(target, /obj/structure/alien/resin))
- var/obj/structure/alien/resin/E = target
- do_attack_animation(E)
- E.health -= rand(melee_damage_lower, melee_damage_upper)
- E.healthcheck()
else
target.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/pony.dm b/code/modules/mob/living/simple_animal/pony.dm
index 437c9b0ac4d..960f8fc0998 100644
--- a/code/modules/mob/living/simple_animal/pony.dm
+++ b/code/modules/mob/living/simple_animal/pony.dm
@@ -27,7 +27,7 @@
..()
if(stat == 2)
new /obj/item/reagent_containers/food/snacks/ectoplasm(src.loc)
- src.visible_message("\The [src] lets out a contented sigh as their form unwinds.")
+ src.visible_message("[src] lets out a contented sigh as [p_their()] form unwinds.")
src.ghostize()
qdel(src)
return
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 63b248ffd41..fb62ad3a629 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -4,6 +4,7 @@
lastKnownIP = client.address
computer_id = client.computer_id
log_access_in(client)
+ create_attack_log("Logged in at [atom_loc_line(get_turf(src))]")
if(config.log_access)
for(var/mob/M in player_list)
if(M == src) continue
diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm
index a0f8594e870..cbcd51c44a7 100644
--- a/code/modules/mob/logout.dm
+++ b/code/modules/mob/logout.dm
@@ -3,6 +3,7 @@
unset_machine()
player_list -= src
log_access_out(src)
+ create_attack_log("Logged out at [atom_loc_line(get_turf(src))]")
// `holder` is nil'd out by now, so we check the `admin_datums` array directly
//Only report this stuff if we are currently playing.
if(admin_datums[ckey] && ticker && ticker.current_state == GAME_STATE_PLAYING)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index db84df47f52..beba84eaa3f 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -543,11 +543,11 @@ var/list/slot_equipment_priority = list( \
client.screen = list()
hud_used.show_hud(hud_used.hud_version)
-/mob/setDir(new_dir)
+/mob/setDir(new_dir)
if(forced_look)
if(isnum(forced_look))
dir = forced_look
- else
+ else
var/atom/A = locateUID(forced_look)
if(istype(A))
dir = get_cardinal_dir(src, A)
@@ -592,7 +592,7 @@ var/list/slot_equipment_priority = list( \
return
if(!src || !isturf(src.loc))
return 0
- if(istype(A, /obj/effect/decal/point))
+ if(istype(A, /obj/effect/temp_visual/point))
return 0
var/tile = get_turf(A)
@@ -600,12 +600,8 @@ var/list/slot_equipment_priority = list( \
return 0
changeNext_move(CLICK_CD_POINT)
- var/obj/P = new /obj/effect/decal/point(tile)
+ var/obj/P = new /obj/effect/temp_visual/point(tile)
P.invisibility = invisibility
- spawn (20)
- if(P)
- qdel(P)
-
return 1
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
@@ -1179,7 +1175,7 @@ var/list/slot_equipment_priority = list( \
new /obj/effect/decal/cleanable/vomit/green(location)
else
if(!no_text)
- visible_message("[src] pukes all over \himself!","You puke all over yourself!")
+ visible_message("[src] pukes all over [p_them()]self!","You puke all over yourself!")
location.add_vomit_floor(src, 1)
playsound(location, 'sound/effects/splat.ogg', 50, 1)
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 1c4b0f38fbe..458138b9db0 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -263,17 +263,17 @@
state = GRAB_AGGRESSIVE
icon_state = "grabbed1"
hud.icon_state = "reinforce1"
- add_attack_logs(assailant, affecting, "Aggressively grabbed", admin_notify = FALSE)
+ add_attack_logs(assailant, affecting, "Aggressively grabbed", ATKLOG_ALL)
else if(state < GRAB_NECK)
if(isslime(affecting))
to_chat(assailant, "You squeeze [affecting], but nothing interesting happens.")
return
- assailant.visible_message("[assailant] has reinforced \his grip on [affecting] (now neck)!")
+ assailant.visible_message("[assailant] has reinforced [assailant.p_their()] grip on [affecting] (now neck)!")
state = GRAB_NECK
icon_state = "grabbed+1"
assailant.setDir(get_dir(assailant, affecting))
- add_attack_logs(assailant, affecting, "Neck grabbed", admin_notify = FALSE)
+ add_attack_logs(assailant, affecting, "Neck grabbed", ATKLOG_ALL)
if(!iscarbon(assailant))
affecting.LAssailant = null
else
@@ -282,11 +282,11 @@
hud.name = "kill"
affecting.Stun(10) //10 ticks of ensured grab
else if(state < GRAB_UPGRADING)
- assailant.visible_message("[assailant] starts to tighten \his grip on [affecting]'s neck!")
+ assailant.visible_message("[assailant] starts to tighten [assailant.p_their()] grip on [affecting]'s neck!")
hud.icon_state = "kill1"
state = GRAB_KILL
- assailant.visible_message("[assailant] has tightened \his grip on [affecting]'s neck!")
+ assailant.visible_message("[assailant] has tightened [assailant.p_their()] grip on [affecting]'s neck!")
add_attack_logs(assailant, affecting, "Strangled")
assailant.next_move = world.time + 10
@@ -332,7 +332,7 @@
if(last_hit_zone == "head") //This checks the hitzone the user has selected. In this specific case, they have the head selected.
if(affecting.lying)
return
- assailant.visible_message("[assailant] thrusts \his head into [affecting]'s skull!") //A visible message for what is going on.
+ assailant.visible_message("[assailant] thrusts [assailant.p_their()] head into [affecting]'s skull!") //A visible message for what is going on.
var/damage = 5
var/obj/item/clothing/hat = attacker.head
if(istype(hat))
@@ -354,7 +354,7 @@
if(!affected.internal_bodyparts_by_name["eyes"])
to_chat(assailant, "You cannot locate any eyes on [affecting]!")
return
- assailant.visible_message("[assailant] presses \his fingers into [affecting]'s eyes!")
+ assailant.visible_message("[assailant] presses [assailant.p_their()] fingers into [affecting]'s eyes!")
to_chat(affecting, "You feel immense pain as digits are being pressed into your eyes!")
add_attack_logs(assailant, affecting, "Eye-fucked with their fingers")
var/obj/item/organ/internal/eyes/eyes = affected.get_int_organ(/obj/item/organ/internal/eyes)
diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm
index bbecb8e6458..99047b0382c 100644
--- a/code/modules/mob/new_player/login.dm
+++ b/code/modules/mob/new_player/login.dm
@@ -30,11 +30,11 @@
callHook("mob_login", list("client" = client, "mob" = src))
new_player_panel()
-
+
spawn(30)
// Annoy the player with polls.
establish_db_connection()
- if(dbcon.IsConnected() && client.can_vote())
+ if(dbcon.IsConnected() && client && client.can_vote())
var/isadmin = 0
if(client && client.holder)
isadmin = 1
@@ -46,7 +46,7 @@
break
if(newpoll)
client.handle_player_polling()
-
+
if(ckey in deadmins)
verbs += /client/proc/readmin
spawn(40)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index fdd9266c128..274c1602e04 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -4,6 +4,7 @@
var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
var/totalPlayers = 0 //Player counts for the Lobby tab
var/totalPlayersReady = 0
+ var/tos_consent = FALSE
universal_speak = 1
invisibility = 101
@@ -19,7 +20,40 @@
/mob/new_player/verb/new_player_panel()
set src = usr
- new_player_panel_proc()
+
+ if(handle_tos_consent())
+ new_player_panel_proc()
+
+/mob/new_player/proc/handle_tos_consent()
+ if(!GLOB.join_tos)
+ tos_consent = TRUE
+ return TRUE
+
+ establish_db_connection()
+ if(!dbcon.IsConnected())
+ tos_consent = TRUE
+ return TRUE
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("privacy")] WHERE ckey='[src.ckey]' AND consent=1")
+ query.Execute()
+ while(query.NextRow())
+ tos_consent = TRUE
+ return TRUE
+
+ privacy_consent()
+ return FALSE
+
+/mob/new_player/proc/privacy_consent()
+ src << browse(null, "window=playersetup")
+ var/output = GLOB.join_tos
+ output += "
"
+
if(!IsGuestKey(src.key))
establish_db_connection()
@@ -109,11 +146,28 @@
/mob/new_player/Topic(href, href_list[])
if(!client) return 0
+ if(href_list["consent_signed"])
+ var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
+ var/DBQuery/query = dbcon.NewQuery("REPLACE INTO [format_table_name("privacy")] (ckey, datetime, consent) VALUES ('[ckey]', '[sqltime]', 1)")
+ query.Execute()
+ src << browse(null, "window=privacy_consent")
+ tos_consent = 1
+ new_player_panel_proc()
+ if(href_list["consent_rejected"])
+ tos_consent = 0
+ to_chat(usr, "You must consent to the terms of service before you can join!")
+ var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
+ var/DBQuery/query = dbcon.NewQuery("REPLACE INTO [format_table_name("privacy")] (ckey, datetime, consent) VALUES ('[ckey]', '[sqltime]', 0)")
+ query.Execute()
+
if(href_list["show_preferences"])
client.prefs.ShowChoices(src)
return 1
if(href_list["ready"])
+ if(!tos_consent)
+ to_chat(usr, "You must consent to the terms of service before you can join!")
+ return 0
ready = !ready
new_player_panel_proc()
@@ -126,6 +180,9 @@
new_player_panel_proc()
if(href_list["observe"])
+ if(!tos_consent)
+ to_chat(usr, "You must consent to the terms of service before you can join!")
+ return 0
if(alert(src,"Are you sure you wish to observe? You cannot normally join the round after doing this!","Player Setup","Yes","No") == "Yes")
if(!client) return 1
@@ -155,8 +212,14 @@
respawnable_list += observer
qdel(src)
return 1
+ if(href_list["tos"])
+ privacy_consent()
+ return 0
if(href_list["late_join"])
+ if(!tos_consent)
+ to_chat(usr, "You must consent to the terms of service before you can join!")
+ return 0
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
to_chat(usr, "The round is either not ready, or has already finished...")
return
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index ace8ab1b621..1cb1bc5f3b0 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -208,3 +208,7 @@
/mob/proc/AdjustWeakened()
return
+
+/mob/proc/adjust_bodytemperature(amount, min_temp = 0, max_temp = INFINITY)
+ if(bodytemperature > min_temp && bodytemperature < max_temp)
+ bodytemperature = Clamp(bodytemperature + amount, min_temp, max_temp)
\ No newline at end of file
diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm
index 6ebf9228848..b570687569a 100644
--- a/code/modules/modular_computers/file_system/programs/command/card.dm
+++ b/code/modules/modular_computers/file_system/programs/command/card.dm
@@ -238,7 +238,7 @@
jobdatum = J
break
if(!jobdatum)
- to_chat(usr, "\red No log exists for this job: [t1]")
+ to_chat(usr, "No log exists for this job: [t1]")
return
access = jobdatum.get_access()
diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm
index b6562d8377d..c97a3e505c3 100644
--- a/code/modules/ninja/martial_art.dm
+++ b/code/modules/ninja/martial_art.dm
@@ -20,7 +20,7 @@
/obj/item/creeping_widow_injector/attack_self(mob/living/carbon/human/user as mob)
if(!used)
user.visible_message("You stick the [src]'s needle into your arm and press the button.", \
- "[user] sticks the [src]'s needle \his arm and presses the button.")
+ "[user] sticks the [src]'s needle [user.p_their()] arm and presses the button.")
to_chat(user, "The nanomachines in the [src] flow through your bloodstream.")
var/datum/martial_art/ninja_martial_art/N = new/datum/martial_art/ninja_martial_art(null)
@@ -98,8 +98,8 @@
D.silent += 1
D.adjustOxyLoss(1)
else
- D.visible_message("[A] loses \his grip on [D]'s neck!", \
- "[A] loses \his grip on your neck!")
+ D.visible_message("[A] loses [A.p_their()] grip on [D]'s neck!", \
+ "[A] loses [A.p_their()] grip on your neck!")
has_choke_hold = 0
return 0
I++
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index db3f7cddce7..d37506b3d82 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -379,7 +379,7 @@
if(is_hot(P))
if((CLUMSY in user.mutations) && prob(10))
- user.visible_message("[user] accidentally ignites themselves!", \
+ user.visible_message("[user] accidentally ignites [user.p_them()]self!", \
"You miss the paper and accidentally light yourself on fire!")
user.unEquip(P)
user.adjust_fire_stacks(1)
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 6656eefcdf1..08cb7b6555e 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -79,8 +79,8 @@
if(istype(P, /obj/item/lighter/zippo))
class = ""
- user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \
- "[class]You hold \the [P] up to \the [src], burning it slowly.")
+ user.visible_message("[class][user] holds [P] up to [src], it looks like [user.p_theyre()] trying to burn it!", \
+ "[class]You hold [P] up to [src], burning it slowly.")
spawn(20)
if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit)
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index 1c4c0b357cc..fbbfacb0b8f 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -33,7 +33,7 @@
/obj/item/paperplane/suicide_act(mob/living/user)
user.Stun(10)
- user.visible_message("[user] jams [name] in \his nose. It looks like \he's trying to commit suicide!")
+ user.visible_message("[user] jams [name] in [user.p_their()] nose. It looks like [user.p_theyre()] trying to commit suicide!")
user.EyeBlurry(6)
var/obj/item/organ/internal/eyes/E = user.get_int_organ(/obj/item/organ/internal/eyes)
if(E)
@@ -73,7 +73,7 @@
else if(is_hot(P))
if(user.disabilities & CLUMSY && prob(10))
- user.visible_message("[user] accidentally ignites themselves!", \
+ user.visible_message("[user] accidentally ignites [user.p_them()]self!", \
"You miss [src] and accidentally light yourself on fire!")
user.unEquip(P)
user.adjust_fire_stacks(1)
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index b4446f67e0e..4e3aaefd1eb 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -25,7 +25,7 @@
pressure_resistance = 2
/obj/item/pen/suicide_act(mob/user)
- to_chat(viewers(user), "[user] starts scribbling numbers over \himself with the [src.name]! It looks like \he's trying to commit sudoku.")
+ to_chat(viewers(user), "[user] starts scribbling numbers over [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit sudoku.")
return (BRUTELOSS)
/obj/item/pen/blue
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 0ab4db844e9..40759ab792c 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -56,8 +56,8 @@
if(istype(P, /obj/item/lighter/zippo))
class = ""
- user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like \he's trying to burn it!", \
- "[class]You hold \the [P] up to \the [src], burning it slowly.")
+ user.visible_message("[class][user] holds \the [P] up to \the [src], it looks like [user.p_theyre()] trying to burn it!", \
+ "[class]You hold [P] up to [src], burning it slowly.")
spawn(20)
if(get_dist(src, user) < 2 && user.get_active_hand() == P && P.lit)
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index ad67a53cd5b..5a101629c94 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -14,7 +14,7 @@
attack_verb = list("stamped")
/obj/item/stamp/suicide_act(mob/user)
- user.visible_message("[user] stamps 'VOID' on \his forehead, then promptly falls over, dead.")
+ user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.")
return (OXYLOSS)
/obj/item/stamp/qm
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 7580621834f..25a47f19e04 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -501,9 +501,9 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
/obj/item/stack/cable_coil/suicide_act(mob/user)
if(locate(/obj/structure/stool) in user.loc)
- user.visible_message("[user] is making a noose with the [name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is making a noose with the [name]! It looks like [user.p_theyre()] trying to commit suicide.")
else
- user.visible_message("[user] is strangling \himself with the [name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is strangling [user.p_them()]self with the [name]! It looks like [user.p_theyre()] trying to commit suicide.")
return(OXYLOSS)
/obj/item/stack/cable_coil/New(loc, length = MAXCOIL, var/paramcolor = null)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index ff7ee7b6784..3bc2b5bc39b 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -89,7 +89,7 @@
to_chat(user, "The charge meter reads [round(percent() )]%.")
/obj/item/stock_parts/cell/suicide_act(mob/user)
- to_chat(viewers(user), "[user] is licking the electrodes of the [src]! It looks like \he's trying to commit suicide.")
+ to_chat(viewers(user), "[user] is licking the electrodes of the [src]! It looks like [user.p_theyre()] trying to commit suicide.")
return (FIRELOSS)
/obj/item/stock_parts/cell/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 3eac3486791..df12267015f 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -726,7 +726,7 @@
update()
/obj/item/light/suicide_act(mob/living/carbon/human/user)
- user.visible_message("[user] touches \the [src], burning their hands off!", "You touch \the [src], burning your hands off!")
+ user.visible_message("[user] touches [src], burning [user.p_their()] hands off!", "You touch [src], burning your hands off!")
for(var/oname in list("l_hand", "r_hand"))
var/obj/item/organ/external/limb = user.get_organ(oname)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 70cd75bf85d..a6c86d3f2ef 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -121,7 +121,7 @@
if(radio_controller)
radio_controller.remove_object(src, frequency)
radio_connection = null
- msg_admin_attack("Emitter deleted at ([x],[y],[z] - [ADMIN_JMP(src)])", 0, 1)
+ msg_admin_attack("Emitter deleted at ([x],[y],[z] - [ADMIN_JMP(src)])", ATKLOG_FEW)
log_game("Emitter deleted at ([x],[y],[z])")
investigate_log("deleted at ([x],[y],[z])","singulo")
return ..()
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 9a911400fd5..0520630dcac 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -10,6 +10,7 @@
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
+ gender = FEMALE
/obj/singularity/narsie/large
name = "Nar-Sie"
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index b8570de2c78..42fbb784f49 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -227,7 +227,7 @@
active = !active
investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo")
if(active)
- msg_admin_attack("PA Control Computer turned ON by [key_name_admin(usr)]",0,1)
+ msg_admin_attack("PA Control Computer turned ON by [key_name_admin(usr)]", ATKLOG_FEW)
log_game("PA Control Computer turned ON by [key_name(usr)] in ([x],[y],[z])")
use_log += text("\[[time_stamp()]\] [key_name(usr)] has turned on the PA Control Computer.")
if(active)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index e69abc5b00f..27229a2d8b3 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -224,8 +224,6 @@
/obj/machinery/power/smes/proc/chargedisplay()
return round(5.5*charge/(capacity ? capacity : 5e6))
-#define SMESRATE 0.05
-
/obj/machinery/power/smes/process()
if(stat & BROKEN) return
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index be17b3f65db..43d418aadf7 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -244,7 +244,7 @@
ui_interact(user)
/obj/machinery/power/supermatter_shard/attack_hand(mob/user as mob)
- user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\
+ user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... [user.p_their(TRUE)] body starts to glow and bursts into flames before flashing into ash.",\
"You reach out and touch \the [src]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"",\
"You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")
@@ -309,7 +309,7 @@
/obj/machinery/power/supermatter_shard/Bumped(atom/AM as mob|obj)
if(istype(AM, /mob/living))
- AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... \his body starts to glow and catch flame before flashing into ash.",\
+ AM.visible_message("\The [AM] slams into \the [src] inducing a resonance... [AM.p_their(TRUE)] body starts to glow and catch flame before flashing into ash.",\
"You slam into \the [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\"",\
"You hear an unearthly noise as a wave of heat washes over you.")
else if(isobj(AM) && !istype(AM, /obj/effect))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index b54d5bff21f..51bf515ca1e 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -347,7 +347,7 @@ obj/item/gun/proc/newshot()
return
if(user == target)
- target.visible_message("[user] sticks [src] in their mouth, ready to pull the trigger...", \
+ target.visible_message("[user] sticks [src] in [user.p_their()] mouth, ready to pull the trigger...", \
"You stick [src] in your mouth, ready to pull the trigger...")
else
target.visible_message("[user] points [src] at [target]'s head, ready to pull the trigger...", \
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 5ae089d5522..c279abdc5c1 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -178,7 +178,8 @@
else
M.LAssailant = user
- add_attack_logs(user, M, "Shot with dartgun containing [R]", !!M.ckey)
+ add_attack_logs(user, M, "Shot with dartgun containing [R]")
+
if(D.reagents)
D.reagents.trans_to(M, 15)
to_chat(M, "You feel a slight prick.")
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index fd6c14c4e6b..795b5942845 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -146,10 +146,10 @@
/obj/item/gun/energy/suicide_act(mob/user)
if(can_shoot())
- user.visible_message("[user] is putting the barrel of the [name] in \his mouth. It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is putting the barrel of the [name] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide.")
sleep(25)
if(user.l_hand == src || user.r_hand == src)
- user.visible_message("[user] melts \his face off with the [name]!")
+ user.visible_message("[user] melts [user.p_their()] face off with the [name]!")
playsound(loc, fire_sound, 50, 1, -1)
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
power_supply.use(shot.e_cost)
@@ -159,7 +159,7 @@
user.visible_message("[user] panics and starts choking to death!")
return(OXYLOSS)
else
- user.visible_message("[user] is pretending to blow \his brains out with the [name]! It looks like \he's trying to commit suicide!")
+ user.visible_message("[user] is pretending to blow [user.p_their()] brains out with the [name]! It looks like [user.p_theyre()] trying to commit suicide!")
playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
return (OXYLOSS)
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 7d2568a7199..7559fc1a591 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -128,7 +128,7 @@
/obj/item/gun/energy/kinetic_accelerator/suicide_act(mob/user)
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
- user.visible_message("[user] cocks the [name] and pretends to blow \his brains out! It looks like \he's trying to commit suicide!")
+ user.visible_message("[user] cocks the [name] and pretends to blow [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!")
shoot_live_shot()
return (OXYLOSS)
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index a1840663350..94f397b45bf 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -76,6 +76,6 @@
return
/obj/item/gun/magic/suicide_act(mob/user)
- user.visible_message("[user] is twisting the [name] above \his head, releasing a magical blast! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is twisting the [name] above [user.p_their()] head, releasing a magical blast! It looks like [user.p_theyre()] trying to commit suicide.")
playsound(loc, fire_sound, 50, 1, -1)
return FIRELOSS
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index 1a8e5e45946..cae9d11cbb6 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -48,9 +48,9 @@
update_icon()
/obj/item/gun/magic/wand/proc/zap_self(mob/living/user)
- user.visible_message("[user] zaps \himself with [src].")
+ user.visible_message("[user] zaps [user.p_them()]self with [src].")
playsound(user, fire_sound, 50, 1)
- user.create_attack_log("[key_name(user)] zapped \himself with a [src]")
+ user.create_attack_log("[key_name(user)] zapped [user.p_them()]self with a [src]")
/////////////////////////////////////
//WAND OF DEATH
diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm
index f6881208a32..89cceab6cd3 100644
--- a/code/modules/projectiles/guns/misc/blastcannon.dm
+++ b/code/modules/projectiles/guns/misc/blastcannon.dm
@@ -76,7 +76,7 @@
var/heavy = power * 0.2
var/medium = power * 0.5
var/light = power
- user.visible_message("[user] opens [bomb] on \his [name] and fires a blast wave at [target]!","You open [bomb] on your [name] and fire a blast wave at [target]!")
+ user.visible_message("[user] opens [bomb] on [user.p_their()] [name] and fires a blast wave at [target]!","You open [bomb] on your [name] and fire a blast wave at [target]!")
playsound(user, "explosion", 100, 1)
var/turf/starting = get_turf(user)
var/turf/targturf = get_turf(target)
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 2b8ff6a59f8..0ff5e57e7c5 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -137,17 +137,17 @@
/obj/item/gun/projectile/suicide_act(mob/user)
if(chambered && chambered.BB && !chambered.BB.nodamage)
- user.visible_message("[user] is putting the barrel of the [name] in \his mouth. It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is putting the barrel of the [name] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide.")
sleep(25)
if(user.l_hand == src || user.r_hand == src)
process_fire(user, user, 0, zone_override = "head")
- user.visible_message("[user] blows \his brains out with the [name]!")
+ user.visible_message("[user] blows [user.p_their()] brains out with the [name]!")
return(BRUTELOSS)
else
user.visible_message("[user] panics and starts choking to death!")
return(OXYLOSS)
else
- user.visible_message("[user] is pretending to blow \his brains out with the [name]! It looks like \he's trying to commit suicide!")
+ user.visible_message("[user] is pretending to blow [user.p_their()] brains out with the [name]! It looks like [user.p_theyre()] trying to commit suicide!")
playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
return (OXYLOSS)
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 502c69bed9c..c4c6f76a963 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -244,7 +244,7 @@
if(zone == "head" || zone == "eyes" || zone == "mouth")
shoot_self(user, zone)
else
- user.visible_message("[user.name] cowardly fires [src] at \his [zone]!", "You cowardly fire [src] at your [zone]!", "You hear a gunshot!")
+ user.visible_message("[user.name] cowardly fires [src] at [user.p_their()] [zone]!", "You cowardly fire [src] at your [zone]!", "You hear a gunshot!")
return
user.visible_message("*click*")
@@ -252,7 +252,7 @@
/obj/item/gun/projectile/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = "head")
user.apply_damage(300, BRUTE, affecting)
- user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a gunshot!")
+ user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!")
/obj/item/gun/projectile/revolver/capgun
name = "cap gun"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a378e291e7c..e38a42ff88f 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -114,13 +114,18 @@
"[L] is hit by \a [src][organ_hit_text]!") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
var/reagent_note
+ var/has_reagents = FALSE
if(reagents && reagents.reagent_list)
reagent_note = " REAGENTS:"
for(var/datum/reagent/R in reagents.reagent_list)
reagent_note += R.id + " ("
reagent_note += num2text(R.volume) + ") "
+ has_reagents = TRUE
if(!log_override && firer && original)
- add_attack_logs(firer, L, "Shot with a [type] (potentially containing [reagent_note])")
+ if(has_reagents)
+ add_attack_logs(firer, L, "Shot with a [type] (containing [reagent_note])")
+ else
+ add_attack_logs(firer, L, "Shot with a [type]")
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
/obj/item/projectile/proc/get_splatter_blockage(var/turf/step_over, var/atom/target, var/splatter_dir, var/target_loca) //Check whether the place we want to splatter blood is blocked (i.e. by windows).
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index becada9f19e..761fb50179c 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -77,7 +77,7 @@
/obj/item/projectile/beam/lasertag
name = "laser tag beam"
icon_state = "omnilaser"
- hitsound = null
+ hitsound = 'sound/weapons/tap.ogg'
damage = 0
damage_type = STAMINA
flag = "laser"
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 4521dc8d7ba..3fe2277ed3b 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -32,7 +32,7 @@
else
G.death()
- visible_message("[G] topples backwards as the death bolt impacts them!")
+ visible_message("[G] topples backwards as the death bolt impacts [G.p_them()]!")
/obj/item/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 6ac21128e56..2c774b7f3dd 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -8,14 +8,14 @@
/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0)
..()
- empulse(target, 1, 1)
+ empulse(target, 1, 1, 1)
return 1
/obj/item/projectile/ion/weak
/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = 0)
..()
- empulse(target, 0, 0)
+ empulse(target, 0, 0, 1)
return 1
/obj/item/projectile/bullet/gyro
@@ -137,7 +137,7 @@
if(prob(15))
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
- M.visible_message("[M] writhes in pain as \his vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.")
+ M.visible_message("[M] writhes in pain as [M.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.")
if(prob(35))
if(prob(80))
randmutb(M)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index e589936a935..d4d232d2ed7 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -1,7 +1,3 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-
/obj/machinery/chem_dispenser
name = "chem dispenser"
density = 1
diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm
index 6a4ede5fe50..a2bd35ae75a 100644
--- a/code/modules/reagents/chemistry/reagents/drugs.dm
+++ b/code/modules/reagents/chemistry/reagents/drugs.dm
@@ -208,7 +208,7 @@
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 7)
M.emote("scream")
- M.visible_message("[M] nervously scratches at their skin!")
+ M.visible_message("[M] nervously scratches at [M.p_their()] skin!")
M.Jitter(10)
M.adjustBruteLoss(5)
M.emote("twitch_s")
@@ -315,7 +315,7 @@
var/effect = ..()
if(severity == 1)
if(effect <= 2)
- M.visible_message("[M] can't seem to control their legs!")
+ M.visible_message("[M] can't seem to control [M.p_their()] legs!")
M.AdjustConfused(20)
M.Weaken(4)
else if(effect <= 4)
@@ -356,7 +356,7 @@
head_organ.f_style = "Very Long Beard"
H.update_hair()
H.update_fhair()
- H.visible_message("[H] has a wild look in their eyes!")
+ H.visible_message("[H] has a wild look in [H.p_their()] eyes!")
if(check < 60)
M.SetParalysis(0)
M.SetStunned(0)
@@ -368,7 +368,7 @@
M.AdjustConfused(10)
if(check < 8)
M.reagents.add_reagent(pick("methamphetamine", "crank", "neurotoxin"), rand(1,5))
- M.visible_message("[M] scratches at something under their skin!")
+ M.visible_message("[M] scratches at something under [M.p_their()] skin!")
M.adjustBruteLoss(5)
else if(check < 16)
M.AdjustHallucinate(30)
@@ -427,7 +427,7 @@
M.reagents.add_reagent("jagged_crystals", 5)
else if(effect <= 7)
M.emote("scream")
- M.visible_message("[M] tears at their own skin!")
+ M.visible_message("[M] tears at [M.p_their()] own skin!")
M.adjustBruteLoss(5)
M.reagents.add_reagent("jagged_crystals", 5)
M.emote("twitch")
@@ -541,7 +541,7 @@
var/effect = ..()
if(severity == 1)
if(effect <= 2)
- M.visible_message("[M] can't seem to control their legs!")
+ M.visible_message("[M] can't seem to control [M.p_their()] legs!")
M.AdjustConfused(33)
M.Weaken(2)
else if(effect <= 4)
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index ada22d5b139..d1b44798b85 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -73,7 +73,7 @@
M.visible_message("[M] suddenly and violently vomits!")
M.fakevomit(no_text = 1)
else if(effect <= 5)
- M.visible_message("[M] staggers and drools, their eyes bloodshot!")
+ M.visible_message("[M] staggers and drools, [M.p_their()] eyes bloodshot!")
M.Dizzy(8)
M.Weaken(4)
if(effect <= 15)
@@ -115,7 +115,11 @@
M.adjustToxLoss(-3)
M.adjustBruteLoss(-12)
M.adjustFireLoss(-12)
- M.status_flags &= ~DISFIGURED
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/head/head = H.get_organ("head")
+ if(head)
+ head.disfigured = FALSE
..()
/datum/reagent/medicine/rezadone
@@ -131,7 +135,11 @@
M.adjustCloneLoss(-1) //What? We just set cloneloss to 0. Why? Simple; this is so external organs properly unmutate.
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- M.status_flags &= ~DISFIGURED
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/head/head = H.get_organ("head")
+ if(head)
+ head.disfigured = FALSE
..()
/datum/reagent/medicine/rezadone/overdose_process(mob/living/M, severity)
@@ -277,7 +285,7 @@
if(severity == 1) //lesser
M.stuttering += 1
if(effect <= 1)
- M.visible_message("[M] suddenly cluches their gut!")
+ M.visible_message("[M] suddenly cluches [M.p_their()] gut!")
M.emote("scream")
M.Stun(4)
M.Weaken(4)
@@ -293,7 +301,7 @@
M.Jitter(30)
else if(severity == 2) // greater
if(effect <= 2)
- M.visible_message("[M] suddenly cluches their gut!")
+ M.visible_message("[M] suddenly cluches [M.p_their()] gut!")
M.emote("scream")
M.Stun(7)
M.Weaken(7)
@@ -446,7 +454,7 @@
M.visible_message("[M] suddenly and violently vomits!")
M.fakevomit(no_text = 1)
else if(effect <= 5)
- M.visible_message("[M.name] staggers and drools, their eyes bloodshot!")
+ M.visible_message("[M.name] staggers and drools, [M.p_their()] eyes bloodshot!")
M.Dizzy(2)
M.Weaken(3)
if(effect <= 15)
@@ -597,7 +605,7 @@
M.visible_message("[M] suddenly and violently vomits!")
M.fakevomit(no_text = 1)
else if(effect <= 5)
- M.visible_message("[M] staggers and drools, their eyes bloodshot!")
+ M.visible_message("[M] staggers and drools, [M.p_their()] eyes bloodshot!")
M.Dizzy(2)
M.Weaken(3)
if(effect <= 15)
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 8cad5400c02..7bff61218c6 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -557,7 +557,7 @@
M.adjustBruteLoss(5)
M.Weaken(5)
M.AdjustJitter(6)
- M.visible_message("[M] falls to the floor, scratching themselves violently!")
+ M.visible_message("[M] falls to the floor, scratching [M.p_them()]self violently!")
M.emote("scream")
..()
@@ -611,11 +611,11 @@
return
if(!H.unacidable)
- var/obj/item/organ/external/affecting = H.get_organ("head")
- affecting.receive_damage(0, 75)
+ var/obj/item/organ/external/head/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.receive_damage(0, 75)
H.UpdateDamageIcon()
H.emote("scream")
- H.status_flags |= DISFIGURED
/datum/reagent/facid/reaction_obj(obj/O, volume)
if((istype(O, /obj/item) || istype(O, /obj/structure/glowshroom)))
@@ -947,8 +947,7 @@
/datum/reagent/glyphosate/reaction_obj(obj/O, volume)
if(istype(O,/obj/structure/alien/weeds))
var/obj/structure/alien/weeds/alien_weeds = O
- alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast
- alien_weeds.healthcheck()
+ alien_weeds.take_damage(rand(15, 35), BRUTE, 0) // Kills alien weeds pretty fast
else if(istype(O, /obj/structure/glowshroom)) //even a small amount is enough to kill it
qdel(O)
else if(istype(O, /obj/structure/spacevine))
@@ -1016,7 +1015,7 @@
M.Drowsy(10)
if(11)
M.Paralyse(10)
- M.visible_message("[M] seizes up and falls limp, their eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
+ M.visible_message("[M] seizes up and falls limp, [M.p_their()] eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
if(12 to 60)
M.Paralyse(10)
if(61 to INFINITY)
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index aa5e16adc04..4df7a525b88 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -334,7 +334,7 @@
/datum/chemical_reaction/slimeoverload/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
- empulse(get_turf(holder.my_atom), 3, 7)
+ empulse(get_turf(holder.my_atom), 3, 7, 1)
/datum/chemical_reaction/slimecell
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 057a339649c..ad8b3438ee4 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -85,7 +85,7 @@
var/datum/reagent/injected = chemical_reagents_list[reagent_ids[mode]]
var/contained = injected.name
var/trans = R.trans_to(M, amount_per_transfer_from_this)
- add_attack_logs(M, user, "Injected with [name] containing [contained], transfered [trans] units", !!M.ckey)
+ add_attack_logs(M, user, "Injected with [name] containing [contained], transfered [trans] units")
M.LAssailant = user
to_chat(user, "[trans] units injected. [R.total_volume] units remaining.")
return
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 39d3babf4bc..d20ef6f82ee 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -42,7 +42,8 @@
/obj/machinery/constructable_frame,
/obj/machinery/icemachine,
/obj/item/bombcore/chemical,
- /obj/machinery/vending)
+ /obj/machinery/vending,
+ /obj/machinery/fishtank)
/obj/item/reagent_containers/glass/New()
..()
@@ -82,7 +83,7 @@
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
- add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey)
+ add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
if(!iscarbon(user))
M.LAssailant = null
else
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index e405dbe169c..02ab4408acb 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -49,14 +49,14 @@
user.newtonian_move(get_dir(A, user))
if(reagents.has_reagent("sacid"))
- msg_admin_attack("[key_name_admin(user)] fired sulphuric acid from \a [src].")
- log_game("[key_name(user)] fired sulphuric acid from \a [src].")
+ msg_admin_attack("[key_name_admin(user)] fired sulphuric acid from \a [src] at [COORD(user)].", ATKLOG_FEW)
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [COORD(user)].")
if(reagents.has_reagent("facid"))
- msg_admin_attack("[key_name_admin(user)] fired fluorosulfuric acid from \a [src].")
- log_game("[key_name(user)] fired fluorosulfuric Acid from \a [src].")
+ msg_admin_attack("[key_name_admin(user)] fired fluorosulfuric acid from \a [src] at [COORD(user)].", ATKLOG_FEW)
+ log_game("[key_name(user)] fired fluorosulfuric Acid from \a [src] at [COORD(user)].")
if(reagents.has_reagent("lube"))
- msg_admin_attack("[key_name_admin(user)] fired space lube from \a [src].")
- log_game("[key_name(user)] fired space lube from \a [src].")
+ msg_admin_attack("[key_name_admin(user)] fired space lube from \a [src] at [COORD(user)].")
+ log_game("[key_name(user)] fired space lube from \a [src] at [COORD(user)].")
return
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index a80c4142d87..bcbcad6bc98 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -9,6 +9,7 @@
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
+ var/lastrigger = "" // The last person to rig this fuel tank - Stored with the object. Only the last person matter for investigation
/obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params)
return
@@ -77,11 +78,16 @@
..()
if(!QDELETED(src)) //wasn't deleted by the projectile's effects.
if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
- message_admins("[key_name_admin(P.firer)] triggered a fueltank explosion.")
- log_game("[key_name(P.firer)] triggered a fueltank explosion.")
+ message_admins("[key_name_admin(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)] ")
+ log_game("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]")
+ investigate_log("[key_name(P.firer)] triggered a fueltank explosion with [P.name] at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
-/obj/structure/reagent_dispensers/fueltank/boom()
+/obj/structure/reagent_dispensers/fueltank/boom(var/rigtrigger = FALSE) // Prevent case where someone who rigged the tank is blamed for the explosion when the rig isn't what triggered the explosion
+ if(rigtrigger == TRUE) // If the explosion is triggered by an assembly holder
+ message_admins("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]") // Then admin is informed of the last person who rigged the fuel tank
+ log_game("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]")
+ investigate_log("A fueltank, last rigged by [lastrigger], exploded at [COORD(loc)]", INVESTIGATE_BOMB)
explosion(loc, 0, 1, 5, 7, 10, flame_range = 5)
qdel(src)
@@ -111,6 +117,7 @@
usr.visible_message("[usr] detaches [rig] from [src].", "You detach [rig] from [src].")
rig.forceMove(get_turf(usr))
rig = null
+ lastrigger = null
overlays.Cut()
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/user, params)
@@ -124,9 +131,11 @@
var/obj/item/assembly_holder/H = I
if(istype(H.a_left, /obj/item/assembly/igniter) || istype(H.a_right, /obj/item/assembly/igniter))
- msg_admin_attack("[key_name_admin(user)] rigged a fueltank for explosion (JMP)")
- log_game("[key_name(user)] rigged fueltank a fueltank for explosion at [loc.x], [loc.y], [loc.z]")
+ msg_admin_attack("[key_name_admin(user)] rigged [src.name] with [I.name] for explosion (JMP)", ATKLOG_FEW)
+ log_game("[key_name(user)] rigged [src.name] with [I.name] for explosion at [COORD(loc)]")
+ investigate_log("[key_name(user)] rigged [src.name] with [I.name] for explosion at [COORD(loc)]", INVESTIGATE_BOMB)
+ lastrigger = "[key_name(user)]"
rig = H
user.drop_item()
H.forceMove(src)
@@ -146,13 +155,14 @@
to_chat(user, "Your [W] is already full!")
return
reagents.trans_to(W, W.max_fuel)
- user.visible_message("[user] refills \his [W].", "You refill [W].")
+ user.visible_message("[user] refills [user.p_their()] [W].", "You refill [W].")
playsound(src, 'sound/effects/refill.ogg', 50, 1)
W.update_icon()
else
- user.visible_message("[user] catastrophically fails at refilling \his [W]!", "That was stupid of you.")
- message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
- log_game("[key_name(user)] triggered a fueltank explosion.")
+ user.visible_message("[user] catastrophically fails at refilling [user.p_their()] [W]!", "That was stupid of you.")
+ message_admins("[key_name_admin(user)] triggered a fueltank explosion at [COORD(loc)]")
+ log_game("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]")
+ investigate_log("[key_name(user)] triggered a fueltank explosion at [COORD(loc)]", INVESTIGATE_BOMB)
boom()
else
..()
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index ba193744467..3658846a696 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -250,8 +250,6 @@
var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc)
src.transfer_fingerprints_to(P)
P.dir = dir
- var/obj/structure/disposalpipe/trunk/Trunk = CP
- Trunk.linked = P
else if(ptype==8) // Disposal outlet
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 3907ed052a6..00b3b06a3a5 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -36,19 +36,19 @@
update()
/obj/machinery/disposal/proc/trunk_check()
- trunk = locate() in src.loc
- if(!trunk)
+ var/obj/structure/disposalpipe/trunk/T = locate() in loc
+ if(!T)
mode = 0
flush = 0
else
mode = initial(mode)
flush = initial(flush)
- trunk.linked = src // link the pipe trunk to self
+ T.nicely_link_to_other_stuff(src)
/obj/machinery/disposal/Destroy()
eject()
if(trunk)
- trunk.linked = null
+ trunk.remove_trunk_links()
return ..()
/obj/machinery/disposal/Initialize()
@@ -133,7 +133,7 @@
for(var/mob/C in viewers(src))
C.show_message("[GM.name] has been placed in the [src] by [user].", 3)
qdel(G)
- add_attack_logs(usr, GM, "Disposal'ed", !!GM.ckey)
+ add_attack_logs(usr, GM, "Disposal'ed", !!GM.ckey ? null : ATKLOG_ALL)
return
if(!I)
@@ -179,7 +179,7 @@
msg = "[user.name] stuffs [target.name] into the [src]!"
to_chat(user, "You stuff [target.name] into the [src]!")
- add_attack_logs(user, target, "Disposal'ed", !!target.ckey)
+ add_attack_logs(user, target, "Disposal'ed", !!target.ckey ? null : ATKLOG_ALL)
else
return
target.forceMove(src)
@@ -1149,24 +1149,39 @@
if(D.trunk == src)
D.go_out()
D.trunk = null
-
- linked = null
+ remove_trunk_links()
return ..()
/obj/structure/disposalpipe/trunk/proc/getlinked()
- linked = null
var/obj/machinery/disposal/D = locate() in src.loc
if(D)
- linked = D
- if(!D.trunk)
- D.trunk = src
-
+ nicely_link_to_other_stuff(D)
+ return
var/obj/structure/disposaloutlet/O = locate() in src.loc
if(O)
- linked = O
+ nicely_link_to_other_stuff(O)
- update()
- return
+/obj/structure/disposalpipe/trunk/proc/remove_trunk_links() //disposals is well-coded
+ if(!linked)
+ return
+ else if(istype(linked, /obj/machinery/disposal)) //jk lol
+ var/obj/machinery/disposal/D = linked
+ D.trunk = null
+ else if(istype(linked, /obj/structure/disposaloutlet)) //God fucking damn it
+ var/obj/structure/disposaloutlet/D = linked
+ D.linkedtrunk = null
+ linked = null
+
+/obj/structure/disposalpipe/trunk/proc/nicely_link_to_other_stuff(obj/O)
+ remove_trunk_links() //Breaks the connections between this trunk and the linked machinery so we don't get sent to nullspace or some shit like that
+ if(istype(O, /obj/machinery/disposal))
+ var/obj/machinery/disposal/D = O
+ linked = D
+ D.trunk = src
+ else if(istype(O, /obj/structure/disposaloutlet))
+ var/obj/structure/disposaloutlet/D = O
+ linked = D
+ D.linkedtrunk = src
// Override attackby so we disallow trunkremoval when somethings ontop
/obj/structure/disposalpipe/trunk/attackby(var/obj/item/I, var/mob/user, params)
@@ -1271,77 +1286,72 @@
var/obj/structure/disposalpipe/trunk/linkedtrunk
var/mode = 0
- New()
- ..()
-
- spawn(1)
- target = get_ranged_target_turf(src, dir, 10)
-
-
- linkedtrunk = locate() in src.loc
- if(linkedtrunk)
- linkedtrunk.linked = src
+/obj/structure/disposaloutlet/New()
+ ..()
+ spawn(1)
+ target = get_ranged_target_turf(src, dir, 10)
+ var/obj/structure/disposalpipe/trunk/T = locate() in loc
+ if(T)
+ T.nicely_link_to_other_stuff(src)
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
- proc/expel(var/obj/structure/disposalholder/H, animation = 1)
-
- if(animation)
- flick("outlet-open", src)
- playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
- sleep(20) //wait until correct animation frame
- playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
-
- if(H)
- for(var/atom/movable/AM in H)
- AM.forceMove(loc)
- AM.pipe_eject(dir)
- if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
- spawn(5)
- if(AM)
- AM.throw_at(target, 3, 1)
- H.vent_gas(src.loc)
- qdel(H)
+/obj/structure/disposaloutlet/proc/expel(var/obj/structure/disposalholder/H, animation = 1)
+ if(animation)
+ flick("outlet-open", src)
+ playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0)
+ sleep(20) //wait until correct animation frame
+ playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0)
+ if(H)
+ for(var/atom/movable/AM in H)
+ AM.forceMove(loc)
+ AM.pipe_eject(dir)
+ if(!istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z
+ spawn(5)
+ if(AM)
+ AM.throw_at(target, 3, 1)
+ H.vent_gas(src.loc)
+ qdel(H)
- attackby(var/obj/item/I, var/mob/user, params)
- if(!I || !user)
+/obj/structure/disposaloutlet/attackby(var/obj/item/I, var/mob/user, params)
+ if(!I || !user)
+ return
+ src.add_fingerprint(user)
+ if(istype(I, /obj/item/screwdriver))
+ if(mode==0)
+ mode=1
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, "You remove the screws around the power connection.")
+ return
+ else if(mode==1)
+ mode=0
+ playsound(src.loc, I.usesound, 50, 1)
+ to_chat(user, "You attach the screws around the power connection.")
+ return
+ else if(istype(I,/obj/item/weldingtool) && mode==1)
+ var/obj/item/weldingtool/W = I
+ if(W.remove_fuel(0,user))
+ playsound(src.loc, W.usesound, 100, 1)
+ to_chat(user, "You start slicing the floorweld off the disposal outlet.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ if(!src || !W.isOn()) return
+ to_chat(user, "You sliced the floorweld off the disposal outlet.")
+ var/obj/structure/disposalconstruct/C = new (src.loc)
+ src.transfer_fingerprints_to(C)
+ C.ptype = 7 // 7 = outlet
+ C.update()
+ C.anchored = 1
+ C.density = 1
+ qdel(src)
+ return
+ else
+ to_chat(user, "You need more welding fuel to complete this task.")
return
- src.add_fingerprint(user)
- if(istype(I, /obj/item/screwdriver))
- if(mode==0)
- mode=1
- playsound(src.loc, I.usesound, 50, 1)
- to_chat(user, "You remove the screws around the power connection.")
- return
- else if(mode==1)
- mode=0
- playsound(src.loc, I.usesound, 50, 1)
- to_chat(user, "You attach the screws around the power connection.")
- return
- else if(istype(I,/obj/item/weldingtool) && mode==1)
- var/obj/item/weldingtool/W = I
- if(W.remove_fuel(0,user))
- playsound(src.loc, W.usesound, 100, 1)
- to_chat(user, "You start slicing the floorweld off the disposal outlet.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- if(!src || !W.isOn()) return
- to_chat(user, "You sliced the floorweld off the disposal outlet.")
- var/obj/structure/disposalconstruct/C = new (src.loc)
- src.transfer_fingerprints_to(C)
- C.ptype = 7 // 7 = outlet
- C.update()
- C.anchored = 1
- C.density = 1
- qdel(src)
- return
- else
- to_chat(user, "You need more welding fuel to complete this task.")
- return
/obj/structure/disposaloutlet/Destroy()
if(linkedtrunk)
- linkedtrunk.linked = null
+ linkedtrunk.remove_trunk_links()
return ..()
// called when movable is expelled from a disposal pipe or outlet
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 3c555c40849..7f5377741e4 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -57,7 +57,7 @@
id = "telepad_beacon"
req_tech = list("programming" = 5, "bluespace" = 4, "engineering" = 4, "plasmatech" = 4)
build_type = PROTOLATHE
- materials = list (MAT_METAL = 2000, MAT_GLASS = 1750, MAT_SILVER = 500)
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1750, MAT_SILVER = 500)
build_path = /obj/item/telepad_beacon
category = list("Bluespace")
@@ -67,6 +67,6 @@
id = "beacon"
req_tech = list("bluespace" = 1)
build_type = PROTOLATHE
- materials = list (MAT_METAL = 150, MAT_GLASS = 100)
+ materials = list(MAT_METAL = 150, MAT_GLASS = 100)
build_path = /obj/item/radio/beacon
category = list("Bluespace")
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 9d973c1ed74..49a1a7d0eba 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -181,7 +181,7 @@
id = "scalpel_manager"
req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4)
build_type = PROTOLATHE
- materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000)
+ materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000)
build_path = /obj/item/scalpel/laser/manager
category = list("Medical")
@@ -271,13 +271,24 @@
build_path = /obj/item/organ/internal/cyberimp/mouth/breathing_tube
category = list("Misc", "Medical")
+/datum/design/cyberimp_surgical
+ name = "Surgical Arm Implant"
+ desc = "A set of surgical tools hidden behind a concealed panel on the user's arm."
+ id = "ci-surgey"
+ req_tech = list("materials" = 3, "engineering" = 3, "biotech" = 3, "programming" = 2, "magnets" = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
+ construction_time = 200
+ build_path = /obj/item/organ/internal/cyberimp/arm/surgery
+ category = list("Misc", "Medical")
+
/datum/design/cyberimp_toolset
name = "Toolset Arm Implant"
desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm."
id = "ci-toolset"
req_tech = list("materials" = 3, "engineering" = 4, "biotech" = 4, "powerstorage" = 4)
build_type = PROTOLATHE | MECHFAB
- materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
+ materials = list(MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500)
construction_time = 200
build_path = /obj/item/organ/internal/cyberimp/arm/toolset
category = list("Misc", "Medical")
diff --git a/code/modules/research/designs/smelting_designs.dm b/code/modules/research/designs/smelting_designs.dm
index fe45e8dacad..a043d90fb19 100644
--- a/code/modules/research/designs/smelting_designs.dm
+++ b/code/modules/research/designs/smelting_designs.dm
@@ -25,6 +25,22 @@
build_path = /obj/item/stack/sheet/plasmaglass
category = list("initial")
+/datum/design/titaniumglass_alloy
+ name = "Titanium + Glass alloy"
+ id = "titaniumglass"
+ build_type = SMELTER
+ materials = list(MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/titaniumglass
+ category = list("initial")
+
+/datum/design/plastitaniumglass_alloy
+ name = "Plasma + Titanium + Glass alloy"
+ id = "plastitaniumglass"
+ build_type = SMELTER
+ materials = list(MAT_PLASMA = MINERAL_MATERIAL_AMOUNT, MAT_TITANIUM = MINERAL_MATERIAL_AMOUNT, MAT_GLASS = MINERAL_MATERIAL_AMOUNT)
+ build_path = /obj/item/stack/sheet/plastitaniumglass
+ category = list("initial")
+
/datum/design/alienalloy
name = "Alien Alloy"
desc = "A sheet of reverse-engineered alien alloy."
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index ee884bc20a4..dcae187b028 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -22,7 +22,6 @@
desc = "A computer used for remotely handling slimes."
networks = list("SS13")
circuit = /obj/item/circuitboard/xenobiology
- off_action = new /datum/action/innate/camera_off/xenobio
var/datum/action/innate/slime_place/slime_place_action = new
var/datum/action/innate/slime_pick_up/slime_up_action = new
var/datum/action/innate/feed_slime/feed_slime_action = new
@@ -43,23 +42,27 @@
eyeobj.icon_state = "camera_target"
/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/carbon/user)
- off_action.target = user
- off_action.Grant(user)
+ ..()
+ if(slime_up_action)
+ slime_up_action.target = src
+ slime_up_action.Grant(user)
+ actions += slime_up_action
+
+ if(slime_place_action)
+ slime_place_action.target = src
+ slime_place_action.Grant(user)
+ actions += slime_place_action
+
+ if(feed_slime_action)
+ feed_slime_action.target = src
+ feed_slime_action.Grant(user)
+ actions += feed_slime_action
+
+ if(monkey_recycle_action)
+ monkey_recycle_action.target = src
+ monkey_recycle_action.Grant(user)
+ actions += monkey_recycle_action
- jump_action.target = user
- jump_action.Grant(user)
-
- slime_up_action.target = src
- slime_up_action.Grant(user)
-
- slime_place_action.target = src
- slime_place_action.Grant(user)
-
- feed_slime_action.target = src
- feed_slime_action.Grant(user)
-
- monkey_recycle_action.target = src
- monkey_recycle_action.Grant(user)
/obj/machinery/computer/camera_advanced/xenobio/attack_hand(mob/user)
@@ -87,31 +90,6 @@
return
..()
-/datum/action/innate/camera_off/xenobio/Activate()
- if(!target || !ishuman(target))
- return
- var/mob/living/carbon/C = target
- var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/xenobio/origin = remote_eye.origin
- C.remote_view = 0
- origin.current_user = null
- origin.jump_action.Remove(C)
- origin.slime_place_action.Remove(C)
- origin.slime_up_action.Remove(C)
- origin.feed_slime_action.Remove(C)
- origin.monkey_recycle_action.Remove(C)
- //All of this stuff below could probably be a proc for all advanced cameras, only the action removal needs to be camera specific
- remote_eye.eye_user = null
- C.reset_perspective(null)
- if(C.client)
- C.client.images -= remote_eye.user_image
- for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
- C.remote_control = null
- C.unset_machine()
- src.Remove(C)
-
-
/datum/action/innate/slime_place
name = "Place Slimes"
button_icon_state = "slime_down"
@@ -190,7 +168,7 @@
if(cameranet.checkTurfVis(remote_eye.loc))
for(var/mob/living/carbon/human/M in remote_eye.loc)
if(issmall(M) && M.stat)
- M.visible_message("[M] vanishes as they are reclaimed for recycling!")
+ M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!")
X.monkeys = round(X.monkeys + 0.2,0.1)
qdel(M)
else
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index d8058efbb53..35bdb18caae 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -205,7 +205,7 @@
SM.master_commander = user
SM.sentience_act()
to_chat(SM, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!")
- to_chat(SM, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost.")
+ to_chat(SM, "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist [user.p_them()] in completing [user.p_their()] goals at any cost.")
if(SM.flags_2 & HOLOGRAM_2) //Check to see if it's a holodeck creature
to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.")
to_chat(user, "[M] accepts the potion and suddenly becomes attentive and aware. It worked!")
@@ -426,7 +426,7 @@
G.loc = src.loc
G.key = ghost.key
add_attack_logs(user, G, "Summoned as a golem")
- to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
+ to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist [user.p_them()] in completing [user.p_their()] goals at any cost.")
qdel(src)
/obj/effect/golemrune/Topic(href,href_list)
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 16640a8b4c8..a24a9522b38 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -24,14 +24,22 @@
interpreter.GC()
+//temp
+/datum/TCS_Compiler
+ var/datum/n_scriptOptions/nS_Options/options
+ var/datum/n_Scanner/nS_Scanner/scanner
+ var/list/tokens
+ var/datum/n_Parser/nS_Parser/parser
+ var/datum/node/BlockDefinition/GlobalBlock/program
+
/* -- Compile a raw block of text -- */
-/datum/TCS_Compiler/proc/Compile(code as message)
- var/datum/n_scriptOptions/nS_Options/options = new()
- var/datum/n_Scanner/nS_Scanner/scanner = new(code, options)
- var/list/tokens = scanner.Scan()
- var/datum/n_Parser/nS_Parser/parser = new(tokens, options)
- var/datum/node/BlockDefinition/GlobalBlock/program = parser.Parse()
+/datum/TCS_Compiler/proc/Compile(list/code)
+ options = new()
+ scanner = new(code, options)
+ tokens = scanner.Scan()
+ parser = new(tokens, options)
+ program = parser.Parse()
var/list/returnerrors = list()
diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm
index 79802ff2fa5..c24e9ba5e3a 100644
--- a/code/modules/scripting/Interpreter/Interpreter.dm
+++ b/code/modules/scripting/Interpreter/Interpreter.dm
@@ -184,6 +184,8 @@ Runs each statement in a block of code.
else
RaiseError(new/datum/runtimeError/UnknownInstruction())
+ CHECK_TICK
+
if(status)
break
diff --git a/code/modules/scripting/Options.dm b/code/modules/scripting/Options.dm
index b27acff91d3..be471756359 100644
--- a/code/modules/scripting/Options.dm
+++ b/code/modules/scripting/Options.dm
@@ -36,11 +36,12 @@ File: Options
if(!CanStartID(id)) //don't need to grab first char in id, since text2ascii does it automatically
return 0
- if(length(id) == 1)
+ var/list/charmap = string2charlist(id)
+ if(charmap.len == 1)
return 1
- for(var/i=2 to length(id))
- if(!IsValidIDChar(copytext(id, i, i + 1)))
+ for(var/i = 2 to charmap.len)
+ if(!IsValidIDChar(charmap[i]))
return 0
return 1
diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm
index 011621c8ea8..da6a2c04803 100644
--- a/code/modules/scripting/Scanner/Scanner.dm
+++ b/code/modules/scripting/Scanner/Scanner.dm
@@ -6,7 +6,7 @@
An object responsible for breaking up source code into tokens for use by the parser.
*/
/datum/n_Scanner
- var/code
+ var/list/code
/*
Var: errors
A list of fatal errors found by the scanner. If there are any items in this list, then it is not safe to parse the returned tokens.
@@ -25,7 +25,7 @@
Proc: LoadCode
Loads source code.
*/
-/datum/n_Scanner/proc/LoadCode(var/c)
+/datum/n_Scanner/proc/LoadCode(var/list/c)
code=c
/*
@@ -100,24 +100,23 @@
code - The source code to tokenize.
options - An object used to configure the scanner.
*/
-/datum/n_Scanner/nS_Scanner/New(var/code, var/datum/n_scriptOptions/nS_Options/options)
+/datum/n_Scanner/nS_Scanner/New(var/list/c, var/datum/n_scriptOptions/nS_Options/options)
. = ..()
ignore += ascii2text(13) //Carriage return
delim += ignore + options.symbols + end_stmt + string_delim
src.options = options
- LoadCode(code)
+ LoadCode(c)
/datum/n_Scanner/nS_Scanner/Scan() //Creates a list of tokens from source code
var/list/tokens = new
- for(, src.codepos <= length(code), src.codepos++)
-
- var/char = copytext(code, codepos, codepos + 1)
- var/nextchar = copytext(code, codepos + 1, codepos + 2)
+ for(, src.codepos <= code.len, src.codepos++)
+ var/char = code[codepos]
+ var/nextchar = TCOMMS_SAFE_INDEX(code, codepos + 1)
if(char == "\n")
line++
linepos = codepos
- if(ignore.Find(char))
+ if(char in ignore)
continue
else if(char == "/" && (nextchar == "*" || nextchar == "/"))
@@ -139,6 +138,7 @@
else if(options.symbols.Find(char))
tokens += ReadSymbol()
+ CHECK_TICK
codepos = initial(codepos)
line = initial(line)
@@ -155,12 +155,12 @@
*/
/datum/n_Scanner/nS_Scanner/proc/ReadString(start)
var/buf
- for(, codepos <= length(code), codepos++)//codepos to length(code))
- var/char = copytext(code, codepos, codepos + 1)
+ for(, codepos <= code.len, codepos++)//codepos to length(code))
+ var/char = code[codepos]
switch(char)
if("\\") //Backslash (\) encountered in string
codepos++ //Skip next character in string, since it was escaped by a backslash
- char = copytext(code, codepos, codepos+1)
+ char = TCOMMS_SAFE_INDEX(code, codepos)
switch(char)
if("\\") //Double backslash
buf += "\\"
@@ -190,12 +190,14 @@
Reads characters separated by an item in into a token.
*/
/datum/n_Scanner/nS_Scanner/proc/ReadWord()
- var/char = copytext(code, codepos, codepos + 1)
+ var/char = code[codepos]
var/buf
- while(!delim.Find(char) && codepos <= length(code))
+ while(!delim.Find(char))
buf += char
- char = copytext(code, ++codepos, codepos + 1)
+ if(++codepos > code.len) break
+ char = code[codepos]
+
codepos-- //allow main Scan() proc to read the delimiter
if(options.keywords.Find(buf))
return new/datum/token/keyword(buf, line, COL)
@@ -207,13 +209,13 @@
Reads a symbol into a token.
*/
/datum/n_Scanner/nS_Scanner/proc/ReadSymbol()
- var/char=copytext(code, codepos, codepos + 1)
+ var/char = code[codepos]
var/buf
while(options.symbols.Find(buf + char))
buf += char
- if(++codepos > length(code)) break
- char = copytext(code, codepos, codepos + 1)
+ if(++codepos > code.len) break
+ char = code[codepos]
codepos-- //allow main Scan() proc to read the next character
return new /datum/token/symbol(buf, line, COL)
@@ -223,7 +225,7 @@
Reads a number into a token.
*/
/datum/n_Scanner/nS_Scanner/proc/ReadNumber()
- var/char = copytext(code, codepos, codepos + 1)
+ var/char = code[codepos]
var/buf
var/dec = 0
@@ -233,7 +235,7 @@
buf += char
codepos++
- char = copytext(code, codepos, codepos + 1)
+ char = TCOMMS_SAFE_INDEX(code, codepos)
var/datum/token/number/T = new(buf, line, COL)
if(isnull(text2num(buf)))
@@ -249,8 +251,8 @@
*/
/datum/n_Scanner/nS_Scanner/proc/ReadComment()
- var/char = copytext(code, codepos, codepos + 1)
- var/nextchar = copytext(code, codepos + 1, codepos + 2)
+ var/char = code[codepos]
+ var/nextchar = TCOMMS_SAFE_INDEX(code, codepos + 1)
var/charstring = char + nextchar
var/comm = 1
// 1: single-line comment
@@ -262,23 +264,23 @@
comm = 2 // starts a multi-line comment
while(comm)
- if(++codepos > length(code))
+ if(++codepos > code.len)
break
if(expectedend) // ending statement expected...
- char = copytext(code, codepos, codepos + 1)
+ char = code[codepos]
if(char == "/") // ending statement found - beak the comment
comm = 0
break
if(comm == 2)
// multi-line comments are broken by ending statements
- char = copytext(code, codepos, codepos + 1)
+ char = code[codepos]
if(char == "*")
expectedend = 1
continue
else
- char = copytext(code, codepos, codepos + 1)
+ char = code[codepos]
if(char == "\n")
comm = 0
break
diff --git a/code/modules/scripting/__defines.dm b/code/modules/scripting/__defines.dm
new file mode 100644
index 00000000000..52f30e68fdc
--- /dev/null
+++ b/code/modules/scripting/__defines.dm
@@ -0,0 +1 @@
+#define TCOMMS_SAFE_INDEX(list, index) list.len > index ? list[index] : null
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index c8f36cfa37e..54f4836ff5b 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -1,4 +1,5 @@
//use this define to highlight docking port bounding boxes (ONLY FOR DEBUG USE)
+// also uncomment the #undef at the bottom of the file
//#define DOCKING_PORT_HIGHLIGHT
//NORTH default dir
@@ -909,7 +910,7 @@ var/global/trade_dockrequest_timelimit = 0
shuttleId = "trade_sol"
docking_request_message = "A trading ship of Sol origin has requested docking aboard the NSS Cyberiad for trading. This request can be accepted or denied using a communications console."
-#undef DOCKING_PORT_HIGHLIGHT
+//#undef DOCKING_PORT_HIGHLIGHT
/turf/proc/copyTurf(turf/T)
diff --git a/code/modules/space_management/level_traits.dm b/code/modules/space_management/level_traits.dm
index ae5d6447aae..39b584df64d 100644
--- a/code/modules/space_management/level_traits.dm
+++ b/code/modules/space_management/level_traits.dm
@@ -1,62 +1,63 @@
/proc/is_level_reachable(z)
- return check_level_trait(z, REACHABLE)
+ return check_level_trait(z, REACHABLE)
/proc/is_station_level(z)
- return check_level_trait(z, STATION_LEVEL)
+ return check_level_trait(z, STATION_LEVEL)
/proc/is_station_contact(z)
- return check_level_trait(z, STATION_CONTACT)
+ return check_level_trait(z, STATION_CONTACT)
/proc/is_teleport_allowed(z)
- return !check_level_trait(z, BLOCK_TELEPORT)
+ return !check_level_trait(z, BLOCK_TELEPORT)
/proc/is_admin_level(z)
- return check_level_trait(z, ADMIN_LEVEL)
+ return check_level_trait(z, ADMIN_LEVEL)
/proc/is_away_level(z)
- return check_level_trait(z, AWAY_LEVEL)
+ return check_level_trait(z, AWAY_LEVEL)
/proc/is_mining_level(z)
- return check_level_trait(z, ORE_LEVEL)
+ return check_level_trait(z, ORE_LEVEL)
/proc/is_ai_allowed(z)
- return check_level_trait(z, AI_OK)
+ return check_level_trait(z, AI_OK)
/proc/level_blocks_magic(z)
- return check_level_trait(z, IMPEDES_MAGIC)
+ return check_level_trait(z, IMPEDES_MAGIC)
/proc/level_boosts_signal(z)
- return check_level_trait(z, BOOSTS_SIGNAL)
+ return check_level_trait(z, BOOSTS_SIGNAL)
// Used for the nuke disk, or for checking if players survived through xenos
/proc/is_secure_level(z)
- var/secure = check_level_trait(z, STATION_LEVEL)
- if(!secure)
- // This is to allow further admin levels later, other than centcomm
- secure = (z == level_name_to_num(CENTCOMM))
- return secure
+ var/secure = check_level_trait(z, STATION_LEVEL)
+ if(!secure)
+ // This is to allow further admin levels later, other than centcomm
+ secure = (z == level_name_to_num(CENTCOMM))
+ return secure
var/list/default_map_traits = MAP_TRANSITION_CONFIG
+
/proc/check_level_trait(z, trait)
- if(!z)
- return 0 // If you're nowhere, you have no traits
- var/list/trait_list
- if(space_manager.initialized)
- var/datum/space_level/S = space_manager.get_zlev(z)
- trait_list = S.flags
- else
- trait_list = default_map_traits[z]
- trait_list = trait_list["attributes"]
- return (trait in trait_list)
+ if(!z)
+ return 0 // If you're nowhere, you have no traits
+ var/list/trait_list
+ if(space_manager.initialized)
+ var/datum/space_level/S = space_manager.get_zlev(z)
+ trait_list = S.flags
+ else
+ trait_list = default_map_traits[z]
+ trait_list = trait_list["attributes"]
+ return (trait in trait_list)
/proc/levels_by_trait(trait)
- var/list/result = list()
- for(var/A in space_manager.z_list)
- var/datum/space_level/S = space_manager.z_list[A]
- if(trait in S.flags)
- result |= S
- return result
+ var/list/result = list()
+ for(var/A in space_manager.z_list)
+ var/datum/space_level/S = space_manager.z_list[A]
+ if(trait in S.flags)
+ result |= S.zpos
+ return result
/proc/level_name_to_num(name)
- var/datum/space_level/S = space_manager.get_zlev_by_name(name)
- return S.zpos
+ var/datum/space_level/S = space_manager.get_zlev_by_name(name)
+ return S.zpos
\ No newline at end of file
diff --git a/code/modules/space_management/zlevel_manager.dm b/code/modules/space_management/zlevel_manager.dm
index 087a70657ed..acb1cf5c0a0 100644
--- a/code/modules/space_management/zlevel_manager.dm
+++ b/code/modules/space_management/zlevel_manager.dm
@@ -12,6 +12,8 @@ var/global/datum/zlev_manager/space_manager = new
var/datum/spacewalk_grid/linkage_map
var/initialized = 0
+ var/list/areas_in_z = list()
+
// Populate our space level list
// and prepare space transitions
/datum/zlev_manager/proc/initialize()
@@ -166,4 +168,4 @@ var/global/datum/zlev_manager/space_manager = new
var/datum/space_level/heap/heap = z_list["[C.zpos]"]
if(!istype(heap))
throw EXCEPTION("Attempted to free chunk at invalid z-level ([C.x],[C.y],[C.zpos]) [C.width]x[C.height]")
- heap.free(C)
+ heap.free(C)
\ No newline at end of file
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 794e5f69bfe..97e34eee154 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -1,6 +1,6 @@
#define DAMAGE 1
#define FIRE 2
-#define LIGHT 1
+#define POD_LIGHT 1
#define WINDOW 2
#define RIM 3
#define PAINT 4
@@ -78,7 +78,7 @@
var/part = input(user, "Choose part", null) as null|anything in list("Lights","Rim","Paint","Windows")
switch(part)
if("Lights")
- part_type = LIGHT
+ part_type = POD_LIGHT
if("Rim")
part_type = RIM
if("Paint")
@@ -101,7 +101,7 @@
pod_overlays[FIRE] = image(icon, icon_state="pod_fire")
if(!pod_paint_effect)
pod_paint_effect = new/list(4)
- pod_paint_effect[LIGHT] = image(icon,icon_state = "LIGHTS")
+ pod_paint_effect[POD_LIGHT] = image(icon,icon_state = "LIGHTS")
pod_paint_effect[WINDOW] = image(icon,icon_state = "Windows")
pod_paint_effect[RIM] = image(icon,icon_state = "RIM")
pod_paint_effect[PAINT] = image(icon,icon_state = "PAINT")
@@ -162,7 +162,7 @@
if(!pod_paint_effect)
pod_paint_effect = new/list(4)
- pod_paint_effect[LIGHT] = image(icon,icon_state = "LIGHTS")
+ pod_paint_effect[POD_LIGHT] = image(icon,icon_state = "LIGHTS")
pod_paint_effect[WINDOW] = image(icon,icon_state = "Windows")
pod_paint_effect[RIM] = image(icon,icon_state = "RIM")
pod_paint_effect[PAINT] = image(icon,icon_state = "PAINT")
@@ -170,9 +170,9 @@
if(has_paint)
var/image/to_add
- if(!isnull(pod_paint_effect[LIGHT]))
- to_add = pod_paint_effect[LIGHT]
- to_add.color = colors[LIGHT]
+ if(!isnull(pod_paint_effect[POD_LIGHT]))
+ to_add = pod_paint_effect[POD_LIGHT]
+ to_add.color = colors[POD_LIGHT]
overlays += to_add
if(!isnull(pod_paint_effect[WINDOW]))
to_add = pod_paint_effect[WINDOW]
@@ -1077,6 +1077,6 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v
#undef DAMAGE
#undef FIRE
#undef WINDOW
-#undef LIGHT
+#undef POD_LIGHT
#undef RIM
#undef PAINT
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index dfe2c0feb8c..a053b568dc7 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -49,7 +49,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \
"You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1)
+ target.custom_pain("Something in your [affected.name] is causing you a lot of pain!")
..()
/datum/surgery_step/glue_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -83,7 +83,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \
"You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].")
- target.custom_pain("The pain in your [affected.name] is going to make you pass out!",1)
+ target.custom_pain("The pain in your [affected.name] is going to make you pass out!")
..()
/datum/surgery_step/set_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -136,7 +136,7 @@
"Your hand slips, damaging [target]'s face with \the [tool]!")
var/obj/item/organ/external/head/h = affected
h.receive_damage(10)
- h.disfigured = 1
+ h.disfigure()
return 0
/datum/surgery_step/finish_bone
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index 0e88927e1a2..2ab2aca37c7 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -78,7 +78,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
"You start making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
- target.custom_pain("The pain in your chest is living hell!",1)
+ target.custom_pain("The pain in your chest is living hell!")
..()
/datum/surgery_step/cavity/make_space/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -104,7 +104,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts mending [target]'s [get_cavity(affected)] cavity wall with \the [tool].", \
"You start mending [target]'s [get_cavity(affected)] cavity wall with \the [tool]." )
- target.custom_pain("The pain in your chest is living hell!",1)
+ target.custom_pain("The pain in your chest is living hell!")
..()
/datum/surgery_step/cavity/close_space/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -155,7 +155,7 @@
else //no internal items..but we still need a message!
user.visible_message("[user] checks for items in [target]'s [target_zone].", "You check for items in [target]'s [target_zone]...")
- target.custom_pain("The pain in your [target_zone] is living hell!",1)
+ target.custom_pain("The pain in your [target_zone] is living hell!")
..()
/datum/surgery_step/cavity/place_item/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -190,7 +190,7 @@
if((tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT)))
to_chat(user, " You tear some vessels trying to fit the object in the cavity.")
affected.internal_bleeding = TRUE
- affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
+ affected.owner.custom_pain("You feel something rip in your [affected.name]!")
user.drop_item()
affected.hidden = tool
tool.forceMove(affected)
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index eddf116a45d..b9a33fcecab 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -38,7 +38,7 @@
user.visible_message("[user] begins to cut through [target]'s [affected.encased] with \the [tool].", \
"You begin to cut through [target]'s [affected.encased] with \the [tool].")
- target.custom_pain("Something hurts horribly in your [affected.name]!",1)
+ target.custom_pain("Something hurts horribly in your [affected.name]!")
..()
/datum/surgery_step/open_encased/saw/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -86,7 +86,7 @@
var/msg = "[user] starts to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
var/self_msg = "You start to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your [affected.name]!",1)
+ target.custom_pain("Something hurts horribly in your [affected.name]!")
..()
/datum/surgery_step/open_encased/retract/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -137,7 +137,7 @@
var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]."
var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]."
user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your [affected.name]!",1)
+ target.custom_pain("Something hurts horribly in your [affected.name]!")
..()
/datum/surgery_step/open_encased/close/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -187,7 +187,7 @@
var/msg = "[user] starts applying \the [tool] to [target]'s [affected.encased]."
var/self_msg = "You start applying \the [tool] to [target]'s [affected.encased]."
user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your [affected.name]!",1)
+ target.custom_pain("Something hurts horribly in your [affected.name]!")
..()
/datum/surgery_step/open_encased/mend/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
deleted file mode 100644
index d96db814b78..00000000000
--- a/code/modules/surgery/face.dm
+++ /dev/null
@@ -1,147 +0,0 @@
-//Procedures in this file: Facial reconstruction surgery
-//////////////////////////////////////////////////////////////////
-// FACE SURGERY //
-//////////////////////////////////////////////////////////////////
-/datum/surgery/plastic_surgery
- name = "Face Repair"
- steps = list(/datum/surgery_step/generic/cut_face, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/face/mend_vocal, /datum/surgery_step/face/fix_face,/datum/surgery_step/face/cauterize)
- possible_locs = list("head")
-
-
-
-/datum/surgery/plastic_surgery/can_start(mob/user, mob/living/carbon/target)
- if(istype(target,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = target
- var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- if(!affected)
- return 0
- if(affected.status & ORGAN_ROBOT)
- return 0
- if(!affected.disfigured)
- return 0
- return 1
-
-/datum/surgery_step/face
- priority = 2
- can_infect = 0
-
-/datum/surgery_step/generic/cut_face
- name = "make incision"
- allowed_tools = list(
- /obj/item/scalpel = 100, \
- /obj/item/kitchen/knife = 90, \
- /obj/item/shard = 60, \
- )
-
- time = 16
-
-/datum/surgery_step/generic/cut_face/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
- "You start to cut open [target]'s face and neck with \the [tool].")
- ..()
-
-/datum/surgery_step/generic/cut_face/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user] has cut open [target]'s face and neck with \the [tool]." , \
- " You have cut open [target]'s face and neck with \the [tool].",)
-
- return 1
-
-/datum/surgery_step/generic/cut_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message(" [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
- " Your hand slips, slicing [target]'s throat wth \the [tool]!" )
- affected.receive_damage(60)
- target.AdjustLoseBreath(4)
-
- return 0
-
-/datum/surgery_step/face/mend_vocal
- name = "mend vocal cords"
- allowed_tools = list(
- /obj/item/scalpel/laser/manager = 100, \
- /obj/item/hemostat = 100, \
- /obj/item/stack/cable_coil = 90, \
- /obj/item/assembly/mousetrap = 12 //I don't know. Don't ask me. But I'm leaving it because hilarity.
- )
-
- time = 24
-
-/datum/surgery_step/face/mend_vocal/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message("[user] starts mending [target]'s vocal cords with \the [tool].", \
- "You start mending [target]'s vocal cords with \the [tool].")
- ..()
-
-/datum/surgery_step/face/mend_vocal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user] mends [target]'s vocal cords with \the [tool].", \
- " You mend [target]'s vocal cords with \the [tool].")
- return 1
-
-/datum/surgery_step/face/mend_vocal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
- " Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
- target.AdjustLoseBreath(4)
- return 0
-
-/datum/surgery_step/face/fix_face
- name = "reshape face"
- allowed_tools = list(
- /obj/item/scalpel/laser/manager = 100, \
- /obj/item/retractor = 100, \
- /obj/item/crowbar = 65, \
- /obj/item/kitchen/utensil/fork = 90)
-
- time = 64
-
-/datum/surgery_step/face/fix_face/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message("[user] starts pulling skin on [target]'s face back in place with \the [tool].", \
- "You start pulling skin on [target]'s face back in place with \the [tool].")
- ..()
-
-/datum/surgery_step/face/fix_face/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message(" [user] pulls skin on [target]'s face back in place with \the [tool].", \
- " You pull skin on [target]'s face back in place with \the [tool].")
- return 1
-
-/datum/surgery_step/face/fix_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message(" [user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
- " Your hand slips, tearing skin on [target]'s face with \the [tool]!")
- target.apply_damage(10, BRUTE, affected, sharp = 1)
- return 0
-
-/datum/surgery_step/face/cauterize
- name = "close incision"
- allowed_tools = list(
- /obj/item/scalpel/laser = 100, \
- /obj/item/cautery = 100, \
- /obj/item/clothing/mask/cigarette = 90, \
- /obj/item/lighter = 60, \
- /obj/item/weldingtool = 30
- )
-
- time = 24
-
-/datum/surgery_step/face/cauterize/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \
- "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].")
- ..()
-
-/datum/surgery_step/face/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message(" [user] cauterizes the incision on [target]'s face and neck with \the [tool].", \
- " You cauterize the incision on [target]'s face and neck with \the [tool].")
- affected.open = 0
- var/obj/item/organ/external/head/h = affected
- h.disfigured = 0
- h.update_icon()
- target.regenerate_icons()
-
- return 1
-
-/datum/surgery_step/face/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message(" [user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \
- " Your hand slips, leaving a small burn on [target]'s face with \the [tool]!")
- target.apply_damage(4, BURN, affected)
-
- return 0
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 158656f8c01..1e1b3a10365 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -37,7 +37,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts the incision on [target]'s [affected.name] with \the [tool].", \
"You start the incision on [target]'s [affected.name] with \the [tool].")
- target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!",1)
+ target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!")
..()
/datum/surgery_step/generic/cut_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -71,7 +71,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].", \
"You start clamping bleeders in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("The pain in your [affected.name] is maddening!",1)
+ target.custom_pain("The pain in your [affected.name] is maddening!")
..()
/datum/surgery_step/generic/clamp_bleeders/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -111,7 +111,7 @@
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
user.visible_message(msg, self_msg)
- target.custom_pain("It feels like the skin on your [affected.name] is on fire!",1)
+ target.custom_pain("It feels like the skin on your [affected.name] is on fire!")
..()
/datum/surgery_step/generic/retract_skin/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -160,7 +160,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool]." , \
"You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Your [affected.name] is being burned!",1)
+ target.custom_pain("Your [affected.name] is being burned!")
..()
/datum/surgery_step/generic/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -219,7 +219,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to amputate [target]'s [affected.name] with \the [tool]." , \
"You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].")
- target.custom_pain("Your [affected.amputation_point] is being ripped apart!",1)
+ target.custom_pain("Your [affected.amputation_point] is being ripped apart!")
..()
/datum/surgery_step/generic/amputate/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 7518cc701af..c36df974ea3 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -45,7 +45,7 @@
I = locate(/obj/item/implant) in target
user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \
"You start poking around inside [target]'s [affected.name] with \the [tool]." )
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ target.custom_pain("The pain in your [affected.name] is living hell!")
..()
/datum/surgery_step/extract_implant/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index d98e40700df..bdc5f763442 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -66,7 +66,7 @@
if(!holder || (holder in src))
return
- owner.visible_message("[owner] retracts [holder] back into \his [parent_organ == "r_arm" ? "right" : "left"] arm.",
+ owner.visible_message("[owner] retracts [holder] back into [owner.p_their()] [parent_organ == "r_arm" ? "right" : "left"] arm.",
"[holder] snaps back into your [parent_organ == "r_arm" ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
@@ -114,7 +114,7 @@
if(parent_organ == "r_arm" ? owner.hand : !owner.hand)
owner.swap_hand()
- owner.visible_message("[owner] extends [holder] from \his [parent_organ == "r_arm" ? "right" : "left"] arm.",
+ owner.visible_message("[owner] extends [holder] from [owner.p_their()] [parent_organ == "r_arm" ? "right" : "left"] arm.",
"You extend [holder] from your [parent_organ == "r_arm" ? "right" : "left"] arm.",
"You hear a short mechanical noise.")
playsound(get_turf(owner), 'sound/mecha/mechmove03.ogg', 50, 1)
@@ -242,7 +242,7 @@
/obj/item/organ/internal/cyberimp/arm/surgery
name = "surgical toolset implant"
desc = "A set of surgical tools hidden behind a concealed panel on the user's arm"
- contents = newlist(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/bonegel, /obj/item/FixOVein, /obj/item/bonesetter)
+ contents = newlist(/obj/item/retractor/augment, /obj/item/hemostat/augment, /obj/item/cautery/augment, /obj/item/surgicaldrill/augment, /obj/item/scalpel/augment, /obj/item/circular_saw/augment, /obj/item/bonegel/augment, /obj/item/FixOVein/augment, /obj/item/bonesetter/augment)
origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3"
// lets make IPCs even *more* vulnerable to EMPs!
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 0af7781eee4..5837fab5925 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -30,6 +30,7 @@
var/sterile = FALSE //can the organ be infected by germs?
var/tough = FALSE //can organ be easily damaged?
var/emp_proof = FALSE //is the organ immune to EMPs?
+ var/hidden_pain = FALSE //will it skip pain messages?
/obj/item/organ/Destroy()
@@ -232,7 +233,7 @@
if(owner && parent_organ && amount > 0)
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if(parent && !silent)
- owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
+ owner.custom_pain("Something inside your [parent.name] hurts a lot.")
//check if we've hit max_damage
if(damage >= max_damage)
@@ -289,7 +290,7 @@
return
if(owner && robotic == 2)
Stop() // In the name of looooove~!
- owner.visible_message("[owner] clutches their chest and gasps!","You clutch your chest in pain!")
+ owner.visible_message("[owner] clutches [owner.p_their()] chest and gasps!","You clutch your chest in pain!")
else if(owner && robotic == 1)
receive_damage(11,1)
@@ -306,7 +307,7 @@
processing_objects |= src
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
- add_attack_logs(user, owner, "Removed vital organ ([src])", !!user)
+ add_attack_logs(user, owner, "Removed vital organ ([src])", !!user ? ATKLOG_FEW : ATKLOG_ALL)
owner.death()
owner = null
return src
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index 0ebf08c225c..960ce7c0da1 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -172,7 +172,7 @@
owner.emote("scream") //getting hit on broken hand hurts
if(status & ORGAN_SPLINTED && prob((brute + burn)*4)) //taking damage to splinted limbs removes the splints
status &= ~ORGAN_SPLINTED
- owner.visible_message("The splint on [owner]'s left arm unravels from their [name]!","The splint on your [name] unravels!")
+ owner.visible_message("The splint on [owner]'s left arm unravels from [owner.p_their()] [name]!","The splint on your [name] unravels!")
owner.handle_splints()
if(used_weapon)
add_autopsy_data("[used_weapon]", brute + burn)
@@ -239,7 +239,6 @@
#undef LIMB_SHARP_THRESH_INT_DMG
#undef LIMB_THRESH_INT_DMG
#undef LIMB_DMG_PROB
-#undef LIMB_NO_BONE_DMG_PROB
/obj/item/organ/external/proc/heal_damage(brute, burn, internal = 0, robo_repair = 0)
if(status & ORGAN_ROBOT && !robo_repair)
@@ -273,8 +272,7 @@ This function completely restores a damaged organ to perfect condition.
burn_dam = 0
open = 0 //Closing all wounds.
internal_bleeding = FALSE
- if(istype(src, /obj/item/organ/external/head) && disfigured) //If their head's disfigured, refigure it.
- disfigured = 0
+ disfigured = FALSE
// handle internal organs
for(var/obj/item/organ/internal/current_organ in internal_organs)
@@ -409,7 +407,7 @@ Note that amputating the affected organ does in fact remove the infection from t
var/local_damage = brute_dam + damage
if(damage > 15 && local_damage > 30 && prob(damage) && !(status & ORGAN_ROBOT))
internal_bleeding = TRUE
- owner.custom_pain("You feel something rip in your [name]!", 1)
+ owner.custom_pain("You feel something rip in your [name]!")
// new damage icon system
// returns just the brute/burn damage code
@@ -442,7 +440,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return
if(owner.step_count >= splinted_count + SPLINT_LIFE)
status &= ~ORGAN_SPLINTED //oh no, we actually need surgery now!
- owner.visible_message("[owner] screams in pain as their splint pops off their [name]!","You scream in pain as your splint pops off your [name]!")
+ owner.visible_message("[owner] screams in pain as [owner.p_their()] splint pops off their [name]!","You scream in pain as your splint pops off your [name]!")
owner.emote("scream")
owner.Stun(2)
owner.handle_splints()
@@ -737,19 +735,14 @@ Note that amputating the affected organ does in fact remove the infection from t
qdel(spark_system)
qdel(src)
-/obj/item/organ/external/proc/disfigure(var/type = "brute")
+/obj/item/organ/external/proc/disfigure()
if(disfigured)
return
if(owner)
- if(type == "brute")
- owner.visible_message("You hear a sickening cracking sound coming from \the [owner]'s [name].", \
- "Your [name] becomes a mangled mess!", \
- "You hear a sickening crack.")
- else
- owner.visible_message("\The [owner]'s [name] melts away, turning into mangled mess!", \
- "Your [name] melts away!", \
- "You hear a sickening sizzle.")
- disfigured = 1
+ owner.visible_message("You hear a sickening sound coming from \the [owner]'s [name] as it turns into a mangled mess!", \
+ "Your [name] becomes a mangled mess!", \
+ "You hear a sickening sound.")
+ disfigured = TRUE
/obj/item/organ/external/is_primary_organ(var/mob/living/carbon/human/O = null)
if(isnull(O))
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index d107c7439c6..e3386aef1b3 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -1,41 +1,28 @@
-mob/var/list/pain_stored = list()
-mob/var/last_pain_message = ""
-mob/var/next_pain_time = 0
+/mob/living/carbon/human
+ var/last_pain_message = ""
+ var/next_pain_time = 0
// partname is the name of a body part
// amount is a num from 1 to 100
-mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0)
- if(stat >= 2) return
+/mob/living/carbon/human/proc/pain(partname, amount)
+ if(stat >= UNCONSCIOUS)
+ return
if(reagents.has_reagent("sal_acid"))
return
if(reagents.has_reagent("morphine"))
return
if(reagents.has_reagent("hydrocodone"))
return
- if(world.time < next_pain_time && !force)
+ if(world.time < next_pain_time)
return
- if(amount > 10 && istype(src,/mob/living/carbon/human))
- if(paralysis)
- AdjustParalysis(-round(amount/10))
- if(amount > 50 && prob(amount / 5))
- src:drop_item()
var/msg
- if(burning)
- switch(amount)
- if(1 to 10)
- msg = "Your [partname] burns."
- if(11 to 90)
- msg = "Your [partname] burns badly!"
- if(91 to 10000)
- msg = "OH GOD! Your [partname] is on fire!"
- else
- switch(amount)
- if(1 to 10)
- msg = "Your [partname] hurts."
- if(11 to 90)
- msg = "Your [partname] hurts badly."
- if(91 to 10000)
- msg = "OH GOD! Your [partname] is hurting terribly!"
+ switch(amount)
+ if(1 to 10)
+ msg = "Your [partname] hurts."
+ if(11 to 90)
+ msg = "Your [partname] hurts badly."
+ if(91 to INFINITY)
+ msg = "OH GOD! Your [partname] is hurting terribly!"
if(msg && (msg != last_pain_message || prob(10)))
last_pain_message = msg
to_chat(src, msg)
@@ -43,20 +30,18 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
// message is the custom message to be displayed
-// flash_strength is 0 for weak pain flash, 1 for strong pain flash
-mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
- if(stat >= 1) return
+mob/living/carbon/human/proc/custom_pain(message)
+ if(stat >= UNCONSCIOUS)
+ return
if(NO_PAIN in species.species_traits)
return
-
if(reagents.has_reagent("morphine"))
return
if(reagents.has_reagent("hydrocodone"))
return
- var/msg = "[message]"
- if(flash_strength >= 1)
- msg = "[message]"
+
+ var/msg = "[message]"
// Anti message spam checks
if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time)))
@@ -67,70 +52,33 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
mob/living/carbon/human/proc/handle_pain()
// not when sleeping
- if(NO_PAIN in species.species_traits)
- //While synthetics don't feel pain, they will notice their gears gunking up with residue (toxins)
- if(isSynthetic())
- var/toxDamageMessage = null
- var/toxMessageProb = 1
- switch(getToxLoss())
- if(25 to 50)
- toxMessageProb = 1
- toxDamageMessage = "Your servos seem to be working harder."
- if(50 to 75)
- toxMessageProb = 2
- toxDamageMessage = "Your joints seem to stick randomly."
- if(75 to INFINITY)
- toxMessageProb = 5
- toxDamageMessage = "Your motors seem to slip; it really grinds your gears!"
- if(toxDamageMessage && prob(toxMessageProb))
- src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
+ if(stat >= UNCONSCIOUS)
+ return
+ if(NO_PAIN in species.species_traits)
return
-
- if(stat >= 2) return
if(reagents.has_reagent("morphine"))
return
if(reagents.has_reagent("hydrocodone"))
return
+
var/maxdam = 0
var/obj/item/organ/external/damaged_organ = null
for(var/obj/item/organ/external/E in bodyparts)
- if(E.status & ORGAN_DEAD|ORGAN_ROBOT) continue
+ if((E.status & ORGAN_DEAD|ORGAN_ROBOT) || E.hidden_pain)
+ continue
var/dam = E.get_damage()
// make the choice of the organ depend on damage,
// but also sometimes use one of the less damaged ones
- if(dam > maxdam && (maxdam == 0 || prob(70)) )
+ if(dam > maxdam && (maxdam == 0 || prob(70)))
damaged_organ = E
maxdam = dam
if(damaged_organ)
- pain(damaged_organ.name, maxdam, 0)
-
+ pain(damaged_organ.name, maxdam)
// Damage to internal organs hurts a lot.
for(var/obj/item/organ/internal/I in internal_organs)
- if(istype(I, /obj/item/organ/internal/brain)) //the brain has no pain receptors, and brain damage is meant to be a stealthy damage type.
+ if(I.hidden_pain)
continue
- if(I.damage > 2) if(prob(2))
+ if(I.damage > 2 && prob(2))
var/obj/item/organ/external/parent = get_organ(I.parent_organ)
- src.custom_pain("You feel a sharp pain in your [parent.limb_name]", 1)
-
- var/toxDamageMessage = null
- var/toxMessageProb = 1
- switch(getToxLoss())
- if(1 to 5)
- toxMessageProb = 1
- toxDamageMessage = "Your body stings slightly."
- if(6 to 10)
- toxMessageProb = 2
- toxDamageMessage = "Your whole body hurts a little."
- if(11 to 15)
- toxMessageProb = 2
- toxDamageMessage = "Your whole body hurts."
- if(15 to 25)
- toxMessageProb = 3
- toxDamageMessage = "Your whole body hurts badly."
- if(26 to INFINITY)
- toxMessageProb = 5
- toxDamageMessage = "Your body aches all over, it's driving you mad."
-
- if(toxDamageMessage && prob(toxMessageProb))
- src.custom_pain(toxDamageMessage, getToxLoss() >= 15)
+ custom_pain("You feel a sharp pain in your [parent.limb_name]")
\ No newline at end of file
diff --git a/code/modules/surgery/organs/parasites.dm b/code/modules/surgery/organs/parasites.dm
index 0adca48bfd0..900e60d9806 100644
--- a/code/modules/surgery/organs/parasites.dm
+++ b/code/modules/surgery/organs/parasites.dm
@@ -82,7 +82,7 @@
// Actually, let's make it slightly worse... just to discourage people from bringing back infections.
alternate_ending = 1
to_chat(owner,"The shapes extend tendrils out of your wound... no... those are legs! SPIDER LEGS! You have spiderlings growing inside you! You scratch at the wound, but it just aggrivates them - they swarm out of the wound, biting you all over!")
- owner.visible_message("[owner] flails around on the floor as spiderlings erupt from their skin and swarm all over them! ")
+ owner.visible_message("[owner] flails around on the floor as spiderlings erupt from [owner.p_their()] skin and swarm all over them! ")
owner.Stun(20)
owner.Weaken(20)
// yes, this is a long stun - that's intentional. Gotta give the spiderlings time to escape.
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 3fd8effd56a..30c4e173cdc 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -211,11 +211,8 @@
/obj/item/organ/external/head/receive_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE)
..(brute, burn, sharp, used_weapon, forbidden_limbs, ignore_resists)
if(!disfigured)
- if(brute_dam > 40)
- if(prob(50))
- disfigure("brute")
- if(burn_dam > 40)
- disfigure("burn")
+ if(brute_dam + burn_dam > 50)
+ disfigure()
/obj/item/organ/external/head/proc/handle_alt_icon()
if(alt_head && alt_heads_list[alt_head])
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 1af925c3166..4c0094592e9 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -116,7 +116,7 @@
if(affected)
user.visible_message("[user] starts transplanting [tool] into [target]'s [affected.name].", \
"You start transplanting [tool] into [target]'s [affected.name].")
- H.custom_pain("Someone's rooting around in your [affected.name]!",1)
+ H.custom_pain("Someone's rooting around in your [affected.name]!")
else
user.visible_message("[user] starts transplanting [tool] into [target]'s [parse_zone(target_zone)].", \
"You start transplanting [tool] into [target]'s [parse_zone(target_zone)].")
@@ -143,7 +143,7 @@
self_msg = "You begin injecting [tool] into [target]'s [I.name]."
user.visible_message(msg, self_msg)
if(H && affected)
- H.custom_pain("Something burns horribly in your [affected.name]!",1)
+ H.custom_pain("Something burns horribly in your [affected.name]!")
else if(implement_type in implements_finsh)
//same as surgery step /datum/surgery_step/open_encased/close/
@@ -159,7 +159,7 @@
user.visible_message(msg, self_msg)
if(H && affected)
- H.custom_pain("Something hurts horribly in your [affected.name]!",1)
+ H.custom_pain("Something hurts horribly in your [affected.name]!")
else if(implement_type in implements_extract)
current_type = "extract"
@@ -188,7 +188,7 @@
user.visible_message("[user] starts to separate [target]'s [I] with [tool].", \
"You start to separate [target]'s [I] with [tool] for removal." )
if(H && affected)
- H.custom_pain("The pain in your [affected.name] is living hell!",1)
+ H.custom_pain("The pain in your [affected.name] is living hell!")
else
return -1
@@ -221,7 +221,7 @@
to_chat(user, "[I] does not appear to be damaged.")
if(affected)
- H.custom_pain("The pain in your [affected.name] is living hell!", 1)
+ H.custom_pain("The pain in your [affected.name] is living hell!")
else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ))
to_chat(user, "[tool] was bitten by someone! It's too damaged to use!")
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 012f7ad3c5b..455a6a8de04 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -80,7 +80,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.name] with \the [tool]." , \
"You start patching the damaged vein in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("The pain in [affected.name] is unbearable!",1)
+ target.custom_pain("The pain in [affected.name] is unbearable!")
..()
/datum/surgery_step/fix_vein/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -133,7 +133,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts cutting away necrotic tissue in [target]'s [affected.name] with \the [tool]." , \
"You start cutting away necrotic tissue in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("The pain in [affected.name] is unbearable!",1)
+ target.custom_pain("The pain in [affected.name] is unbearable!")
..()
/datum/surgery_step/fix_dead_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -191,7 +191,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] starts applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \
"You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1)
+ target.custom_pain("Something in your [affected.name] is causing you a lot of pain!")
..()
/datum/surgery_step/treat_necrosis/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -241,7 +241,7 @@
//////////////////////////////////////////////////////////////////
/datum/surgery/remove_thrall
name = "Remove Shadow Tumor"
- steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,/datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/dethrall, /datum/surgery_step/glue_bone, /datum/surgery_step/set_bone,/datum/surgery_step/finish_bone,/datum/surgery_step/generic/cauterize)
+ steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/internal/dethrall, /datum/surgery_step/generic/cauterize)
possible_locs = list("head", "chest", "groin")
/datum/surgery/remove_thrall/synth
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
new file mode 100644
index 00000000000..4d14d2e8a79
--- /dev/null
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -0,0 +1,56 @@
+/datum/surgery/plastic_surgery
+ name = "Plastic Surgery"
+ steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/reshape_face, /datum/surgery_step/generic/cauterize)
+ possible_locs = list("head")
+
+/datum/surgery/plastic_surgery/can_start(mob/user, mob/living/carbon/target)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/organ/external/head/head = H.get_organ(user.zone_sel.selecting)
+ if(!head)
+ return FALSE
+ if(head.status & ORGAN_ROBOT)
+ return FALSE
+ return TRUE
+
+
+/datum/surgery_step/reshape_face
+ name = "reshape face"
+ allowed_tools = list(/obj/item/scalpel = 100, /obj/item/kitchen/knife = 50, /obj/item/wirecutters = 35)
+ time = 64
+
+/datum/surgery_step/reshape_face/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...")
+
+/datum/surgery_step/reshape_face/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ var/obj/item/organ/external/head/head = target.get_organ(target_zone)
+ var/species_names = target.get_species()
+ if(head.disfigured)
+ head.disfigured = FALSE
+ user.visible_message("[user] successfully restores [target]'s appearance!", "You successfully restore [target]'s appearance.")
+ else
+ var/list/names = list()
+ if(!isabductor(user))
+ for(var/i in 1 to 10)
+ names += random_name(target.gender, species_names)
+ else
+ for(var/_i in 1 to 9)
+ names += "Subject [target.gender == MALE ? "i" : "o"]-[pick("a", "b", "c", "d", "e")]-[rand(10000, 99999)]"
+ names += random_name(target.gender, species_names) //give one normal name in case they want to do regular plastic surgery
+ var/chosen_name = input(user, "Choose a new name to assign.", "Plastic Surgery") as null|anything in names
+ if(!chosen_name)
+ return
+ var/oldname = target.real_name
+ target.real_name = chosen_name
+ var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name
+ user.visible_message("[user] alters [oldname]'s appearance completely, [target.p_they()] [target.p_are()] now [newname]!", "You alter [oldname]'s appearance completely, [target.p_they()] [target.p_are()] now [newname].")
+ target.sec_hud_set_ID()
+ return TRUE
+
+
+/datum/surgery_step/reshape_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ var/obj/item/organ/external/head/head = target.get_organ(target_zone)
+ user.visible_message(" [user]'s hand slips, tearing skin on [target]'s face with [tool]!", \
+ " Your hand slips, tearing skin on [target]'s face with [tool]!")
+ target.apply_damage(10, BRUTE, head, sharp = TRUE)
+ return FALSE
\ No newline at end of file
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 58b570eb5e3..ed82328c47d 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -248,10 +248,7 @@
user.visible_message(" [user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \
" You finish patching damage to [target]'s [affected.name] with \the [tool].")
affected.heal_damage(rand(30,50),0,1,1)
- if(affected.disfigured)
- affected.disfigured = 0
- affected.update_icon()
- target.regenerate_icons()
+ affected.disfigured = FALSE
if("burn")
user.visible_message(" [user] finishes splicing cable into [target]'s [affected.name].", \
" You finishes splicing new cable into [target]'s [affected.name].")
@@ -325,7 +322,7 @@
user.visible_message("[user] begins reattaching [target]'s [tool].", \
"You start reattaching [target]'s [tool].")
- target.custom_pain("Someone's rooting around in your [affected.name]!",1)
+ target.custom_pain("Someone's rooting around in your [affected.name]!")
else if(istype(tool,/obj/item/mmi))
current_type = "install"
@@ -386,7 +383,7 @@
user.visible_message("[user] starts to decouple [target]'s [I] with \the [tool].", \
"You start to decouple [target]'s [I] with \the [tool]." )
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ target.custom_pain("The pain in your [affected.name] is living hell!")
else
return -1
@@ -407,7 +404,7 @@
to_chat(user, "There are no damaged components in [affected].")
return -1
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ target.custom_pain("The pain in your [affected.name] is living hell!")
else if(implement_type in implements_finish)
current_type = "finish"
@@ -522,7 +519,7 @@
user.visible_message("[user] starts to decouple [target]'s [affected.name] with \the [tool].", \
"You start to decouple [target]'s [affected.name] with \the [tool]." )
- target.custom_pain("Your [affected.amputation_point] is being ripped apart!",1)
+ target.custom_pain("Your [affected.amputation_point] is being ripped apart!")
..()
/datum/surgery_step/robotics/external/amputate/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm
index ced21be08b4..77614d41430 100644
--- a/code/modules/surgery/slime.dm
+++ b/code/modules/surgery/slime.dm
@@ -98,6 +98,6 @@
return 1
/datum/surgery_step/slime/saw_core/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool)
- user.visible_message(" [user]'s hand slips, causing \him to miss the core!", \
+ user.visible_message(" [user]'s hand slips, causing [user.p_them()] to miss the core!", \
" Your hand slips, causing you to miss the core!")
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 85880048f9b..53691dd0264 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -8,6 +8,10 @@
w_class = WEIGHT_CLASS_SMALL
origin_tech = "materials=1;biotech=1"
+/obj/item/retractor/augment
+ desc = "Micro-mechanical manipulator for retracting stuff."
+ w_class = WEIGHT_CLASS_TINY
+ toolspeed = 0.5
/obj/item/hemostat
name = "hemostat"
@@ -20,6 +24,9 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "pinched")
+/obj/item/hemostat/augment
+ desc = "Tiny servos power a pair of pincers to stop bleeding."
+ toolspeed = 0.5
/obj/item/cautery
name = "cautery"
@@ -32,6 +39,9 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("burnt")
+/obj/item/cautery/augment
+ desc = "A heated element that cauterizes wounds."
+ toolspeed = 0.5
/obj/item/surgicaldrill
name = "surgical drill"
@@ -48,10 +58,16 @@
attack_verb = list("drilled")
suicide_act(mob/user)
- to_chat(viewers(user), pick("[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.",
- "[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide."))
+ to_chat(viewers(user), pick("[user] is pressing [src] to [user.p_their()] temple and activating it! It looks like [user.p_theyre()] trying to commit suicide.",
+ "[user] is pressing [src] to [user.p_their()] chest and activating it! It looks like [user.p_theyre()] trying to commit suicide."))
return (BRUTELOSS)
+/obj/item/surgicaldrill/augment
+ desc = "Effectively a small power drill contained within your arm, edges dulled to prevent tissue damage. May or may not pierce the heavens."
+ hitsound = 'sound/weapons/circsawhit.ogg'
+ force = 10
+ w_class = WEIGHT_CLASS_SMALL
+ toolspeed = 0.5
/obj/item/scalpel
name = "scalpel"
@@ -72,12 +88,16 @@
hitsound = 'sound/weapons/bladeslice.ogg'
suicide_act(mob/user)
- to_chat(viewers(user), pick("[user] is slitting \his wrists with [src]! It looks like \he's trying to commit suicide.",
- "[user] is slitting \his throat with [src]! It looks like \he's trying to commit suicide.",
- "[user] is slitting \his stomach open with [src]! It looks like \he's trying to commit seppuku."))
+ to_chat(viewers(user), pick("[user] is slitting [user.p_their()] wrists with [src]! It looks like [user.p_theyre()] trying to commit suicide.",
+ "[user] is slitting [user.p_their()] throat with [src]! It looks like [user.p_theyre()] trying to commit suicide.",
+ "[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku."))
return (BRUTELOSS)
+/obj/item/scalpel/augment
+ desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy."
+ toolspeed = 0.5
+
/*
* Researchable Scalpels
*/
@@ -129,6 +149,12 @@
origin_tech = "biotech=1;combat=1"
attack_verb = list("attacked", "slashed", "sawed", "cut")
+/obj/item/circular_saw/augment
+ desc = "A small but very fast spinning saw. Edges dulled to prevent accidental cutting inside of the surgeon."
+ force = 10
+ w_class = WEIGHT_CLASS_SMALL
+ toolspeed = 0.5
+
//misc, formerly from code/defines/weapons.dm
/obj/item/bonegel
name = "bone gel"
@@ -139,6 +165,9 @@
throwforce = 1.0
origin_tech = "materials=1;biotech=1"
+/obj/item/bonegel/augment
+ toolspeed = 0.5
+
/obj/item/FixOVein
name = "FixOVein"
icon = 'icons/obj/surgery.dmi'
@@ -148,6 +177,9 @@
origin_tech = "materials=1;biotech=1"
w_class = WEIGHT_CLASS_SMALL
+/obj/item/FixOVein/augment
+ toolspeed = 0.5
+
/obj/item/bonesetter
name = "bone setter"
icon = 'icons/obj/surgery.dmi'
@@ -160,6 +192,9 @@
attack_verb = list("attacked", "hit", "bludgeoned")
origin_tech = "materials=1;biotech=1"
+/obj/item/bonesetter/augment
+ toolspeed = 0.5
+
/obj/item/surgical_drapes
name = "surgical drapes"
desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control."
diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt
index a962b4b685c..563768b69bc 100644
--- a/config/example/dbconfig.txt
+++ b/config/example/dbconfig.txt
@@ -9,7 +9,7 @@
## This value must be set to the version of the paradise schema in use.
## If this value does not match, the SQL database will not be loaded and an error will be generated.
## Roundstart will be delayed.
-DB_VERSION 2
+DB_VERSION 4
## Server the MySQL database can be found at.
# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
@@ -26,11 +26,11 @@ FEEDBACK_DATABASE feedback
## Note, this does not change the table names in the database, you will have to do that yourself.
## IE:
## FEEDBACK_TABLEPREFIX erro_
-## FEEDBACK_TABLEPREFIX
+## FEEDBACK_TABLEPREFIX
## FEEDBACK_TABLEPREFIX SS13_
##
## Leave as is if you are using the standard schema file.
-FEEDBACK_TABLEPREFIX
+FEEDBACK_TABLEPREFIX
## Username/Login used to access the database.
FEEDBACK_LOGIN username
diff --git a/config/example/jobs_highpop.txt b/config/example/jobs_highpop.txt
new file mode 100644
index 00000000000..962803ab886
--- /dev/null
+++ b/config/example/jobs_highpop.txt
@@ -0,0 +1,37 @@
+Captain=1
+Head of Personnel=1
+Head of Security=1
+Chief Engineer=1
+Research Director=1
+Chief Medical Officer=1
+
+Station Engineer=5
+Roboticist=1
+
+Medical Doctor=5
+Geneticist=2
+Virologist=1
+
+Scientist=3
+Chemist=2
+
+Bartender=1
+Botanist=2
+Chef=1
+Janitor=1
+Quartermaster=1
+Shaft Miner=3
+
+Warden=1
+Detective=1
+Security Officer=7
+
+Assistant=-1
+Atmospheric Technician=4
+Cargo Technician=3
+Chaplain=1
+Lawyer=2
+Librarian=1
+
+AI=1
+Cyborg=1
\ No newline at end of file
diff --git a/config/example/tos.txt b/config/example/tos.txt
new file mode 100644
index 00000000000..eb43c50a083
--- /dev/null
+++ b/config/example/tos.txt
@@ -0,0 +1,3 @@
+
Welcome to Space Station 13!
+
+Terms of service goes here.
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 0a6ad665b97..7f3d57e8808 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,144 @@
-->
+
17 June 2018
+
Fox McCloud updated:
+
+
Fixes wizards not spawning with their clothes and backpack
+
It no longer snows on away missions
+
+
variableundefined updated:
+
+
Nuclear challenge time limit now depends on round start time.
+
+
+
13 June 2018
+
Aurorablade updated:
+
+
Fluff for Panzerskull
+
+
Fox McCloud updated:
+
+
Medibots now actually talk, like beepsky
+
Adds Plastic surgery; fix someone's face or give them a new identity!
+
Having more than 50 cloneloss will render you "Unknown"
+
head disfigurement requires you to have more than 50 combined brute and burn damage, rather than tracking it separately
+
Fixes Cryoxadone and Rezadone not fixing disfigurement, Fixes fluorosulfuric acid not causing disfigurement at proper thresholds
+
Fixes syndicate medibot not being constructable from tactical medkits
+
Syndicate medibot and the mysterious medibot are better at treating brute and burn damage
+
Radiation event reworked; graphics updated--effects may be a bit more deadly
+
Buffed DIY chainsaws damage slightly
+
You now flip about when you spin with a double e-sword
+
Adds surgical augment to R&D
+
Tools on surgical augment are slightly faster at surgery
+
Wishgranter grants "Avatar of the Wishgranter" instead of making you a superhero
+
Toxin damage is stealthier and will no longer cause stinging spam message
+
+
Kyep updated:
+
+
Additional job slots are now available at 80+ server population.
+
+
MINIMAN10000 updated:
+
+
Airlock electronics lock
+
Airlock electronics close button
+
+
Piccione updated:
+
+
Added Magboots to the Paramedic's EVA gear closet
+
+
Tayyyyyyy updated:
+
+
Shadowling dethrall has been shortened to scalpel, hemostat, retractor, shine light, cautery
+
+
+
11 June 2018
+
FalseIncarnate updated:
+
+
Food on utensils now properly inherits the name of the source dish.
+
Joined Souls rune can now properly can summon restrained targets with 3+ invokers.
+
+
+
09 June 2018
+
Fox McCloud updated:
+
+
Fixes holobarrier icons being missing
+
+
+
08 June 2018
+
Alffd updated:
+
+
Adds an automated emergency var on air alarms for mappers
+
+
Anasari updated:
+
+
Fixes admin log for spray displaying (0,0,0) all the time.
+
+
Desolate updated:
+
+
ED-209 code corrected to work properly. Floorbot code corrected to work properly.
+
+
and Dumbdumb updated:
+
+
Unathi and Vox Sec Hardsuit update
+
+
+
05 June 2018
+
Kyep updated:
+
+
The Terror Spider away mission now has spiders colonizing the west side of the map. Only the gateway room is safe.
+
+
+
04 June 2018
+
Fox McCloud updated:
+
+
Hulk mutation no longer works at range (ie: punching/breaking windows/walls at range)
+
You must be on harm intent to damage things if you have hulk
+
Having hulk allows you to punch and damage just about anything
+
+
uraniummeltdown updated:
+
+
You can smelt titanium and glass together to form titanium glass for building shuttle windows
+
You can smelt titanium, plasma and glass together to form plastitanium glass for building plastitanium windows
+
Fulltile windows now smooth, windows crack as they get damaged and can be repaired with help intent welder
+
Windows have deconstruction hints and show whether they can be rotated or not
+
Plasma glass no longer gets auto-colored
+
RCDs can deconstruct airlocks again, they have no force now though
+
Wielded fireaxe does a lot of damage to windows and grilles instead of just deleting them
+
Glass stacks now use stack recipes instead of a custom menu
+
+
+
31 May 2018
+
FalseIncarnate updated:
+
+
The singulo no longer feeds on attention.
+
+
+
26 May 2018
+
Birdtalon updated:
+
+
Holoparasite guide updated to include newer models. Small tooltip added for charger models.
+
laser tag gun projectiles now play appropriate sound when striking.
+
+
Citinited updated:
+
+
Hopefully fixes all issues with disposals sending you to nullspace.
+
+
Fox McCloud updated:
+
+
Fixes not being able to propel yourself through space by farting if you possessed both superfart and toxic farts
+
+
Kyep and Bxil updated:
+
+
Prevents everyone and their mother from seeing through closed poddoors.
+
+
Tayyyyyyy updated:
+
+
Most things will now use the correct pronouns.
+
Newscasters properly check for feed channel creation and wanted issue creation
+
ERT should deploy properly without admins now.
+
+
19 May 2018
Aurorablade updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index f3142451491..15d5824d09f 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6420,3 +6420,103 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Unarmed attacks now have their own icons, as does disarming.
- rscadd: Various mobs have their own custom icon attacks
- tweak: Monkies now bite!
+2018-05-26:
+ Birdtalon:
+ - tweak: Holoparasite guide updated to include newer models. Small tooltip added
+ for charger models.
+ - bugfix: laser tag gun projectiles now play appropriate sound when striking.
+ Citinited:
+ - bugfix: Hopefully fixes all issues with disposals sending you to nullspace.
+ Fox McCloud:
+ - bugfix: Fixes not being able to propel yourself through space by farting if you
+ possessed both superfart and toxic farts
+ Kyep and Bxil:
+ - bugfix: Prevents everyone and their mother from seeing through closed poddoors.
+ Tayyyyyyy:
+ - rscadd: Most things will now use the correct pronouns.
+ - bugfix: Newscasters properly check for feed channel creation and wanted issue
+ creation
+ - bugfix: ERT should deploy properly without admins now.
+2018-05-31:
+ FalseIncarnate:
+ - bugfix: The singulo no longer feeds on attention.
+2018-06-04:
+ Fox McCloud:
+ - bugfix: 'Hulk mutation no longer works at range (ie: punching/breaking windows/walls
+ at range)'
+ - tweak: You must be on harm intent to damage things if you have hulk
+ - rscadd: Having hulk allows you to punch and damage just about anything
+ uraniummeltdown:
+ - rscadd: You can smelt titanium and glass together to form titanium glass for building
+ shuttle windows
+ - rscadd: You can smelt titanium, plasma and glass together to form plastitanium
+ glass for building plastitanium windows
+ - rscadd: Fulltile windows now smooth, windows crack as they get damaged and can
+ be repaired with help intent welder
+ - rscadd: Windows have deconstruction hints and show whether they can be rotated
+ or not
+ - bugfix: Plasma glass no longer gets auto-colored
+ - bugfix: RCDs can deconstruct airlocks again, they have no force now though
+ - tweak: Wielded fireaxe does a lot of damage to windows and grilles instead of
+ just deleting them
+ - tweak: Glass stacks now use stack recipes instead of a custom menu
+2018-06-05:
+ Kyep:
+ - bugfix: The Terror Spider away mission now has spiders colonizing the west side
+ of the map. Only the gateway room is safe.
+2018-06-08:
+ Alffd:
+ - rscadd: Adds an automated emergency var on air alarms for mappers
+ Anasari:
+ - bugfix: Fixes admin log for spray displaying (0,0,0) all the time.
+ Desolate:
+ - bugfix: ED-209 code corrected to work properly. Floorbot code corrected to work
+ properly.
+ and Dumbdumb:
+ - rscadd: Unathi and Vox Sec Hardsuit update
+2018-06-09:
+ Fox McCloud:
+ - bugfix: Fixes holobarrier icons being missing
+2018-06-11:
+ FalseIncarnate:
+ - bugfix: Food on utensils now properly inherits the name of the source dish.
+ - bugfix: Joined Souls rune can now properly can summon restrained targets with
+ 3+ invokers.
+2018-06-13:
+ Aurorablade:
+ - rscadd: Fluff for Panzerskull
+ Fox McCloud:
+ - rscadd: Medibots now actually talk, like beepsky
+ - rscadd: Adds Plastic surgery; fix someone's face or give them a new identity!
+ - tweak: Having more than 50 cloneloss will render you "Unknown"
+ - tweak: head disfigurement requires you to have more than 50 combined brute and
+ burn damage, rather than tracking it separately
+ - bugfix: Fixes Cryoxadone and Rezadone not fixing disfigurement, Fixes fluorosulfuric
+ acid not causing disfigurement at proper thresholds
+ - bugfix: Fixes syndicate medibot not being constructable from tactical medkits
+ - tweak: Syndicate medibot and the mysterious medibot are better at treating brute
+ and burn damage
+ - tweak: Radiation event reworked; graphics updated--effects may be a bit more deadly
+ - tweak: Buffed DIY chainsaws damage slightly
+ - tweak: You now flip about when you spin with a double e-sword
+ - rscadd: Adds surgical augment to R&D
+ - tweak: Tools on surgical augment are slightly faster at surgery
+ - rscadd: Wishgranter grants "Avatar of the Wishgranter" instead of making you a
+ superhero
+ - tweak: Toxin damage is stealthier and will no longer cause stinging spam message
+ Kyep:
+ - rscadd: Additional job slots are now available at 80+ server population.
+ MINIMAN10000:
+ - rscdel: Airlock electronics lock
+ - bugfix: Airlock electronics close button
+ Piccione:
+ - rscadd: Added Magboots to the Paramedic's EVA gear closet
+ Tayyyyyyy:
+ - tweak: Shadowling dethrall has been shortened to scalpel, hemostat, retractor,
+ shine light, cautery
+2018-06-17:
+ Fox McCloud:
+ - bugfix: Fixes wizards not spawning with their clothes and backpack
+ - bugfix: It no longer snows on away missions
+ variableundefined:
+ - tweak: Nuclear challenge time limit now depends on round start time.
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 2fdc968ebd6..a5195cc0167 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index fa6f26fefe6..060d8b77a27 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi
index 215cf53556f..da1523706e2 100644
Binary files a/icons/effects/weather_effects.dmi and b/icons/effects/weather_effects.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index f969705ec83..14b099f3f45 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index ebbfa5f9c73..1d0bcf81f27 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/collar.dmi b/icons/mob/species/vox/collar.dmi
index c0b8c6ba936..6c442c62f77 100644
Binary files a/icons/mob/species/vox/collar.dmi and b/icons/mob/species/vox/collar.dmi differ
diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index c9227ce2119..a7186d611b6 100644
Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index ca8289a3ccb..3af770d719a 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index b3f92a3b57f..db92d8c21a6 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index a63ff4f5daa..d1aa0e9805a 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index be2fb4f62aa..1ee46571f66 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index 34c3ea75105..30b590cc7ed 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index 940f2ba25da..8296c4ceb7d 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/doors/windoor.dmi b/icons/obj/doors/windoor.dmi
index 8104686b483..9bf105faaf6 100644
Binary files a/icons/obj/doors/windoor.dmi and b/icons/obj/doors/windoor.dmi differ
diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi
index 22dc1384904..288785052cd 100644
Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index d828f2ee9de..5714fcf4c9f 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/smooth_structures/clockwork_window.dmi b/icons/obj/smooth_structures/clockwork_window.dmi
new file mode 100644
index 00000000000..90309ac3d52
Binary files /dev/null and b/icons/obj/smooth_structures/clockwork_window.dmi differ
diff --git a/icons/obj/smooth_structures/plasma_window.dmi b/icons/obj/smooth_structures/plasma_window.dmi
new file mode 100644
index 00000000000..3d57d156f01
Binary files /dev/null and b/icons/obj/smooth_structures/plasma_window.dmi differ
diff --git a/icons/obj/smooth_structures/plastitanium_window.dmi b/icons/obj/smooth_structures/plastitanium_window.dmi
new file mode 100644
index 00000000000..82ac0306159
Binary files /dev/null and b/icons/obj/smooth_structures/plastitanium_window.dmi differ
diff --git a/icons/obj/smooth_structures/pod_window.dmi b/icons/obj/smooth_structures/pod_window.dmi
new file mode 100644
index 00000000000..0fe7501225c
Binary files /dev/null and b/icons/obj/smooth_structures/pod_window.dmi differ
diff --git a/icons/obj/smooth_structures/reinforced_window.dmi b/icons/obj/smooth_structures/reinforced_window.dmi
index b5f24ebbd30..ed9a2a143e6 100644
Binary files a/icons/obj/smooth_structures/reinforced_window.dmi and b/icons/obj/smooth_structures/reinforced_window.dmi differ
diff --git a/icons/obj/smooth_structures/rice_window.dmi b/icons/obj/smooth_structures/rice_window.dmi
index e3a82935cf2..f5e7a6dd57a 100644
Binary files a/icons/obj/smooth_structures/rice_window.dmi and b/icons/obj/smooth_structures/rice_window.dmi differ
diff --git a/icons/obj/smooth_structures/rplasma_window.dmi b/icons/obj/smooth_structures/rplasma_window.dmi
new file mode 100644
index 00000000000..c64f42c7f5a
Binary files /dev/null and b/icons/obj/smooth_structures/rplasma_window.dmi differ
diff --git a/icons/obj/smooth_structures/shuttle_window.dmi b/icons/obj/smooth_structures/shuttle_window.dmi
index 3db34cf1ba1..85924dc449b 100644
Binary files a/icons/obj/smooth_structures/shuttle_window.dmi and b/icons/obj/smooth_structures/shuttle_window.dmi differ
diff --git a/icons/obj/smooth_structures/tinted_window.dmi b/icons/obj/smooth_structures/tinted_window.dmi
index ab992353275..be9affafeea 100644
Binary files a/icons/obj/smooth_structures/tinted_window.dmi and b/icons/obj/smooth_structures/tinted_window.dmi differ
diff --git a/icons/obj/smooth_structures/window.dmi b/icons/obj/smooth_structures/window.dmi
index 0197f5b20a7..670713bcfe0 100644
Binary files a/icons/obj/smooth_structures/window.dmi and b/icons/obj/smooth_structures/window.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 997642dcf29..d4b8e837db6 100755
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/status_display.dmi b/icons/obj/status_display.dmi
index b131da89349..81ccc415de1 100644
Binary files a/icons/obj/status_display.dmi and b/icons/obj/status_display.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 0b17038ade5..838503bbda1 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 6cf47e457f5..095e5ad2a78 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -77,6 +77,7 @@
#include "code\__HELPERS\matrices.dm"
#include "code\__HELPERS\mobs.dm"
#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\pronouns.dm"
#include "code\__HELPERS\qdel.dm"
#include "code\__HELPERS\sanitize_values.dm"
#include "code\__HELPERS\text.dm"
@@ -197,7 +198,6 @@
#include "code\controllers\Processes\obj.dm"
#include "code\controllers\Processes\shuttles.dm"
#include "code\controllers\Processes\ticker.dm"
-#include "code\controllers\Processes\weather.dm"
#include "code\controllers\ProcessScheduler\core\process.dm"
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
#include "code\controllers\subsystem\air.dm"
@@ -212,6 +212,7 @@
#include "code\controllers\subsystem\sun.dm"
#include "code\controllers\subsystem\throwing.dm"
#include "code\controllers\subsystem\timer.dm"
+#include "code\controllers\subsystem\weather.dm"
#include "code\controllers\subsystem\processing\processing.dm"
#include "code\datums\action.dm"
#include "code\datums\ai_law_sets.dm"
@@ -223,6 +224,7 @@
#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\gas_mixture.dm"
+#include "code\datums\holocall.dm"
#include "code\datums\hud.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
@@ -239,11 +241,6 @@
#include "code\datums\uplink_item.dm"
#include "code\datums\vision_override.dm"
#include "code\datums\vr.dm"
-#include "code\datums\antagonists\antag_datum.dm"
-#include "code\datums\antagonists\antag_helpers.dm"
-#include "code\datums\antagonists\antag_hud.dm"
-#include "code\datums\antagonists\antag_spawner.dm"
-#include "code\datums\antagonists\antag_team.dm"
#include "code\datums\cache\air_alarm.dm"
#include "code\datums\cache\apc.dm"
#include "code\datums\cache\cache.dm"
@@ -316,6 +313,7 @@
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\looping_sounds\looping_sound.dm"
#include "code\datums\looping_sounds\machinery_sounds.dm"
+#include "code\datums\looping_sounds\weather.dm"
#include "code\datums\outfits\outfit.dm"
#include "code\datums\outfits\outfit_admin.dm"
#include "code\datums\ruins\space.dm"
@@ -355,7 +353,10 @@
#include "code\datums\status_effects\status_effect.dm"
#include "code\datums\vr\level.dm"
#include "code\datums\weather\weather.dm"
-#include "code\datums\weather\weather_types.dm"
+#include "code\datums\weather\weather_types\ash_storm.dm"
+#include "code\datums\weather\weather_types\floor_is_lava.dm"
+#include "code\datums\weather\weather_types\radiation_storm.dm"
+#include "code\datums\weather\weather_types\snow_storm.dm"
#include "code\datums\wires\airlock.dm"
#include "code\datums\wires\alarm.dm"
#include "code\datums\wires\apc.dm"
@@ -528,6 +529,7 @@
#include "code\game\jobs\job_controller.dm"
#include "code\game\jobs\job_exp.dm"
#include "code\game\jobs\job_objective.dm"
+#include "code\game\jobs\job_scaling.dm"
#include "code\game\jobs\jobs.dm"
#include "code\game\jobs\whitelist.dm"
#include "code\game\jobs\job\central.dm"
@@ -629,7 +631,6 @@
#include "code\game\machinery\computer\computer.dm"
#include "code\game\machinery\computer\crew.dm"
#include "code\game\machinery\computer\HolodeckControl.dm"
-#include "code\game\machinery\computer\hologram.dm"
#include "code\game\machinery\computer\honkputer.dm"
#include "code\game\machinery\computer\law.dm"
#include "code\game\machinery\computer\medical.dm"
@@ -959,7 +960,6 @@
#include "code\game\objects\structures\false_walls.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\foodcart.dm"
-#include "code\game\objects\structures\fullwindow.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guillotine.dm"
@@ -1135,6 +1135,12 @@
#include "code\modules\alarm\fire_alarm.dm"
#include "code\modules\alarm\motion_alarm.dm"
#include "code\modules\alarm\power_alarm.dm"
+#include "code\modules\antagonists\_common\antag_datum.dm"
+#include "code\modules\antagonists\_common\antag_helpers.dm"
+#include "code\modules\antagonists\_common\antag_hud.dm"
+#include "code\modules\antagonists\_common\antag_spawner.dm"
+#include "code\modules\antagonists\_common\antag_team.dm"
+#include "code\modules\antagonists\wishgranter\wishgranter.dm"
#include "code\modules\arcade\arcade_base.dm"
#include "code\modules\arcade\arcade_prize.dm"
#include "code\modules\arcade\claw_game.dm"
@@ -2105,6 +2111,7 @@
#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\ruins\ruin_areas.dm"
+#include "code\modules\scripting\__defines.dm"
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\Options.dm"
#include "code\modules\scripting\AST\AST Nodes.dm"
@@ -2155,7 +2162,6 @@
#include "code\modules\surgery\cavity_implant.dm"
#include "code\modules\surgery\dental_implant.dm"
#include "code\modules\surgery\encased.dm"
-#include "code\modules\surgery\face.dm"
#include "code\modules\surgery\generic.dm"
#include "code\modules\surgery\helpers.dm"
#include "code\modules\surgery\implant_removal.dm"
@@ -2163,6 +2169,7 @@
#include "code\modules\surgery\limb_reattach.dm"
#include "code\modules\surgery\organs_internal.dm"
#include "code\modules\surgery\other.dm"
+#include "code\modules\surgery\plastic_surgery.dm"
#include "code\modules\surgery\remove_embedded_object.dm"
#include "code\modules\surgery\rig_removal.dm"
#include "code\modules\surgery\robotics.dm"
diff --git a/sound/lavaland/ash_storm_end.ogg b/sound/lavaland/ash_storm_end.ogg
deleted file mode 100644
index f9b01453dda..00000000000
Binary files a/sound/lavaland/ash_storm_end.ogg and /dev/null differ
diff --git a/sound/lavaland/ash_storm_start.ogg b/sound/lavaland/ash_storm_start.ogg
deleted file mode 100644
index 4b9bebffd08..00000000000
Binary files a/sound/lavaland/ash_storm_start.ogg and /dev/null differ
diff --git a/sound/lavaland/ash_storm_windup.ogg b/sound/lavaland/ash_storm_windup.ogg
deleted file mode 100644
index a9f0fa3270e..00000000000
Binary files a/sound/lavaland/ash_storm_windup.ogg and /dev/null differ
diff --git a/sound/voice/mapple.ogg b/sound/voice/mapple.ogg
new file mode 100644
index 00000000000..21e26742ca1
Binary files /dev/null and b/sound/voice/mapple.ogg differ
diff --git a/sound/voice/mcatch.ogg b/sound/voice/mcatch.ogg
new file mode 100644
index 00000000000..07b8aaab75c
Binary files /dev/null and b/sound/voice/mcatch.ogg differ
diff --git a/sound/voice/mcoming.ogg b/sound/voice/mcoming.ogg
new file mode 100644
index 00000000000..d3eb9e467f4
Binary files /dev/null and b/sound/voice/mcoming.ogg differ
diff --git a/sound/voice/mdelicious.ogg b/sound/voice/mdelicious.ogg
new file mode 100644
index 00000000000..5158538580e
Binary files /dev/null and b/sound/voice/mdelicious.ogg differ
diff --git a/sound/voice/mfeelbetter.ogg b/sound/voice/mfeelbetter.ogg
new file mode 100644
index 00000000000..fdbe57fd2e9
Binary files /dev/null and b/sound/voice/mfeelbetter.ogg differ
diff --git a/sound/voice/mflies.ogg b/sound/voice/mflies.ogg
new file mode 100644
index 00000000000..831281ebbee
Binary files /dev/null and b/sound/voice/mflies.ogg differ
diff --git a/sound/voice/mhelp.ogg b/sound/voice/mhelp.ogg
new file mode 100644
index 00000000000..516d5db068d
Binary files /dev/null and b/sound/voice/mhelp.ogg differ
diff --git a/sound/voice/minjured.ogg b/sound/voice/minjured.ogg
new file mode 100644
index 00000000000..0e968b3980c
Binary files /dev/null and b/sound/voice/minjured.ogg differ
diff --git a/sound/voice/minsult.ogg b/sound/voice/minsult.ogg
new file mode 100644
index 00000000000..017292977a1
Binary files /dev/null and b/sound/voice/minsult.ogg differ
diff --git a/sound/voice/mlive.ogg b/sound/voice/mlive.ogg
new file mode 100644
index 00000000000..ceb0dec9a34
Binary files /dev/null and b/sound/voice/mlive.ogg differ
diff --git a/sound/voice/mlost.ogg b/sound/voice/mlost.ogg
new file mode 100644
index 00000000000..7b332ac346a
Binary files /dev/null and b/sound/voice/mlost.ogg differ
diff --git a/sound/voice/mno.ogg b/sound/voice/mno.ogg
new file mode 100644
index 00000000000..030e43a0109
Binary files /dev/null and b/sound/voice/mno.ogg differ
diff --git a/sound/voice/mpatchedup.ogg b/sound/voice/mpatchedup.ogg
new file mode 100644
index 00000000000..1314f6ee471
Binary files /dev/null and b/sound/voice/mpatchedup.ogg differ
diff --git a/sound/voice/mradar.ogg b/sound/voice/mradar.ogg
new file mode 100644
index 00000000000..ad347a6d891
Binary files /dev/null and b/sound/voice/mradar.ogg differ
diff --git a/sound/voice/msurgeon.ogg b/sound/voice/msurgeon.ogg
new file mode 100644
index 00000000000..a300ee57ef6
Binary files /dev/null and b/sound/voice/msurgeon.ogg differ
diff --git a/sound/weather/ashstorm/inside/active_end.ogg b/sound/weather/ashstorm/inside/active_end.ogg
new file mode 100644
index 00000000000..959bf5773eb
Binary files /dev/null and b/sound/weather/ashstorm/inside/active_end.ogg differ
diff --git a/sound/weather/ashstorm/inside/active_mid1.ogg b/sound/weather/ashstorm/inside/active_mid1.ogg
new file mode 100644
index 00000000000..95244cd2b7c
Binary files /dev/null and b/sound/weather/ashstorm/inside/active_mid1.ogg differ
diff --git a/sound/weather/ashstorm/inside/active_mid2.ogg b/sound/weather/ashstorm/inside/active_mid2.ogg
new file mode 100644
index 00000000000..a45584b9f31
Binary files /dev/null and b/sound/weather/ashstorm/inside/active_mid2.ogg differ
diff --git a/sound/weather/ashstorm/inside/active_mid3.ogg b/sound/weather/ashstorm/inside/active_mid3.ogg
new file mode 100644
index 00000000000..be2e672fa0e
Binary files /dev/null and b/sound/weather/ashstorm/inside/active_mid3.ogg differ
diff --git a/sound/weather/ashstorm/inside/active_start.ogg b/sound/weather/ashstorm/inside/active_start.ogg
new file mode 100644
index 00000000000..3efab12ef26
Binary files /dev/null and b/sound/weather/ashstorm/inside/active_start.ogg differ
diff --git a/sound/weather/ashstorm/inside/weak_end.ogg b/sound/weather/ashstorm/inside/weak_end.ogg
new file mode 100644
index 00000000000..416b75a9b84
Binary files /dev/null and b/sound/weather/ashstorm/inside/weak_end.ogg differ
diff --git a/sound/weather/ashstorm/inside/weak_mid1.ogg b/sound/weather/ashstorm/inside/weak_mid1.ogg
new file mode 100644
index 00000000000..d3211c6b5fc
Binary files /dev/null and b/sound/weather/ashstorm/inside/weak_mid1.ogg differ
diff --git a/sound/weather/ashstorm/inside/weak_mid2.ogg b/sound/weather/ashstorm/inside/weak_mid2.ogg
new file mode 100644
index 00000000000..b6491a7afb8
Binary files /dev/null and b/sound/weather/ashstorm/inside/weak_mid2.ogg differ
diff --git a/sound/weather/ashstorm/inside/weak_mid3.ogg b/sound/weather/ashstorm/inside/weak_mid3.ogg
new file mode 100644
index 00000000000..95238c72d40
Binary files /dev/null and b/sound/weather/ashstorm/inside/weak_mid3.ogg differ
diff --git a/sound/weather/ashstorm/inside/weak_start.ogg b/sound/weather/ashstorm/inside/weak_start.ogg
new file mode 100644
index 00000000000..59abf1937dc
Binary files /dev/null and b/sound/weather/ashstorm/inside/weak_start.ogg differ
diff --git a/sound/weather/ashstorm/outside/active_end.ogg b/sound/weather/ashstorm/outside/active_end.ogg
new file mode 100644
index 00000000000..95149d846cc
Binary files /dev/null and b/sound/weather/ashstorm/outside/active_end.ogg differ
diff --git a/sound/weather/ashstorm/outside/active_mid1.ogg b/sound/weather/ashstorm/outside/active_mid1.ogg
new file mode 100644
index 00000000000..189528ab569
Binary files /dev/null and b/sound/weather/ashstorm/outside/active_mid1.ogg differ
diff --git a/sound/weather/ashstorm/outside/active_mid2.ogg b/sound/weather/ashstorm/outside/active_mid2.ogg
new file mode 100644
index 00000000000..92317f2e0a7
Binary files /dev/null and b/sound/weather/ashstorm/outside/active_mid2.ogg differ
diff --git a/sound/weather/ashstorm/outside/active_mid3.ogg b/sound/weather/ashstorm/outside/active_mid3.ogg
new file mode 100644
index 00000000000..34846bfd42c
Binary files /dev/null and b/sound/weather/ashstorm/outside/active_mid3.ogg differ
diff --git a/sound/weather/ashstorm/outside/active_start.ogg b/sound/weather/ashstorm/outside/active_start.ogg
new file mode 100644
index 00000000000..8b3acf1a153
Binary files /dev/null and b/sound/weather/ashstorm/outside/active_start.ogg differ
diff --git a/sound/weather/ashstorm/outside/weak_end.ogg b/sound/weather/ashstorm/outside/weak_end.ogg
new file mode 100644
index 00000000000..55db2fc3565
Binary files /dev/null and b/sound/weather/ashstorm/outside/weak_end.ogg differ
diff --git a/sound/weather/ashstorm/outside/weak_mid1.ogg b/sound/weather/ashstorm/outside/weak_mid1.ogg
new file mode 100644
index 00000000000..56faa9ad26c
Binary files /dev/null and b/sound/weather/ashstorm/outside/weak_mid1.ogg differ
diff --git a/sound/weather/ashstorm/outside/weak_mid2.ogg b/sound/weather/ashstorm/outside/weak_mid2.ogg
new file mode 100644
index 00000000000..0c836ad220a
Binary files /dev/null and b/sound/weather/ashstorm/outside/weak_mid2.ogg differ
diff --git a/sound/weather/ashstorm/outside/weak_mid3.ogg b/sound/weather/ashstorm/outside/weak_mid3.ogg
new file mode 100644
index 00000000000..f2cbfb0f4b9
Binary files /dev/null and b/sound/weather/ashstorm/outside/weak_mid3.ogg differ
diff --git a/sound/weather/ashstorm/outside/weak_start.ogg b/sound/weather/ashstorm/outside/weak_start.ogg
new file mode 100644
index 00000000000..1ac59c36f05
Binary files /dev/null and b/sound/weather/ashstorm/outside/weak_start.ogg differ