L{}pLApI-7j413j=bjJO9H42n7$z9u$yoWL@i0
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
literal 20940
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
Date: Fri, 26 Jun 2020 20:19:42 +0200
Subject: [PATCH 09/37] Remove 1px offset
---
code/_onclick/hud/_defines.dm | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 93786e50c76..b069ff31eb7 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -161,13 +161,13 @@
#define ui_bot_pull "EAST-2:26,SOUTH:7"
//Ghosts
-#define ui_ghost_jumptomob "SOUTH:6,CENTER-2:1"
-#define ui_ghost_orbit "SOUTH:6,CENTER-1:1"
-#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:1"
-#define ui_ghost_teleport "SOUTH:6,CENTER+1:1"
-#define ui_ghost_respawn_list "SOUTH:6,CENTER+2:1"
-#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2:1"
-#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2:1"
+#define ui_ghost_jumptomob "SOUTH:6,CENTER-2"
+#define ui_ghost_orbit "SOUTH:6,CENTER-1"
+#define ui_ghost_reenter_corpse "SOUTH:6,CENTER"
+#define ui_ghost_teleport "SOUTH:6,CENTER+1"
+#define ui_ghost_respawn_list "SOUTH:6,CENTER+2"
+#define ui_ghost_respawn_mob "SOUTH:6+1,CENTER+2"
+#define ui_ghost_respawn_pai "SOUTH:6+2,CENTER+2"
//HUD styles. Please ensure HUD_VERSIONS is the same as the maximum index. Index order defines how they are cycled in F12.
#define HUD_STYLE_STANDARD 1
From a572022c64ca96685b71b222092706205a5d24ae Mon Sep 17 00:00:00 2001
From: joep van der velden
Date: Sun, 28 Jun 2020 00:55:45 +0200
Subject: [PATCH 10/37] Makes maint drones not have a camera
---
code/modules/mob/living/silicon/robot/drone/drone.dm | 1 +
code/modules/mob/living/silicon/robot/robot.dm | 3 ++-
code/modules/mob/living/silicon/robot/syndicate.dm | 1 +
3 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 39bedc78c77..4bc585fa2a1 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -13,6 +13,7 @@
braintype = "Robot"
lawupdate = 0
density = 0
+ has_camera = FALSE
req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS)
ventcrawler = 2
magpulse = 1
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 2eb1e4669ab..11b2536a40c 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -82,6 +82,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/lockcharge //Used when locking down a borg to preserve cell charge
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
+ var/has_camera = TRUE
var/pdahide = 0 //Used to hide the borg from the messenger list
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
var/braintype = "Cyborg"
@@ -132,7 +133,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
init()
- if(!scrambledcodes && !camera)
+ if(has_camera && !camera)
camera = new /obj/machinery/camera(src)
camera.c_tag = real_name
camera.network = list("SS13","Robots")
diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm
index f5ac3e5532b..8e3f660ae98 100644
--- a/code/modules/mob/living/silicon/robot/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/syndicate.dm
@@ -3,6 +3,7 @@
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
+ has_camera = FALSE
pdahide = 1
faction = list("syndicate")
designation = "Syndicate Assault"
From 29a16d31167bdbf2f08e4dd652162ec3a05aed96 Mon Sep 17 00:00:00 2001
From: Kyep
Date: Mon, 29 Jun 2020 18:14:19 -0700
Subject: [PATCH 11/37] Fixes dnamodifier bugs
---
code/game/dna/dna_modifier.dm | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index eae6edd3bd4..2df4a929ceb 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -124,11 +124,11 @@
add_fingerprint(usr)
/obj/machinery/dna_scannernew/Destroy()
- eject_occupant()
+ eject_occupant(TRUE)
return ..()
-/obj/machinery/dna_scannernew/proc/eject_occupant()
- go_out()
+/obj/machinery/dna_scannernew/proc/eject_occupant(force)
+ go_out(force)
for(var/obj/O in src)
if(!istype(O,/obj/item/circuitboard/clonescanner) && \
!istype(O,/obj/item/stock_parts) && \
@@ -271,15 +271,16 @@
occupant.notify_ghost_cloning(source = src)
-/obj/machinery/dna_scannernew/proc/go_out()
+/obj/machinery/dna_scannernew/proc/go_out(force)
if(!occupant)
- to_chat(usr, "The scanner is empty!")
+ if(usr)
+ to_chat(usr, "The scanner is empty!")
return
-
if(locked)
- to_chat(usr, "The scanner is locked!")
- return
-
+ if(usr)
+ to_chat(usr, "The scanner is locked!")
+ if(!force)
+ return
occupant.forceMove(loc)
occupant = null
icon_state = "scanner_open"
From 359b26a811fade0613dcbb337644ac72af0a19f7 Mon Sep 17 00:00:00 2001
From: Kyep
Date: Mon, 29 Jun 2020 20:05:20 -0700
Subject: [PATCH 12/37] Fox request, pass in the usr as arg to
go_out()/eject_occupant()
---
code/game/dna/dna_modifier.dm | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 2df4a929ceb..53e72fe3137 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -118,17 +118,15 @@
if(usr.incapacitated())
return
-
- eject_occupant()
-
+ eject_occupant(usr)
add_fingerprint(usr)
/obj/machinery/dna_scannernew/Destroy()
- eject_occupant(TRUE)
+ eject_occupant(null, TRUE)
return ..()
-/obj/machinery/dna_scannernew/proc/eject_occupant(force)
- go_out(force)
+/obj/machinery/dna_scannernew/proc/eject_occupant(user = null, force = FALSE)
+ go_out(user, force)
for(var/obj/O in src)
if(!istype(O,/obj/item/circuitboard/clonescanner) && \
!istype(O,/obj/item/stock_parts) && \
@@ -271,14 +269,14 @@
occupant.notify_ghost_cloning(source = src)
-/obj/machinery/dna_scannernew/proc/go_out(force)
+/obj/machinery/dna_scannernew/proc/go_out(mob/user, force)
if(!occupant)
- if(usr)
- to_chat(usr, "The scanner is empty!")
+ if(user)
+ to_chat(user, "The scanner is empty!")
return
if(locked)
- if(usr)
- to_chat(usr, "The scanner is locked!")
+ if(user)
+ to_chat(user, "The scanner is locked!")
if(!force)
return
occupant.forceMove(loc)
@@ -752,7 +750,7 @@
return TRUE
if(href_list["ejectOccupant"])
- connected.eject_occupant()
+ connected.eject_occupant(usr)
return TRUE
// Transfer Buffer Management
From 5393a840e0dbd1b396fa8d2451acd039b8c9f491 Mon Sep 17 00:00:00 2001
From: Kyep
Date: Mon, 29 Jun 2020 23:01:13 -0700
Subject: [PATCH 13/37] Fox requests
---
code/game/dna/dna_modifier.dm | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 53e72fe3137..2f9cc98f164 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -125,7 +125,7 @@
eject_occupant(null, TRUE)
return ..()
-/obj/machinery/dna_scannernew/proc/eject_occupant(user = null, force = FALSE)
+/obj/machinery/dna_scannernew/proc/eject_occupant(user, force)
go_out(user, force)
for(var/obj/O in src)
if(!istype(O,/obj/item/circuitboard/clonescanner) && \
@@ -274,11 +274,10 @@
if(user)
to_chat(user, "The scanner is empty!")
return
- if(locked)
+ if(locked && !force)
if(user)
to_chat(user, "The scanner is locked!")
- if(!force)
- return
+ return
occupant.forceMove(loc)
occupant = null
icon_state = "scanner_open"
From 20772d2899fa64a0c2470305c087d97897e1e186 Mon Sep 17 00:00:00 2001
From: Fox McCloud
Date: Tue, 30 Jun 2020 22:30:08 -0400
Subject: [PATCH 14/37] Fixes Mob Init Arguments and Returned Values
---
code/modules/mob/living/carbon/human/human.dm | 54 +++++++++----------
code/modules/mob/living/carbon/human/npcs.dm | 2 +-
.../mob/living/simple_animal/bot/honkbot.dm | 2 +-
.../mob/living/simple_animal/corpse.dm | 4 +-
.../simple_animal/hostile/megafauna/drake.dm | 2 +-
.../mob/living/simple_animal/hostile/mimic.dm | 4 +-
.../simple_animal/hostile/netherworld.dm | 2 +-
.../living/simple_animal/hostile/syndicate.dm | 2 +-
code/modules/mob/mob.dm | 4 +-
9 files changed, 38 insertions(+), 38 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e58ba518780..a7d603f7acd 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -18,7 +18,7 @@
dna = new /datum/dna(null)
// Species name is handled by set_species()
- ..()
+ . = ..()
set_species(new_species, 1, delay_icon_update = 1, skip_same_check = TRUE)
@@ -68,55 +68,55 @@
status_flags = GODMODE|CANPUSH
/mob/living/carbon/human/skrell/Initialize(mapload)
- ..(mapload, /datum/species/skrell)
+ . = ..(mapload, /datum/species/skrell)
/mob/living/carbon/human/tajaran/Initialize(mapload)
- ..(mapload, /datum/species/tajaran)
+ . = ..(mapload, /datum/species/tajaran)
/mob/living/carbon/human/vulpkanin/Initialize(mapload)
- ..(mapload, /datum/species/vulpkanin)
+ . = ..(mapload, /datum/species/vulpkanin)
/mob/living/carbon/human/unathi/Initialize(mapload)
- ..(mapload, /datum/species/unathi)
+ . = ..(mapload, /datum/species/unathi)
/mob/living/carbon/human/vox/Initialize(mapload)
- ..(mapload, /datum/species/vox)
+ . = ..(mapload, /datum/species/vox)
/mob/living/carbon/human/voxarmalis/Initialize(mapload)
- ..(mapload, /datum/species/vox/armalis)
+ . = ..(mapload, /datum/species/vox/armalis)
/mob/living/carbon/human/skeleton/Initialize(mapload)
- ..(mapload, /datum/species/skeleton)
+ . = ..(mapload, /datum/species/skeleton)
/mob/living/carbon/human/kidan/Initialize(mapload)
- ..(mapload, /datum/species/kidan)
+ . = ..(mapload, /datum/species/kidan)
/mob/living/carbon/human/plasma/Initialize(mapload)
- ..(mapload, /datum/species/plasmaman)
+ . = ..(mapload, /datum/species/plasmaman)
/mob/living/carbon/human/slime/Initialize(mapload)
- ..(mapload, /datum/species/slime)
+ . = ..(mapload, /datum/species/slime)
/mob/living/carbon/human/grey/Initialize(mapload)
- ..(mapload, /datum/species/grey)
+ . = ..(mapload, /datum/species/grey)
/mob/living/carbon/human/abductor/Initialize(mapload)
- ..(mapload, /datum/species/abductor)
+ . = ..(mapload, /datum/species/abductor)
/mob/living/carbon/human/diona/Initialize(mapload)
- ..(mapload, /datum/species/diona)
+ . = ..(mapload, /datum/species/diona)
/mob/living/carbon/human/pod_diona/Initialize(mapload)
- ..(mapload, /datum/species/diona/pod)
+ . = ..(mapload, /datum/species/diona/pod)
/mob/living/carbon/human/machine/Initialize(mapload)
- ..(mapload, /datum/species/machine)
+ . = ..(mapload, /datum/species/machine)
/mob/living/carbon/human/machine/created
name = "Integrated Robotic Chassis"
/mob/living/carbon/human/machine/created/Initialize(mapload)
- ..()
+ . = ..()
rename_character(null, "Integrated Robotic Chassis ([rand(1, 9999)])")
update_dna()
for(var/obj/item/organ/external/E in bodyparts)
@@ -129,34 +129,34 @@
death()
/mob/living/carbon/human/shadow/Initialize(mapload)
- ..(mapload, /datum/species/shadow)
+ . = ..(mapload, /datum/species/shadow)
/mob/living/carbon/human/golem/Initialize(mapload)
- ..(mapload, /datum/species/golem)
+ . = ..(mapload, /datum/species/golem)
/mob/living/carbon/human/wryn/Initialize(mapload)
- ..(mapload, /datum/species/wryn)
+ . = ..(mapload, /datum/species/wryn)
/mob/living/carbon/human/nucleation/Initialize(mapload)
- ..(mapload, /datum/species/nucleation)
+ . = ..(mapload, /datum/species/nucleation)
/mob/living/carbon/human/drask/Initialize(mapload)
- ..(mapload, /datum/species/drask)
+ . = ..(mapload, /datum/species/drask)
/mob/living/carbon/human/monkey/Initialize(mapload)
- ..(mapload, /datum/species/monkey)
+ . = ..(mapload, /datum/species/monkey)
/mob/living/carbon/human/farwa/Initialize(mapload)
- ..(mapload, /datum/species/monkey/tajaran)
+ . = ..(mapload, /datum/species/monkey/tajaran)
/mob/living/carbon/human/wolpin/Initialize(mapload)
- ..(mapload, /datum/species/monkey/vulpkanin)
+ . = ..(mapload, /datum/species/monkey/vulpkanin)
/mob/living/carbon/human/neara/Initialize(mapload)
- ..(mapload, /datum/species/monkey/skrell)
+ . = ..(mapload, /datum/species/monkey/skrell)
/mob/living/carbon/human/stok/Initialize(mapload)
- ..(mapload, /datum/species/monkey/unathi)
+ . = ..(mapload, /datum/species/monkey/unathi)
/mob/living/carbon/human/Stat()
..()
diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm
index 41c108dadb9..9dcf83f2e9a 100644
--- a/code/modules/mob/living/carbon/human/npcs.dm
+++ b/code/modules/mob/living/carbon/human/npcs.dm
@@ -7,7 +7,7 @@
species_exception = list(/datum/species/monkey)
/mob/living/carbon/human/monkey/punpun/Initialize(mapload)
- ..()
+ . = ..()
name = "Pun Pun"
real_name = name
equip_to_slot(new /obj/item/clothing/under/punpun(src), slot_w_uniform)
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index d9097a82d2e..62c133fffd7 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -33,7 +33,7 @@
/obj/machinery/bot_core/honkbot
req_one_access = list(ACCESS_CLOWN, ACCESS_ROBOTICS, ACCESS_MIME)
-/mob/living/simple_animal/bot/honkbot/Initialize()
+/mob/living/simple_animal/bot/honkbot/Initialize(mapload)
. = ..()
update_icon()
auto_patrol = TRUE
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 10460d11e65..8d0ad5d0e2b 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -103,9 +103,9 @@
name = "Space Wizard Corpse"
outfit = /datum/outfit/wizardcorpse
-/obj/effect/mob_spawn/human/corpse/clownoff/Initialize()
+/obj/effect/mob_spawn/human/corpse/clownoff/Initialize(mapload)
mob_name = "[pick(GLOB.wizard_first)], [pick(GLOB.wizard_second)]"
- ..()
+ . = ..()
/datum/outfit/wizardcorpse
name = "Space Wizard Corpse"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 6dca834169b..50531f976e9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -534,7 +534,7 @@ obj/effect/temp_visual/fireball
duration = 9
pixel_z = 270
-/obj/effect/temp_visual/fireball/Initialize()
+/obj/effect/temp_visual/fireball/Initialize(mapload)
. = ..()
animate(src, pixel_z = 0, time = duration)
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 848a285abf4..fbf65ccfa9b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -48,8 +48,8 @@
var/attempt_open = 0
// Pickup loot
-/mob/living/simple_animal/hostile/mimic/crate/Initialize()
- ..()
+/mob/living/simple_animal/hostile/mimic/crate/Initialize(mapload)
+ . = ..()
for(var/obj/item/I in loc)
I.loc = src
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index e8ce4027b4e..0f0c52b78e3 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -31,7 +31,7 @@
deathmessage = "wails as its form turns into a pulpy mush."
death_sound = 'sound/voice/hiss6.ogg'
-/mob/living/simple_animal/hostile/netherworld/migo/Initialize()
+/mob/living/simple_animal/hostile/netherworld/migo/Initialize(mapload)
. = ..()
migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg', 'sound/ambience/ambigen1.ogg', 'sound/ambience/ambigen3.ogg', 'sound/ambience/ambigen4.ogg', 'sound/ambience/ambigen5.ogg', 'sound/ambience/ambigen6.ogg', 'sound/ambience/ambigen10.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg') //hahahaha fuck you code divers
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 7ebddfeec12..decfc7146cf 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -260,7 +260,7 @@
alert_on_shield_breach = TRUE
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize(mapload)
- ..()
+ . = ..()
if(prob(50))
// 50% chance of switching to extremely dangerous ranged variant
melee_damage_lower = 10
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d6a86d3e3cd..f10e2c88859 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -23,7 +23,7 @@
LAssailant = null
return ..()
-/mob/Initialize()
+/mob/Initialize(mapload)
GLOB.mob_list += src
if(stat == DEAD)
GLOB.dead_mob_list += src
@@ -31,7 +31,7 @@
GLOB.alive_mob_list += src
set_focus(src)
prepare_huds()
- ..()
+ . = ..()
/atom/proc/prepare_huds()
hud_list = list()
From 6d6091c0e20f8b387b42694efd30109bab596ca6 Mon Sep 17 00:00:00 2001
From: denghis1 <63977635+denghis1@users.noreply.github.com>
Date: Wed, 1 Jul 2020 09:29:10 +0200
Subject: [PATCH 15/37] Added wrench_act to slot machines, so that they can be
moved by the crew
Added the section of code that is used on pretty much every wrenchable machinery to the slot machines, so that they can now be moved and wrenched down again. Wrench time set to 120 to make it take a tad longer than most things to unwrench/wrench.
---
code/game/machinery/slotmachine.dm | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index d0cf38a272d..bdadb1b0da9 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -20,6 +20,12 @@
account = null
ui_interact(user)
+/obj/machinery/slot_machine/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.tool_use_check(user, 0))
+ return
+ default_unfasten_wrench(user, I, 120)
+
/obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
From 71501580dda4a3f1b8f57855aec6fc8ff6e3923c Mon Sep 17 00:00:00 2001
From: denghis1 <63977635+denghis1@users.noreply.github.com>
Date: Wed, 1 Jul 2020 13:20:49 +0200
Subject: [PATCH 16/37] Timer set to use default value
Timer for wrenching changed from 120 the use the proc default instead of 20, this brings it in line with most other wrenchable objects
---
code/game/machinery/slotmachine.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index bdadb1b0da9..5952108b6a9 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -24,7 +24,7 @@
. = TRUE
if(!I.tool_use_check(user, 0))
return
- default_unfasten_wrench(user, I, 120)
+ default_unfasten_wrench(user, I)
/obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
From c709b133452b07b85ef8e3f51218c6765f834348 Mon Sep 17 00:00:00 2001
From: denghis1 <63977635+denghis1@users.noreply.github.com>
Date: Wed, 1 Jul 2020 15:54:10 +0200
Subject: [PATCH 17/37] Prevent swarmers from eating the green podbay door
energy barrier
Prevents swarmers from eating the spacepoddoor, green energy field. This could be eaten to open up a way into space for swarmers
---
code/game/gamemodes/miniantags/bot_swarm/swarmer.dm | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 27097d64913..8da5b4468d7 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -363,6 +363,10 @@
to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.")
return FALSE
+/obj/structure/spacepoddoor/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ to_chat(S, "Disrupting this energy field would overload us. Aborting.")
+ return FALSE
+
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
var/isonshuttle = istype(loc, /area/shuttle)
for(var/turf/T in range(1, src))
From 8852a9de587a83b92ff700b50ebda0a2221da960 Mon Sep 17 00:00:00 2001
From: Fox McCloud
Date: Wed, 1 Jul 2020 10:45:42 -0400
Subject: [PATCH 18/37] Makes New Players GC
---
code/ATMOSPHERICS/atmospherics.dm | 2 +-
code/__HELPERS/game.dm | 2 +-
code/__HELPERS/unique_ids.dm | 6 +-----
code/_globalvars/misc.dm | 2 +-
code/controllers/configuration.dm | 2 +-
code/controllers/subsystem/ticker.dm | 2 +-
code/game/atoms_movable.dm | 1 +
code/game/machinery/tcomms/_base.dm | 2 +-
code/game/objects/items/stacks/stack.dm | 2 +-
code/game/verbs/who.dm | 6 +++---
code/game/world.dm | 2 +-
code/modules/admin/DB ban/functions.dm | 2 +-
code/modules/admin/admin.dm | 8 ++++----
code/modules/admin/admin_verbs.dm | 4 ++--
code/modules/admin/player_panel.dm | 4 ++--
code/modules/admin/topic.dm | 10 ++++------
code/modules/admin/verbs/adminpm.dm | 4 ++--
code/modules/admin/verbs/debug.dm | 4 ++--
code/modules/client/client procs.dm | 11 +++++++++--
code/modules/events/dust.dm | 2 +-
code/modules/food_and_drinks/drinks/drinks/bottle.dm | 2 +-
code/modules/mob/emote.dm | 2 +-
code/modules/mob/mob.dm | 2 +-
code/modules/mob/mob_grab.dm | 2 +-
code/modules/mob/mob_helpers.dm | 2 +-
code/modules/mob/mob_transformation_simple.dm | 2 +-
code/modules/mob/new_player/new_player.dm | 7 ++++++-
27 files changed, 52 insertions(+), 45 deletions(-)
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 002b3ecc691..8dd95119aff 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -59,7 +59,7 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
for(var/mob/living/L in src) //ventcrawling is serious business
L.remove_ventcrawl()
L.forceMove(get_turf(src))
- QDEL_NULL(pipe_image) //we have to del it, or it might keep a ref somewhere else
+ QDEL_NULL(pipe_image) //we have to qdel it, or it might keep a ref somewhere else
return ..()
// Icons/overlays/underlays
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index b519130bb4f..bd077204f00 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -344,7 +344,7 @@
for(var/i = 1; i <= GLOB.player_list.len; i++)
var/mob/M = GLOB.player_list[i]
if(M && M.client)
- if(istype(M, /mob/new_player)) // exclude people in the lobby
+ if(isnewplayer(M)) // exclude people in the lobby
continue
else if(isobserver(M)) // Ghosts are fine if they were playing once (didn't start as observers)
var/mob/dead/observer/O = M
diff --git a/code/__HELPERS/unique_ids.dm b/code/__HELPERS/unique_ids.dm
index 549f5c71016..b66b1a11b90 100644
--- a/code/__HELPERS/unique_ids.dm
+++ b/code/__HELPERS/unique_ids.dm
@@ -16,8 +16,6 @@
GLOBAL_VAR_INIT(next_unique_datum_id, 1)
-// /client/var/tmp/unique_datum_id = null
-
/datum/proc/UID()
if(!unique_datum_id)
var/tag_backup = tag
@@ -37,8 +35,6 @@ GLOBAL_VAR_INIT(next_unique_datum_id, 1)
var/datum/D = locate(copytext(uid, 1, splitat))
- // We might locate a client instead of a datum, but just using : is easier
- // than actually checking and typecasting
- if(D && D:unique_datum_id == uid)
+ if(D && D.unique_datum_id == uid)
return D
return null
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index 74591eb8070..c541e40768a 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -4,7 +4,7 @@ GLOBAL_DATUM(slmaster, /obj/effect/overlay)
GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule
GLOBAL_VAR_INIT(CHARGELEVEL, 0.001) // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
-// Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it.
+// Announcer intercom, because too much stuff creates an intercom for one message then qdel()s it.
GLOBAL_DATUM_INIT(global_announcer, /obj/item/radio/intercom, create_global_announcer())
GLOBAL_DATUM_INIT(command_announcer, /obj/item/radio/intercom/command, create_command_announcer())
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index d348747fb80..083b347e52c 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -36,7 +36,7 @@
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
var/vote_no_dead = 0 // dead people can't vote (tbi)
// var/enable_authentication = 0 // goon authentication
- var/del_new_on_log = 1 // del's new players if they log before they spawn in
+ var/del_new_on_log = 1 // qdel's new players if they log before they spawn in
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 475bdaccb3c..6f8dd85b79b 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -407,7 +407,7 @@ SUBSYSTEM_DEF(ticker)
EquipCustomItems(player)
if(captainless)
for(var/mob/M in GLOB.player_list)
- if(!istype(M,/mob/new_player))
+ if(!isnewplayer(M))
to_chat(M, "Captainship not forced on anyone.")
/datum/controller/subsystem/ticker/proc/send_tip_of_the_round()
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index aed4a4c5c2d..ab5ff19462a 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -50,6 +50,7 @@
loc.handle_atom_del(src)
for(var/atom/movable/AM in contents)
qdel(AM)
+ LAZYCLEARLIST(client_mobs_in_contents)
loc = null
if(pulledby)
pulledby.stop_pulling()
diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm
index 7e468a548bf..dc933099faa 100644
--- a/code/game/machinery/tcomms/_base.dm
+++ b/code/game/machinery/tcomms/_base.dm
@@ -306,7 +306,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines)
if(is_admin(R) && !R.get_preference(CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
- if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
+ if(isnewplayer(R)) // we don't want new players to hear messages. rare but generates runtimes.
continue
// --- Can understand the speech ---
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 14ccc103ab1..ab592cc0402 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -204,7 +204,7 @@
if(amount < 1) // Just in case a stack's amount ends up fractional somehow
var/oldsrc = src
- src = null //dont kill proc after del()
+ src = null //dont kill proc after qdel()
usr.unEquip(oldsrc, 1)
qdel(oldsrc)
if(istype(O, /obj/item))
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 2683e236269..95b11353b86 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -27,7 +27,7 @@
entry += " - Observing"
else
entry += " - DEAD"
- else if(istype(C.mob, /mob/new_player))
+ else if(isnewplayer(C.mob))
entry += " - New Player"
else
entry += " - DEAD"
@@ -90,7 +90,7 @@
if(isobserver(C.mob))
msg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
+ else if(isnewplayer(C.mob))
msg += " - Lobby"
else
msg += " - Playing"
@@ -106,7 +106,7 @@
if(isobserver(C.mob))
modmsg += " - Observing"
- else if(istype(C.mob,/mob/new_player))
+ else if(isnewplayer(C.mob))
modmsg += " - Lobby"
else
modmsg += " - Playing"
diff --git a/code/game/world.dm b/code/game/world.dm
index daeab8fbe4c..355c6280aaf 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -232,7 +232,7 @@ GLOBAL_VAR_INIT(world_topic_spam_protect_time, world.timeofday)
if(!C)
return "No client with that name on server"
- del(C)
+ qdel(C)
return "Kick Successful"
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 21b59586bfd..25693b58f47 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -146,7 +146,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
if(kickbannedckey)
if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey)
- del(banned_mob.client)
+ qdel(banned_mob.client)
if(isjobban)
jobban_client_fullban(ckey, job)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index df156c5b0df..1eed8083a97 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -72,7 +72,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\] "
body += "\[" + M.client.get_exp_type(EXP_TYPE_CREW) + " as [EXP_TYPE_CREW]\]"
- if(istype(M, /mob/new_player))
+ if(isnewplayer(M))
body += " Hasn't Entered Game "
else
body += " \[Heal\] "
@@ -147,7 +147,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
body += {" | Cryo "}
if(M.client)
- if(!istype(M, /mob/new_player))
+ if(!isnewplayer(M))
body += "
"
body += "Transformation:"
body += "
"
@@ -1004,13 +1004,13 @@ GLOBAL_VAR_INIT(gamma_ship_location, 1) // 0 = station , 1 = space
/proc/kick_clients_in_lobby(message, kick_only_afk = 0)
var/list/kicked_client_names = list()
for(var/client/C in GLOB.clients)
- if(istype(C.mob, /mob/new_player))
+ if(isnewplayer(C.mob))
if(kick_only_afk && !C.is_afk()) //Ignore clients who are not afk
continue
if(message)
to_chat(C, message)
kicked_client_names.Add("[C.ckey]")
- del(C)
+ qdel(C)
return kicked_client_names
//returns 1 to let the dragdrop code know we are trapping this event
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 4e3d2d65f30..80a60957c75 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -337,7 +337,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
ghost.reenter_corpse()
log_admin("[key_name(usr)] re-entered their body")
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- else if(istype(mob,/mob/new_player))
+ else if(isnewplayer(mob))
to_chat(src, "Error: Aghost: Can't admin-ghost whilst in the lobby. Join or observe first.")
else
//ghostize
@@ -542,7 +542,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban")
log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban")
to_chat(C, "You have been autobanned due to a warning by [ckey].
This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.")
- del(C)
+ qdel(C)
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban")
log_admin("[key_name(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban")
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index efb5ac32f97..e89b829f421 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -268,7 +268,7 @@
else
M_job = "Living"
- else if(istype(M,/mob/new_player))
+ else if(isnewplayer(M))
M_job = "New player"
else if(isobserver(M))
@@ -356,7 +356,7 @@
dat += "[M.real_name] | "
else if(istype(M, /mob/living/silicon/pai))
dat += "pAI | "
- else if(istype(M, /mob/new_player))
+ else if(isnewplayer(M))
dat += "New Player | "
else if(isobserver(M))
dat += "Ghost | "
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 1a040d46e90..ac8adc5fdf0 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -909,7 +909,7 @@
log_admin("[key_name(usr)] booted [key_name(M)].")
message_admins("[key_name_admin(usr)] booted [key_name_admin(M)].", 1)
//M.client = null
- del(M.client)
+ qdel(M.client)
//Player Notes
else if(href_list["addnote"])
@@ -1011,8 +1011,7 @@
log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
message_admins("[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
- del(M.client)
- //qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
+ qdel(M.client)
if("No")
var/reason = input(usr,"Please state the reason","Reason") as message|null
if(!reason)
@@ -1032,8 +1031,7 @@
feedback_inc("ban_perma",1)
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
- del(M.client)
- //qdel(M)
+ qdel(M.client)
if("Cancel")
return
@@ -1507,7 +1505,7 @@
if(!check_rights(R_SPAWN)) return
var/mob/M = locateUID(href_list["makeanimal"])
- if(istype(M, /mob/new_player))
+ if(isnewplayer(M))
to_chat(usr, "This cannot be used on instances of type /mob/new_player")
return
if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes")
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 164d499e04a..dba9a5c26aa 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -19,7 +19,7 @@
var/list/client/targets[0]
for(var/client/T)
if(T.mob)
- if(istype(T.mob, /mob/new_player))
+ if(isnewplayer(T.mob))
targets["(New Player) - [T]"] = T
else if(istype(T.mob, /mob/dead/observer))
targets["[T.mob.name](Ghost) - [T]"] = T
@@ -42,7 +42,7 @@
var/list/client/targets[0]
for(var/client/T)
if(T.mob)
- if(istype(T.mob, /mob/new_player))
+ if(isnewplayer(T.mob))
targets["[T] - (New Player)"] = T
else if(istype(T.mob, /mob/dead/observer))
targets["[T] - [T.mob.name](Ghost)"] = T
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 329efb8e067..496292c919b 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -251,7 +251,7 @@ GLOBAL_PROTECT(AdminProcCaller)
alert("That mob doesn't seem to exist, close the panel and try again.")
return
- if(istype(M, /mob/new_player))
+ if(isnewplayer(M))
alert("The mob must not be a new_player.")
return
@@ -382,7 +382,7 @@ GLOBAL_PROTECT(AdminProcCaller)
if(!check_rights(R_DEBUG))
return
- //This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with del-all
+ //This gets a confirmation check because it's way easier to accidentally hit this and delete things than it is with qdel-all
var/confirm = alert("This will delete ALL Singularities and Tesla orbs except for any that are on away mission z-levels or the centcomm z-level. Are you sure you want to delete them?", "Confirm Panic Button", "Yes", "No")
if(confirm != "Yes")
return
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 561b0b48149..c4604fcf9ab 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -432,7 +432,13 @@
//////////////
//DISCONNECT//
//////////////
+
/client/Del()
+ if(!gc_destroyed)
+ Destroy() //Clean up signals and timers.
+ return ..()
+
+/client/Destroy()
if(holder)
holder.owner = null
GLOB.admins -= src
@@ -442,7 +448,8 @@
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
Master.UpdateTickRate()
- return ..()
+ ..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening
+ return QDEL_HINT_HARDDEL_NOW
/client/proc/donator_check()
@@ -556,7 +563,7 @@
if(GLOB.panic_bunker_enabled)
var/threshold = config.panic_bunker_threshold
src << "Server is not accepting connections from never-before-seen players until player count is less than [threshold]. Please try again later."
- del(src)
+ qdel(src)
return // Dont insert or they can just go in again
var/DBQuery/query_insert = GLOB.dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')")
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index 563ef98697d..a11ef107a8f 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -16,7 +16,7 @@
density = 1
anchored = 1
var/strength = 2 //ex_act severity number
- var/life = 2 //how many things we hit before del(src)
+ var/life = 2 //how many things we hit before qdel(src)
var/atom/goal = null
/obj/effect/space_dust/weak
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index d6395bf3d43..4515a62d86b 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -115,7 +115,7 @@
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
SplashReagents(target)
- //Finally, smash the bottle. This kills (del) the bottle.
+ //Finally, smash the bottle. This kills (qdel) the bottle.
smash(target, user)
/obj/item/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 5f18a27adc9..99e0af0ca6a 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -135,7 +135,7 @@
if(message)
for(var/mob/M in GLOB.player_list)
- if(istype(M, /mob/new_player))
+ if(isnewplayer(M))
continue
if(check_rights(R_ADMIN|R_MOD, 0, M) && M.get_preference(CHAT_DEAD)) // Show the emote to admins/mods
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d6a86d3e3cd..0b56391d79a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -752,7 +752,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
if(client.holder && (client.holder.rights & R_ADMIN))
is_admin = 1
- else if(stat != DEAD || istype(src, /mob/new_player))
+ else if(stat != DEAD || isnewplayer(src))
to_chat(usr, "You must be observing to use this!")
return
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 64444864804..37e116b4376 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -434,7 +434,7 @@
if(affecting)
if(!affecting.buckled)
affecting.pixel_x = 0
- affecting.pixel_y = 0 //used to be an animate, not quick enough for del'ing
+ affecting.pixel_y = 0 //used to be an animate, not quick enough for qdel'ing
affecting.layer = initial(affecting.layer)
affecting.grabbed_by -= src
affecting = null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 63175a68024..5fb5bcb06c8 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -459,7 +459,7 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM
name = realname
for(var/mob/M in GLOB.player_list)
- if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(CHAT_DEAD))
+ if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(CHAT_DEAD))
var/follow
var/lname
if(subject)
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index c3ec68c9793..1e704ea3449 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -4,7 +4,7 @@
//Note that this proc does NOT do MMI related stuff!
/mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/forcekey = 0)
- if(istype(src,/mob/new_player))
+ if(isnewplayer(src))
to_chat(usr, "cannot convert players who have not entered yet.")
return
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index af3d439df59..9107d7d09ae 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -12,8 +12,13 @@
stat = 2
canmove = 0
-/mob/new_player/New()
+/mob/new_player/Initialize(mapload)
+ SHOULD_CALL_PARENT(FALSE)
+ if(initialized)
+ stack_trace("Warning: [src]([type]) initialized multiple times!")
+ initialized = TRUE
GLOB.mob_list += src
+ return INITIALIZE_HINT_NORMAL
/mob/new_player/verb/new_player_panel()
set src = usr
From b94c07b79771a4c94cd1b27c0b2a5b2b1957600b Mon Sep 17 00:00:00 2001
From: Fox McCloud
Date: Wed, 1 Jul 2020 13:33:46 -0400
Subject: [PATCH 19/37] No Destroying Things Directly
---
code/datums/components/ducttape.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm
index 98512589a46..49931db8edc 100644
--- a/code/datums/components/ducttape.dm
+++ b/code/datums/components/ducttape.dm
@@ -37,10 +37,10 @@
I.anchored = initial(I.anchored)
for(var/datum/action/item_action/remove_tape/RT in I.actions)
RT.Remove(user)
- RT.Destroy()
+ qdel(RT)
I.overlays.Cut(tape_overlay)
user.transfer_fingerprints_to(I)
- Destroy()
+ qdel(src)
/datum/component/ducttape/proc/afterattack(obj/item/I, atom/target, mob/user, proximity, params)
if(!proximity)
From f1f7610c4d515f942d1b34cea1627f2aaa754cd6 Mon Sep 17 00:00:00 2001
From: Fox McCloud
Date: Wed, 1 Jul 2020 13:46:09 -0400
Subject: [PATCH 20/37] client cleanup
---
code/modules/client/client defines.dm | 7 -------
1 file changed, 7 deletions(-)
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 3cd6458afdf..9a3a1215df3 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -59,10 +59,6 @@
var/karma = 0
var/karma_spent = 0
var/karma_tab = 0
- /////////////////////////////////////////////
- // /vg/: MEDIAAAAAAAA
- // Set on login.
- var/datum/media_manager/media = null
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
@@ -85,9 +81,6 @@
// If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
var/advanced_admin_interaction = FALSE
- // Has the client been varedited by an admin? [Inherits from datum now]
- // var/var_edited = FALSE
-
var/client_keysend_amount = 0
var/next_keysend_reset = 0
var/next_keysend_trip_reset = 0
From 79cc1e24e4daaac4fd3736802b66d84ccfefc2a5 Mon Sep 17 00:00:00 2001
From: AffectedArc07
Date: Thu, 2 Jul 2020 09:59:27 +0100
Subject: [PATCH 21/37] Fixes typo in TGUI tutorial docs
---
tgui/docs/tutorial-and-examples.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tgui/docs/tutorial-and-examples.md b/tgui/docs/tutorial-and-examples.md
index b50d980157c..08bb6f92321 100644
--- a/tgui/docs/tutorial-and-examples.md
+++ b/tgui/docs/tutorial-and-examples.md
@@ -37,7 +37,7 @@ powerful interactions for embedded objects or remote access.
Let's start with a very basic hello world.
```dm
-/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = default_state)
+/obj/machinery/my_machine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "my_machine", name, 300, 300, master_ui, state)
@@ -294,7 +294,7 @@ here's what you need (note that you'll probably be forced to clean your shit up
upon code review):
```dm
-/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) // Remember to use the appropriate state.
+/obj/copypasta/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) // Remember to use the appropriate state.
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "copypasta", name, 300, 300, master_ui, state)
From e305530d59b9bb8169191a4c60feb30c8d33f3a8 Mon Sep 17 00:00:00 2001
From: AffectedArc07
Date: Thu, 2 Jul 2020 21:22:55 +0100
Subject: [PATCH 22/37] Obliterates Zombies
---
code/__DEFINES/genetics.dm | 1 -
code/__DEFINES/is_helpers.dm | 1 -
code/_globalvars/lists/objects.dm | 1 -
code/datums/uplink_item.dm | 9 --
code/game/gamemodes/objective.dm | 10 +-
.../items/weapons/storage/uplink_kits.dm | 13 ---
code/modules/mob/language.dm | 11 --
.../living/carbon/human/species/_species.dm | 1 -
.../living/carbon/human/species/zombies.dm | 102 ------------------
.../simple_animal/hostile/netherworld.dm | 4 +-
.../sprite_accessories/sprite_accessories.dm | 2 +-
.../reagents/chemistry/reagents/toxins.dm | 31 ------
.../reagents/reagent_containers/bottle.dm | 5 -
code/modules/shuttle/emergency.dm | 2 -
code/modules/zombie/items.dm | 69 ------------
code/modules/zombie/organs.dm | 99 -----------------
icons/mob/human_races/r_def_zombie.dmi | Bin 2032 -> 0 bytes
icons/mob/human_races/r_zombie.dmi | Bin 2032 -> 0 bytes
paradise.dme | 3 -
19 files changed, 8 insertions(+), 356 deletions(-)
delete mode 100644 code/modules/mob/living/carbon/human/species/zombies.dm
delete mode 100644 code/modules/zombie/items.dm
delete mode 100644 code/modules/zombie/organs.dm
delete mode 100644 icons/mob/human_races/r_def_zombie.dmi
delete mode 100644 icons/mob/human_races/r_zombie.dmi
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 58571e8b1ca..5fd85513501 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -145,7 +145,6 @@
#define RESISTCOLD "resist_cold"
#define NO_EXAMINE "no_examine"
#define CAN_WINGDINGS "can_wingdings"
-#define NOZOMBIE "no_zombie"
#define NO_GERMS "no_germs"
#define NO_DECAY "no_decay"
#define PIERCEIMMUNE "pierce_immunity"
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index b52d08c1d23..2b8c515e81a 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -3,7 +3,6 @@
// Mobs
#define ismegafauna(A) istype(A, /mob/living/simple_animal/hostile/megafauna)
-#define iszombie(A) (is_species(A, /datum/species/zombie))
//Simple animals
#define isshade(A) (istype(A, /mob/living/simple_animal/shade))
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 931a0e394e8..21af95cab48 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -16,7 +16,6 @@ GLOBAL_LIST_INIT(prisoncomputer_list, list())
GLOBAL_LIST_INIT(celltimers_list, list()) // list of all cell timers
GLOBAL_LIST_INIT(cell_logs, list())
GLOBAL_LIST_INIT(navigation_computers, list())
-GLOBAL_LIST_INIT(zombie_infection_list, list())
GLOBAL_LIST_INIT(all_areas, list())
GLOBAL_LIST_INIT(machines, list())
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index a0c9a19e4b0..8dbdfd95420 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -188,15 +188,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/syndie_kit/fake_revolver
cost = 1
job = list("Clown")
-/*
-/datum/uplink_item/stealthy_weapons/romerol_kit
- name = "Romerol"
- reference = "ROM"
- desc = "A highly experimental bioterror agent which creates dormant nodules to be etched into the grey matter of the brain. On death, these nodules take control of the dead body, causing limited revivification, along with slurred speech, aggression, and the ability to infect others with this agent."
- item = /obj/item/storage/box/syndie_kit/romerol
- cost = 25
- cant_discount = TRUE
-*/
//mime
/datum/uplink_item/jobspecific/caneshotgun
name = "Cane Shotgun and Assassination Shells"
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index c6f6218e969..0b46264cb33 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -67,7 +67,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/assassinate/check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || iszombie(target))
+ if(target.current.stat == DEAD)
return 1
if(issilicon(target.current) || isbrain(target.current)) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
@@ -111,7 +111,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
/datum/objective/maroon/check_completion()
if(target && target.current)
- if(target.current.stat == DEAD || iszombie(target))
+ if(target.current.stat == DEAD)
return 1
if(!target.current.ckey)
return 1
@@ -168,7 +168,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
if(!target) //If it's a free objective.
return 1
if(target.current)
- if(target.current.stat == DEAD || iszombie(target))
+ if(target.current.stat == DEAD)
return 0
if(issilicon(target.current))
return 0
@@ -262,7 +262,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
return 0
if(isbrain(owner.current))
return 0
- if(!owner.current || owner.current.stat == DEAD || iszombie(owner))
+ if(!owner.current || owner.current.stat == DEAD)
return 0
if(SSticker.force_ending) //This one isn't their fault, so lets just assume good faith
return 1
@@ -317,7 +317,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective)
explanation_text = "Die a glorious death."
/datum/objective/die/check_completion()
- if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current) || iszombie(owner))
+ if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
return 1
if(issilicon(owner.current) && owner.current != owner.original)
return 1
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index f965907c5ba..6cf011bc2c3 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -121,19 +121,6 @@
desc = "A sleek, sturdy box"
icon_state = "box_of_doom"
-/obj/item/storage/box/syndie_kit/romerol
- name = "Romerol Kit"
- desc = "A box containing a deadly virus capable of reanimating dead as zombies."
- max_w_class = WEIGHT_CLASS_NORMAL
- can_hold = list(/obj/item/reagent_containers/glass/bottle/romerol,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/dropper)
-
-/obj/item/storage/box/syndie_kit/romerol/New()
- ..()
- new /obj/item/reagent_containers/glass/bottle/romerol(src)
- new /obj/item/reagent_containers/syringe(src)
- new /obj/item/reagent_containers/dropper(src)
- return
-
/obj/item/storage/box/syndie_kit/space
name = "Boxed Space Suit and Helmet"
can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red, /obj/item/tank/emergency_oxygen/syndi, /obj/item/clothing/mask/gas/syndicate)
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 92d936227cc..a46268daf50 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -767,17 +767,6 @@
desc = "Bark bark bark."
key = "vu"
-/datum/language/zombie
- name = "Zombie"
- desc = "BRAAAAAAINS!"
- speech_verb = "moans"
- whisper_verb = "mutters"
- exclaim_verb = "wails"
- colour = "zombie"
- key = "zom"
- flags = RESTRICTED
- syllables = list("BRAAAAAAAAAAAAAAAAINS", "BRAAINS", "BRAINS")
-
/mob/proc/grant_all_babel_languages()
for(var/la in GLOB.all_languages)
var/datum/language/new_language = GLOB.all_languages[la]
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 2114299f939..f65cefff49d 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -53,7 +53,6 @@
var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
var/speed_mod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster
var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood?
- var/obj/item/mutanthands
var/total_health = 100
var/punchdamagelow = 0 //lowest possible punch damage
var/punchdamagehigh = 9 //highest possible punch damage
diff --git a/code/modules/mob/living/carbon/human/species/zombies.dm b/code/modules/mob/living/carbon/human/species/zombies.dm
deleted file mode 100644
index 1f1c4d979b7..00000000000
--- a/code/modules/mob/living/carbon/human/species/zombies.dm
+++ /dev/null
@@ -1,102 +0,0 @@
-#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin
-
-/datum/species/zombie
- // 1spooky
- name = "High-Functioning Zombie"
- name_plural = "High-Functioning Zombies"
- icobase = 'icons/mob/human_races/r_zombie.dmi'
- deform = 'icons/mob/human_races/r_def_zombie.dmi'
- dies_at_threshold = TRUE
- language = "Zombie"
- species_traits = list(NO_BLOOD, NOZOMBIE, NOTRANSSTING, NO_BREATHE, RADIMMUNE, NO_SCAN)
- var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
- warning_low_pressure = -1
- hazard_low_pressure = -1
- hazard_high_pressure = 999999999
- warning_high_pressure = 999999999
- cold_level_1 = -1
- cold_level_2 = -1
- cold_level_3 = -1
- tox_mod = 0
- flesh_color = "#00FF00" // for green examine text
- bodyflags = HAS_SKIN_COLOR
- dietflags = DIET_CARN
- has_organ = list(
- "heart" = /obj/item/organ/internal/heart,
- "lungs" = /obj/item/organ/internal/lungs,
- "liver" = /obj/item/organ/internal/liver,
- "kidneys" = /obj/item/organ/internal/kidneys,
- "brain" = /obj/item/organ/internal/brain,
- "appendix" = /obj/item/organ/internal/appendix,
- "eyes" = /obj/item/organ/internal/eyes,
- "ears" = /obj/item/organ/internal/ears)
-
-
-/datum/species/zombie/infectious
- name = "Infectious Zombie"
- mutanthands = /obj/item/zombie_hand
- icobase = 'icons/mob/human_races/r_zombie.dmi'
- deform = 'icons/mob/human_races/r_def_zombie.dmi'
- brute_mod = 0.8 // 120 damage to KO a zombie, which kills it
- burn_mod = 0.8
- clone_mod = 0.8
- brain_mod = 0.8
- stamina_mod = 0.8
- speed_mod = 1.6
- default_language = "Zombie"
- var/heal_rate = 1
- var/regen_cooldown = 0
-
-/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H, amount)
- . = min(20, amount)
-
-/datum/species/zombie/infectious/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, obj/used_weapon = null)
- . = ..()
- if(damage)
- regen_cooldown = world.time + REGENERATION_DELAY
-
-/datum/species/zombie/infectious/handle_life(mob/living/carbon/human/H)
- . = ..()
- H.a_intent = INTENT_HARM // THE SUFFERING MUST FLOW
-
- //Zombies never actually die, they just fall down until they regenerate enough to rise back up.
- //They must be restrained, beheaded or gibbed to stop being a threat.
- if(regen_cooldown < world.time)
- var/heal_amt = heal_rate
- if(H.InCritical())
- heal_amt *= 2
- H.heal_overall_damage(heal_amt,heal_amt)
- H.adjustToxLoss(-heal_amt)
- if(!H.InCritical() && prob(4))
- playsound(H, pick(spooks), 50, TRUE, 10)
-
-//Congrats you somehow died so hard you stopped being a zombie
-/datum/species/zombie/infectious/handle_death(gibbed, mob/living/carbon/C)
- . = ..()
- var/obj/item/organ/internal/zombie_infection/infection
- infection = C.get_organ_slot("zombie_infection")
- if(infection)
- qdel(infection)
-
-/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
- . = ..()
- // Deal with the source of this zombie corruption
- // Infection organ needs to be handled separately from mutant_organs
- // because it persists through species transitions
- if(mutanthands)
- H.drop_l_hand()
- H.drop_r_hand()
- H.put_in_hands(new mutanthands())
- H.put_in_hands(new mutanthands())
- var/obj/item/organ/internal/zombie_infection/infection
- infection = H.get_organ_slot("zombie_infection")
- if(!infection)
- infection = new()
- infection.insert(H)
-
-/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/C, datum/species/old_species)
- QDEL_NULL(C.r_hand)
- QDEL_NULL(C.l_hand)
- return ..()
-
-#undef REGENERATION_DELAY
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index e8ce4027b4e..346583205e5 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -82,14 +82,14 @@
/obj/structure/spawner/nether/examine(mob/user)
. = ..()
- if(isskeleton(user) || iszombie(user))
+ if(isskeleton(user))
. += "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!"
else
. += "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea."
/obj/structure/spawner/nether/attack_hand(mob/user)
. = ..()
- if(isskeleton(user) || iszombie(user))
+ if(isskeleton(user))
to_chat(user, "You don't feel like going home yet...")
else
user.visible_message("[user] is violently pulled into the link!", \
diff --git a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
index 476861861a3..d4834eccc80 100644
--- a/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories/sprite_accessories.dm
@@ -48,7 +48,7 @@
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
// Restrict some styles to specific species
- var/list/species_allowed = list("Human", "Slime People", "Infectious Zombie", "High-Functioning Zombie")
+ var/list/species_allowed = list("Human", "Slime People")
var/list/sprite_sheets = list() //For accessories common across species but need to use 'fitted' sprites (like underwear). e.g. list("Vox" = 'icons/mob/species/vox/iconfile.dmi')
var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with.
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index dec256ac455..c6ff39aaead 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -226,37 +226,6 @@
if(B && islist(B.data) && !data)
data = B.data.Copy()
-/datum/reagent/romerol
- name = "romerol"
- // the REAL zombie powder
- id = "romerol"
- description = "Romerol is a highly experimental bioterror agent \
- which causes dormant nodules to be etched into the grey matter of \
- the subject. These nodules only become active upon death of the \
- host, upon which, the secondary structures activate and take control \
- of the host body."
- color = "#123524" // RGB (18, 53, 36)
- metabolization_rate = INFINITY
- can_synth = FALSE
- taste_description = "CAAAARL"
-
-/datum/reagent/romerol/reaction_mob(mob/living/carbon/human/H, method = REAGENT_TOUCH, volume)
- if(!istype(H))
- return
- // Silently add the zombie infection organ to be activated upon death
- if(!H.get_organ_slot("zombie_infection"))
- var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new()
- ZI.insert(H)
- ..()
-
-/datum/reagent/romerol/on_mob_life(mob/living/M)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(!H.get_organ_slot("zombie_infection"))
- var/obj/item/organ/internal/zombie_infection/nodamage/ZI = new()
- ZI.insert(H)
- return ..()
-
/datum/reagent/uranium
name ="Uranium"
id = "uranium"
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 61552eae789..6c836988e8b 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -12,11 +12,6 @@
container_type = OPENCONTAINER
volume = 30
-/obj/item/reagent_containers/glass/bottle/romerol
- name = "romerol bottle"
- desc = "A small bottle of Romerol. The REAL zombie powder."
- list_reagents = list("romerol" = 30)
-
/obj/item/reagent_containers/glass/bottle/on_reagent_change()
update_icon()
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index f82598b1e14..de08d5cdf82 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -178,8 +178,6 @@
continue
if(player.stat == DEAD) // Corpses
continue
- if(iszombie(player)) // Walking corpses
- continue
if(issilicon(player)) //Borgs are technically dead anyways
continue
if(isanimal(player)) //Poly does not own the shuttle
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
deleted file mode 100644
index 0f0f85b088b..00000000000
--- a/code/modules/zombie/items.dm
+++ /dev/null
@@ -1,69 +0,0 @@
-/obj/item/zombie_hand
- name = "zombie claw"
- desc = "A zombie's claw is its primary tool, capable of infecting \
- unconscious or dead humans, butchering all other living things to \
- sustain the zombie, forcing open airlock doors and opening \
- child-safe caps on bottles."
- flags = NODROP|ABSTRACT|DROPDEL
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- icon = 'icons/effects/blood.dmi'
- icon_state = "bloodhand_left"
- var/icon_left = "bloodhand_left"
- var/icon_right = "bloodhand_right"
- hitsound = 'sound/hallucinations/growl1.ogg'
- force = 21 // Just enough to break airlocks with melee attacks
- damtype = "brute"
-
-/obj/item/zombie_hand/equipped(mob/user, slot)
- . = ..()
- switch(slot)
- // Yes, these intentionally don't match
- if(slot_l_hand)
- icon_state = icon_right
- if(slot_r_hand)
- icon_state = icon_left
-
-/obj/item/zombie_hand/afterattack(atom/target, mob/user, proximity_flag)
- . = ..()
- if(!proximity_flag)
- return
-
- else if(isliving(target))
- if(ishuman(target))
- try_to_zombie_infect(target)
- else
- check_feast(target, user)
-
-/proc/try_to_zombie_infect(mob/living/carbon/human/target)
- CHECK_DNA_AND_SPECIES(target)
-
- if(NOZOMBIE in target.dna.species.species_traits)
- // cannot infect any NOZOMBIE subspecies (such as high functioning
- // zombies)
- return
-
- var/obj/item/organ/internal/zombie_infection/infection
- infection = target.get_organ_slot("zombie_infection")
- if(!infection)
- infection = new()
- infection.insert(target)
-
-/obj/item/zombie_hand/proc/check_feast(mob/living/target, mob/living/user)
- if(target.stat == DEAD)
- var/hp_gained = target.maxHealth
- target.gib()
- user.adjustBruteLoss(-hp_gained, FALSE)
- user.adjustToxLoss(-hp_gained, FALSE)
- user.adjustFireLoss(-hp_gained, FALSE)
- user.adjustCloneLoss(-hp_gained, FALSE)
- user.adjustBrainLoss(-hp_gained, FALSE) // Zom Bee gibbers "BRAAAAISNSs!1!"
- user.updatehealth()
-
-/obj/item/zombie_hand/suicide_act(mob/living/carbon/human/user)
- user.visible_message("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!")
- if(ishuman(user))
- var/mob/living/carbon/human/L = user
- var/obj/item/organ/external/O = L.get_organ("head")
- if(O)
- O.droplimb()
- return (BRUTELOSS)
diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm
deleted file mode 100644
index 6ea40c90e96..00000000000
--- a/code/modules/zombie/organs.dm
+++ /dev/null
@@ -1,99 +0,0 @@
-/obj/item/organ/internal/zombie_infection
- name = "festering ooze"
- desc = "A black web of pus and viscera."
- parent_organ = "head"
- slot = "zombie_infection"
- icon_state = "blacktumor"
- var/causes_damage = TRUE
- var/datum/species/old_species = /datum/species/human
- var/living_transformation_time = 30
- var/converts_living = FALSE
-
- var/revive_time_min = 450
- var/revive_time_max = 700
- var/timer_id
-
-/obj/item/organ/internal/zombie_infection/New(mob/living/carbon/holder)
- ..()
- GLOB.zombie_infection_list += src
-
-/obj/item/organ/internal/zombie_infection/Destroy()
- GLOB.zombie_infection_list -= src
- . = ..()
-
-/obj/item/organ/internal/zombie_infection/insert(mob/living/carbon/human/M, special = 0)
- ..()
- START_PROCESSING(SSobj, src)
-
-/obj/item/organ/internal/zombie_infection/remove(mob/living/carbon/human/M, special = 0)
- STOP_PROCESSING(SSobj, src)
- if(iszombie(M) && old_species)
- M.set_species(old_species, retain_damage = TRUE)
- if(timer_id)
- deltimer(timer_id)
- . = ..()
-
-/obj/item/organ/internal/zombie_infection/on_find(mob/living/finder)
- to_chat(finder, "Inside the head is a disgusting black \
- web of pus and viscera, bound tightly around the brain like some \
- biological harness.")
-
-/obj/item/organ/internal/zombie_infection/process()
- if(!owner)
- return
- if(!(src in owner.internal_organs))
- remove(owner)
- if(causes_damage && !iszombie(owner) && owner.stat != DEAD)
- owner.adjustToxLoss(1)
- if (prob(10))
- to_chat(owner, "You feel sick...")
- if(timer_id)
- return
- if(owner.suiciding)
- return
- if(owner.stat != DEAD && !converts_living)
- return
- if(!owner.get_int_organ(/obj/item/organ/internal/brain))
- return
- if(!iszombie(owner))
- to_chat(owner, "You can feel your heart stopping, but something isn't right... \
- life has not abandoned your broken form. You can only feel a deep and immutable hunger that \
- not even death can stop, you will rise again!")
- var/revive_time = rand(revive_time_min, revive_time_max)
- var/flags = TIMER_STOPPABLE
- timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags)
-
-/obj/item/organ/internal/zombie_infection/proc/zombify()
- timer_id = null
-
- if(!converts_living && owner.stat != DEAD)
- return
-
- if(!iszombie(owner))
- old_species = owner.dna.species.type
- owner.set_species(/datum/species/zombie/infectious)
- for(var/datum/disease/critical/crit in owner.viruses) // cure any new crit viruses
- crit.cure(0)
-
- var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
- //Fully heal the zombie's damage the first time they rise
- owner.setToxLoss(0)
- owner.setOxyLoss(0)
- owner.setBrainLoss(0)
- owner.setCloneLoss(0)
- owner.SetLoseBreath(0)
- owner.heal_overall_damage(INFINITY, INFINITY, TRUE, TRUE, FALSE)
- owner.setStaminaLoss(0)
-
- if(!owner.update_revive())
- return
-
- owner.grab_ghost()
- owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!")
- playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, TRUE)
- owner.do_jitter_animation(living_transformation_time)
- owner.Stun(living_transformation_time * 0.05)
- to_chat(owner, "You are now a zombie! Do not seek to be cured, do not help any non-zombies in any way, do not harm your zombie brethren and spread the disease by killing others. You are a creature of hunger and violence.")
-
-/obj/item/organ/internal/zombie_infection/nodamage
- causes_damage = FALSE
diff --git a/icons/mob/human_races/r_def_zombie.dmi b/icons/mob/human_races/r_def_zombie.dmi
deleted file mode 100644
index 007eb3f31f3ab8651f9294fe6c3339ac10682af7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2032
zcmX|Bdpy(s8vkz0hM$9wB<1qUh|t9?GItv`tYK-*Etf?usaV!FYUX}Tix%nRnno0U
zQdZ*SL@DXwvWYO|pr&%0?QqVo^ZfHX@6Yr4JkR^{yr0)6!yDtKAh%Nv000FP(isZ?
zpv@2jz@#=^R6QQI>GHijaV}ggHzL#9_llL%Wi8u84Fbd2CUp<#f>dY>;N}I8&I1vt
zT9_*)AplSW06qo)nN0Tg_qW{*SldBeJ>|{Jfv^m;ud+UYX-`aZKEZGxraL<`w1`X>
zQnrsD!y3;x8pK3~rh5?6T#qvl!Az7>sum&L-j`t&vUTXa1#l`?Y5<92xkzAMAA1)E=MxITqC+|)6
z>YR$CKHVX@gOP3;9qep)YkV^E;g@G`)SyF|QHboK*%&?APEXMGcx3^vtl9tdFe~oJ
z*%@@4U93)6FYKK-Lt19{JlMx^&Bp~@rql0k%U*}{N_$QaDsR;||GXwHSn#zf
zJgke>8$7Iw>e8&NtPK8X!BpCQ&>wLFq@uKDu@D<*v{t(=9*2@|x22eVY+3>U8E=%c
z11^a@e=|P$hJ{j3fwb)Q?!6@BwJOrwz4`Wsean(0o8Z_>Ewh-QMr-rM0WUG~4vd$T
zuawBn0&l+lZ=?H~z0cvy)n|wwKX5&LhyAg#c``c8&A+PM#|Z`07G%}lJOby`>1P8~
zXGz_`S9gI->>9;+R{gm>Xj1WA!mGJb73gaO?1RS5lDfhl@%lqn8FUYOp2zY_)OKuz
ztsPqBfOo4GiTyjN{3_eo2cRwL=H=y*J3SecUvOBB1QGM=!u!2G-
z&wBfXQ#8M}v0sxzO+slVXI_DaR7Cq<4c$k;376aB!w)&o(L;lS;i8V0=p*FsBPDrs
zmI-${+;RS8*bsKyljN*^WA;H0RuE;l)r0OhHVeq=U@*DLSS{VD{u&rZ3D&b!b=V(vEku#Rp%RA{k
z4Tn>qkSTF>zlWa^{|P#ob2jM`!d$9;AGhrbY39#sE6aa@`}+dTdRqP}S}}ycn(1ug
zYIYI#ld;hX0hDdbHBhwb+vc%?63|P)*%pgQT0i*GYDHy&-o$6agC=iRv(^5uGys?u
zA~?vhTQS}eaR3ETy;kOGCQuB#`H_Jsu@wr=~S
z40xI8cRCzIA`#KlRG(FaG-;W-POOpajnp6<^>PJ<4+g&7CMSIE7HW>CPv@|zW#_Fu
z`RS<0%-fbt;3uT#GSA#^lS?`dxZ=3Hoq9P1Rm+nB*2ecU)ov{%xb3mS{$Rb9Bojdq
zmp2kSfW+b$(7rdoWI+`z*_=k7{C3mI4d}63=Dv5U&HOiS*tt#Ax8u0kAfANwo1+
zD9JiwDa`eU4hWaM`X!3LM@y&BX}iVb6~RO~lU8QR+yW()qRk&;(>^hRne$fVH9D%L
zmCt_SLR{9J?yDK8G8#+v@{c~D*|x+A9CEws>d(LTb7VYUmhVWGAb0T|C1@{RwX+h~
zv1{SK+W>&zsd`AhU!ZCRtFkgrzsO
z*Yh0HbDCXoz2-TSD_3+*1awbh<)?q<%F#A*@+ReUFoh`-@^F92piiz6B0+mCh6Hn{
ze+kzqY^eWA%y!h&O+VE+3dN@+Ss78Z8OP#qs7<
z1-~$>GPM#~z9Zo~k&fO^1eZeMpr9)#zR2+TL;>IclH}NMElWYYVm4$&{2?(|LvOSu
zgV-)D>JcV9|9YpR)9bRmS2WogrcD69ADRU4!-(=-Ag`|P<#?&S2@7|k%$$3>0{#PH
zQHER|(YV?wild-_)s+c9AJw3f5(>ISBVu@icycjs!1bT-yv5WFM@iQCjivKPDS432
ziTN%Yw~C$eC&81{5At_wz%%gE-zoLtUb*3-i@W2>h`&|omHVIWe=k79X)Z!hVk=tu
zHqeEjVI`s$2Hyr6vScKpx|+>Eb}L~D{C78m6R|ue8!CrWWW7}k<$`hMI0mKu2Mi9T
AbpQYW
diff --git a/icons/mob/human_races/r_zombie.dmi b/icons/mob/human_races/r_zombie.dmi
deleted file mode 100644
index 007eb3f31f3ab8651f9294fe6c3339ac10682af7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2032
zcmX|Bdpy(s8vkz0hM$9wB<1qUh|t9?GItv`tYK-*Etf?usaV!FYUX}Tix%nRnno0U
zQdZ*SL@DXwvWYO|pr&%0?QqVo^ZfHX@6Yr4JkR^{yr0)6!yDtKAh%Nv000FP(isZ?
zpv@2jz@#=^R6QQI>GHijaV}ggHzL#9_llL%Wi8u84Fbd2CUp<#f>dY>;N}I8&I1vt
zT9_*)AplSW06qo)nN0Tg_qW{*SldBeJ>|{Jfv^m;ud+UYX-`aZKEZGxraL<`w1`X>
zQnrsD!y3;x8pK3~rh5?6T#qvl!Az7>sum&L-j`t&vUTXa1#l`?Y5<92xkzAMAA1)E=MxITqC+|)6
z>YR$CKHVX@gOP3;9qep)YkV^E;g@G`)SyF|QHboK*%&?APEXMGcx3^vtl9tdFe~oJ
z*%@@4U93)6FYKK-Lt19{JlMx^&Bp~@rql0k%U*}{N_$QaDsR;||GXwHSn#zf
zJgke>8$7Iw>e8&NtPK8X!BpCQ&>wLFq@uKDu@D<*v{t(=9*2@|x22eVY+3>U8E=%c
z11^a@e=|P$hJ{j3fwb)Q?!6@BwJOrwz4`Wsean(0o8Z_>Ewh-QMr-rM0WUG~4vd$T
zuawBn0&l+lZ=?H~z0cvy)n|wwKX5&LhyAg#c``c8&A+PM#|Z`07G%}lJOby`>1P8~
zXGz_`S9gI->>9;+R{gm>Xj1WA!mGJb73gaO?1RS5lDfhl@%lqn8FUYOp2zY_)OKuz
ztsPqBfOo4GiTyjN{3_eo2cRwL=H=y*J3SecUvOBB1QGM=!u!2G-
z&wBfXQ#8M}v0sxzO+slVXI_DaR7Cq<4c$k;376aB!w)&o(L;lS;i8V0=p*FsBPDrs
zmI-${+;RS8*bsKyljN*^WA;H0RuE;l)r0OhHVeq=U@*DLSS{VD{u&rZ3D&b!b=V(vEku#Rp%RA{k
z4Tn>qkSTF>zlWa^{|P#ob2jM`!d$9;AGhrbY39#sE6aa@`}+dTdRqP}S}}ycn(1ug
zYIYI#ld;hX0hDdbHBhwb+vc%?63|P)*%pgQT0i*GYDHy&-o$6agC=iRv(^5uGys?u
zA~?vhTQS}eaR3ETy;kOGCQuB#`H_Jsu@wr=~S
z40xI8cRCzIA`#KlRG(FaG-;W-POOpajnp6<^>PJ<4+g&7CMSIE7HW>CPv@|zW#_Fu
z`RS<0%-fbt;3uT#GSA#^lS?`dxZ=3Hoq9P1Rm+nB*2ecU)ov{%xb3mS{$Rb9Bojdq
zmp2kSfW+b$(7rdoWI+`z*_=k7{C3mI4d}63=Dv5U&HOiS*tt#Ax8u0kAfANwo1+
zD9JiwDa`eU4hWaM`X!3LM@y&BX}iVb6~RO~lU8QR+yW()qRk&;(>^hRne$fVH9D%L
zmCt_SLR{9J?yDK8G8#+v@{c~D*|x+A9CEws>d(LTb7VYUmhVWGAb0T|C1@{RwX+h~
zv1{SK+W>&zsd`AhU!ZCRtFkgrzsO
z*Yh0HbDCXoz2-TSD_3+*1awbh<)?q<%F#A*@+ReUFoh`-@^F92piiz6B0+mCh6Hn{
ze+kzqY^eWA%y!h&O+VE+3dN@+Ss78Z8OP#qs7<
z1-~$>GPM#~z9Zo~k&fO^1eZeMpr9)#zR2+TL;>IclH}NMElWYYVm4$&{2?(|LvOSu
zgV-)D>JcV9|9YpR)9bRmS2WogrcD69ADRU4!-(=-Ag`|P<#?&S2@7|k%$$3>0{#PH
zQHER|(YV?wild-_)s+c9AJw3f5(>ISBVu@icycjs!1bT-yv5WFM@iQCjivKPDS432
ziTN%Yw~C$eC&81{5At_wz%%gE-zoLtUb*3-i@W2>h`&|omHVIWe=k79X)Z!hVk=tu
zHqeEjVI`s$2Hyr6vScKpx|+>Eb}L~D{C78m6R|ue8!CrWWW7}k<$`hMI0mKu2Mi9T
AbpQYW
diff --git a/paradise.dme b/paradise.dme
index b687e6c9db2..21029f96bfc 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1850,7 +1850,6 @@
#include "code\modules\mob\living\carbon\human\species\vox.dm"
#include "code\modules\mob\living\carbon\human\species\vulpkanin.dm"
#include "code\modules\mob\living\carbon\human\species\wryn.dm"
-#include "code\modules\mob\living\carbon\human\species\zombies.dm"
#include "code\modules\mob\living\silicon\death.dm"
#include "code\modules\mob\living\silicon\emote.dm"
#include "code\modules\mob\living\silicon\laws.dm"
@@ -2503,8 +2502,6 @@
#include "code\modules\vehicle\speedbike.dm"
#include "code\modules\vehicle\sportscar.dm"
#include "code\modules\vehicle\vehicle.dm"
-#include "code\modules\zombie\items.dm"
-#include "code\modules\zombie\organs.dm"
#include "goon\code\datums\browserOutput.dm"
#include "interface\interface.dm"
#include "interface\skin.dmf"
From 846b4796862fc03052f37f60268c1b18e0bbe948 Mon Sep 17 00:00:00 2001
From: denghis1 <63977635+denghis1@users.noreply.github.com>
Date: Thu, 2 Jul 2020 22:48:52 +0200
Subject: [PATCH 23/37] bugfix, scopes lawyers_badge/attack_self properly
Scopes the attack_self of the lawyers_badge to that accessory, instead of setting it on every single accessory, thus preventing everyone from being able to pretend that they are an attorney
---
code/modules/clothing/under/accessories/accessory.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 63fd1fa26b5..76bcd87921d 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -330,7 +330,7 @@
item_color = "lawyerbadge"
var/cached_bubble_icon = null
-/obj/item/clothing/accessory/attack_self(mob/user)
+/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user)
if(prob(1))
user.say("The testimony contradicts the evidence!")
user.visible_message("[user] shows [user.p_their()] attorney's badge.", "You show your attorney's badge.")
From e2bd9164259bc552d265325738a97b111e5845b4 Mon Sep 17 00:00:00 2001
From: Deelite34
Date: Thu, 2 Jul 2020 23:09:40 +0200
Subject: [PATCH 24/37] Fix typos
Fixes typos in baseball cap and searching for items under seat in space pod.
---
code/modules/clothing/head/soft_caps.dm | 2 +-
code/modules/spacepods/spacepod.dm | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index d34584ff425..7ac87e5d5bc 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -113,7 +113,7 @@
/obj/item/clothing/head/soft/sec/corp
name = "corporate security cap"
- desc = "It's baseball hat in corpotate colours."
+ desc = "It's a baseball hat in corporate colours."
icon_state = "corpsoft"
item_color = "corp"
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 2e3c89017ef..56e7f8f96ba 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -973,7 +973,7 @@
var/obj/I = pick(true_contents)
if(user.put_in_any_hand_if_possible(I))
src.contents -= I
- to_chat(user, "You find a [I] [pick("under the seat", "under the console", "in the mainenance access")]!")
+ to_chat(user, "You find a [I] [pick("under the seat", "under the console", "in the maintenance access")]!")
else
to_chat(user, "You think you saw something shiny, but you can't reach it!")
else
From 29045e16dc4f4798b84c08656510037292274188 Mon Sep 17 00:00:00 2001
From: denghis1 <63977635+denghis1@users.noreply.github.com>
Date: Fri, 3 Jul 2020 11:09:56 +0200
Subject: [PATCH 25/37] closet attack_ai check for user.loc
/obj/machinery/atmospherics
Checks if the user.loc type is part of/obj/machinery/atmospherics machines (pipes, vents etc) this prevents a ventcrawling maintenance drone from opening lockers.
---
code/game/objects/structures/crates_lockers/closets.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 553cfda4d59..04373502832 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -230,7 +230,7 @@
add_fingerprint(user)
/obj/structure/closet/attack_ai(mob/user)
- if(isrobot(user) && Adjacent(user)) //Robots can open/close it, but not the AI
+ if(isrobot(user) && Adjacent(user) && !istype(user.loc, /obj/machinery/atmospherics)) //Robots can open/close it, but not the AI
attack_hand(user)
/obj/structure/closet/relaymove(mob/user)
From 8dda2766c6a51eaec55de3ec549c84734d862c7b Mon Sep 17 00:00:00 2001
From: joep van der velden
Date: Fri, 3 Jul 2020 20:57:37 +0200
Subject: [PATCH 26/37] fixes show_borg_info and
select_active_ai_with_fewest_borgs
---
code/__HELPERS/unsorted.dm | 5 +++--
code/modules/mob/living/silicon/ai/ai.dm | 6 ++++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a022851e45f..63d9f7c85ef 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -329,8 +329,9 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/select_active_ai_with_fewest_borgs()
var/mob/living/silicon/ai/selected
var/list/active = active_ais()
- for(var/mob/living/silicon/ai/A in active)
- if(!selected || (selected.connected_robots > A.connected_robots))
+ for(var/thing in active)
+ var/mob/living/silicon/ai/A = thing
+ if(!selected || (length(selected.connected_robots) > length(A.connected_robots)))
selected = A
return selected
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 85c4ceac427..1c232f9f43c 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -243,7 +243,8 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
/mob/living/silicon/ai/proc/show_borg_info()
stat(null, text("Connected cyborgs: [connected_robots.len]"))
- for(var/mob/living/silicon/robot/R in connected_robots)
+ for(var/thing in connected_robots)
+ var/mob/living/silicon/robot/R = thing
var/robot_status = "Nominal"
if(R.stat || !R.client)
robot_status = "OFFLINE"
@@ -251,8 +252,9 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
robot_status = "DEPOWERED"
// Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies!
var/area/A = get_area(R)
+ var/area_name = A ? sanitize(A.name) : "Unknown"
stat(null, text("[R.name] | S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge] / [R.cell.maxcharge]" : "Empty"] | \
- Module: [R.designation] | Loc: [sanitize(A.name)] | Status: [robot_status]"))
+ Module: [R.designation] | Loc: [area_name] | Status: [robot_status]"))
/mob/living/silicon/ai/rename_character(oldname, newname)
if(!..(oldname, newname))
From ae778d3810dd02a034409a9e9fdd76a8d511d64e Mon Sep 17 00:00:00 2001
From: joep van der velden