@@ -1158,7 +1179,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)
@@ -1308,4 +1329,4 @@ var/list/slot_equipment_priority = list( \
if(WEST)
D = NORTH
setDir(D)
- spintime -= speed
\ No newline at end of file
+ spintime -= speed
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 9154591c2fe..57b5aeb4996 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -198,3 +198,5 @@
var/list/progressbars = null //for stacking do_after bars
var/list/tkgrabbed_objects = list() // Assoc list of items to TK grabs
+
+ var/forced_look = null // This can either be a numerical direction or a soft object reference (UID). It makes the mob always face towards the selected thing.
\ No newline at end of file
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/mob_movement.dm b/code/modules/mob/mob_movement.dm
index a92e548d42b..f26961eace9 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -268,6 +268,8 @@
else
. = ..()
+ mob.setDir(direct)
+
for(var/obj/item/grab/G in mob)
if(G.state == GRAB_NECK)
mob.setDir(reverse_dir[direct])
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index bf6526c856e..6d1f856fbd3 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,39 @@
/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)
+ 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 += "I consent"
+ output += "
I DO NOT consent"
+ src << browse(output,"window=privacy_consent;size=500x300")
+ var/datum/browser/popup = new(src, "privacy_consent", "
Privacy Consent
", 500, 400)
+ popup.set_window_options("can_close=0")
+ popup.set_content(output)
+ popup.open(0)
+ return
/mob/new_player/proc/new_player_panel_proc()
@@ -43,6 +76,9 @@
output += "Observe
"
+ if(GLOB.join_tos)
+ output += "Terms of Service
"
+
if(!IsGuestKey(src.key))
establish_db_connection()
@@ -109,11 +145,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 +179,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 +211,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
@@ -326,7 +388,7 @@
if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
if(character.mind)
- if((character.mind.assigned_role != "Cyborg") && (character.mind.special_role != "MODE"))
+ if((character.mind.assigned_role != "Cyborg") && (character.mind.assigned_role != character.mind.special_role))
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
var/arrivalmessage = announcer.arrivalmsg
@@ -338,7 +400,7 @@
announcer.say(";[arrivalmessage]")
else
if(character.mind)
- if((character.mind.assigned_role != "Cyborg") && (character.mind.special_role != "MODE"))
+ if((character.mind.assigned_role != "Cyborg") && (character.mind.assigned_role != character.mind.special_role))
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
@@ -351,12 +413,12 @@
if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
if(character.mind)
- if((character.mind.special_role != "MODE"))
+ if(character.mind.assigned_role != character.mind.special_role)
var/arrivalmessage = "A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"]."
announcer.say(";[arrivalmessage]")
else
if(character.mind)
- if((character.mind.special_role != "MODE"))
+ if(character.mind.assigned_role != character.mind.special_role)
// can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc.
global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
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/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index e3c625593c5..30841f94c69 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -30,7 +30,8 @@
icon_state = "tallcabinet"
-/obj/structure/filingcabinet/initialize()
+/obj/structure/filingcabinet/Initialize()
+ ..()
for(var/obj/item/I in loc)
if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo))
I.loc = src
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/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 0d176753ad4..41799958c4f 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -316,11 +316,11 @@
return
src.add_fingerprint(user)
if(target == user && !user.incapacitated())
- visible_message("[usr] jumps onto the photocopier!")
+ visible_message("[usr] jumps onto [src]!")
else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
if(target.anchored) return
if(!ishuman(user)) return
- visible_message("[usr] drags [target.name] onto the photocopier!")
+ visible_message("[usr] drags [target.name] onto [src]!")
target.forceMove(get_turf(src))
ass = target
if(copyitem)
@@ -344,9 +344,9 @@
/obj/machinery/photocopier/emag_act(user as mob)
if(!emagged)
emagged = 1
- to_chat(user, "You overload the photocopier's laser printing mechanism.")
+ to_chat(user, "You overload [src]'s laser printing mechanism.")
else
- to_chat(user, "The photocopier's laser printing mechanism is already overloaded!")
+ to_chat(user, "[src]'s laser printing mechanism is already overloaded!")
/obj/item/toner
name = "toner cartridge"
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/pda/cart.dm b/code/modules/pda/cart.dm
index c50ae0758f4..53c61f4e27f 100644
--- a/code/modules/pda/cart.dm
+++ b/code/modules/pda/cart.dm
@@ -14,15 +14,6 @@
var/list/programs = list()
var/list/messenger_plugins = list()
-/obj/item/cartridge/New()
- if(ticker && ticker.current_state >= GAME_STATE_SETTING_UP)
- initialize()
-
-/obj/item/cartridge/initialize()
- if(radio)
- radio.initialize()
- ..()
-
/obj/item/cartridge/Destroy()
QDEL_NULL(radio)
QDEL_LIST(programs)
@@ -68,7 +59,7 @@
new/datum/data/pda/app/crew_records/security,
new/datum/data/pda/app/secbot_control)
-/obj/item/cartridge/security/initialize()
+/obj/item/cartridge/security/Initialize()
radio = new /obj/item/integrated_radio/beepsky(src)
..()
@@ -118,7 +109,7 @@
desc = "A data cartridge with an integrated radio signaler module."
programs = list(new/datum/data/pda/app/signaller)
-/obj/item/cartridge/signal/initialize()
+/obj/item/cartridge/signal/Initialize()
radio = new /obj/item/integrated_radio/signal(src)
..()
@@ -141,7 +132,7 @@
new/datum/data/pda/app/supply,
new/datum/data/pda/app/mule_control)
-/obj/item/cartridge/quartermaster/initialize()
+/obj/item/cartridge/quartermaster/Initialize()
radio = new /obj/item/integrated_radio/mule(src)
..()
@@ -163,7 +154,7 @@
new/datum/data/pda/app/status_display)
-/obj/item/cartridge/hop/initialize()
+/obj/item/cartridge/hop/Initialize()
radio = new /obj/item/integrated_radio/mule(src)
..()
@@ -176,7 +167,7 @@
new/datum/data/pda/app/status_display)
-/obj/item/cartridge/hos/initialize()
+/obj/item/cartridge/hos/Initialize()
radio = new /obj/item/integrated_radio/beepsky(src)
..()
@@ -214,7 +205,7 @@
new/datum/data/pda/app/status_display)
-/obj/item/cartridge/rd/initialize()
+/obj/item/cartridge/rd/Initialize()
radio = new /obj/item/integrated_radio/signal(src)
..()
@@ -242,7 +233,7 @@
new/datum/data/pda/app/status_display)
-/obj/item/cartridge/captain/initialize()
+/obj/item/cartridge/captain/Initialize()
radio = new /obj/item/integrated_radio/beepsky(src)
..()
@@ -279,7 +270,7 @@
new/datum/data/pda/app/status_display)
-/obj/item/cartridge/centcom/initialize()
+/obj/item/cartridge/centcom/Initialize()
radio = new /obj/item/integrated_radio/beepsky(src)
..()
diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm
index 3c89c291300..b9dfe8ff7e4 100644
--- a/code/modules/pda/radio.dm
+++ b/code/modules/pda/radio.dm
@@ -173,7 +173,7 @@
radio_connection = null
return ..()
-/obj/item/integrated_radio/signal/initialize()
+/obj/item/integrated_radio/signal/Initialize()
if(!radio_controller)
return
if(src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 9c3d64ef4fc..3ba1a4b5210 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -682,7 +682,7 @@
else
user.put_in_hands(cell)
cell.add_fingerprint(user)
- cell.updateicon()
+ cell.update_icon()
src.cell = null
user.visible_message("[user.name] removes the power cell from [src.name]!", "You remove the power cell.")
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index c5b014576fc..25a47f19e04 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -72,19 +72,13 @@ By design, d1 is the smallest direction and d2 is the highest
var/turf/T = src.loc // hide if turf is not intact
if(level==1) hide(T.intact)
- cable_list += src //add it to the global cable list
-
- // Catches the interim-zone of worldstart and roundstart
- // I want both the ticker to exist (so mapped-in cables don't trip this)
- // but also not have started yet (since the zlevel system would handle this on its own otherwise)
- if((ticker && ticker.current_state < GAME_STATE_PLAYING))
- attempt_init()
+ LAZYADD(GLOB.cable_list, src) //add it to the global cable list
/obj/structure/cable/Destroy() // called when a cable is deleted
if(powernet)
cut_cable_from_powernet() // update the powernets
- cable_list -= src //remove it from global cable list
+ LAZYREMOVE(GLOB.cable_list, src) //remove it from global cable list
return ..() // then go ahead and delete the cable
///////////////////////////////////
@@ -462,7 +456,7 @@ obj/structure/cable/proc/cable_color(var/colorC)
powernet.remove_cable(src) //remove the cut cable from its powernet
// queue it to rebuild
- deferred_powernet_rebuilds += O
+ SSmachines.deferred_powernet_rebuilds += O
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
@@ -507,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 f08e008089b..3bc2b5bc39b 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -1,8 +1,64 @@
-// the power cell
-// charge from 0 to 100%
-// fits in APC to provide backup power
+/obj/item/stock_parts/cell
+ name = "power cell"
+ desc = "A rechargeable electrochemical power cell."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "cell"
+ item_state = "cell"
+ origin_tech = "powerstorage=1"
+ force = 5
+ throwforce = 5
+ throw_speed = 2
+ throw_range = 5
+ w_class = WEIGHT_CLASS_SMALL
+ var/charge = 0 // note %age conveted to actual charge in New
+ var/maxcharge = 1000
+ materials = list(MAT_METAL = 700, MAT_GLASS = 50)
+ var/rigged = FALSE // true if rigged to explode
+ var/chargerate = 100 //how much power is given every tick in a recharger
+ var/self_recharge = 0 //does it self recharge, over time, or not?
+ var/ratingdesc = TRUE
+ var/grown_battery = FALSE // If it's a grown that acts as a battery, add a wire overlay to it.
+
+/obj/item/stock_parts/cell/New()
+ ..()
+ processing_objects.Add(src)
+ charge = maxcharge
+ if(ratingdesc)
+ desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it."
+ update_icon()
+
+/obj/item/stock_parts/cell/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/item/stock_parts/cell/vv_edit_var(var_name, var_value)
+ switch(var_name)
+ if("self_recharge")
+ if(var_value)
+ processing_objects.Add(src)
+ else
+ processing_objects.Remove(src)
+ . = ..()
+
+/obj/item/stock_parts/cell/process()
+ if(self_recharge)
+ give(chargerate * 0.25)
+ else
+ return PROCESS_KILL
+
+/obj/item/stock_parts/cell/update_icon()
+ overlays.Cut()
+ if(grown_battery)
+ overlays += image('icons/obj/power.dmi', "grown_wires")
+ if(charge < 0.01)
+ return
+ else if(charge/maxcharge >=0.995)
+ overlays += "cell-o2"
+ else
+ overlays += "cell-o1"
+
/obj/item/stock_parts/cell/proc/percent() // return % charge of cell
- return 100.0*charge/maxcharge
+ return 100 * charge / maxcharge
// use power from a cell
/obj/item/stock_parts/cell/proc/use(amount)
@@ -20,24 +76,23 @@
explode()
return 0
if(maxcharge < amount)
- return 0
- var/power_used = min(maxcharge-charge,amount)
+ amount = maxcharge
+ var/power_used = min(maxcharge - charge, amount)
charge += power_used
return power_used
/obj/item/stock_parts/cell/examine(mob/user)
- if(..(user, 1))
- if(maxcharge <= 2500)
- to_chat(user, "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%.")
- else
- to_chat(user, "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%.")
+ ..()
+ if(rigged)
+ to_chat(user, "This power cell seems to be faulty!")
+ else
+ to_chat(user, "The charge meter reads [round(percent() )]%.")
-/obj/item/stock_parts/cell/attack_self(mob/user as mob)
- src.add_fingerprint(user)
- return
+/obj/item/stock_parts/cell/suicide_act(mob/user)
+ 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)
- ..()
if(istype(W, /obj/item/reagent_containers/syringe))
var/obj/item/reagent_containers/syringe/S = W
@@ -45,34 +100,29 @@
if(S.reagents.has_reagent("plasma", 5) || S.reagents.has_reagent("plasma_dust", 5))
- rigged = 1
+ rigged = TRUE
log_admin("LOG: [key_name(user)] injected a power cell with plasma, rigging it to explode.")
message_admins("LOG: [key_name_admin(user)] injected a power cell with plasma, rigging it to explode.")
S.reagents.clear_reagents()
+ else
+ return ..()
/obj/item/stock_parts/cell/proc/explode()
- var/turf/T = get_turf(src.loc)
-/*
- * 1000-cell explosion(T, -1, 0, 1, 1)
- * 2500-cell explosion(T, -1, 0, 1, 1)
- * 10000-cell explosion(T, -1, 1, 3, 3)
- * 15000-cell explosion(T, -1, 2, 4, 4)
- * */
- if(charge==0)
+ var/turf/T = get_turf(loc)
+ if(charge == 0)
return
var/devastation_range = -1 //round(charge/11000)
- var/heavy_impact_range = round(sqrt(charge)/60)
- var/light_impact_range = round(sqrt(charge)/30)
+ var/heavy_impact_range = round(sqrt(charge) / 60)
+ var/light_impact_range = round(sqrt(charge) / 30)
var/flash_range = light_impact_range
- if(light_impact_range==0)
- rigged = 0
+ if(light_impact_range == 0)
+ rigged = FALSE
corrupt()
return
//explosion(T, 0, 1, 2, 2)
-
log_admin("LOG: Rigged power cell explosion, last touched by [fingerprintslast]")
message_admins("LOG: Rigged power cell explosion, last touched by [fingerprintslast]")
@@ -81,70 +131,242 @@
/obj/item/stock_parts/cell/proc/corrupt()
charge /= 2
- maxcharge /= 2
+ maxcharge = max(maxcharge / 2, chargerate)
if(prob(10))
- rigged = 1 //broken batterys are dangerous
+ rigged = TRUE //broken batterys are dangerous
/obj/item/stock_parts/cell/emp_act(severity)
charge -= 1000 / severity
if(charge < 0)
charge = 0
- if(reliability != 100 && prob(50/severity))
- reliability -= 10 / severity
..()
/obj/item/stock_parts/cell/ex_act(severity)
-
switch(severity)
- if(1.0)
+ if(EXPLODE_DEVASTATE)
qdel(src)
- return
- if(2.0)
+ if(EXPLODE_HEAVY)
if(prob(50))
qdel(src)
return
if(prob(50))
corrupt()
- if(3.0)
+ if(EXPLODE_LIGHT)
if(prob(25))
qdel(src)
return
if(prob(25))
corrupt()
- return
/obj/item/stock_parts/cell/blob_act()
- ex_act(1)
+ ex_act(EXPLODE_DEVASTATE)
/obj/item/stock_parts/cell/proc/get_electrocute_damage()
switch(charge)
-/* if(9000 to INFINITY)
- return min(rand(90,150),rand(90,150))
- if(2500 to 9000-1)
- return min(rand(70,145),rand(70,145))
- if(1750 to 2500-1)
- return min(rand(35,110),rand(35,110))
- if(1500 to 1750-1)
- return min(rand(30,100),rand(30,100))
- if(750 to 1500-1)
- return min(rand(25,90),rand(25,90))
- if(250 to 750-1)
- return min(rand(20,80),rand(20,80))
- if(100 to 250-1)
- return min(rand(20,65),rand(20,65))*/
if(5000000 to INFINITY)
- return min(rand(200,300),rand(200,300))
- if(4000000 to 5000000-1)
- return min(rand(80,180),rand(80,180))
- if(1000000 to 4000000-1)
- return min(rand(50,160),rand(50,160))
- if(200000 to 1000000-1)
- return min(rand(25,80),rand(25,80))
- if(100000 to 200000-1)//Ave powernet
- return min(rand(20,60),rand(20,60))
- if(50000 to 100000-1)
- return min(rand(15,40),rand(15,40))
- if(1000 to 50000-1)
- return min(rand(10,20),rand(10,20))
+ return min(rand(200, 300),rand(200, 300))
+ if(4000000 to 5000000 - 1)
+ return min(rand(80, 180),rand(80, 180))
+ if(1000000 to 4000000 - 1)
+ return min(rand(50, 160),rand(50, 160))
+ if(200000 to 1000000 - 1)
+ return min(rand(25, 80),rand(25, 80))
+ if(100000 to 200000 - 1)//Ave powernet
+ return min(rand(20, 60),rand(20, 60))
+ if(50000 to 100000 - 1)
+ return min(rand(15, 40),rand(15, 40))
+ if(1000 to 50000 - 1)
+ return min(rand(10, 20),rand(10, 20))
else
return 0
+
+// Cell variants
+/obj/item/stock_parts/cell/empty/New()
+ ..()
+ charge = 0
+
+/obj/item/stock_parts/cell/crap
+ name = "\improper Nanotrasen brand rechargeable AA battery"
+ desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
+ maxcharge = 500
+ materials = list(MAT_GLASS = 40)
+ rating = 2
+
+/obj/item/stock_parts/cell/crap/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/upgraded
+ name = "upgraded power cell"
+ desc = "A power cell with a slightly higher capacity than normal!"
+ maxcharge = 2500
+ materials = list(MAT_GLASS = 50)
+ rating = 2
+ chargerate = 1000
+
+/obj/item/stock_parts/cell/upgraded/plus
+ name = "upgraded power cell+"
+ desc = "A power cell with an even higher capacity than the base model!"
+ maxcharge = 5000
+
+/obj/item/stock_parts/cell/secborg
+ name = "security borg rechargeable D battery"
+ origin_tech = null
+ maxcharge = 600 //600 max charge / 100 charge per shot = six shots
+ materials = list(MAT_GLASS = 40)
+ rating = 2.5
+
+/obj/item/stock_parts/cell/secborg/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/pulse //200 pulse shots
+ name = "pulse rifle power cell"
+ maxcharge = 40000
+ rating = 3
+ chargerate = 1500
+
+/obj/item/stock_parts/cell/pulse/carbine //25 pulse shots
+ name = "pulse carbine power cell"
+ maxcharge = 5000
+
+/obj/item/stock_parts/cell/pulse/pistol //10 pulse shots
+ name = "pulse pistol power cell"
+ maxcharge = 2000
+
+/obj/item/stock_parts/cell/high
+ name = "high-capacity power cell"
+ origin_tech = "powerstorage=2"
+ icon_state = "hcell"
+ maxcharge = 10000
+ materials = list(MAT_GLASS = 60)
+ rating = 3
+ chargerate = 1500
+
+/obj/item/stock_parts/cell/high/plus
+ name = "high-capacity power cell+"
+ desc = "Where did these come from?"
+ icon_state = "h+cell"
+ maxcharge = 15000
+ chargerate = 2250
+
+/obj/item/stock_parts/cell/high/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/super
+ name = "super-capacity power cell"
+ origin_tech = "powerstorage=3;materials=3"
+ icon_state = "scell"
+ maxcharge = 20000
+ materials = list(MAT_GLASS = 300)
+ rating = 4
+ chargerate = 2000
+
+/obj/item/stock_parts/cell/super/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/hyper
+ name = "hyper-capacity power cell"
+ origin_tech = "powerstorage=4;engineering=4;materials=4"
+ icon_state = "hpcell"
+ maxcharge = 30000
+ materials = list(MAT_GLASS = 400)
+ rating = 5
+ chargerate = 3000
+
+/obj/item/stock_parts/cell/hyper/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/bluespace
+ name = "bluespace power cell"
+ desc = "A rechargeable transdimensional power cell."
+ origin_tech = "powerstorage=5;bluespace=4;materials=4;engineering=4"
+ icon_state = "bscell"
+ maxcharge = 40000
+ materials = list(MAT_GLASS = 600)
+ rating = 6
+ chargerate = 4000
+
+/obj/item/stock_parts/cell/bluespace/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/infinite
+ name = "infinite-capacity power cell!"
+ icon_state = "icell"
+ origin_tech = "powerstorage=7"
+ maxcharge = 30000
+ materials = list(MAT_GLASS=1000)
+ rating = 6
+ chargerate = 30000
+
+/obj/item/stock_parts/cell/infinite/use()
+ return 1
+
+/obj/item/stock_parts/cell/infinite/abductor
+ name = "void core"
+ desc = "An alien power cell that produces energy seemingly out of nowhere."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cell"
+ maxcharge = 50000
+ rating = 12
+ ratingdesc = FALSE
+
+/obj/item/stock_parts/cell/infinite/abductor/update_icon()
+ return
+
+
+/obj/item/stock_parts/cell/potato
+ name = "potato battery"
+ desc = "A rechargeable starch based power cell."
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "potato"
+ origin_tech = "powerstorage=1;biotech=1"
+ charge = 100
+ maxcharge = 300
+ materials = list()
+ rating = 1
+ grown_battery = TRUE //it has the overlays for wires
+
+/obj/item/stock_parts/cell/high/slime
+ name = "charged slime core"
+ desc = "A yellow slime core infused with plasma, it crackles with power."
+ origin_tech = "powerstorage=5;biotech=4"
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "yellow slime extract"
+ materials = list()
+ rating = 5 //self-recharge makes these desirable
+ self_recharge = 1 // Infused slime cores self-recharge, over time
+ chargerate = 500
+
+/obj/item/stock_parts/cell/emproof
+ name = "\improper EMP-proof cell"
+ desc = "An EMP-proof cell."
+ maxcharge = 500
+ rating = 3
+
+/obj/item/stock_parts/cell/emproof/empty/New()
+ ..()
+ charge = 0
+ update_icon()
+
+/obj/item/stock_parts/cell/emproof/emp_act(severity)
+ return
+
+/obj/item/stock_parts/cell/emproof/corrupt()
+ return
+
+/obj/item/stock_parts/cell/ninja
+ name = "spider-clan power cell"
+ desc = "A standard ninja-suit power cell."
+ maxcharge = 10000
+ materials = list(MAT_GLASS = 60)
\ No newline at end of file
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 4def1c3b067..8c9ee3eda0d 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -35,7 +35,7 @@
if(powernet)
disconnect_from_network()
-/obj/machinery/power/generator/initialize()
+/obj/machinery/power/generator/Initialize()
..()
connect()
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index ad73a6ff0ad..42f7cbde657 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -85,20 +85,12 @@ var/const/GRAV_NEEDS_WRENCH = 3
// Generator which spawns with the station.
//
-/obj/machinery/gravity_generator/main/station/initialize()
+/obj/machinery/gravity_generator/main/station/Initialize()
..()
setup_parts()
middle.overlays += "activated"
update_list()
-//
-// Generator an admin can spawn
-//
-
-/obj/machinery/gravity_generator/main/station/admin/New()
- ..()
- initialize()
-
//
// Main Generator with the main code
//
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/port_gen.dm b/code/modules/power/port_gen.dm
index 72e30b9d29a..2892d0245b2 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -112,7 +112,7 @@
var/temperature = 0 //The current temperature
var/overheating = 0 //if this gets high enough the generator explodes
-/obj/machinery/power/port_gen/pacman/initialize()
+/obj/machinery/power/port_gen/pacman/Initialize()
..()
if(anchored)
connect_to_network()
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index fd5946b7dc4..15b47a47635 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -232,26 +232,6 @@
. += C
return .
-/hook/startup/proc/buildPowernets()
- return makepowernets()
-
-// rebuild all power networks from scratch - only called at world creation or by the admin verb
-/proc/makepowernets()
- for(var/datum/powernet/PN in powernets)
- qdel(PN)
- powernets.Cut()
-
- for(var/obj/structure/cable/PC in cable_list)
- makepowernet_for(PC)
-
- return 1
-
-/proc/makepowernet_for(var/obj/structure/cable/PC)
- if(!PC.powernet)
- var/datum/powernet/NewPN = new()
- NewPN.add_cable(PC)
- propagate_network(PC,PC.powernet)
-
//remove the old powernet and replace it with a new one throughout the network.
/proc/propagate_network(var/obj/O, var/datum/powernet/PN)
//log_world("propagating new network")
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
index 416de55f6c3..a07d854380d 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -16,7 +16,7 @@
/datum/powernet/New()
- powernets += src
+ SSmachines.powernets += src
..()
/datum/powernet/Destroy()
@@ -28,7 +28,7 @@
nodes -= M
M.powernet = null
- powernets -= src
+ SSmachines.powernets -= src
return ..()
//Returns the amount of excess power (before refunding to SMESs) from last tick.
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 58cecbc8ecc..70cd75bf85d 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -76,12 +76,13 @@
return
rotate()
-/obj/machinery/power/emitter/initialize()
+/obj/machinery/power/emitter/Initialize()
..()
if(state == 2 && anchored)
connect_to_network()
if(frequency)
set_frequency(frequency)
+
/obj/machinery/power/emitter/multitool_menu(var/mob/user,var/obj/item/multitool/P)
return {"
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index c55a206ebfa..a2025376e9d 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -300,7 +300,7 @@
track = 2 // Auto tracking mode
autostart = 1 // Automatically start
-/obj/machinery/power/solar_control/initialize()
+/obj/machinery/power/solar_control/Initialize()
..()
if(!powernet)
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/power/treadmill.dm b/code/modules/power/treadmill.dm
index 5f8f8c1b8e4..762d442a2a9 100644
--- a/code/modules/power/treadmill.dm
+++ b/code/modules/power/treadmill.dm
@@ -18,7 +18,7 @@
var/list/mobs_running[0]
var/id = null // for linking to monitor
-/obj/machinery/power/treadmill/initialize()
+/obj/machinery/power/treadmill/Initialize()
..()
if(anchored)
connect_to_network()
@@ -137,7 +137,7 @@
var/frame = 0 // on 0, show labels, on 1 show numbers
var/redeem_immediately = 0 // redeem immediately for holding cell
-/obj/machinery/treadmill_monitor/initialize()
+/obj/machinery/treadmill_monitor/Initialize()
..()
if(id)
for(var/obj/machinery/power/treadmill/T in machines)
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index a385f51863e..641682490d4 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -82,7 +82,7 @@
inturf = get_step(src, dir)
-/obj/machinery/power/compressor/initialize()
+/obj/machinery/power/compressor/Initialize()
..()
locate_machinery()
if(!turbine)
@@ -202,7 +202,7 @@
outturf = get_step(src, dir)
-/obj/machinery/power/turbine/initialize()
+/obj/machinery/power/turbine/Initialize()
..()
locate_machinery()
if(!compressor)
@@ -341,7 +341,7 @@
-/obj/machinery/computer/turbine_computer/initialize()
+/obj/machinery/computer/turbine_computer/Initialize()
..()
spawn(10)
locate_machinery()
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 63f533d91ec..130fda822fd 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -29,7 +29,7 @@
/obj/item/ammo_casing/update_icon()
..()
icon_state = "[initial(icon_state)][BB ? "-live" : ""]"
- desc = "[initial(desc)][BB ? "" : " This one is spent"]"
+ desc = "[initial(desc)][BB ? "" : " This one is spent."]"
/obj/item/ammo_casing/proc/newshot(params) //For energy weapons, shotgun shells and wands (!).
if(!BB)
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 8965432aac0..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)
@@ -342,9 +342,9 @@
user << browse("Temperature Gun Configuration
[dat]", "window=tempgun;size=510x120")
onclose(user, "tempgun")
-/obj/item/gun/energy/temperature/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/card/emag) && !emagged)
- emagged = 1
+/obj/item/gun/energy/temperature/emag_act(mob/user)
+ if(!emagged)
+ emagged = TRUE
to_chat(user, "You double the gun's temperature cap! Targets hit by searing beams will burst into flames!")
desc = "A gun that changes the body temperature of its targets. Its temperature cap has been hacked."
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 16cedc0244d..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
@@ -52,7 +52,7 @@
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
/obj/item/projectile/temp/New(loc, shot_temp)
- ..(loc)
+ ..()
if(!isnull(shot_temp))
temperature = shot_temp
switch(temperature)
@@ -86,7 +86,6 @@
else
name = "temperature beam"//failsafe
icon_state = "temp_4"
- ..()
/obj/item/projectile/temp/on_hit(var/atom/target, var/blocked = 0)//These two could likely check temp protection on the mob
@@ -138,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/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..a979d350c2a 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)
@@ -277,7 +277,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 +293,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 +446,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 +597,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..0dbd2224e92 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")
..()
@@ -1016,7 +1016,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/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index e405dbe169c..02d71db8719 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(src)].")
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [COORD(src)].")
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(src)].")
+ log_game("[key_name(user)] fired fluorosulfuric Acid from \a [src] at [COORD(src)].")
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(src)].")
+ log_game("[key_name(user)] fired space lube from \a [src] at [COORD(src)].")
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 56bb7478327..aaf35238d80 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -36,22 +36,22 @@
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()
+/obj/machinery/disposal/Initialize()
// this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
..()
var/atom/L = loc
@@ -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/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 0b41a26256c..ec26ae39644 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -4,7 +4,7 @@
/datum/design/basic_cell
name = "Basic Power Cell"
- desc = "A basic power cell that holds 1000 units of energy"
+ desc = "A basic power cell that holds 1 kW of power."
id = "basic_cell"
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB | PODFAB
@@ -15,7 +15,7 @@
/datum/design/high_cell
name = "High-Capacity Power Cell"
- desc = "A power cell that holds 10000 units of energy"
+ desc = "A power cell that holds 10 kW of power."
id = "high_cell"
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB | PODFAB
@@ -26,7 +26,7 @@
/datum/design/hyper_cell
name = "Hyper-Capacity Power Cell"
- desc = "A power cell that holds 30000 units of energy"
+ desc = "A power cell that holds 30 kW of power."
id = "hyper_cell"
req_tech = list("powerstorage" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB | PODFAB
@@ -37,7 +37,7 @@
/datum/design/super_cell
name = "Super-Capacity Power Cell"
- desc = "A power cell that holds 20000 units of energy"
+ desc = "A power cell that holds 20 kW of power."
id = "super_cell"
req_tech = list("powerstorage" = 3, "materials" = 3)
build_type = PROTOLATHE | MECHFAB | PODFAB
@@ -48,7 +48,7 @@
/datum/design/bluespace_cell
name = "Bluespace Power Cell"
- desc = "A power cell that holds 40000 units of energy."
+ desc = "A power cell that holds 40 kW of power."
id = "bluespace_cell"
req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE | MECHFAB
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 50c8e1a4cf8..8d18df1ee07 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -149,10 +149,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
matching_designs = list()
if(!id)
for(var/obj/machinery/r_n_d/server/centcom/S in world)
- S.initialize()
+ S.initialize_serv()
break
-/obj/machinery/computer/rdconsole/initialize()
+/obj/machinery/computer/rdconsole/Initialize()
..()
SyncRDevices()
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 014b2f80e6b..a2f9f185853 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -23,7 +23,7 @@
component_parts += new /obj/item/stack/cable_coil(null,1)
component_parts += new /obj/item/stack/cable_coil(null,1)
RefreshParts()
- initialize(); //Agouri
+ initialize_serv(); //Agouri // fuck you agouri
/obj/machinery/r_n_d/server/upgraded/New()
..()
@@ -44,8 +44,7 @@
tot_rating += SP.rating
heat_gen /= max(1, tot_rating)
-/obj/machinery/r_n_d/server/initialize()
- ..()
+/obj/machinery/r_n_d/server/proc/initialize_serv()
if(!files) files = new /datum/research(src)
var/list/temp_list
if(!id_with_upload.len)
@@ -162,7 +161,7 @@
name = "CentComm. Central R&D Database"
server_id = -1
-/obj/machinery/r_n_d/server/centcom/initialize()
+/obj/machinery/r_n_d/server/centcom/Initialize()
..()
var/list/no_id_servers = list()
var/list/server_ids = list()
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index ee884bc20a4..f7976645bc4 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -190,7 +190,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/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index cea1f502d91..09978047027 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -351,7 +351,7 @@
height = 4
var/target_area = /area/mine/dangerous/unexplored
-/obj/docking_port/stationary/random/initialize()
+/obj/docking_port/stationary/random/Initialize()
..()
var/list/turfs = get_area_turfs(target_area)
var/turf/T = pick(turfs)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 6e712e74914..c8f36cfa37e 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -229,7 +229,7 @@
-/obj/docking_port/mobile/initialize()
+/obj/docking_port/mobile/Initialize()
if(!timid)
register()
..()
diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm
index dc598ccab42..38ec849179a 100644
--- a/code/modules/space_management/space_level.dm
+++ b/code/modules/space_management/space_level.dm
@@ -152,7 +152,7 @@
if(istype(AM, /obj/effect/landmark/map_loader))
late_maps.Add(AM)
continue
- AM.initialize()
+ AM.Initialize(TRUE)
if(istype(AM, /obj/machinery/atmospherics))
pipes.Add(AM)
else if(istype(AM, /obj/structure/cable))
@@ -179,10 +179,7 @@
/datum/space_level/proc/do_cables(list/cables)
var/watch = start_watch()
log_debug("Building powernets on z-level '[zpos]'!")
- for(var/schmoo in cables)
- var/obj/structure/cable/C = schmoo
- if(C)
- makepowernet_for(C)
+ SSmachines.setup_template_powernets(cables)
cables.Cut()
log_debug("Took [stop_watch(watch)]s")
@@ -193,7 +190,7 @@
for(var/schmoo in late_maps)
var/obj/effect/landmark/map_loader/ML = schmoo
if(ML)
- ML.initialize()
+ ML.Initialize()
late_maps.Cut()
space_manager.remove_dirt(zpos)
log_debug("Took [stop_watch(watch)]s")
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 0c0ab2b1259..57142365cc4 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -273,7 +273,7 @@
area_aim = TRUE
target_all_areas = TRUE
-/obj/machinery/computer/bsa_control/admin/initialize()
+/obj/machinery/computer/bsa_control/admin/Initialize()
..()
if(!cannon)
cannon = deploy()
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..794c19e2655 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)
@@ -442,7 +442,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()
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/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/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 9336de72515..b7cf78e5ed2 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -46,7 +46,7 @@
..(user)
to_chat(user, "There are [crystals.len ? crystals.len : "no"] bluespace crystal\s in the crystal slots.")
-/obj/machinery/computer/telescience/initialize()
+/obj/machinery/computer/telescience/Initialize()
..()
for(var/i = 1; i <= starting_crystals; i++)
crystals += new /obj/item/ore/bluespace_crystal/artificial(null) // starting crystals
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 0938ed45f8e..464012c5cb9 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,100 @@
-->
+
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 disposals.
+
+
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:
+
+ - Vet Coat Fluff item.
+ - Spacepod mod kit now uses kit blueprints and not KITE blueprints (spelling error).
+
+
Fox McCloud updated:
+
+ - Adds gloves of the North Star; get them on the uplink for 8 TC
+ - Unarmed attacks now have their own icons, as does disarming.
+ - Various mobs have their own custom icon attacks
+ - Monkies now bite!
+
+
+
18 May 2018
+
Fox McCloud updated:
+
+ - Removes engineering and police tape
+ - Adds security, atmospheric, and engineering holoprojectors
+
+
tigercat2000 updated:
+
+ - You can now lock a facing direction with shift+middle mouse button, or lock your direction towards an object by clicking on it with shift + ctrl + middle mouse button.
+
+
+
15 May 2018
+
Tayyyyyyy updated:
+
+
+
11 May 2018
+
Kyep updated:
+
+ - It is no longer possible to create an infinite number of monkeys from the same monkey cube.
+
+
+
09 May 2018
+
RyanSmake updated:
+
+ - You can now jump on fax machines without the UI lying to you.
+
+
+
07 May 2018
+
qwertyquerty updated:
+
+ - The window title is custom now!
+
+
+
06 May 2018
+
Kyep updated:
+
+ - DeathSquad is now better equipped, and prompts eligible ghosts with a "Do you want to play as DeathSquad?" when called.
+ - DeathSquad members (except team leaders) can now choose to spawn as either an organic DS member, or a DS borg.
+
+
+
05 May 2018
+
Tayyyyyyy updated:
+
+ - ERT members will have their proper name and appearance when cloned
+
+
+
04 May 2018
+
RyanSmake updated:
+
+ - You will now log in to the proper account you input to the ATM instead of the one associated with you.
+ - Now ATMs will reconnect after a power outage.
+
+
02 May 2018
CrazyLemon and Fox McCloud updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index a99a2c4b64c..04b66ec89a7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6375,3 +6375,65 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
2018-05-02:
CrazyLemon and Fox McCloud:
- bugfix: Fixes reagent smoke
+2018-05-04:
+ RyanSmake:
+ - bugfix: You will now log in to the proper account you input to the ATM instead
+ of the one associated with you.
+ - bugfix: Now ATMs will reconnect after a power outage.
+2018-05-05:
+ Tayyyyyyy:
+ - bugfix: ERT members will have their proper name and appearance when cloned
+2018-05-06:
+ Kyep:
+ - tweak: DeathSquad is now better equipped, and prompts eligible ghosts with a "Do
+ you want to play as DeathSquad?" when called.
+ - rscadd: DeathSquad members (except team leaders) can now choose to spawn as either
+ an organic DS member, or a DS borg.
+2018-05-07:
+ qwertyquerty:
+ - rscadd: The window title is custom now!
+2018-05-09:
+ RyanSmake:
+ - bugfix: You can now jump on fax machines without the UI lying to you.
+2018-05-11:
+ Kyep:
+ - bugfix: It is no longer possible to create an infinite number of monkeys from
+ the same monkey cube.
+2018-05-15:
+ Tayyyyyyy:
+ - bugfix: Pun pun is back!
+2018-05-18:
+ Fox McCloud:
+ - rscdel: Removes engineering and police tape
+ - rscadd: Adds security, atmospheric, and engineering holoprojectors
+ tigercat2000:
+ - rscadd: You can now lock a facing direction with shift+middle mouse button, or
+ lock your direction towards an object by clicking on it with shift + ctrl +
+ middle mouse button.
+2018-05-19:
+ Aurorablade:
+ - rscadd: Vet Coat Fluff item.
+ - tweak: Spacepod mod kit now uses kit blueprints and not KITE blueprints (spelling
+ error).
+ Fox McCloud:
+ - rscadd: Adds gloves of the North Star; get them on the uplink for 8 TC
+ - 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 disposals.
+ 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.
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index ee05d5f450e..fa6f26fefe6 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 16eeff1107f..49679ae2256 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/fluff_lefthand.dmi b/icons/mob/inhands/fluff_lefthand.dmi
index 645c04a9ac9..a5721f518ce 100644
Binary files a/icons/mob/inhands/fluff_lefthand.dmi and b/icons/mob/inhands/fluff_lefthand.dmi differ
diff --git a/icons/mob/inhands/fluff_righthand.dmi b/icons/mob/inhands/fluff_righthand.dmi
index f0656ef8e22..50435f90e0d 100644
Binary files a/icons/mob/inhands/fluff_righthand.dmi and b/icons/mob/inhands/fluff_righthand.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 781bc710af3..209e052895a 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index 8c3b77c337d..940f2ba25da 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index f1c8b87aaa4..042c10b2aed 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/engicart.dmi b/icons/obj/engicart.dmi
index 36d45cdf04b..0e665bff8df 100644
Binary files a/icons/obj/engicart.dmi and b/icons/obj/engicart.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 119f3df0e37..83cb94a5ca3 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/policetape.dmi b/icons/policetape.dmi
deleted file mode 100644
index 74a758335a9..00000000000
Binary files a/icons/policetape.dmi and /dev/null differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 54ed0c40d6a..813abc66b98 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1499,7 +1499,7 @@ window "mainwindow"
size = 640x440
is-default = true
is-maximized = true
- title = "Space Station 13"
+ title = "Paradise Station 13"
icon = 'icons\\ss13_64.png'
menu = "menu"
macro = "macro"
diff --git a/paradise.dme b/paradise.dme
index fd478a69e07..62908577586 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -18,6 +18,7 @@
#include "code\__DEFINES\_globals.dm"
#include "code\__DEFINES\_readme.dm"
#include "code\__DEFINES\admin.dm"
+#include "code\__DEFINES\antagonists.dm"
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\bots.dm"
#include "code\__DEFINES\callbacks.dm"
@@ -76,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"
@@ -88,8 +90,6 @@
#include "code\__HELPERS\sorts\MergeSort.dm"
#include "code\__HELPERS\sorts\TimSort.dm"
#include "code\_DATASTRUCTURES\heap.dm"
-#include "code\_DATASTRUCTURES\linked_lists.dm"
-#include "code\_DATASTRUCTURES\priority_queue.dm"
#include "code\_DATASTRUCTURES\stacks.dm"
#include "code\_globalvars\configuration.dm"
#include "code\_globalvars\database.dm"
@@ -192,8 +192,6 @@
#include "code\controllers\Processes\event.dm"
#include "code\controllers\Processes\fast_process.dm"
#include "code\controllers\Processes\lighting.dm"
-#include "code\controllers\Processes\machinery.dm"
-#include "code\controllers\Processes\mob.dm"
#include "code\controllers\Processes\nano_mob_hunter.dm"
#include "code\controllers\Processes\npcai.dm"
#include "code\controllers\Processes\npcpool.dm"
@@ -204,21 +202,24 @@
#include "code\controllers\ProcessScheduler\core\process.dm"
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
#include "code\controllers\subsystem\air.dm"
+#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\fires.dm"
#include "code\controllers\subsystem\garbage.dm"
+#include "code\controllers\subsystem\machinery.dm"
+#include "code\controllers\subsystem\mobs.dm"
#include "code\controllers\subsystem\nanoui.dm"
#include "code\controllers\subsystem\nightshift.dm"
#include "code\controllers\subsystem\spacedrift.dm"
#include "code\controllers\subsystem\sun.dm"
#include "code\controllers\subsystem\throwing.dm"
#include "code\controllers\subsystem\timer.dm"
+#include "code\controllers\subsystem\processing\processing.dm"
#include "code\datums\action.dm"
#include "code\datums\ai_law_sets.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\beam.dm"
#include "code\datums\browser.dm"
#include "code\datums\callback.dm"
-#include "code\datums\computerfiles.dm"
#include "code\datums\datacore.dm"
#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
@@ -226,7 +227,6 @@
#include "code\datums\hud.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
-#include "code\datums\modules.dm"
#include "code\datums\mutable_appearance.dm"
#include "code\datums\periodic_news.dm"
#include "code\datums\progressbar.dm"
@@ -240,6 +240,11 @@
#include "code\datums\uplink_item.dm"
#include "code\datums\vision_override.dm"
#include "code\datums\vr.dm"
+#include "code\datums\antagonists\antag_datum.dm"
+#include "code\datums\antagonists\antag_helpers.dm"
+#include "code\datums\antagonists\antag_hud.dm"
+#include "code\datums\antagonists\antag_spawner.dm"
+#include "code\datums\antagonists\antag_team.dm"
#include "code\datums\cache\air_alarm.dm"
#include "code\datums\cache\apc.dm"
#include "code\datums\cache\cache.dm"
@@ -383,7 +388,6 @@
#include "code\game\data_huds.dm"
#include "code\game\response_team.dm"
#include "code\game\shuttle_engines.dm"
-#include "code\game\skincmd.dm"
#include "code\game\sound.dm"
#include "code\game\world.dm"
#include "code\game\area\ai_monitored.dm"
@@ -402,8 +406,6 @@
#include "code\game\dna\genes\powers.dm"
#include "code\game\dna\genes\vg_disabilities.dm"
#include "code\game\dna\genes\vg_powers.dm"
-#include "code\game\gamemodes\antag_hud.dm"
-#include "code\game\gamemodes\antag_spawner.dm"
#include "code\game\gamemodes\factions.dm"
#include "code\game\gamemodes\game_mode.dm"
#include "code\game\gamemodes\gameticker.dm"
@@ -768,7 +770,6 @@
#include "code\game\objects\items\flag.dm"
#include "code\game\objects\items\latexballoon.dm"
#include "code\game\objects\items\misc.dm"
-#include "code\game\objects\items\policetape.dm"
#include "code\game\objects\items\random_items.dm"
#include "code\game\objects\items\shooting_range.dm"
#include "code\game\objects\items\toys.dm"
@@ -865,7 +866,6 @@
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\pneumaticCannon.dm"
-#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\powerfist.dm"
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RCL.dm"
@@ -964,6 +964,7 @@
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\guillotine.dm"
+#include "code\game\objects\structures\holosign.dm"
#include "code\game\objects\structures\inflatable.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
diff --git a/tgstation.dme b/tgstation.dme
deleted file mode 120000
index abc8cf17220..00000000000
--- a/tgstation.dme
+++ /dev/null
@@ -1 +0,0 @@
-paradise.dme
\ No newline at end of file