", "\[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/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/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/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/mind.dm b/code/datums/mind.dm
index 08bd6252d99..5094ff4e8d7 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"
@@ -630,7 +630,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 +742,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
@@ -1549,7 +1549,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 750f7bfd70c..f1c4141720f 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -97,6 +97,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)
@@ -1338,7 +1339,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
@@ -1425,6 +1426,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
@@ -1440,8 +1442,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/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/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/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/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/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 f76830910b1..68e8c16c5da 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -448,6 +448,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..4158deb6380 100644
--- a/code/game/gamemodes/nuclear/nuclear_challenge.dm
+++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm
@@ -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")
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..ae9b8e3945a 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -280,7 +280,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
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.")
+ 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/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/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 +1047,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/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/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/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/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/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..4e76f7dcc74 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -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/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/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/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a1e4b555412..a0969b82b25 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -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()
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..3fd269f2346 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
@@ -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)
@@ -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]!")
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..3af9130fa7d 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -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..4de74d63e5a 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
@@ -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]!")
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..d008bf060c4 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
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index d734272e905..e211cef629e 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -244,7 +244,7 @@
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/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/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..593d077a562 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -269,7 +269,7 @@
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))
@@ -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/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/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/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/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/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/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/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 39d3babf4bc..6b0dc98dd37 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()
..()
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index e405dbe169c..fa709fd7d98 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)].")
+ 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)].")
+ 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..322f392950d 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)")
+ 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..aaf35238d80 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()
@@ -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/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/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..5c66ce225df 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -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/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/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index d98e40700df..9f2d24fd50a 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)
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 0af7781eee4..8a29c148253 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -289,7 +289,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)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index 0ebf08c225c..853f16e8cd0 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)
@@ -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/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/other.dm b/code/modules/surgery/other.dm
index 012f7ad3c5b..0ba667afe6f 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -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..50a99f9759c 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].")
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..a0d5cf335a9 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -48,8 +48,8 @@
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)
@@ -72,9 +72,9 @@
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)
diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt
index a962b4b685c..37768b61732 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 3
## Server the MySQL database can be found at.
# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
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..5a8d65610ab 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,93 @@
-->
+
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..4634db3675d 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6420,3 +6420,65 @@ 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.
diff --git a/html/changelogs/AutoChangeLog-pr-9043.yml b/html/changelogs/AutoChangeLog-pr-9043.yml
new file mode 100644
index 00000000000..a0a6a1369bb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9043.yml
@@ -0,0 +1,4 @@
+author: "Piccione"
+delete-after: True
+changes:
+ - rscadd: "Added Magboots to the Paramedic's EVA gear closet"
diff --git a/html/changelogs/AutoChangeLog-pr-9057.yml b/html/changelogs/AutoChangeLog-pr-9057.yml
new file mode 100644
index 00000000000..6bdb0bdba84
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9057.yml
@@ -0,0 +1,4 @@
+author: "Aurorablade"
+delete-after: True
+changes:
+ - rscadd: "Fluff for Panzerskull"
diff --git a/html/changelogs/AutoChangeLog-pr-9070.yml b/html/changelogs/AutoChangeLog-pr-9070.yml
new file mode 100644
index 00000000000..21bd74a45e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9070.yml
@@ -0,0 +1,7 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - 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"
diff --git a/html/changelogs/AutoChangeLog-pr-9072.yml b/html/changelogs/AutoChangeLog-pr-9072.yml
new file mode 100644
index 00000000000..79585d22a22
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9072.yml
@@ -0,0 +1,4 @@
+author: "Tayyyyyyy"
+delete-after: True
+changes:
+ - tweak: "Shadowling dethrall has been shortened to scalpel, hemostat, retractor, shine light, cautery"
diff --git a/html/changelogs/AutoChangeLog-pr-9109.yml b/html/changelogs/AutoChangeLog-pr-9109.yml
new file mode 100644
index 00000000000..ce8b2146cef
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9109.yml
@@ -0,0 +1,5 @@
+author: "MINIMAN10000"
+delete-after: True
+changes:
+ - rscdel: "Airlock electronics lock"
+ - bugfix: "Airlock electronics close button"
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/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/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index c9227ce2119..bf06b4d2057 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..a3d89179bf6 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/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/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/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 d3dc7d1a169..2ca227b9732 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"
@@ -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"
@@ -633,7 +635,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"
@@ -963,7 +964,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"
@@ -2109,6 +2109,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"
@@ -2159,7 +2160,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"
@@ -2167,6 +2167,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"