diff --git a/baystation12.dme b/baystation12.dme
index 2218c3fa7cd..075645d281c 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -533,6 +533,7 @@
#include "code\game\machinery\computer\communications.dm"
#include "code\game\machinery\computer\computer.dm"
#include "code\game\machinery\computer\crew.dm"
+#include "code\game\machinery\computer\HolodeckControl.dm"
#include "code\game\machinery\computer\hologram.dm"
#include "code\game\machinery\computer\id.dm"
#include "code\game\machinery\computer\lockdown.dm"
diff --git a/code/datums/shuttle_controller.dm b/code/datums/shuttle_controller.dm
index 23a1f155ccc..6b4925481c6 100644
--- a/code/datums/shuttle_controller.dm
+++ b/code/datums/shuttle_controller.dm
@@ -140,9 +140,13 @@ datum/shuttle_controller
AM.throw_at(E, 1, 1)
return
*/
+
if(istype(T, /turf/simulated))
del(T)
+ for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area...
+ bug.gib()
+
start_location.move_contents_to(end_location)
settimeleft(SHUTTLELEAVETIME)
world << "The Emergency Shuttle has docked with the station! You have [timeleft()/60] minutes to board the Emergency Shuttle."
@@ -151,6 +155,7 @@ datum/shuttle_controller
return 1
if(1)
+
if(timeleft>0)
return 0
diff --git a/code/defines/obj/computer.dm b/code/defines/obj/computer.dm
index 23f9581fedc..fcb954a18eb 100644
--- a/code/defines/obj/computer.dm
+++ b/code/defines/obj/computer.dm
@@ -128,31 +128,6 @@
var/h_b = 245.0
-/obj/machinery/computer/med_data
- name = "Medical Records"
- desc = "This can be used to check medical records."
- icon_state = "medcomp"
- req_access = list(access_medical)
- circuit = "/obj/item/weapon/circuitboard/med_data"
- var/obj/item/weapon/card/id/scan = null
- var/obj/item/weapon/disk/records/disk = null
- var/authenticated = null
- var/rank = null
- var/screen = null
- var/datum/data/record/active1 = null
- var/datum/data/record/active2 = null
- var/a_id = null
- var/temp = null
- var/printing = null
- var/list/Perp
- var/tempname = null
-
-
-/obj/machinery/computer/med_data/laptop
- name = "Medical Laptop"
- desc = "Cheap Nanotrasen Laptop."
- icon_state = "medlaptop"
-
/obj/machinery/computer/pod
name = "Pod Launch Control"
diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index 075cb3e4150..304645172f6 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -229,6 +229,8 @@
return max(low,min(high,num))
/proc/dd_replacetext(text, search_string, replacement_string)
+ if(!text || !istext(text) || !search_string || !istext(search_string) || !istext(replacement_string))
+ return null
var/textList = dd_text2list(text, search_string)
return dd_list2text(textList, replacement_string)
@@ -1383,7 +1385,7 @@ proc/listclearnulls(list/list)
var/y_pos = null
var/z_pos = null
-/area/proc/move_contents_to(var/area/A, var/turftoleave=null)
+/area/proc/move_contents_to(var/area/A, var/turftoleave=null, var/direction = null)
//Takes: Area. Optional: turf type to leave behind.
//Returns: Nothing.
//Notes: Attempts to move the contents of one area to another area.
@@ -1442,7 +1444,39 @@ proc/listclearnulls(list/list)
X.icon_state = old_icon_state1
X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
+ /* Quick visual fix for some weird shuttle corner artefacts when on transit space tiles */
+ if(direction && findtext(X.icon_state, "swall_s"))
+
+ // Spawn a new shuttle corner object
+ var/obj/corner = new()
+ corner.loc = X
+ corner.density = 1
+ corner.anchored = 1
+ corner.icon = X.icon
+ corner.icon_state = dd_replacetext(X.icon_state, "_s", "_f")
+ corner.tag = "delete me"
+ corner.name = "wall"
+
+ // Find a new turf to take on the property of
+ var/turf/nextturf = get_step(corner, direction)
+ if(!nextturf || !istype(nextturf, /turf/space))
+ nextturf = get_step(corner, turn(direction, 180))
+
+
+ // Take on the icon of a neighboring scrolling space icon
+ X.icon = nextturf.icon
+ X.icon_state = nextturf.icon_state
+
+
for(var/obj/O in T)
+
+ // Reset the shuttle corners
+ if(O.tag == "delete me")
+ X.icon = 'shuttle.dmi'
+ X.icon_state = dd_replacetext(O.icon_state, "_f", "_s") // revert the turf to the old icon_state
+ X.name = "wall"
+ del(O) // prevents multiple shuttle corners from stacking
+ continue
if(!istype(O,/obj)) continue
O.loc = X
for(var/mob/M in T)
@@ -1500,6 +1534,172 @@ proc/listclearnulls(list/list)
+proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0)
+ if(!original)
+ return null
+
+ var/obj/O = null
+
+ if(sameloc)
+ O=new original.type(original.loc)
+ else
+ O=new original.type(locate(0,0,0))
+
+ if(perfectcopy)
+ if((O) && (original))
+ for(var/V in original.vars)
+ if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key")))
+ O.vars[V] = original.vars[V]
+ return O
+
+
+/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 )
+ //Takes: Area. Optional: If it should copy to areas that don't have plating
+ //Returns: Nothing.
+ //Notes: Attempts to move the contents of one area to another area.
+ // Movement based on lower left corner. Tiles that do not fit
+ // into the new area will not be moved.
+
+ if(!A || !src) return 0
+
+ var/list/turfs_src = get_area_turfs(src.type)
+ var/list/turfs_trg = get_area_turfs(A.type)
+
+ var/src_min_x = 0
+ var/src_min_y = 0
+ for (var/turf/T in turfs_src)
+ if(T.x < src_min_x || !src_min_x) src_min_x = T.x
+ if(T.y < src_min_y || !src_min_y) src_min_y = T.y
+
+ var/trg_min_x = 0
+ var/trg_min_y = 0
+ for (var/turf/T in turfs_trg)
+ if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x
+ if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y
+
+ var/list/refined_src = new/list()
+ for(var/turf/T in turfs_src)
+ refined_src += T
+ refined_src[T] = new/datum/coords
+ var/datum/coords/C = refined_src[T]
+ C.x_pos = (T.x - src_min_x)
+ C.y_pos = (T.y - src_min_y)
+
+ var/list/refined_trg = new/list()
+ for(var/turf/T in turfs_trg)
+ refined_trg += T
+ refined_trg[T] = new/datum/coords
+ var/datum/coords/C = refined_trg[T]
+ C.x_pos = (T.x - trg_min_x)
+ C.y_pos = (T.y - trg_min_y)
+
+ var/list/toupdate = new/list()
+
+ var/copiedobjs = list()
+
+
+ moving:
+ for (var/turf/T in refined_src)
+ var/datum/coords/C_src = refined_src[T]
+ for (var/turf/B in refined_trg)
+ var/datum/coords/C_trg = refined_trg[B]
+ if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos)
+
+ var/old_dir1 = T.dir
+ var/old_icon_state1 = T.icon_state
+ var/old_icon1 = T.icon
+
+ if(platingRequired)
+ if(istype(B, /turf/space))
+ continue moving
+
+ var/turf/X = new T.type(B)
+ X.dir = old_dir1
+ X.icon_state = old_icon_state1
+ X.icon = old_icon1 //Shuttle floors are in shuttle.dmi while the defaults are floors.dmi
+
+
+ var/list/objs = new/list()
+ var/list/newobjs = new/list()
+ var/list/mobs = new/list()
+ var/list/newmobs = new/list()
+
+ for(var/obj/O in T)
+
+ if(!istype(O,/obj))
+ continue
+
+ objs += O
+
+
+ for(var/obj/O in objs)
+ newobjs += DuplicateObject(O , 1)
+
+
+ for(var/obj/O in newobjs)
+ O.loc = X
+
+ for(var/mob/M in T)
+
+ if(!istype(M,/mob))
+ continue
+
+ mobs += M
+
+ for(var/mob/M in mobs)
+ newmobs += DuplicateObject(M , 1)
+
+ for(var/mob/M in newmobs)
+ M.loc = X
+
+ copiedobjs += newobjs
+ copiedobjs += newmobs
+
+
+
+ for(var/V in T.vars)
+ if(!(V in list("type","loc","locs","vars", "parent", "parent_type","verbs","ckey","key","x","y","z","contents", "luminosity", "sd_light_spill",)))
+ X.vars[V] = T.vars[V]
+
+ var/area/AR = X.loc
+
+ if(AR.sd_lighting)
+ X.opacity = !X.opacity
+ X.sd_SetOpacity(!X.opacity)
+
+ toupdate += X
+
+ refined_src -= T
+ refined_trg -= B
+ continue moving
+
+
+
+
+ var/list/doors = new/list()
+
+ if(toupdate.len)
+ for(var/turf/simulated/T1 in toupdate)
+ for(var/obj/machinery/door/D2 in T1)
+ doors += D2
+ if(T1.parent)
+ air_master.groups_to_rebuild += T1.parent
+ else
+ air_master.tiles_to_update += T1
+
+ for(var/obj/O in doors)
+ O:update_nearby_tiles(1)
+
+
+
+
+ return copiedobjs
+
+
+
+
+
+
proc/get_cardinal_dir(atom/A, atom/B)
var/dx = abs(B.x - A.x)
var/dy = abs(B.y - A.y)
diff --git a/code/game/events/EventProcs/space_ninja.dm b/code/game/events/EventProcs/space_ninja.dm
index 28bd1088c42..c600efd4057 100644
--- a/code/game/events/EventProcs/space_ninja.dm
+++ b/code/game/events/EventProcs/space_ninja.dm
@@ -109,9 +109,9 @@ When I already created about 4 new objectives, this doesn't seem terribly import
var/commando_list[] = list()//Commandos.
//We want the ninja to appear only in certain modes.
- var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey")
- if(!(current_mode.config_tag in acceptable_modes_list))
- return
+// var/acceptable_modes_list[] = list("traitor","revolution","cult","wizard","changeling","traitorchan","nuclear","malfunction","monkey") // Commented out for both testing and ninjas
+// if(!(current_mode.config_tag in acceptable_modes_list))
+// return
/*No longer need to determine what mode it is since bad guys are basically universal.
And there is now a mode with two types of bad guys.*/
@@ -187,7 +187,7 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
if(sent_strike_team&&side=="heel"&&antagonist_list.len)//If a strike team was sent, murder them all like a champ.
for(current_mind in antagonist_list)//Search and destroy. Since we already have an antagonist list, they should appear there.
- if(current_mind.special_role=="Death Commando")
+ if(current_mind && current_mind.special_role=="Death Commando")
commando_list += current_mind
if(commando_list.len)//If there are living commandos still in play.
for(var/mob/living/carbon/human/commando in commando_list)
@@ -230,8 +230,7 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
objective_list -= 3
switch(pick(objective_list))
if(1)//kill
- while (!isnull(current_mind) && hostile_targets.len)
- current_mind = pick(hostile_targets)
+ current_mind = pick(hostile_targets)
if(current_mind)
var/datum/objective/assassinate/ninja_objective = new
@@ -239,6 +238,9 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))//If they have a special role, use that instead to find em.
ninja_mind.objectives += ninja_objective
+ else
+ i++
+
hostile_targets -= current_mind//Remove them from the list.
if(2)//Steal
var/list/datum/objective/theft = GenerateTheft(ninja_mind.assigned_role,ninja_mind)
@@ -247,26 +249,32 @@ In either case, it's a good idea to spawn the ninja with a semi-random set of ob
objective_list -= 2
if(3)//Protect. Keeping people alive can be pretty difficult.
- while (!isnull(current_mind) && friendly_targets.len)
- current_mind = pick(friendly_targets)
+ current_mind = pick(friendly_targets)
if(current_mind)
+
var/datum/objective/protection/ninja_objective = new
ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
ninja_mind.objectives += ninja_objective
+ else
+ i++
+
friendly_targets -= current_mind
if(4)//Debrain
- while (!isnull(current_mind) && hostile_targets.len)
- current_mind = pick(hostile_targets)
+ current_mind = pick(hostile_targets)
if(current_mind)
+
var/datum/objective/debrain/ninja_objective = new
ninja_objective.owner = ninja_mind
ninja_objective.find_target_by_role((current_mind.special_role ? current_mind.special_role : current_mind.assigned_role),(current_mind.special_role?1:0))
ninja_mind.objectives += ninja_objective
+ else
+ i++
+
hostile_targets -= current_mind//Remove them from the list.
if(5)//Download research
var/datum/objective/download/ninja_objective = new
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index e13d4cd37a2..e351f3d82a3 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -227,9 +227,8 @@
/obj/item/weapon/disk/nuclear/Del()
- if (ticker.mode && ticker.mode.name == "nuclear emergency")
- if(blobstart.len > 0)
- var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
- message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
- log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+ if(blobstart.len > 0)
+ var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
+ message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+ log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
..()
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 683e5328cc3..6a0f2d475e5 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -92,9 +92,12 @@
dat += "10 milk (20)
"
dat += "Slab of meat (50)
"
dat += "Nutrient
"
- dat += "E-Z-Nutrient (10)
"
- dat += "Left 4 Zed (20)
"
- dat += "Robust Harvest (25)
"
+ dat += "E-Z-Nutrient (10) | x5
"
+ dat += "Left 4 Zed (20) | x5
"
+ dat += "Robust Harvest (25) | x5
"
+ dat += "Leather
"
+ dat += "Botanical gloves (350)
"
+ dat += "Utility belt (400)
"
//dat += "Other
"
//dat += "Monkey (500)
"
else
@@ -163,6 +166,28 @@
new/obj/item/nutrient/l4z(src.loc)
if("rh")
new/obj/item/nutrient/rh(src.loc)
+ if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan
+ new/obj/item/nutrient/ez(src.loc)
+ new/obj/item/nutrient/ez(src.loc)
+ new/obj/item/nutrient/ez(src.loc)
+ new/obj/item/nutrient/ez(src.loc)
+ new/obj/item/nutrient/ez(src.loc)
+ if("l4z5")
+ new/obj/item/nutrient/l4z(src.loc)
+ new/obj/item/nutrient/l4z(src.loc)
+ new/obj/item/nutrient/l4z(src.loc)
+ new/obj/item/nutrient/l4z(src.loc)
+ new/obj/item/nutrient/l4z(src.loc)
+ if("rh5")
+ new/obj/item/nutrient/rh(src.loc)
+ new/obj/item/nutrient/rh(src.loc)
+ new/obj/item/nutrient/rh(src.loc)
+ new/obj/item/nutrient/rh(src.loc)
+ new/obj/item/nutrient/rh(src.loc)
+ if("gloves")
+ new/obj/item/clothing/gloves/botanic_leather(src.loc)
+ if("tbelt")
+ new/obj/item/weapon/storage/belt/utility(src.loc)
if("monkey")
new/mob/living/carbon/monkey(src.loc)
processing = 0
@@ -181,9 +206,10 @@
if("activate")
activate()
if("detach")
- beaker.loc = src.loc
- beaker = null
- update_icon()
+ if(beaker)
+ beaker.loc = src.loc
+ beaker = null
+ update_icon()
if("create")
create_product(href_list["item"],text2num(href_list["cost"]))
if("menu")
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
new file mode 100644
index 00000000000..567f10801f9
--- /dev/null
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -0,0 +1,459 @@
+/obj/machinery/computer/HolodeckControl
+ name = "Holodeck Control Computer"
+ desc = "A computer used to control a nearby holodeck."
+ icon_state = "computer_generic"
+ var/area/linkedholodeck = null
+ var/area/target = null
+ var/active = 0
+ var/list/holographic_items = list()
+ var/damaged = 0
+
+
+ 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)
+
+ if(..())
+ return
+ user.machine = src
+ var/dat
+
+
+ dat += "Holodeck Control System
"
+ dat += "
Current Loaded Programs:
"
+
+ dat += "((Empty Court))
"
+ dat += "((Boxing Court))
"
+ dat += "((Thunderdome Court))
"
+ dat += "((Beach))
"
+// dat += "((Shutdown System))
"
+
+ dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.
"
+
+ if(issilicon(user) && !emagged)
+ dat += "(Override Safety Protocols?)
"
+
+ if(emagged)
+ dat += "(Begin Atmospheric Burn Simulation)
"
+ dat += "Ensure the holodeck is empty before testing.
"
+ dat += "
"
+ dat += "(Begin Wildlife Simulation)
"
+ dat += "Ensure the holodeck is empty before testing.
"
+ dat += "
"
+ dat += "Safety Protocols are DISABLED
"
+ else
+ dat += "
"
+ dat += "Safety Protocols are ENABLED
"
+
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+
+
+ return
+
+
+ Topic(href, href_list)
+ if(..())
+ return
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.machine = src
+
+ if(href_list["emptycourt"])
+ target = locate(/area/holodeck/source_emptycourt)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["boxingcourt"])
+ target = locate(/area/holodeck/source_boxingcourt)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["thunderdomecourt"])
+ target = locate(/area/holodeck/source_thunderdomecourt)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["beach"])
+ target = locate(/area/holodeck/source_beach)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["turnoff"])
+ target = locate(/area/holodeck/source_plating)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["burntest"])
+ target = locate(/area/holodeck/source_burntest)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["wildlifecarp"])
+ target = locate(/area/holodeck/source_wildlife)
+ if(target)
+ loadProgram(target)
+
+ else if(href_list["AIoverride"])
+ emagged = 1
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ return
+
+
+
+/obj/machinery/computer/HolodeckControl/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
+/* if(istype(D, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (src.stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ new /obj/item/weapon/shard( src.loc )
+ var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ A.circuit = M
+ A.state = 3
+ A.icon_state = "3"
+ A.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
+ for (var/obj/C in src)
+ C.loc = src.loc
+ A.circuit = M
+ A.state = 4
+ A.icon_state = "4"
+ A.anchored = 1
+ del(src)
+
+*/
+ if(istype(D, /obj/item/weapon/card/emag) && !emagged)
+ playsound(src.loc, 'sparks4.ogg', 75, 1)
+ emagged = 1
+ user << "\blue You vastly increase projector power and override the safety and security protocols."
+ user << "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintence and do not use the simulator."
+ src.updateUsrDialog()
+ return
+
+/obj/machinery/computer/HolodeckControl/New()
+ ..()
+ linkedholodeck = locate(/area/holodeck/alphadeck)
+ //if(linkedholodeck)
+ // target = locate(/area/holodeck/source_emptycourt)
+ // if(target)
+ // loadProgram(target)
+
+
+/obj/machinery/computer/HolodeckControl/process()
+
+ if(active)
+
+ if(!checkInteg(linkedholodeck))
+ damaged = 1
+ target = locate(/area/holodeck/source_plating)
+ if(target)
+ loadProgram(target)
+ active = 0
+ for(var/mob/M in range(10,src))
+ M.show_message("The holodeck overloads!")
+
+
+ for(var/turf/T in linkedholodeck)
+ if(prob(30))
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, T)
+ s.start()
+ T.ex_act(3)
+ T.hotspot_expose(1000,500,1)
+
+
+ for(var/item in holographic_items)
+ if(!(get_turf(item) in linkedholodeck))
+ derez(item, 0)
+
+
+
+/obj/machinery/computer/HolodeckControl/proc/derez(var/obj , var/silent = 1)
+ holographic_items.Remove(obj)
+
+ if(istype(obj , /obj/))
+ if(istype(obj:loc , /mob/))
+ var/mob/M = obj:loc
+ M.drop_from_slot(obj)
+
+ if(!silent)
+ var/obj/oldobj = obj
+ for(var/mob/M in viewers(world.view,get_turf(obj)))
+ M << "The [oldobj.name] fades away!"
+ del(obj)
+
+/obj/machinery/computer/HolodeckControl/proc/checkInteg(var/area/A)
+ for(var/turf/T in A)
+ if(istype(T, /turf/space))
+ return 0
+
+ return 1
+
+/obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0)
+
+ if(toggleOn)
+ var/area/targetsource = locate(/area/holodeck/source_emptycourt)
+ holographic_items = targetsource.copy_contents_to(linkedholodeck)
+
+ spawn(30)
+ for(var/obj/effect/landmark/L in linkedholodeck)
+ if(L.name=="Atmospheric Test Start")
+ spawn(20)
+ var/turf/T = get_turf(L)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, T)
+ s.start()
+ if(T)
+ T.temperature = 5000
+ T.hotspot_expose(50000,50000,1)
+
+ active = 1
+ else
+ for(var/item in holographic_items)
+ derez(item)
+ var/area/targetsource = locate(/area/holodeck/source_plating)
+ targetsource.copy_contents_to(linkedholodeck , 1)
+ active = 0
+
+
+/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/area/A)
+
+ active = 1
+
+ for(var/item in holographic_items)
+ derez(item)
+
+ for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
+ del(B)
+
+ holographic_items = A.copy_contents_to(linkedholodeck , 1)
+
+ if(emagged)
+ for(var/obj/item/weapon/melee/energy/sword/holosword/H in linkedholodeck)
+ H.damtype = BRUTE
+
+ spawn(30)
+ for(var/obj/effect/landmark/L in linkedholodeck)
+ if(L.name=="Atmospheric Test Start")
+ spawn(20)
+ var/turf/T = get_turf(L)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, T)
+ s.start()
+ if(T)
+ T.temperature = 5000
+ T.hotspot_expose(50000,50000,1)
+
+
+
+
+
+
+
+
+
+
+// Holographic Items!
+
+/turf/simulated/floor/holofloor/
+ thermal_conductivity = 0
+
+/turf/simulated/floor/holofloor/grass
+ name = "Lush Grass"
+ icon_state = "grass1"
+ floor_tile = new/obj/item/stack/tile/grass
+
+ New()
+ floor_tile.New() //I guess New() isn't run on objects spawned without the definition of a turf to house them, ah well.
+ icon_state = "grass[pick("1","2","3","4")]"
+ ..()
+ spawn(4)
+ update_icon()
+ for(var/direction in cardinal)
+ if(istype(get_step(src,direction),/turf/simulated/floor))
+ var/turf/simulated/floor/FF = get_step(src,direction)
+ FF.update_icon() //so siding get updated properly
+
+/turf/simulated/floor/holofloor/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ return
+ // HOLOFLOOR DOES NOT GIVE A FUCK
+
+
+
+
+
+
+
+
+
+
+/obj/structure/table/holotable
+ name = "table"
+ desc = "A square piece of metal standing on four metal legs. It can not move."
+ icon = 'structures.dmi'
+ icon_state = "table"
+ density = 1
+ anchored = 1.0
+ layer = 2.8
+// throwpass = 1 //You can throw objects over this, despite it's density.
+
+
+/obj/structure/table/holotable/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+/obj/structure/table/holotable/attack_alien(mob/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
+ return attack_hand(user)
+
+/obj/structure/table/holotable/attack_animal(mob/living/simple_animal/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
+ return attack_hand(user)
+
+/obj/structure/table/holotable/attack_hand(mob/user as mob)
+ return // HOLOTABLE DOES NOT GIVE A FUCK
+
+
+/obj/structure/table/holotable/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
+ var/obj/item/weapon/grab/G = W
+ if(G.state<2)
+ user << "\red You need a better grip to do that!"
+ return
+ G.affecting.loc = src.loc
+ G.affecting.Weaken(5)
+ for(var/mob/O in viewers(world.view, src))
+ if (O.client)
+ O << text("\red [] puts [] on the table.", G.assailant, G.affecting)
+ del(W)
+ return
+
+ if (istype(W, /obj/item/weapon/wrench))
+ user << "It's a holotable! There are no bolts!"
+ return
+
+ if(isrobot(user))
+ return
+
+
+
+/obj/item/clothing/gloves/boxing/hologlove
+ name = "boxing gloves"
+ desc = "Because you really needed another excuse to punch your crewmates."
+ icon_state = "boxing"
+ item_state = "boxing"
+
+/obj/structure/holowindow
+ name = "reinforced window"
+ icon = 'structures.dmi'
+ icon_state = "rwindow"
+ desc = "A window."
+ density = 1
+ layer = 3.2//Just above doors
+ pressure_resistance = 4*ONE_ATMOSPHERE
+ anchored = 1.0
+ flags = ON_BORDER
+
+
+/obj/structure/holowindow/Del()
+ ..()
+
+
+/obj/item/weapon/melee/energy/sword/holosword
+ damtype = HALLOSS
+
+/obj/item/weapon/melee/energy/sword/holosword/green
+ New()
+ color = "green"
+
+/obj/item/weapon/melee/energy/sword/holosword/red
+ New()
+ color = "red"
+
+
+
+
+
+
+/obj/machinery/readybutton
+ name = "Ready Declaration Device"
+ desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!"
+ icon = 'monitors.dmi'
+ icon_state = "auth_off"
+ var/ready = 0
+ var/area/currentarea = null
+ var/eventstarted = 0
+
+ anchored = 1.0
+ use_power = 1
+ idle_power_usage = 2
+ active_power_usage = 6
+ power_channel = ENVIRON
+
+/obj/machinery/readybutton/attack_ai(mob/user as mob)
+ user << "The station AI is not to interact with these devices"
+ return
+
+/obj/machinery/readybutton/attack_paw(mob/user as mob)
+ user << "You are too primitive to use this device"
+ return
+
+/obj/machinery/readybutton/New()
+ ..()
+
+
+/obj/machinery/readybutton/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ user << "The device is a solid button, there's nothing you can do with it!"
+
+/obj/machinery/readybutton/attack_hand(mob/user as mob)
+ if(user.stat || stat & (NOPOWER|BROKEN))
+ user << "This device is not powered."
+ return
+
+ currentarea = get_area(src.loc)
+ if(!currentarea)
+ del(src)
+
+ if(eventstarted)
+ usr << "The event has already begun!"
+ return
+
+ ready = !ready
+
+ update_icon()
+
+ var/numbuttons = 0
+ var/numready = 0
+ for(var/obj/machinery/readybutton/button in currentarea)
+ numbuttons++
+ if (button.ready)
+ numready++
+
+ if(numbuttons == numready)
+ begin_event()
+
+/obj/machinery/readybutton/update_icon()
+ if(ready)
+ icon_state = "auth_on"
+ else
+ icon_state = "auth_off"
+
+/obj/machinery/readybutton/proc/begin_event()
+
+ eventstarted = 1
+
+ for(var/obj/structure/holowindow/W in currentarea)
+ del(W)
+
+ for(var/mob/M in currentarea)
+ M << "FIGHT!"
\ No newline at end of file
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 14c0ceb7485..0fd688bed81 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -192,6 +192,11 @@
build_path = "/obj/machinery/computer/telecomms/server"
origin_tech = "programming=3"
+/obj/item/weapon/circuitboard/comm_traffic
+ name = "Circuitboard (Telecommunications Traffic Control)"
+ build_path = "/obj/machinery/computer/telecomms/traffic"
+ origin_tech = "programming=3"
+
/obj/item/weapon/circuitboard/curefab
name = "Circuit board (Cure fab)"
build_path = "/obj/machinery/computer/curer"
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 3c200f6158a..c7035736f6d 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -1,3 +1,24 @@
+/obj/machinery/computer/med_data//TODO:SANITY
+ name = "Medical Records"
+ desc = "This can be used to check medical records."
+ icon_state = "medcomp"
+ req_access = list(access_medical)
+ circuit = "/obj/item/weapon/circuitboard/med_data"
+ var
+ obj/item/weapon/card/id/scan = null
+ obj/item/weapon/disk/records/disk = null
+ authenticated = null
+ rank = null
+ screen = null
+ datum/data/record/active1 = null
+ datum/data/record/active2 = null
+ a_id = null
+ temp = null
+ printing = null
+ list/Perp
+ tempname = null
+
+
/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob)
if(istype(O, /obj/item/weapon/card/id) && !scan)
usr.drop_item()
@@ -21,7 +42,6 @@
if(..())
return
var/dat
-
if (src.temp)
dat = text("[src.temp]
Clear Screen")
else
@@ -540,3 +560,8 @@
src.updateUsrDialog()
return
+
+/obj/machinery/computer/med_data/laptop
+ name = "Medical Laptop"
+ desc = "Cheap Nanotrasen Laptop."
+ icon_state = "medlaptop"
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 2ead66f3eb7..7d87be6345b 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -90,19 +90,25 @@
del(src)
+ attack_ai(var/mob/user as mob)
+ attack_hand(user)
+
attack_hand(var/mob/user as mob)
- // You need a multitool to use this.
- if(user.equipped())
- if(!istype(user.equipped(), /obj/item/device/multitool))
+ // You need a multitool to use this, or be silicon
+ if(!issilicon(user))
+ if(user.equipped())
+ if(!istype(user.equipped(), /obj/item/device/multitool))
+ return
+ else
return
- else
- return
if(stat & (BROKEN|NOPOWER) || !on)
return
- var/obj/item/device/multitool/P = user.equipped()
+ var/obj/item/device/multitool/P = null
+ if(!issilicon(user))
+ P = user.equipped()
user.machine = src
var/dat
@@ -138,10 +144,12 @@
dat += "
\[Add Filter\]"
dat += "
"
- if(P.buffer)
- dat += "
MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]"
- else
- dat += "
MULTITOOL BUFFER: \[Add Machine\]"
+
+ if(P)
+ if(P.buffer)
+ dat += "
MULTITOOL BUFFER: [P.buffer] ([P.buffer.id]) \[Link\] \[Flush\]"
+ else
+ dat += "
MULTITOOL BUFFER: \[Add Machine\]"
dat += ""
temp = ""
@@ -150,16 +158,19 @@
Topic(href, href_list)
- if(usr.equipped())
- if(!istype(usr.equipped(), /obj/item/device/multitool))
+ if(!issilicon(usr))
+ if(usr.equipped())
+ if(!istype(usr.equipped(), /obj/item/device/multitool))
+ return
+ else
return
- else
- return
if(stat & (BROKEN|NOPOWER) || !on)
return
- var/obj/item/device/multitool/P = usr.equipped()
+ var/obj/item/device/multitool/P = null
+ if(!issilicon(usr))
+ P = usr.equipped()
if(href_list["input"])
switch(href_list["input"])
@@ -205,27 +216,30 @@
if(href_list["unlink"])
- var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])]
- temp = "-% Removed \ref[T] [T.name] from linked entities. %-"
+ if(text2num(href_list["unlink"]) <= length(links))
+ var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])]
+ temp = "-% Removed \ref[T] [T.name] from linked entities. %-"
- // Remove link entries from both T and src.
- if(src in T.links)
- T.links.Remove(src)
- links.Remove(T)
+ // Remove link entries from both T and src.
+ if(src in T.links)
+ T.links.Remove(src)
+ links.Remove(T)
if(href_list["link"])
- if(P.buffer)
- if(!(src in P.buffer.links))
- P.buffer.links.Add(src)
+ if(P)
- if(!(P.buffer in src.links))
- src.links.Add(P.buffer)
+ if(P.buffer)
+ if(!(src in P.buffer.links))
+ P.buffer.links.Add(src)
- temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-"
+ if(!(P.buffer in src.links))
+ src.links.Add(P.buffer)
- else
- temp = "-% Unable to acquire buffer %-"
+ temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-"
+
+ else
+ temp = "-% Unable to acquire buffer %-"
if(href_list["buffer"])
@@ -244,3 +258,4 @@
updateUsrDialog()
+
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 1866477d7a8..b777f24a70b 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -108,7 +108,7 @@
if(href_list["network"])
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
- if(newnet && usr in range(1, src))
+ if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 972c36e9110..accfd0abea5 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -35,7 +35,7 @@
winset(editingcode, "tcscode", "is-disabled=false")
// If the player's not manning the keyboard anymore, adjust everything
- if(!(editingcode in range(1, src)) || editingcode.machine != src)
+ if( (!(editingcode in range(1, src)) && !issilicon(editingcode)) || (editingcode.machine != src && !issilicon(editingcode)))
if(editingcode)
winshow(editingcode, "Telecomms IDE", 0) // hide the window!
editingcode = null
@@ -169,6 +169,7 @@
editingcode = usr
winshow(editingcode, "Telecomms IDE", 1) // show the IDE
winset(editingcode, "tcscode", "is-disabled=false")
+ winset(editingcode, "tcscode", "text=\"\"")
var/showcode = dd_replacetext(storedcode, "\\\"", "\\\\\"")
showcode = dd_replacetext(storedcode, "\"", "\\\"")
winset(editingcode, "tcscode", "text=\"[showcode]\"")
@@ -189,7 +190,7 @@
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
- if(newnet && usr in range(1, src))
+ if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
@@ -211,7 +212,7 @@
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
+ var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
@@ -222,7 +223,7 @@
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
+ var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
diff --git a/code/game/objects/closets/secure/medical.dm b/code/game/objects/closets/secure/medical.dm
index 3d220fb37de..383296c9636 100644
--- a/code/game/objects/closets/secure/medical.dm
+++ b/code/game/objects/closets/secure/medical.dm
@@ -1,12 +1,12 @@
/obj/structure/closet/secure_closet/medicine
name = "Medicine Closet"
desc = "Filled with medical junk."
- icon_state = "medical1"
- icon_closed = "medical"
- icon_locked = "medical1"
- icon_opened = "medicalopen"
- icon_broken = "medicalbroken"
- icon_off = "medical1"
+ icon_state = "securemed1"
+ icon_closed = "securemed"
+ icon_locked = "securemed1"
+ icon_opened = "securemedopen"
+ icon_broken = "securemedbroken"
+ icon_off = "securemed1"
req_access = list(access_medical)
@@ -28,13 +28,13 @@
/obj/structure/closet/secure_closet/anaesthetic
name = "Anesthetic"
- desc = "Used to knock people out, either by sleeping gas or brute force."
- icon_state = "medical1"
- icon_closed = "medical"
- icon_locked = "medical1"
- icon_opened = "medicalopen"
- icon_broken = "medicalbroken"
- icon_off = "medical1"
+ desc = "Used to knock people out."
+ icon_state = "securemed1"
+ icon_closed = "securemed"
+ icon_locked = "securemed1"
+ icon_opened = "securemedopen"
+ icon_broken = "securemedbroken"
+ icon_off = "securemed1"
req_access = list(access_medical)
@@ -51,6 +51,31 @@
+/obj/structure/closet/secure_closet/doctor_personal
+ name = "Doctor's Locker"
+ req_access = list(access_medical)
+ icon_state = "securemed1"
+ icon_closed = "securemed"
+ icon_locked = "securemed1"
+ icon_opened = "securemedopen"
+ icon_broken = "securemedbroken"
+ icon_off = "securemed1"
+
+ New()
+ ..()
+ sleep(2)
+ new /obj/item/wardrobe/doctor(src)
+ //
+ var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src)
+ var/obj/item/weapon/storage/box/B = new(BPK)
+ new /obj/item/weapon/pen(B)
+ new /obj/item/device/pda/medical(src)
+ new /obj/item/weapon/storage/firstaid/regular(src)
+ new /obj/item/device/flashlight/pen(src)
+ new /obj/item/weapon/cartridge/medical(src)
+ new /obj/item/device/radio/headset/headset_med(src)
+ return
+
/obj/structure/closet/secure_closet/chemist_personal
name = "Chemist's Locker"
req_access = list(access_chemistry)
@@ -67,25 +92,6 @@
new /obj/item/device/pda/toxins(src)
return
-/obj/structure/closet/secure_closet/doctor_personal
- name = "Doctor's Locker"
- req_access = list(access_medical)
-
- New()
- ..()
- sleep(2)
- new /obj/item/wardrobe/doctor(src)
- //
- var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src)
- var/obj/item/weapon/storage/box/B = new(BPK)
- new /obj/item/weapon/pen(B)
- new /obj/item/device/pda/medical(src)
- new /obj/item/weapon/storage/firstaid/regular(src)
- new /obj/item/device/flashlight/pen(src)
- new /obj/item/weapon/cartridge/medical(src)
- new /obj/item/device/radio/headset/headset_med(src)
- return
-
/obj/structure/closet/secure_closet/genetics_personal
name = "Geneticist's Locker"
req_access = list(access_medlab)
@@ -122,6 +128,12 @@
/obj/structure/closet/secure_closet/CMO
name = "Chief Medical Officer's Locker"
req_access = list(access_cmo)
+ icon_state = "cmosecure1"
+ icon_closed = "cmosecure"
+ icon_locked = "cmosecure1"
+ icon_opened = "cmosecureopen"
+ icon_broken = "cmosecurebroken"
+ icon_off = "cmosecure1"
New()
..()
@@ -159,12 +171,12 @@
/obj/structure/closet/secure_closet/chemical
name = "Chemical Closet"
desc = "Store dangerous chemicals in here."
- icon_state = "medical1"
- icon_closed = "medical"
- icon_locked = "medical1"
- icon_opened = "medicalopen"
- icon_broken = "medicalbroken"
- icon_off = "medical1"
+ icon_state = "securemed1"
+ icon_closed = "securemed"
+ icon_locked = "securemed1"
+ icon_opened = "securemedopen"
+ icon_broken = "securemedbroken"
+ icon_off = "securemed1"
req_access = list(access_medical)
diff --git a/code/game/objects/closets/secure/research.dm b/code/game/objects/closets/secure/research.dm
index ebfc674f687..77caa212bd4 100755
--- a/code/game/objects/closets/secure/research.dm
+++ b/code/game/objects/closets/secure/research.dm
@@ -1,7 +1,37 @@
+/obj/structure/closet/secure_closet/scientist
+ name = "Scientist's Locker"
+ req_access = list(access_research)
+ icon_state = "secureres1"
+ icon_closed = "secureres"
+ icon_locked = "secureres1"
+ icon_opened = "secureresopen"
+ icon_broken = "secureresbroken"
+ icon_off = "secureres1"
+
+ New()
+ ..()
+ sleep(2)
+ new /obj/item/wardrobe/scientist(src)
+ //
+ var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
+ var/obj/item/weapon/storage/box/B = new(BPK)
+ new /obj/item/weapon/pen(B)
+ new /obj/item/device/pda/toxins(src)
+ new /obj/item/weapon/tank/oxygen(src)
+ new /obj/item/clothing/mask/gas(src)
+ new /obj/item/device/radio/headset/headset_sci(src)
+
+
/obj/structure/closet/secure_closet/rd
name = "Research Director's Locker"
req_access = list(access_rd)
+ icon_state = "rdsecure1"
+ icon_closed = "rdsecure"
+ icon_locked = "rdsecure1"
+ icon_opened = "rdsecureopen"
+ icon_broken = "rdsecurebroken"
+ icon_off = "rdsecure1"
New()
..()
@@ -16,21 +46,4 @@
new /obj/item/clothing/mask/gas(src)
new /obj/item/device/flash(src)
new /obj/item/device/radio/headset/heads/rd(src)
- //
-
-/obj/structure/closet/secure_closet/scientist
- name = "Scientist's Locker"
- req_access = list(access_research)
-
- New()
- ..()
- sleep(2)
- new /obj/item/wardrobe/scientist(src)
- //
- var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
- var/obj/item/weapon/storage/box/B = new(BPK)
- new /obj/item/weapon/pen(B)
- new /obj/item/device/pda/toxins(src)
- new /obj/item/weapon/tank/oxygen(src)
- new /obj/item/clothing/mask/gas(src)
- new /obj/item/device/radio/headset/headset_sci(src)
\ No newline at end of file
+ //
\ No newline at end of file
diff --git a/code/game/objects/closets/secure/scientist.dm b/code/game/objects/closets/secure/scientist.dm
index 57c5981e6ec..e28b2212f49 100644
--- a/code/game/objects/closets/secure/scientist.dm
+++ b/code/game/objects/closets/secure/scientist.dm
@@ -1,7 +1,12 @@
/obj/structure/closet/secure_closet/RD
name = "Research Director"
req_access = list(access_rd)
-
+ icon_state = "rdsecure1"
+ icon_closed = "rdsecure"
+ icon_locked = "rdsecure1"
+ icon_opened = "rdsecureopen"
+ icon_broken = "rdsecurebroken"
+ icon_off = "rdsecure1"
New()
..()
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 4eff5bf31ac..ac9c3069ce5 100755
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -339,7 +339,8 @@ mob/proc/flash_weak_pain()
if(Metroid)
Metroid.SStun = 1
sleep(rand(5,20))
- Metroid.SStun = 0
+ if(Metroid)
+ Metroid.SStun = 0
spawn(0)
Metroid.canmove = 0
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index c5ce4deb9ef..d206312b0a2 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -106,6 +106,7 @@
if(isigniter(W))
var/obj/item/device/assembly/igniter/I = W
if(I.secured) return 0
+ if(src.igniter) return
user.remove_from_mob(I)
I.loc = src
igniter = I
diff --git a/code/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm
index de52b3703c5..0498b7aafee 100644
--- a/code/game/objects/radio/radio.dm
+++ b/code/game/objects/radio/radio.dm
@@ -129,11 +129,12 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
if(!src.loc)
on = 0
- var/area/A = get_area(src)
- if(!A || !isarea(A) || !A.master)
- on = 0
else
- on = A.master.powered(EQUIP) // set "on" to the power status
+ var/area/A = src.loc.loc
+ if(!A || !isarea(A) || !A.master)
+ on = 0
+ else
+ on = A.master.powered(EQUIP) // set "on" to the power status
if(!on)
icon_state = "intercom-p"
diff --git a/code/game/objects/window.dm b/code/game/objects/window.dm
index 34c42f24bb7..a022f63f137 100644
--- a/code/game/objects/window.dm
+++ b/code/game/objects/window.dm
@@ -224,9 +224,11 @@
playsound(src.loc, 'Crowbar.ogg', 75, 1)
user << (state ? "You have pried the window into the frame." : "You have pried the window out of the frame.")
else
+
var/aforce = W.force
if(reinf) aforce /= 2.0
- src.health = max(0, src.health - aforce)
+ if(W.damtype == BRUTE || W.damtype == BURN)
+ src.health = max(0, src.health - aforce)
playsound(src.loc, 'Glasshit.ogg', 75, 1)
if (src.health <= 7)
src.anchored = 0
diff --git a/code/game/syndicate_specops_shuttle.dm b/code/game/syndicate_specops_shuttle.dm
index 8dbfb79ba2a..15b9456c8c5 100644
--- a/code/game/syndicate_specops_shuttle.dm
+++ b/code/game/syndicate_specops_shuttle.dm
@@ -243,7 +243,7 @@ var/syndicate_elite_shuttle_timeleft = 0
elite_squad.readyalert()//Trigger alarm for the spec ops area.
syndicate_elite_shuttle_moving_to_station = 1
- syndicate_elite_shuttle_time = world.timeofday
+ syndicate_elite_shuttle_time = world.timeofday + SYNDICATE_ELITE_MOVETIME
spawn(0)
syndicate_elite_process()
diff --git a/code/game/turf.dm b/code/game/turf.dm
index effb872f879..ca8444f4415 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -1283,58 +1283,46 @@ turf/simulated/floor/return_siding_icon_state()
// Okay, so let's make it so that people can travel z levels but not nuke disks!
// if(ticker.mode.name == "nuclear emergency") return
+ if (src.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || src.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
+ if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
+ del(A)
+ return
+ if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level.
+ del(A) //The disk's Del() proc ensures a new one is created
+ return
- if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels
- return
+ if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear)))
+ if(istype(A, /mob/living))
+ var/mob/living/MM = A
+ if(MM.client)
+ MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
+ return
-// else if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") Sandbox_Spacemove(A)
+ var/move_to_z_str = pickweight(accessable_z_levels)
- else
- if (src.x <= 2 || A.x >= (world.maxx - 1) || src.y <= 2 || A.y >= (world.maxy - 1))
- if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
- del(A)
- return
+ var/move_to_z = text2num(move_to_z_str)
- if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear)))
- if(istype(A, /mob/living))
- var/mob/living/MM = A
- if(MM.client)
- MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
- return
+ if(!move_to_z)
+ return
+ A.z = move_to_z
+ if(src.x <= TRANSITIONEDGE)
+ A.x = world.maxx - TRANSITIONEDGE - 2
- var/move_to_z_str = pickweight(accessable_z_levels)
+ else if (A.x >= (world.maxx - TRANSITIONEDGE - 1))
+ A.x = TRANSITIONEDGE + 1
- var/move_to_z = text2num(move_to_z_str)
+ else if (src.y <= TRANSITIONEDGE)
+ A.y = world.maxy - TRANSITIONEDGE -2
- if(!move_to_z)
- return
+ else if (A.y >= (world.maxy - TRANSITIONEDGE - 1))
+ A.y = TRANSITIONEDGE +1
-
-
- A.z = move_to_z
-
-
- if(src.x <= 2)
- A.x = world.maxx - 2
-
- else if (A.x >= (world.maxx - 1))
- A.x = 3
-
- else if (src.y <= 2)
- A.y = world.maxy - 2
-
- else if (A.y >= (world.maxy - 1))
- A.y = 3
-
- spawn (0)
- if ((A && A.loc))
- A.loc.Entered(A)
-
-// if(istype(A, /obj/structure/closet/coffin))
-// coffinhandler.Add(A)
+ spawn (0)
+ if ((A && A.loc))
+ A.loc.Entered(A)
/*
/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj)
var/cur_x
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index c330f574512..82149e232d1 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -195,6 +195,7 @@
verbs += /client/proc/spawn_xeno
verbs += /client/proc/toggleprayers
verbs += /client/proc/deadmin_self
+ verbs += /client/proc/tension_report
verbs += /proc/possess
verbs += /proc/release
verbs += /client/proc/admin_deny_shuttle
@@ -229,7 +230,6 @@
//verbs += /proc/togglebuildmode --Merged with view variables
//verbs += /client/proc/cmd_modify_object_variables --Merged with view variables
verbs += /client/proc/togglebuildmodeself
- verbs += /client/proc/tension_report
verbs += /client/proc/toggleadminhelpsound
else return
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 69ffc12b836..47e61313879 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -17,6 +17,7 @@
M << "\blue \icon[cross] PRAY: [key_name(src, M)] (PP) (VV) (SM) (JMP) (CA): [msg]"
usr << "Your prayers have been received by the gods."
+ //feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
diff --git a/code/modules/chemical/Chemistry-Machinery.dm b/code/modules/chemical/Chemistry-Machinery.dm
index 57eb90fbeac..2e31bce08f2 100644
--- a/code/modules/chemical/Chemistry-Machinery.dm
+++ b/code/modules/chemical/Chemistry-Machinery.dm
@@ -462,23 +462,23 @@
if (href_list["create_vaccine"])
if(!src.wait)
var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- var/vaccine_type = text2path(href_list["create_vaccine"])//the path is received as string - converting
- var/datum/disease/D = new vaccine_type
- var/name = input(usr,"Name:","Name the vaccine",D.name)
- if(!name || name == " ") name = D.name
- B.name = "[name] vaccine bottle"
- B.reagents.add_reagent("vaccine",15,vaccine_type)
- del(D)
- wait = 1
- var/datum/reagents/R = beaker.reagents
- var/datum/reagent/blood/Blood = null
- for(var/datum/reagent/blood/L in R.reagent_list)
- if(L)
- Blood = L
- break
- var/list/res = Blood.data["resistances"]
- spawn(res.len*500)
- src.wait = null
+ if(B)
+ var/vaccine_type = text2path(href_list["create_vaccine"])//the path is received as string - converting
+ var/datum/disease/D = new vaccine_type
+ if(D)
+ B.name = "[D.name] vaccine bottle"
+ B.reagents.add_reagent("vaccine",15,vaccine_type)
+ del(D)
+ wait = 1
+ var/datum/reagents/R = beaker.reagents
+ var/datum/reagent/blood/Blood = null
+ for(var/datum/reagent/blood/L in R.reagent_list)
+ if(L)
+ Blood = L
+ break
+ var/list/res = Blood.data["resistances"]
+ spawn(res.len*500)
+ src.wait = null
else
src.temphtml = "The replicator is not ready yet."
src.updateUsrDialog()
diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm
index b78486260f6..0ecef3b724f 100644
--- a/code/modules/chemical/Chemistry-Recipes.dm
+++ b/code/modules/chemical/Chemistry-Recipes.dm
@@ -759,13 +759,14 @@ datum
if(M:eyecheck() <= 0)
flick("e_flash", M.flash)
- for(var/i = 1, i <= created_volume, i++)
+ for(var/i = 1, i <= created_volume + rand(1,2), i++)
var/chosen = pick(borks)
var/obj/B = new chosen
- B.loc = get_turf_loc(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
+ if(B)
+ B.loc = get_turf_loc(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 9fac994c5f5..a2f976ea90e 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -6,6 +6,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
/obj/item/clothing/suit/storage/wcoat
name = "waistcoat"
desc = "The height of class."
@@ -13,6 +14,24 @@
item_state = "wcoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
+
+
+/obj/item/clothing/suit/bluetag
+ name = "blue laser tag armour"
+ desc = "Blue Pride, Station Wide"
+ icon_state = "bluetag"
+ item_state = "bluetag"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
+/obj/item/clothing/suit/redtag
+ name = "red laser tag armour"
+ desc = "Pew pew pew"
+ icon_state = "redtag"
+ item_state = "redtag"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
+
/obj/item/clothing/suit/storage/apron
name = "apron"
desc = "A basic blue apron. It has a large pocket you can store things in."
@@ -21,6 +40,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list (/obj/item/weapon/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/nutrient,/obj/item/weapon/minihoe)
+
/obj/item/clothing/suit/storage/chef
name = "chef's apron"
desc = "An apron used by a high class chef. Has a few pockets for nic-naks."
@@ -33,6 +53,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list (/obj/item/weapon/kitchenknife,/obj/item/weapon/butch)
+
/obj/item/clothing/suit/storage/chef/classic
name = "classic chef's apron"
desc = "A basic, dull, white chef's apron."
@@ -40,18 +61,21 @@
item_state = "apronchef"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+
/obj/item/clothing/suit/hazardvest
name = "hazard vest"
desc = "A high-visibility vest used in work zones."
icon_state = "hazard"
item_state = "hazard"
+
/obj/item/clothing/suit/suspenders
name = "suspenders"
desc = "They suspend the illusion of the mime's play."
icon = 'belts.dmi'
icon_state = "suspenders"
+
/obj/item/clothing/suit/syndicatefake
name = "red space suit replica"
icon_state = "syndicate"
@@ -62,6 +86,7 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
/obj/item/clothing/suit/storage/captunic
name = "captain's parade tunic"
desc = "Worn by a Captain to show their class."
@@ -70,6 +95,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
+
/obj/item/clothing/suit/nun
name = "nun robe"
desc = "Maximum piety in this star system."
@@ -92,14 +118,16 @@
item_state = "chaplain_hoodie"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+
/obj/item/clothing/suit/hastur
- name = "Hastur's robes"
+ name = "\improper Hastur's robes"
desc = "Robes not meant to be worn by man"
icon_state = "hastur"
item_state = "hastur"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
/obj/item/clothing/suit/imperium_monk
name = "imperium monk robes"
desc = "A set of strange robes."
@@ -108,6 +136,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDESHOES|HIDEJUMPSUIT
+
/obj/item/clothing/suit/chickensuit
name = "chicken suit"
desc = "Bwak!"
@@ -116,6 +145,7 @@
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HEAD
flags_inv = HIDESHOES|HIDEJUMPSUIT
+
/obj/item/clothing/suit/monkeysuit
name = "monkey suit"
desc = "A suit that looks like a primate"
@@ -124,6 +154,7 @@
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
/obj/item/clothing/suit/holidaypriest
name = "holiday priest"
desc = "This is a nice holiday my son."
@@ -131,6 +162,8 @@
item_state = "holidaypriest"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
+
// BubbleWrap - Nothing to see here
/obj/item/clothing/suit/cardborg
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 28cde78ffcf..806a37dd8ff 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -44,6 +44,36 @@ proc/move_mining_shuttle()
else
fromArea = locate(/area/shuttle/mining/station)
toArea = locate(/area/shuttle/mining/outpost)
+
+
+ var/list/dstturfs = list()
+ var/throwy = world.maxy
+
+ for(var/turf/T in toArea)
+ dstturfs += T
+ if(T.y < throwy)
+ throwy = T.y
+
+ // hey you, get out of the way!
+ for(var/turf/T in dstturfs)
+ // find the turf to move things to
+ var/turf/D = locate(T.x, throwy - 1, 1)
+ //var/turf/E = get_step(D, SOUTH)
+ for(var/atom/movable/AM as mob|obj in T)
+ AM.Move(D)
+ // NOTE: Commenting this out to avoid recreating mass driver glitch
+ /*
+ spawn(0)
+ AM.throw_at(E, 1, 1)
+ return
+ */
+
+ if(istype(T, /turf/simulated))
+ del(T)
+
+ for(var/mob/living/carbon/bug in toArea) // If someone somehow is still in the shuttle's docking area...
+ bug.gib()
+
fromArea.move_contents_to(toArea)
if (mining_shuttle_location)
mining_shuttle_location = 0
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index b50b0eb84ee..4ca82ab7435 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -193,11 +193,13 @@
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
+
if(halloss > 0)
if(prob(30))
brutedamage += halloss
if(prob(30))
burndamage += halloss
+
if(brutedamage > 0)
status = "bruised"
if(brutedamage > 20)
@@ -208,6 +210,7 @@
status += " and "
if(burndamage > 40)
status += "peeling away"
+
else if(burndamage > 10)
status += "blistered"
else if(burndamage > 0)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index e1d2364f92e..024bb726c99 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -180,14 +180,14 @@
distance = 1
if (src.stat == 1 || stat == 2)
- msg += "[name] doesn't seem to be responding to anything around [t_him], [t_his] eyes closed as though asleep.\n"
+ msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n"
if((!isbreathing || holdbreath) && distance <= 3)
- msg += "[name] does not appear to be breathing.\n"
+ msg += "[t_He] does not appear to be breathing.\n"
if(istype(usr, /mob/living/carbon/human) && usr.stat == 0 && src.stat == 1 && distance <= 1)
for(var/mob/O in viewers(usr.loc, null))
O.show_message("[usr] checks [src]'s pulse.", 1)
spawn(15)
- usr << "\blue [name] has a pulse!"
+ usr << "\blue [t_He] has a pulse!"
if (src.stat == 2 || (changeling && changeling.changeling_fakedeath == 1))
if(distance <= 1)
@@ -195,7 +195,19 @@
for(var/mob/O in viewers(usr.loc, null))
O.show_message("[usr] checks [src]'s pulse.", 1)
spawn(15)
- usr << "\red [name] has no pulse!"
+ if(!src.client)
+ var/foundghost = 0
+ for(var/mob/dead/observer/G in world)
+ if(G.client)
+ if(G.corpse == src)
+ foundghost++
+ break
+ if(!foundghost)
+ usr << "[t_He] has no pulse and [t_his] soul has departed..."
+ else
+ usr << "[t_He] has no pulse..."
+
+ msg += ""
/* if (src.getBruteLoss())
if (src.getBruteLoss() < 30)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 7d434f659a5..0340f2a925e 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -32,6 +32,30 @@
visible_message("\red [src] has been touched with the stun gloves by [M]!")
return
+ if(istype(M.gloves , /obj/item/clothing/gloves/boxing/hologlove))
+
+ var/damage = rand(0, 9)
+ if(!damage)
+ playsound(loc, 'punchmiss.ogg', 25, 1, -1)
+ visible_message("\red [M] has attempted to punch [src]!")
+ return 0
+ var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
+ var/armor_block = run_armor_check(affecting, "melee")
+
+ if(M.mutations & HULK) damage += 5
+ playsound(loc, "punch", 25, 1, -1)
+
+ visible_message("\red [M] has punched [src]!")
+
+ apply_damage(damage, HALLOSS, affecting, armor_block)
+ if(damage >= 9)
+ visible_message("\red [M] has weakened [src]!")
+ apply_effect(4, WEAKEN, armor_block)
+ UpdateDamageIcon()
+
+ return
+
+
switch(M.a_intent)
if("help")
if(health > 0)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index f88b78787d1..4b96f26273a 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -143,7 +143,7 @@ emp_act
apply_damage(power, I.damtype, affecting, armor, is_cut(I), I.name)
var/bloody = 0
- if((I.damtype == BRUTE) && prob(25 + is_sharp(I) * 50 + (I.force * 2)))
+ if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + is_sharp(I) * 50 + (I.force * 2)))
I.add_blood(src) //Make the weapon bloody, not the person.
bloody = 1
var/turf/location = loc
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 58f3628941e..aa4c7e09b35 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -186,15 +186,24 @@
// a.hallucinate(src)
if(!handling_hal && hallucination > 20)
spawn handle_hallucinations() //The not boring kind!
- hallucination = max(hallucination - 2, 0)
+ hallucination = max(hallucination - 2, 0)
//if(health < 0)
// for(var/obj/a in hallucinations)
// del a
else
- halloss = 0
+ //halloss = 0
for(var/atom/a in hallucinations)
del a
+ if(halloss > 100)
+ src << "You're too tired to keep going..."
+ for(var/mob/O in viewers(src, null))
+ if(O == src)
+ continue
+ O.show_message(text("\red [src] slumps to the ground panting, too weak to continue fighting."), 1)
+ Paralyse(15)
+ setHalLoss(99)
+
if(mutations2 & mSmallsize)
if(!(pass_flags & PASSTABLE))
pass_flags |= PASSTABLE
@@ -927,7 +936,7 @@
if(getOxyLoss() > 50) Paralyse(3)
if(sleeping)
-// adjustHalLoss(-5)
+ adjustHalLoss(-5)
if(paralysis <= 0)
Paralyse(2)
if (prob(10) && health && !hal_crit) spawn(0) emote("snore")
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index d7bca333688..f53ca6f66f0 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -3,7 +3,7 @@
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/proc/updateshock()
- src.traumatic_shock = src.getOxyLoss() + src.getToxLoss() + src.getFireLoss() + 1.2*src.getBruteLoss() + 2*src.getCloneLoss()
+ src.traumatic_shock = src.getOxyLoss() + src.getToxLoss() + src.getFireLoss() + 1.2*src.getBruteLoss() + 2*src.getCloneLoss() + src.halloss
if(reagents.has_reagent("alkysine"))
src.traumatic_shock -= 10
if(reagents.has_reagent("inaprovaline"))
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index b1778089a8c..78e4257cf86 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -22,18 +22,21 @@
adjustOxyLoss(damage/(blocked+1))
if(CLONE)
adjustCloneLoss(damage/(blocked+1))
+ if(HALLOSS)
+ adjustHalLoss(damage/(blocked+1))
UpdateDamageIcon()
updatehealth()
return 1
-/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0)
+/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/halloss = 0)
if(blocked >= 2) return 0
if(brute) apply_damage(brute, BRUTE, def_zone, blocked)
if(burn) apply_damage(burn, BURN, def_zone, blocked)
if(tox) apply_damage(tox, TOX, def_zone, blocked)
if(oxy) apply_damage(oxy, OXY, def_zone, blocked)
if(clone) apply_damage(clone, CLONE, def_zone, blocked)
+ if(halloss) apply_damage(halloss, HALLOSS, def_zone, blocked)
return 1
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4a1104141b6..be090aaa13f 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1102,7 +1102,26 @@ Frequency:
. = ..()
if ((s_active && !( s_active in contents ) ))
s_active.close(src)
- return
+
+ if(module)
+ if(module.type == /obj/item/weapon/robot_module/janitor) //you'd think checking the module would work
+ var/turf/tile = get_turf(loc)
+
+ tile.clean_blood()
+ for(var/obj/effect/R in tile)
+ if(istype(R, /obj/effect/rune) || istype(R, /obj/effect/decal/cleanable) || istype(R, /obj/effect/overlay))
+ del(R)
+
+ for(var/obj/item/cleaned_item in tile)
+ cleaned_item.clean_blood()
+
+ for(var/mob/living/carbon/human/cleaned_human in tile) //HUE HUE I CLEAN U
+ if(cleaned_human.lying)
+ cleaned_human.clean_blood()
+ cleaned_human << "\red [src] cleans your face!"
+ for(var/obj/item/carried_item in cleaned_human.contents)
+ carried_item.clean_blood()
+ return
/mob/living/silicon/robot/proc/reset_module()
modtype = "robot"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index ffe76a3b76c..ae36d76944c 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -163,9 +163,7 @@
New()
..()
- src.modules += new /obj/item/weapon/cleaner(src)
- src.modules += new /obj/item/weapon/mop(src)
- src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
+ src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/trashbag(src)
src.emag = new /obj/item/weapon/cleaner(src)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index fa15f854fdf..9ac8ee68130 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1149,3 +1149,66 @@ note dizziness decrements automatically in the mob's Life() proc.
/mob/proc/AdjustParalysis(amount)
paralysis = max(paralysis + amount,0)
return
+
+// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching
+
+/mob/proc/getBruteLoss()
+ return bruteloss
+
+/mob/proc/adjustBruteLoss(var/amount)
+ bruteloss = max(bruteloss + amount, 0)
+
+/mob/proc/getOxyLoss()
+ return oxyloss
+
+/mob/proc/adjustOxyLoss(var/amount)
+ oxyloss = max(oxyloss + amount, 0)
+
+/mob/proc/setOxyLoss(var/amount)
+ oxyloss = amount
+
+/mob/proc/getToxLoss()
+ return toxloss
+
+/mob/proc/adjustToxLoss(var/amount)
+ toxloss = max(toxloss + amount, 0)
+
+/mob/proc/setToxLoss(var/amount)
+ toxloss = amount
+
+/mob/proc/getFireLoss()
+ return fireloss
+
+/mob/proc/adjustFireLoss(var/amount)
+ fireloss = max(fireloss + amount, 0)
+
+/mob/proc/getCloneLoss()
+ return cloneloss
+
+/mob/proc/adjustCloneLoss(var/amount)
+ cloneloss = max(cloneloss + amount, 0)
+
+/mob/proc/setCloneLoss(var/amount)
+ cloneloss = amount
+
+/mob/proc/getHalLoss()
+ return halloss
+
+/mob/proc/adjustHalLoss(var/amount)
+ halloss = max(halloss + amount, 0)
+
+/mob/proc/setHalLoss(var/amount)
+ halloss = amount
+
+
+
+/mob/proc/getBrainLoss()
+ return brainloss
+
+/mob/proc/adjustBrainLoss(var/amount)
+ brainloss = max(brainloss + amount, 0)
+
+/mob/proc/setBrainLoss(var/amount)
+ brainloss = amount
+
+// ++++ROCKDTBEN++++ MOB PROCS //END
\ No newline at end of file
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 1da6a25f4f3..a727014738f 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -288,58 +288,3 @@ the mob is also allowed to move without any sort of restriction. For instance, i
//Singularity wants you!
var/grav_delay = 0
var/being_strangled = 0
-
-
-
-// ++++ROCKDTBEN++++ MOB PROCS
-
-/mob/proc/getBruteLoss()
- return bruteloss
-
-/mob/proc/adjustBruteLoss(var/amount)
- bruteloss = max(bruteloss + amount, 0)
-
-/mob/proc/getOxyLoss()
- return oxyloss
-
-/mob/proc/adjustOxyLoss(var/amount)
- oxyloss = max(oxyloss + amount, 0)
-
-/mob/proc/setOxyLoss(var/amount)
- oxyloss = amount
-
-/mob/proc/getToxLoss()
- return toxloss
-
-/mob/proc/adjustToxLoss(var/amount)
- toxloss = max(toxloss + amount, 0)
-
-/mob/proc/setToxLoss(var/amount)
- toxloss = amount
-
-/mob/proc/getFireLoss()
- return fireloss
-
-/mob/proc/adjustFireLoss(var/amount)
- fireloss = max(fireloss + amount, 0)
-
-/mob/proc/getCloneLoss()
- return cloneloss
-
-/mob/proc/adjustCloneLoss(var/amount)
- cloneloss = max(cloneloss + amount, 0)
-
-/mob/proc/setCloneLoss(var/amount)
- cloneloss = amount
-
-/mob/proc/getBrainLoss()
- return brainloss
-
-/mob/proc/adjustBrainLoss(var/amount)
- brainloss = max(brainloss + amount, 0)
-
-/mob/proc/setBrainLoss(var/amount)
- brainloss = amount
-
-// ++++ROCKDTBEN++++ MOB PROCS //END
-
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 94b761882b4..8a4514cfee7 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -14,6 +14,7 @@
last_power = 0
active = 0
locked = 0
+ drainratio = 1
process()
if(P)
@@ -21,7 +22,7 @@
P.air_contents.toxins = 0
eject()
else
- P.air_contents.toxins -= 0.001
+ P.air_contents.toxins -= 0.001*drainratio
return
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index c6acb29eb54..1377d5934d9 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -76,7 +76,8 @@ field_generator power level display
power = field_generator_max_power
anchored = 1
warming_up = 3
- turn_on()
+ start_fields()
+ update_icon()
Varedit_start = 0
if(src.active == 2)
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 2e86e4fea35..2233b41d551 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/gun/energy/laser
- name = "\improper Laser Gun"
+ name = "laser gun"
desc = "a basic weapon designed kill with concentrated energy bolts"
icon_state = "laser"
item_state = "laser"
@@ -17,7 +17,7 @@
obj/item/weapon/gun/energy/laser/retro
- name ="\improper Retro Laser"
+ name ="retro laser"
icon_state = "retro"
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws."
@@ -68,9 +68,84 @@ obj/item/weapon/gun/energy/laser/retro
/obj/item/weapon/gun/energy/lasercannon
- name = "\improper Laser Cannon"
+ name = "laser cannon"
desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
icon_state = "lasercannon"
fire_sound = 'lasercannonfire.ogg'
origin_tech = "combat=4;materials=3;powerstorage=3"
projectile_type = "/obj/item/projectile/beam/heavylaser"
+
+
+
+
+
+////////Laser Tag////////////////////
+
+/obj/item/weapon/gun/energy/laser/bluetag
+ name = "laser tag gun"
+ icon_state = "bluetag"
+ desc = "Standard issue weapon of the Imperial Guard"
+ projectile_type = "/obj/item/projectile/bluetag"
+
+ special_check(var/mob/living/carbon/human/M)
+ if(ishuman(M))
+ if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
+ return 1
+ M << "\red You need to be wearing your laser tag vest!"
+ return 0
+ var/charge_tick = 0
+
+
+ New()
+ ..()
+ processing_objects.Add(src)
+
+
+ Del()
+ processing_objects.Remove(src)
+ ..()
+
+
+ process()
+ charge_tick++
+ if(charge_tick < 4) return 0
+ charge_tick = 0
+ if(!power_supply) return 0
+ power_supply.give(100)
+ update_icon()
+ return 1
+
+
+
+/obj/item/weapon/gun/energy/laser/redtag
+ name = "laser tag gun"
+ icon_state = "redtag"
+ desc = "Standard issue weapon of the Imperial Guard"
+ projectile_type = "/obj/item/projectile/redtag"
+ var/charge_tick = 0
+
+ special_check(var/mob/living/carbon/human/M)
+ if(ishuman(M))
+ if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
+ return 1
+ M << "\red You need to be wearing your laser tag vest!"
+ return 0
+
+ New()
+ ..()
+ processing_objects.Add(src)
+
+
+ Del()
+ processing_objects.Remove(src)
+ ..()
+
+
+ process()
+ charge_tick++
+ if(charge_tick < 4) return 0
+ charge_tick = 0
+ if(!power_supply) return 0
+ power_supply.give(100)
+ update_icon()
+ return 1
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d9606bcd987..12e0ca517df 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -1,5 +1,5 @@
/obj/item/projectile/beam
- name = "\improper Laser"
+ name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 40
@@ -56,20 +56,21 @@
flag = "laser"
eyeblur = 2
+
/obj/item/projectile/beam/heavylaser
- name = "\improper Heavy Laser"
+ name = "heavy laser"
icon_state = "heavylaser"
damage = 60
/obj/item/projectile/beam/pulse
- name = "\improper Pulse"
+ name = "pulse"
icon_state = "u_laser"
damage = 40
/obj/item/projectile/beam/deathlaser
- name = "\improper Death Laser"
+ name = "death laser"
icon_state = "heavylaser"
damage = 60
@@ -79,4 +80,32 @@
+/obj/item/projectile/bluetag
+ name = "lasertag beam"
+ icon_state = "ice_2"
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+ damage = 0
+ damage_type = BURN
+ flag = "laser"
+ on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
+ M.Weaken(5)
+ return 1
+
+/obj/item/projectile/redtag
+ name = "lasertag beam"
+ icon_state = "laser"
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+ damage = 0
+ damage_type = BURN
+ flag = "laser"
+
+ on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
+ M.Weaken(5)
+ return 1
\ No newline at end of file
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 027e9afecab..15135220b22 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -511,7 +511,7 @@
for (var/mob/V in viewers(usr))
V.show_message("[user] dunks [GM.name] into the toilet!", 3)
if(do_after(user, 30))
- if(G.state>1&&!GM.internal)
+ if(G && G.state>1 && !GM.internal)
GM.oxyloss += 5
else if(I.w_class < 4)
diff --git a/code/setup.dm b/code/setup.dm
index 3d174db55fd..c3e5a03ce55 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -281,3 +281,5 @@ var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','h
#define SEC_LEVEL_BLUE 1
#define SEC_LEVEL_RED 2
#define SEC_LEVEL_DELTA 3
+
+#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
\ No newline at end of file
diff --git a/code/unused/_debug.dm b/code/unused/_debug.dm
index b9cbcdf4306..ced557f197e 100644
--- a/code/unused/_debug.dm
+++ b/code/unused/_debug.dm
@@ -615,3 +615,5 @@ Doing this because FindTurfs() isn't even used
playsound(pt.loc, 'explosionfar.ogg', 100, 1,10)
pt.gas.temperature = 500+T0C
pt.ignite()
+
+
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index 9aa23ca974b..14e84d67326 100644
Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
index 30f36441a35..a35fc84e968 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/mob/livestock.dmi b/icons/mob/livestock.dmi
index d8a5fd79f0f..d83b8209668 100644
Binary files a/icons/mob/livestock.dmi and b/icons/mob/livestock.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 6502aeaa3f6..1f503ac05c8 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi
index 9b34ebfb4ad..6405a1e47dd 100644
Binary files a/icons/obj/harvest.dmi and b/icons/obj/harvest.dmi differ
diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi
index aa5a3613af4..e8d9ae4daf9 100644
Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ
diff --git a/sound/effects/glassknock.ogg b/sound/effects/glassknock.ogg
index efdb198fd39..8878dda8013 100644
Binary files a/sound/effects/glassknock.ogg and b/sound/effects/glassknock.ogg differ