diff --git a/baystation12.dme b/baystation12.dme
index 75d35c11776..4d995fb5723 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -502,6 +502,7 @@
#include "code\game\machinery\turrets.dm"
#include "code\game\machinery\vending.dm"
#include "code\game\machinery\walllockers.dm"
+#include "code\game\machinery\atmoalter\area_atmos_computer.dm"
#include "code\game\machinery\atmoalter\canister.dm"
#include "code\game\machinery\atmoalter\meter.dm"
#include "code\game\machinery\atmoalter\portable_atmospherics.dm"
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index e0058ee9d49..6f19d956a4c 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -172,7 +172,19 @@ client
body += "
<< [dir2text(A.dir)] >>"
if(istype(A,/mob))
var/mob/M = A
- body += "
[M.key ? M.key : "No key"] / [M.real_name ? M.real_name : "No real name"]"
+ body += "
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]"
+ body += {"
+
+ BRUTE:[M.getBruteLoss()]
+ FIRE:[M.getFireLoss()]
+ TOXIN:[M.getToxLoss()]
+ OXY:[M.getOxyLoss()]
+ CLONE:[M.getCloneLoss()]
+ BRAIN:[M.getBrainLoss()]
+
+
+
+ "}
else
body += "[D]"
@@ -351,7 +363,6 @@ client
// not sure if this is completely right...
if(0) //(L.vars.len > 0)
html += ""
-
html += "
"
else
html += ""
@@ -364,6 +375,7 @@ client
html += debug_variable(index, L[index], level + 1)
index++
html += "
"
+
else
html += "[name] = [value]"
@@ -470,6 +482,7 @@ client
if(!src.holder)
return
src.cmd_admin_gib(MOB)
+
else if (href_list["build_mode"])
if(!href_list["build_mode"])
return
@@ -482,6 +495,7 @@ client
return
togglebuildmode(MOB)
href_list["datumrefresh"] = href_list["build_mode"]
+
else if (href_list["delall"])
if(!href_list["delall"])
return
@@ -656,6 +670,31 @@ client
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
+ else if (href_list["adjustDamage"] && href_list["mobToDamage"])
+ var/mob/M = locate(href_list["mobToDamage"])
+ var/Text = locate(href_list["adjustDamage"])
+
+ var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
+ if(Text == "brute")
+ M.adjustBruteLoss(amount)
+ else if(Text == "fire")
+ M.adjustFireLoss(amount)
+ else if(Text == "toxin")
+ M.adjustToxLoss(amount)
+ else if(Text == "oxygen")
+ M.adjustOxyLoss(amount)
+ else if(Text == "brain")
+ M.adjustBrainLoss(amount)
+ else if(Text == "clone")
+ M.adjustCloneLoss(amount)
+ else
+ usr << "You caused an error. DEBUG: Text:[Text] Mob:[M]"
+ return
+
+ if(amount != 0)
+ log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [M] ")
+ message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [M] ", 1)
+ href_list["datumrefresh"] = href_list["mobToDamage"]
else
..()
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 8c2dc29ae5e..6c822adb1ef 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -27,10 +27,7 @@
if(prob(1))
if (affected_mob.nutrition > 100)
affected_mob.Stun(rand(4,6))
- affected_mob << "\red You throw up!"
for(var/mob/O in viewers(world.view, affected_mob))
- if(O == affected_mob)
- continue
O.show_message(text("\red [] throws up!", affected_mob), 1)
playsound(affected_mob.loc, 'splat.ogg', 50, 1)
var/turf/location = affected_mob.loc
diff --git a/code/defines/obj/closet.dm b/code/defines/obj/closet.dm
index 19256103605..652a89cac76 100644
--- a/code/defines/obj/closet.dm
+++ b/code/defines/obj/closet.dm
@@ -52,6 +52,8 @@
icon_closed = "emergency"
icon_opened = "emergencyopen"
+/obj/structure/closet/emcloset/legacy
+
/obj/structure/closet/firecloset
name = "Fire Closet"
desc = "A bulky (yet mobile) closet. Comes with supplies to fight fire."
diff --git a/code/defines/obj/machinery.dm b/code/defines/obj/machinery.dm
index 3f4c6708fe0..88af344c6a4 100644
--- a/code/defines/obj/machinery.dm
+++ b/code/defines/obj/machinery.dm
@@ -257,11 +257,24 @@
active_power_usage = 400
/obj/machinery/door_control
- name = "Remote Door Control"
+ name = "remote door-control"
+ desc = "It controls doors, remotely."
icon = 'stationobjs.dmi'
icon_state = "doorctrl0"
- desc = "A remote control switch for a door."
+ desc = "A remote control-switch for a door."
var/id = null
+ var/range = 10
+ var/normaldoorcontrol = 0
+ var/desiredstate = 0 // Zero is closed, 1 is open.
+ var/specialfunctions = 1
+ /*
+ Bitflag, 1= open
+ 2= idscan,
+ 4= bolts
+ 8= shock
+ 16= door safties
+
+ */
anchored = 1.0
use_power = 1
idle_power_usage = 2
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index e6d05dceec8..66a3b259156 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -1,5 +1,3 @@
-
-
/atom/proc/MouseDrop_T()
return
@@ -260,9 +258,11 @@
/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
if( istype(src, /turf/simulated) )
var/obj/effect/decal/cleanable/vomit/this = new /obj/effect/decal/cleanable/vomit(src)
+
// Make toxins vomit look different
if(toxvomit)
this.icon_state = "vomittox_[pick(1,4)]"
+
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
new file mode 100644
index 00000000000..8a6853cf32b
--- /dev/null
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -0,0 +1,69 @@
+/obj/machinery/computer/area_atmos
+ name = "Area Air Control"
+ desc = "A computer used to control the stationary scrubbers and pumps in the area."
+ icon_state = "computer_generic"
+ var/scrubber_state = 0 //0 = off; 1 = on
+
+
+ attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
+
+ attack_paw(var/mob/user as mob)
+ return
+
+ attack_hand(var/mob/user as mob)
+ src.add_fingerprint(usr)
+ var/dat = text("
Area Air Control:
Turn area scrubbers [scrubber_state?"off":"on"]")
+ user << browse("[dat]", "window=miningshuttle;size=200x100")
+
+ Topic(href, href_list)
+ if(..())
+ return
+ usr.machine = src
+ src.add_fingerprint(usr)
+ if(href_list["scrubbers"])
+ toggle_scrubbers()
+ usr << "\blue Area scrubbers turned [scrubber_state?"on":"off"]"
+
+ proc/toggle_scrubbers()
+ if( (ishuman(usr)||issilicon(usr)) && !usr.stat && !usr.restrained() )
+ scrubber_state = !scrubber_state
+ var/turf/T = get_turf(src)
+ if(!T.loc) return
+ var/area/A = T.loc
+ if (A.master)
+ A = A.master
+ for( var/obj/machinery/portable_atmospherics/scrubber/stationary/SCRUBBER in world )
+ var/turf/T2 = get_turf(SCRUBBER)
+ if ( T2 && T2.loc)
+ var/area/A2 = T2.loc
+ if ( istype(A2) && A2.master && A2.master == A )
+ SCRUBBER.on = scrubber_state
+ SCRUBBER.update_icon()
+
+
+
+
+/obj/machinery/computer/mining_shuttle/attack_hand(user as mob)
+ src.add_fingerprint(usr)
+ var/dat
+ dat = text("Mining shuttle:
Send")
+ user << browse("[dat]", "window=miningshuttle;size=200x100")
+
+/obj/machinery/computer/mining_shuttle/Topic(href, href_list)
+ if(..())
+ return
+ usr.machine = src
+ src.add_fingerprint(usr)
+ if(href_list["move"])
+ if(ticker.mode.name == "blob")
+ if(ticker.mode:declared)
+ usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
+ return
+
+ if (!mining_shuttle_moving)
+ usr << "\blue Shuttle recieved message and will be sent shortly."
+ move_mining_shuttle()
+ else
+ usr << "\blue Shuttle is already moving."
+
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 9aa0d7e821a..cec39215e6b 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -10,6 +10,27 @@
volume = 750
+ stationary
+ name = "Stationary Air Scrubber"
+ icon_state = "scrubber:0"
+ anchored = 1
+ volume = 30000
+ volume_rate = 5000
+
+ attack_hand(var/mob/user as mob)
+ usr << "\blue You can't directly interact with this machine. Use the area atmos computer."
+
+ update_icon()
+ src.overlays = 0
+
+ if(on)
+ icon_state = "scrubber:1"
+ else
+ icon_state = "scrubber:0"
+
+ attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+ return
+
/obj/machinery/portable_atmospherics/scrubber/update_icon()
src.overlays = 0
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index fa22d982d47..0381c873b70 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -15,17 +15,52 @@
use_power(5)
icon_state = "doorctrl1"
- for(var/obj/machinery/door/poddoor/M in machines)
- if (M.id == src.id)
- if (M.density)
- spawn( 0 )
- M.open()
- return
- else
- spawn( 0 )
- M.close()
- return
+ if(normaldoorcontrol)
+ for(var/obj/machinery/door/airlock/D in range(range))
+ if(D.id_tag == src.id)
+ if(desiredstate == 1)
+ if(specialfunctions & OPEN)
+ if (D.density)
+ spawn( 0 )
+ D.open()
+ return
+ if(specialfunctions & IDSCAN)
+ D.aiDisabledIdScanner = 1
+ if(specialfunctions & BOLTS)
+ spawn(5)
+ D.locked = 1
+ if(specialfunctions & SHOCK)
+ D.secondsElectrified = -1
+ else
+ if(specialfunctions & OPEN)
+ if (!D.density)
+ spawn( 0 )
+ D.close()
+ return
+ if(specialfunctions & IDSCAN)
+ D.aiDisabledIdScanner = 0
+ if(specialfunctions & BOLTS)
+ spawn(5)
+ D.locked = 0
+ if(specialfunctions & SHOCK)
+ D.secondsElectrified = 0
+
+
+
+ else
+ for(var/obj/machinery/door/poddoor/M in machines)
+ if (M.id == src.id)
+ if (M.density)
+ spawn( 0 )
+ M.open()
+ return
+ else
+ spawn( 0 )
+ M.close()
+ return
+
+ desiredstate = !desiredstate
spawn(15)
if(!(stat & NOPOWER))
icon_state = "doorctrl0"
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index ea37af8fc56..240e5d22913 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -57,9 +57,10 @@
density = 1
var/lasers = 0
var/lasertype = 1
- // 1 = laser
- // 2 = cannon
+ // 1 = lasers
+ // 2 = cannons
// 3 = pulse
+ // 4 = change (HONK)
var/health = 18
var/id = ""
var/obj/machinery/turretcover/cover = null
@@ -212,6 +213,8 @@
A = new /obj/item/projectile/beam/heavylaser( loc )
if(3)
A = new /obj/item/projectile/beam/pulse( loc )
+ if(4)
+ A = new /obj/item/projectile/change( loc )
A.original = target.loc
use_power(500)
else
@@ -296,11 +299,13 @@
icon_state = "motion3"
anchored = 1
density = 0
- req_access = list(access_ai_upload)
var/enabled = 1
var/id = ""
var/lethal = 0
var/locked = 1
+ var/control_area //can be area name, path or nothing.
+ var/ailock = 0 // AI cannot use this
+ req_access = list(access_ai_upload)
var/similar_controls
var/turrets
@@ -348,7 +353,10 @@
user << "\red Access denied."
/obj/machinery/turretid/attack_ai(mob/user as mob)
- return attack_hand(user)
+ if(!ailock)
+ return attack_hand(user)
+ else
+ user << "There seems to be a firewall preventing you from accessing this device."
/obj/machinery/turretid/attack_hand(mob/user as mob)
if ( (get_dist(src, user) > 1 ))
diff --git a/code/game/objects/closets/emergency.dm b/code/game/objects/closets/emergency.dm
index 80e87c6367f..2b7d5b97225 100644
--- a/code/game/objects/closets/emergency.dm
+++ b/code/game/objects/closets/emergency.dm
@@ -14,3 +14,7 @@
while(prob(60) && counter < 3)
new /obj/item/clothing/mask/breath(src)
counter++
+
+/obj/structure/closet/emcloset/legacy/New()
+ new /obj/item/weapon/tank/oxygen(src)
+ new /obj/item/clothing/mask/gas(src)
\ No newline at end of file
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index ff3952ac4cb..15e95ba5c6a 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -85,12 +85,13 @@
/obj/structure/closet/secure_closet/warden
name = "Warden's Locker"
req_access = list(access_armory)
- icon_state = "hossecure1"
- icon_closed = "hossecure"
- icon_locked = "hossecure1"
- icon_opened = "hossecureopen"
- icon_broken = "hossecurebroken"
- icon_off = "hossecureoff"
+ icon_state = "wardensecure1"
+ icon_closed = "wardensecure"
+ icon_locked = "wardensecure1"
+ icon_opened = "wardensecureopen"
+ icon_broken = "wardensecurebroken"
+ icon_off = "wardensecureoff"
+
New()
..()
diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm
index ef012e92fdd..2461604742a 100644
--- a/code/game/objects/devices/PDA/cart.dm
+++ b/code/game/objects/devices/PDA/cart.dm
@@ -515,8 +515,9 @@ Code:
for (var/obj/item/weapon/mop/M in world)
var/turf/ml = get_turf(M)
- if (ml.z != cl.z)
- continue
+ if(ml)
+ if (ml.z != cl.z)
+ continue
ldat += "Mop - \[[ml.x],[ml.y]\] - [M.reagents.total_volume ? "Wet" : "Dry"]
"
diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm
index 11da0553758..4556101b881 100644
--- a/code/game/objects/items/weapons/grenades.dm
+++ b/code/game/objects/items/weapons/grenades.dm
@@ -93,6 +93,7 @@ FLASHBANG
var
active = 0
det_time = 30
+ banglet = 0
proc
bang(var/turf/T , var/mob/living/carbon/M)
prime()
@@ -206,14 +207,16 @@ FLASHBANG
if (M.eye_stat >= 20)
M << "\red Your eyes start to burn badly!"
M.disabilities |= 1
- if (prob(M.eye_stat - 20 + 1))
- M << "\red You can't see anything!"
- M.disabilities |= 128
+ if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang)))
+ if (prob(M.eye_stat - 20 + 1))
+ M << "\red You can't see anything!"
+ M.disabilities |= 128
if (M.ear_damage >= 15)
M << "\red Your ears start to ring badly!"
- if (prob(M.ear_damage - 10 + 5))
- M << "\red You can't hear anything!"
- M.disabilities |= 32
+ if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang)))
+ if (prob(M.ear_damage - 10 + 5))
+ M << "\red You can't hear anything!"
+ M.disabilities |= 32
else
if (M.ear_damage >= 5)
M << "\red Your ears start to ring!"
@@ -232,9 +235,7 @@ FLASHBANG
for(var/mob/living/carbon/M in viewers(T, null))
bang(T, M)
-
-//Blob damage here
- for(var/obj/effect/blob/B in view(8,T))
+ for(var/obj/effect/blob/B in view(8,T)) //Blob damage here
var/damage = round(30/(get_dist(B,T)+1))
B.health -= damage
B.update()
@@ -255,6 +256,12 @@ FLASHBANG
return
+ attack_hand()
+ walk(src, null, null)
+ ..()
+ return
+
+
clown_check(var/mob/living/user)
if ((user.mutations & CLUMSY) && prob(50))
user << "\red Huh? How does this thing work?!"
@@ -266,12 +273,80 @@ FLASHBANG
return 0
return 1
-
-
-
-
-
-
+/obj/item/weapon/flashbang/clusterbang
+ desc = "Use of this weapon may constiute a war crime in your area, consult your local captain."
+ name = "Clusterbang"
+ icon = 'grenade.dmi'
+ icon_state = "clusterbang"
+ var/child = 0
+
+ attack_self(mob/user as mob)
+ if(!active)
+ //world << "cluster attack self"
+ user << "\red You prime the clusterbang! [det_time/10] seconds!"
+ src.active = 1
+ src.icon_state = "clusterbang1"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(src.det_time)
+ arm(user)
+ return
+
+ afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
+ if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
+ if((user.equipped() == src)&&(!active))
+ //world << "cluster after attack"
+ arm(user)
+ user.dir = get_dir(user, target)
+ user.drop_item()
+ var/t = (isturf(target) ? target : target.loc)
+ walk_towards(src, t, 3)
+ return
+
+/obj/item/weapon/flashbang/clusterbang/proc/arm(mob/user as mob)
+
+ //world << "Armed!"
+ var/numspawned = rand(4,8)
+// world << numspawned
+ var/again = 0
+ if(!child)
+ for(var/more = numspawned,more > 0,more--)
+ if(prob(35))
+ again++
+ numspawned --
+
+ for(,numspawned > 0, numspawned--)
+ //world << "Spawned Flashbang!"
+ spawn(0)
+ var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(src)
+ F.loc = src.loc
+ F.icon_state = "flashbang1"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ F.active = 1
+ F.banglet = 1
+ var/stepdist = rand(1,3)
+ walk_away(F,src,stepdist)
+ var/dettime = rand(15,60)
+ spawn(dettime)
+ F.prime()
+
+ for(,again > 0, again--)
+ //world << "Spawned CFlashbang!"
+ spawn(0)
+ var/obj/item/weapon/flashbang/clusterbang/F = new /obj/item/weapon/flashbang/clusterbang(src)
+ F.loc = src.loc
+ F.active = 1
+ F.child = 1
+ F.icon_state = "clusterbang1"
+ var/stepdist = rand(1,4)
+ walk_away(F,src,stepdist)
+ spawn(30)
+ F.arm()
+
+ spawn(70)
+ prime()
+
+ return
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 7de05474249..2148f1a1d9f 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -906,6 +906,7 @@ CIRCULAR SAW
else
M.take_organ_damage(15)
M.disabilities &= ~128
+ M.eye_stat = 0
M:eye_op_stage = 0.0
return
diff --git a/code/game/objects/secstorage/secstorage.dm b/code/game/objects/secstorage/secstorage.dm
index 9458f05a853..6e1b1d05f85 100644
--- a/code/game/objects/secstorage/secstorage.dm
+++ b/code/game/objects/secstorage/secstorage.dm
@@ -13,6 +13,7 @@
var/l_hacking = 0
var/emagged = 0
var/open = 0
+ var/internalstorage = 3
w_class = 3.0
/obj/item/weapon/secstorage/examine()
@@ -116,7 +117,7 @@
else
user << "You short out the lock on [src]."
return
- if ((W.w_class > 3 || istype(W, /obj/item/weapon/secstorage)))
+ if ((W.w_class > internalstorage || istype(W, /obj/item/weapon/secstorage)))
return
if ((istype(W, /obj/item/weapon/screwdriver)) && (src.locked == 1))
sleep(6)
diff --git a/code/game/objects/secstorage/ssafe.dm b/code/game/objects/secstorage/ssafe.dm
index 28d58e713d0..b2882454908 100644
--- a/code/game/objects/secstorage/ssafe.dm
+++ b/code/game/objects/secstorage/ssafe.dm
@@ -7,7 +7,8 @@
icon_sparking = "safespark"
flags = FPRINT | TABLEPASS
force = 8.0
- w_class = 4.0
+ w_class = 8.0
+ internalstorage = 8
anchored = 1.0
density = 0
@@ -16,5 +17,9 @@
new /obj/item/weapon/paper(src)
new /obj/item/weapon/pen(src)
+/obj/item/weapon/secstorage/ssafe/HoS/New()
+ ..()
+ new /obj/item/weapon/storage/lockbox/clusterbang(src)
+
/obj/item/weapon/secstorage/ssafe/attack_hand(mob/user as mob)
return attack_self(user)
\ No newline at end of file
diff --git a/code/game/objects/storage/lockbox.dm b/code/game/objects/storage/lockbox.dm
index d3cba8ecfcf..38141dd1e6e 100644
--- a/code/game/objects/storage/lockbox.dm
+++ b/code/game/objects/storage/lockbox.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/storage/lockbox
- name = "Lockbox"
+ name = "lockbox"
desc = "A locked box."
icon_state = "lockbox+l"
item_state = "syringe_kit"
@@ -80,4 +80,14 @@
new /obj/item/weapon/implantcase/loyalty(src)
new /obj/item/weapon/implantcase/loyalty(src)
new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implanter/loyalty(src)
\ No newline at end of file
+ new /obj/item/weapon/implanter/loyalty(src)
+
+
+/obj/item/weapon/storage/lockbox/clusterbang
+ name = "lockbox (clusterbang)"
+ desc = "You have a bad feeling about opening this."
+ req_access = list(access_security)
+
+ New()
+ ..()
+ new /obj/item/weapon/flashbang/clusterbang(src)
\ No newline at end of file
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index a7fc4875349..8f19124f02f 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -84,7 +84,9 @@ obj/structure
Tsrc.ReplaceWithWall()
for(var/obj/machinery/atmospherics/pipe/P in Tsrc)
P.layer = 1
- W:use(2)
+ for(var/turf/simulated/wall/X in Tsrc.loc)
+ if(X) X.add_hiddenprint(usr)
+ if (W) W:use(2)
del(src)
return
@@ -99,6 +101,8 @@ obj/structure
Tsrc.ReplaceWithRWall()
for(var/obj/machinery/atmospherics/pipe/P in Tsrc)
P.layer = 1
+ for(var/turf/simulated/wall/r_wall/X in Tsrc.loc)
+ if(X) X.add_hiddenprint(usr)
if (W)
W:use(1)
del(src)
diff --git a/code/game/throwing.dm b/code/game/throwing.dm
index 4ae8d2c2698..9560bed0efd 100644
--- a/code/game/throwing.dm
+++ b/code/game/throwing.dm
@@ -64,8 +64,9 @@
item.layer = initial(item.layer)
src.visible_message("\red [src] has thrown [item].")
- var/area/a = get_area(src.loc)
- if((istype(src.loc, /turf/space)) || (a.has_gravity == 0))
+ if(!src.lastarea)
+ src.lastarea = get_area(src.loc)
+ if((istype(src.loc, /turf/space)) || (src.lastarea.has_gravity == 0))
src.inertia_dir = get_dir(target, src)
step(src, inertia_dir)
diff --git a/code/game/turf.dm b/code/game/turf.dm
index 966a8791ec7..0afdb11a163 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -80,6 +80,7 @@
/turf/Entered(atom/movable/M as mob|obj)
+// var/loopsanity = 100
if(ismob(M))
if(!M:lastarea)
M:lastarea = get_area(M.loc)
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index fc9e39596ae..55c1fa425d8 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -1531,6 +1531,7 @@ datum
M:eye_blurry = max(M:eye_blurry-5 , 0)
M:eye_blind = max(M:eye_blind-5 , 0)
M:disabilities &= ~1
+ M:eye_stat = max(M:eye_stat-5, 0)
if(volume > REAGENTS_OVERDOSE)
M:adjustToxLoss(1)
// if(data >= 100)
diff --git a/code/modules/clothing/gloves.dm b/code/modules/clothing/gloves.dm
index 153b1945fb8..0faf49808be 100644
--- a/code/modules/clothing/gloves.dm
+++ b/code/modules/clothing/gloves.dm
@@ -12,6 +12,25 @@
var/obj/item/weapon/cell/cell = 0
body_parts_covered = HANDS
+
+/obj/item/clothing/gloves/boxing
+ name = "boxing gloves"
+ desc = "Because you really needed another excuse to punch your crewmates."
+ icon_state = "boxing"
+ item_state = "boxing"
+
+/obj/item/clothing/gloves/boxing/green
+ icon_state = "boxinggreen"
+ item_state = "boxinggreen"
+
+/obj/item/clothing/gloves/boxing/blue
+ icon_state = "boxingblue"
+ item_state = "boxingblue"
+
+/obj/item/clothing/gloves/boxing/yellow
+ icon_state = "boxingyellow"
+ item_state = "boxingyellow"
+
/obj/item/clothing/gloves/white
name = "White Gloves"
desc = "These look pretty fancy."
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 00345636251..415e32c6982 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -19,7 +19,7 @@
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 1.0
- allowed = list(/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
diff --git a/code/modules/critters/critter.dm b/code/modules/critters/critter.dm
index bd46ecaf047..854765817c1 100644
--- a/code/modules/critters/critter.dm
+++ b/code/modules/critters/critter.dm
@@ -23,6 +23,8 @@
wanderer = 1
//Will open doors it bumps ignoring access
opensdoors = 0
+ //Will randomly travel through vents
+ ventcrawl = 0
//Internal tracking ignore
frustration = 0
@@ -34,6 +36,10 @@
target = null
oldtarget_name = null
target_lastloc = null
+
+ thinkspeed = 15
+ chasespeed = 4
+ wanderspeed = 10
//The last guy who attacked it
attacker = null
//Will not attack this thing
@@ -49,6 +55,11 @@
atksame = 0
atkmech = 0
+ //Attacks syndies/traitors (distinguishes via mind)
+ atksynd = 1
+ //Attacks things NOT in its obj/req_access list
+ atkreq = 0
+
//Damage multipliers
brutevuln = 1
firevuln = 1
@@ -61,7 +72,10 @@
//Basic attack message when they move to attack and attack
angertext = "charges at"
attacktext = "attacks"
+ deathtext = "dies!"
+ chasestate = null // the icon state to use when attacking or chasing a target
+ attackflick = null // the icon state to flick when it attacks
attack_sound = null // the sound it makes when it attacks!
attack_speed = 25 // delay of attack
@@ -121,4 +135,4 @@
-*/
+*/
\ No newline at end of file
diff --git a/code/modules/critters/critter_AI.dm b/code/modules/critters/critter_AI.dm
index 169ce48974c..ae11c6e6d6d 100644
--- a/code/modules/critters/critter_AI.dm
+++ b/code/modules/critters/critter_AI.dm
@@ -13,7 +13,7 @@
if("thinking")
src.attack = 0
src.target = null
- sleep(15)
+ sleep(thinkspeed)
walk_to(src,0)
if (src.aggressive) seek_target()
if (src.wanderer && !src.target) src.task = "wandering"
@@ -29,11 +29,13 @@
var/mob/living/carbon/M = src.target
ChaseAttack()
src.task = "attacking"
+ if(chasestate)
+ icon_state = chasestate
src.anchored = 1
src.target_lastloc = M.loc
else
var/turf/olddist = get_dist(src, src.target)
- walk_to(src, src.target,1,speed)
+ walk_to(src, src.target,1,chasespeed)
if ((get_dist(src, src.target)) >= (olddist))
src.frustration++
else
@@ -45,6 +47,8 @@
if ((get_dist(src, src.target) > 1) || ((src.target:loc != src.target_lastloc)))
src.anchored = 0
src.task = "chasing"
+ if(chasestate)
+ icon_state = chasestate
else
if (get_dist(src, src.target) <= 1)
var/mob/living/carbon/M = src.target
@@ -58,20 +62,25 @@
src.attacking = 0
else
if(M!=null)
- if(M.health < 0)
- src.task = "thinking"
- src.target = null
- src.anchored = 0
- src.last_found = world.time
- src.frustration = 0
- src.attacking = 0
+ if(ismob(src.target))
+ if(M.health < 0)
+ src.task = "thinking"
+ src.target = null
+ src.anchored = 0
+ src.last_found = world.time
+ src.frustration = 0
+ src.attacking = 0
else
src.anchored = 0
src.attacking = 0
src.task = "chasing"
+ if(chasestate)
+ icon_state = chasestate
if("wandering")
+ if(chasestate)
+ icon_state = initial(icon_state)
patrol_step()
- sleep(10)
+ sleep(wanderspeed)
spawn(8)
process()
return
@@ -114,29 +123,57 @@
if (src.target)
src.task = "chasing"
break
+
+ // Ignore syndicates and traitors if specified
+ if(!atksynd && C.mind)
+ var/datum/mind/synd_mind = C.mind
+ if( synd_mind.special_role == "Syndicate" || synd_mind.special_role == "traitor" )
+ continue
if((C.name == src.oldtarget_name) && (world.time < src.last_found + 100)) continue
if(istype(C, /mob/living/carbon/) && !src.atkcarbon) continue
if(istype(C, /mob/living/silicon/) && !src.atksilicon) continue
+ if(atkreq)
+ if(src.allowed(C)) continue
if(C.health < 0) continue
if(istype(C, /mob/living/carbon/) && src.atkcarbon) src.attack = 1
if(istype(C, /mob/living/silicon/) && src.atksilicon) src.attack = 1
+ if(atkreq)
+ if(!src.allowed(C)) src.attack = 1
if(src.attack)
T = C
break
if(!src.attack)
for(var/obj/effect/critter/C in view(src.seekrange,src))
- if(istype(C, /obj/effect/critter) && !src.atkcritter) continue
- if(istype(C, /obj/mecha) && !src.atkmech) continue
+ if(!src.atkcritter) continue
if(C.health <= 0) continue
- if(istype(C, /obj/effect/critter) && src.atkcritter)
+ if(src.atkcritter)
if((istype(C, src.type) && !src.atksame) || (C == src)) continue
src.attack = 1
- if(istype(C, /obj/mecha) && src.atkmech) src.attack = 1
if(src.attack)
T = C
break
+ if(!src.attack)
+ for(var/obj/mecha/C in view(src.seekrange,src))
+ if(!C.occupant) continue
+
+ if(atkreq && C.occupant)
+ if(src.allowed(C.occupant)) continue
+
+ if(!atksynd && C.occupant)
+ if(C.occupant.mind)
+ var/datum/mind/synd_mind = C.occupant.mind
+ if( synd_mind.special_role == "Syndicate" || synd_mind.special_role == "traitor" )
+ continue
+
+ if(!src.atkmech) continue
+ if(C.health <= 0) continue
+ if(src.atkmech) src.attack = 1
+ if(src.attack)
+ T = C
+ break
+
if(src.attack)
src.target = T
src.oldtarget_name = T:name
@@ -152,10 +189,11 @@
RunAttack()
src.attacking = 1
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] [src.attacktext] [src.target]!", 1)
if(ismob(src.target))
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [src] [src.attacktext] [src.target]!", 1)
+
var/damage = rand(melee_damage_lower, melee_damage_upper)
if(istype(target, /mob/living/carbon/human))
@@ -174,7 +212,8 @@
if(isobj(src.target))
if(istype(target, /obj/mecha))
- src.target:take_damage(rand(melee_damage_lower,melee_damage_upper))
+ //src.target:take_damage(rand(melee_damage_lower,melee_damage_upper))
+ src.target:attack_critter(src)
else
src.target:TakeDamage(rand(melee_damage_lower,melee_damage_upper))
spawn(attack_speed)
@@ -200,4 +239,4 @@
smoke.set_up(10, 0, src.loc)
smoke.start()
src.task = "thinking"
-*/
+*/
\ No newline at end of file
diff --git a/code/modules/critters/critter_defenses.dm b/code/modules/critters/critter_defenses.dm
index fc50e9f02a1..fde45ab5d3f 100644
--- a/code/modules/critters/critter_defenses.dm
+++ b/code/modules/critters/critter_defenses.dm
@@ -13,7 +13,7 @@ Contains the procs that control attacking critters
if("fire") damage = W.force * firevuln
if("brute") damage = W.force * brutevuln
TakeDamage(damage)
- if(src.defensive) Target_Attacker(user)
+ if(src.defensive && alive) Target_Attacker(user)
return
@@ -51,9 +51,10 @@ Contains the procs that control attacking critters
if(!target) return
src.target = target
src.oldtarget_name = target:name
- if(task != "chasing" || task != "attacking")
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [src] [src.angertext] at [target:name]!", 1)
+ if(task != "chasing" && task != "attacking")
+ if(angertext && angertext != "")
+ for(var/mob/O in viewers(src, null))
+ O.show_message("\red [src] [src.angertext] at [target:name]!", 1)
src.task = "chasing"
return
@@ -75,7 +76,7 @@ Contains the procs that control attacking critters
src.anchored = 0
src.density = 0
walk_to(src,0)
- src.visible_message("[src] dies!")
+ src.visible_message("[src] [deathtext]")
Harvest(var/obj/item/weapon/W, var/mob/living/user)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm
index de242f455e2..01eb6e2f257 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/death.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm
@@ -31,30 +31,4 @@
if (mind) mind.store_memory("Time of death: [tod]", 0)
else src << "We seem to have misplaced your mind datum, so we can't add this to your memory, but you died at [tod]"
- var/cancel
- for (var/mob/M in world)
- if (M.client && !M.stat)
- cancel = 1
- break
-
- if (!cancel && !abandon_allowed)
- spawn (50)
- cancel = 0
- for (var/mob/M in world)
- if (M.client && !M.stat)
- cancel = 1
- break
-
- if (!cancel && !abandon_allowed)
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn (300)
- log_game("Rebooting because of no live players")
- world.Reboot()
-
return ..(gibbed)
diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm
index 48b6e13c7a5..0242119ef56 100644
--- a/code/modules/mob/living/carbon/alien/larva/death.dm
+++ b/code/modules/mob/living/carbon/alien/larva/death.dm
@@ -34,30 +34,4 @@
var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
mind.store_memory("Time of death: [tod]", 0)
- var/cancel
- for (var/mob/M in world)
- if (M.client && !M.stat)
- cancel = 1
- break
-
- if (!cancel && !abandon_allowed)
- spawn (50)
- cancel = 0
- for (var/mob/M in world)
- if (M.client && !M.stat)
- cancel = 1
- break
-
- if (!cancel && !abandon_allowed)
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn (300)
- log_game("Rebooting because of no live players")
- world.Reboot()
-
return ..(gibbed)
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 6f34b926c6f..71581811e88 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -15,25 +15,8 @@
see_invisible = 2
var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
- var/cancel
store_memory("Time of death: [tod]", 0)
- for(var/mob/M in world)
- if ((M.client && !( M.stat )))
- cancel = 1
- break
- if (!( cancel ))
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn( 300 )
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
if (key)
spawn(50)
if(key && stat == 2)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index b74b9fea7b1..6a9662adf24 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -56,32 +56,6 @@
message_admins("\red Traitor [key_name_admin(src)] has died.")
log_game("Traitor [key_name(src)] has died.")
- var/cancel
- for (var/mob/M in world)
- if (M.client && !M.stat)
- cancel = 1
- break
-
- if (!cancel && !abandon_allowed)
- spawn (50)
- cancel = 0
- for (var/mob/M in world)
- if (M.client && !M.stat)
- cancel = 1
- break
-
- if (!cancel && !abandon_allowed)
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn (300)
- log_game("Rebooting because of no live players")
- world.Reboot()
-
return ..(gibbed)
/mob/living/carbon/human/proc/ChangeToHusk()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 9e4b9314eb9..ed1cfbb35ba 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1282,7 +1282,7 @@
if (druggy)
client.screen += hud_used.druggy
- if (istype(head, /obj/item/clothing/head/helmet/welding))
+ if ((istype(head, /obj/item/clothing/head/helmet/welding)) )
if(!head:up && tinted_weldhelh)
client.screen += hud_used.darkMask
diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm
index 813929cb0d1..2356f425505 100644
--- a/code/modules/mob/living/carbon/metroid/death.dm
+++ b/code/modules/mob/living/carbon/metroid/death.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/metroid/death(gibbed)
if(src.stat == 2)
return
- var/cancel
+
if(!gibbed)
if(istype(src, /mob/living/carbon/metroid/adult))
@@ -32,27 +32,8 @@
drop_item()
src.hand = h
- //var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
- //mind.store_memory("Time of death: [tod]", 0)
-
ticker.mode.check_win()
- //src.icon_state = "dead"
- for(var/mob/M in world)
- if ((M.client && !( M.stat )))
- cancel = 1
- break
- if (!( cancel ))
- world << "Everyone is dead! Resetting in 30 seconds!"
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn( 300 )
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 13ec9d07430..737872121ca 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -359,7 +359,10 @@
Tempstun = 1
if(bodytemperature <= (T0C - 50)) // hurt temperature
- adjustFireLoss(round(sqrt(bodytemperature)) * 2)
+ if(bodytemperature <= 50) // sqrting negative numbers is bad
+ adjustFireLoss(200)
+ else
+ adjustFireLoss(round(sqrt(bodytemperature)) * 2)
else
Tempstun = 0
diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm
index 0f984a3b4bd..a20b53d203c 100644
--- a/code/modules/mob/living/carbon/monkey/death.dm
+++ b/code/modules/mob/living/carbon/monkey/death.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/monkey/death(gibbed)
if(src.stat == 2)
return
- var/cancel
+
if (src.healths)
src.healths.icon_state = "health5"
if(!gibbed)
@@ -21,27 +21,8 @@
drop_item()
src.hand = h
- //var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
- //mind.store_memory("Time of death: [tod]", 0)
-
ticker.mode.check_win()
- //src.icon_state = "dead"
- for(var/mob/M in world)
- if ((M.client && !( M.stat )))
- cancel = 1
- break
- if (!( cancel ))
- world << "Everyone is dead! Resetting in 30 seconds!"
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn( 300 )
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 430bd76ef7a..ce640fc219f 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -1,5 +1,4 @@
/mob/living/silicon/ai/death(gibbed)
- var/cancel
stat = 2
canmove = 0
if(blind)
@@ -49,24 +48,8 @@
loc.icon_state = "aicard-404"
var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
- mind.store_memory("Time of death: [tod]", 0)
+ if(mind) mind.store_memory("Time of death: [tod]", 0)
- for(var/mob/M in world)
- if ((M.client && !( M.stat )))
- cancel = 1
- break
- if (!( cancel ))
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn( 300 )
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
if (key)
spawn(50)
if(key && stat == 2)
diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm
index 33da7afd092..bbbe20ad14d 100644
--- a/code/modules/mob/living/silicon/pai/death.dm
+++ b/code/modules/mob/living/silicon/pai/death.dm
@@ -1,5 +1,4 @@
/mob/living/silicon/pai/death(gibbed)
- var/cancel
src.stat = 2
src.canmove = 0
if(src.blind)
@@ -13,22 +12,6 @@
//var/tod = time2text(world.realtime,"hh:mm:ss") //weasellos time of death patch
//mind.store_memory("Time of death: [tod]", 0)
- for(var/mob/M in world)
- if ((M.client && !( M.stat )))
- cancel = 1
- break
- if (!( cancel ))
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn( 300 )
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
if(key)
spawn(50)
src.ghostize(1)
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index dec51853808..9a677ac60ab 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -1,5 +1,4 @@
/mob/living/silicon/robot/death(gibbed)
- var/cancel
if (!gibbed)
src.emote("deathgasp")
src.stat = 2
@@ -28,22 +27,6 @@
sql_report_cyborg_death(src)
- for(var/mob/M in world)
- if ((M.client && !( M.stat )))
- cancel = 1
- break
- if (!( cancel ))
- world << "Everyone is dead! Resetting in 30 seconds!"
-
- feedback_set_details("end_error","no live players")
- feedback_set_details("round_end","[time2text(world.realtime)]")
- if(blackbox)
- blackbox.save_all_data_to_sql()
-
- spawn( 300 )
- log_game("Rebooting because of no live players")
- world.Reboot()
- return
if (src.key)
spawn(50)
if(src.key && src.stat == 2)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index af12643d530..58b66560cc9 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -105,6 +105,34 @@
/mob/proc/death(gibbed)
timeofdeath = world.time
+
+ var/cancel = 0
+ for(var/mob/M in world)
+ if(M.client && (M.stat != DEAD))
+ cancel = 1
+ break
+ if(!cancel)
+ world << "Everyone is dead! Resetting in 30 seconds!"
+
+
+
+ spawn(300)
+ for(var/mob/M in world)
+ if(M.client && (M.stat != DEAD))
+ world << "Aborting world restart!"
+ return
+
+ feedback_set_details("end_error","no live players")
+
+ if(blackbox)
+ blackbox.save_all_data_to_sql()
+
+ sleep(50)
+
+ log_game("Rebooting because of no live players")
+ world.Reboot()
+ return
+
return ..(gibbed)
/mob/proc/restrained()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index e3d151d2ba7..bf3df67ac35 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -252,6 +252,7 @@ proc/slur(phrase)
p++//for each letter p is increased to find where the next letter will be.
return copytext(sanitize(t),1,MAX_MESSAGE_LEN)
+
proc/Gibberish(t, p)
/* Turn text into complete gibberish! */
var/returntext = ""
@@ -269,6 +270,7 @@ proc/Gibberish(t, p)
return returntext
+
/proc/ninjaspeak(n)
/*
The difference with stutter is that this proc can stutter more than 1 letter
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index b1888dadd89..4b45709359b 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -172,8 +172,10 @@
//if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
// if(!mob.Process_Spacemove(0)) return 0
- var/area/a = get_area(mob.loc)
- if((istype(mob.loc, /turf/space)) || (a.has_gravity == 0))
+ if(!mob.lastarea)
+ mob.lastarea = get_area(mob.loc)
+
+ if((istype(mob.loc, /turf/space)) || (mob.lastarea.has_gravity == 0))
if(!mob.Process_Spacemove(0)) return 0
@@ -215,16 +217,17 @@
if(L.len == 2)
L -= mob
var/mob/M = L[1]
- if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
- var/turf/T = mob.loc
- . = ..()
- if (isturf(M.loc))
- var/diag = get_dir(mob, M)
- if ((diag - 1) & diag)
- else
- diag = null
- if ((get_dist(mob, M) > 1 || diag))
- step(M, get_dir(M.loc, T))
+ if(M)
+ if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
+ var/turf/T = mob.loc
+ . = ..()
+ if (isturf(M.loc))
+ var/diag = get_dir(mob, M)
+ if ((diag - 1) & diag)
+ else
+ diag = null
+ if ((get_dist(mob, M) > 1 || diag))
+ step(M, get_dir(M.loc, T))
else
for(var/mob/M in L)
M.other_mobs = 1
@@ -351,16 +354,13 @@
if(istype(turf,/turf/space))
continue
-
- var/area/a = get_area(turf)
-
if(istype(src,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to.
- if((istype(turf,/turf/simulated/floor)) && (a.has_gravity == 0) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP)))
+ if((istype(turf,/turf/simulated/floor)) && (src.lastarea.has_gravity == 0) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP)))
continue
else
- if((istype(turf,/turf/simulated/floor)) && (a.has_gravity == 0)) // No one else gets a chance.
+ if((istype(turf,/turf/simulated/floor)) && (src.lastarea.has_gravity == 0)) // No one else gets a chance.
continue
/*
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 5cfb45af9e8..f4ddf4d83bb 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -24,6 +24,8 @@
var/starting_loc = pick(newplayer_start)
if(!starting_loc) starting_loc = locate(1,1,1)
loc = starting_loc
+ lastarea = starting_loc
+
sight |= SEE_TURFS
var/list/watch_locations = list()
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index e0f5acf4710..e5365fe3408 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -505,16 +505,14 @@
PN.merge_powernets(TPN)
for(var/obj/machinery/power/apc/N in loc)
-
- if(!N)
- continue
+ if(!N) continue
var/obj/machinery/power/M
M = N.terminal
+ if(!M) continue
- if(M.netnum == 0)
- if(netnum == 0)
- continue
+ if(!M.netnum)
+ if(!netnum)continue
var/datum/powernet/PN = powernets[netnum]
PN.nodes += M
M.netnum = netnum
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 3a82de22d40..b729ec0e374 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -4,7 +4,7 @@
desc = "A device which uses Hawking Radiation and plasma to produce power."
icon = 'singularity.dmi'
icon_state = "ca"
- anchored = 1
+ anchored = 0
density = 1
directwired = 1
// use_power = 0
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index 309ddb2c9e5..9cf20a8f394 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -5,7 +5,7 @@
desc = "An Odd Device which produces a Gravitational Singularity when set up."
icon = 'singularity.dmi'
icon_state = "TheSingGen"
- anchored = 1
+ anchored = 0
density = 1
use_power = 0
var
@@ -42,11 +42,11 @@
if(anchored)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
- "You hear ratchet")
+ "You hear a ratchet")
else
user.visible_message("[user.name] unsecures [src.name] from the floor.", \
"You unsecure the [src.name] from the floor.", \
- "You hear ratchet")
+ "You hear a ratchet")
return
return ..()
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 8467ab99ff6..746ff36f155 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -23,6 +23,7 @@
component_parts += new /obj/item/weapon/cable_coil(src)
component_parts += new /obj/item/weapon/cable_coil(src)
RefreshParts()
+ src.initialize(); //Agouri
RefreshParts()
var/tot_rating = 0
diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi
index ed97da97a88..bbc19ba56bc 100644
Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 226d157a927..d2e07918203 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/critter.dmi b/icons/mob/critter.dmi
index 0febb340d1b..2b5a7189914 100644
Binary files a/icons/mob/critter.dmi and b/icons/mob/critter.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index 3a71ae7ea96..29d0fd98c8a 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index 273ccd0153e..ff77f715acb 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 4a1369f69fa..0d5f9892b96 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 913295eaf69..3ad2e5afbc9 100755
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index ad351e8fafb..907789f99ca 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index e247d799018..018678f6f86 100755
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index 1424985d139..fe55a57cd7c 100755
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -3171,7 +3171,7 @@
"biY" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/cafeteria)
"biZ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "bar"},/area/crew_quarters/cafeteria)
"bja" = (/obj/structure/filingcabinet,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
-"bjb" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"bjb" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; dir = 2; id = "MedbayFoyer"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 26; pixel_y = 0; range = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bjc" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bjd" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
"bje" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access_txt = "6;5"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = "Streight"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
@@ -3289,8 +3289,8 @@
"blm" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bln" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/medbay)
"blo" = (/obj/effect/sign/redcross,/turf/simulated/wall,/area/medical/medbay)
-"blp" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
-"blq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Medbay"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"blp" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"blq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{id_tag = "MedbayFoyer"; name = "Medbay"; req_access_txt = "5"; req_one_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"blr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bls" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"blt" = (/obj/machinery/door/firedoor/border_only,/obj/structure/table/reinforced,/obj/machinery/door/window/westleft{name = "Chemistry Desk"},/obj/machinery/door/window/eastright{name = "Chemistry Desk"; req_access_txt = "33"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
@@ -5665,8 +5665,8 @@
"ceW" = (/obj/machinery/light,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor,/area/engine/engineering)
"ceX" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
"ceY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
-"ceZ" = (/obj/machinery/power/rad_collector,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
-"cfa" = (/obj/machinery/power/rad_collector,/obj/structure/cable,/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
+"ceZ" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
+"cfa" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable,/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
"cfb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/engine/particle_accelerator)
"cfc" = (/obj/structure/particle_accelerator/particle_emitter/left,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
"cfd" = (/obj/structure/particle_accelerator/particle_emitter/center,/turf/simulated/floor/plating,/area/engine/particle_accelerator)
@@ -5720,7 +5720,7 @@
"cfZ" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/solar/starboard)
"cga" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cgb" = (/obj/machinery/light/spot{dir = 8; layer = 2.8},/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/engine/engineering)
-"cgc" = (/obj/machinery/the_singularitygen,/turf/simulated/floor/plating/airless,/area/engine/engineering)
+"cgc" = (/obj/machinery/the_singularitygen{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cgd" = (/obj/machinery/light/spot{dir = 4; layer = 2.8},/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cge" = (/obj/structure/grille,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = "90Curve"},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cgf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating/airless,/area/solar/starboard)