diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 916a750b35..c5b1c7de61 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -11,6 +11,7 @@ var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacon
var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons.
var/global/list/nuke_list = list()
var/global/list/alarmdisplay = list() //list of all machines or programs that can display station alerts
+var/global/list/singularities = list() //list of all singularities on the station (actually technically all engines)
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 82726f0598..232fe649e6 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -42,9 +42,10 @@
if(istype(loc, /obj/item/device/aicard) && (pixel_turf in view(client.view, loc)))
turf_visible = TRUE
else
- log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
- message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
- send2irc("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
+ if (pixel_turf.obscured)
+ log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
+ message_admins("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))")
+ send2irc_adminless_only("NOCHEAT", "[key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
return
var/list/modifiers = params2list(params)
diff --git a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
index 8b65392a7c..6f446616b4 100644
--- a/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures/ratvar_the_clockwork_justicar.dm
@@ -62,7 +62,7 @@
T.ratvar_act(1)
var/dir_to_step_in = pick(cardinal)
if(!prey)
- for(var/obj/singularity/narsie/N in poi_list)
+ for(var/obj/singularity/narsie/N in singularities)
if(N.z == z)
prey = N
break
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index ca15b73251..04a0d618c1 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -34,7 +34,7 @@
user << "An overwhelming sense of nausea overpowers you!"
user.Dizzy(120)
else
- user << "\"One of Ratvar's toys is trying to play with things [user.gender == FEMALE ? "s" : ""]he shouldn't. Cute.\""
+ user << "\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\""
user << "A horrible force yanks at your arm!"
user.emote("scream")
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 822d4e92fa..8d4a484d99 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -22,6 +22,7 @@
/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
if(istype(M, /mob/living/simple_animal/hostile/construct/builder))
if(obj_integrity < max_integrity)
+ M.changeNext_move(CLICK_CD_MELEE)
obj_integrity = min(max_integrity, obj_integrity + 5)
Beam(M, icon_state="sendbeam", time=4)
M.visible_message("[M] repairs \the [src].", \
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 1f0cb9122b..d85e2066eb 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -35,6 +35,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/stat_msg1
var/stat_msg2
+/obj/machinery/computer/communications/proc/checkCCcooldown()
+ var/obj/item/weapon/circuitboard/computer/communications/CM = circuit
+ if(CM.lastTimeUsed + 600 > world.time)
+ return FALSE
+ return TRUE
/obj/machinery/computer/communications/New()
shuttle_caller_list += src
@@ -264,11 +269,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
// OMG CENTCOM LETTERHEAD
if("MessageCentcomm")
if(src.authenticated==2)
- if(CM.lastTimeUsed + 600 > world.time)
+ if(!checkCCcooldown())
usr << "Arrays recycling. Please stand by."
return
var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to Centcomm.", "")
- if(!input || !(usr in view(1,src)))
+ if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
Centcomm_announce(input, usr)
@@ -280,12 +285,12 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
// OMG SYNDICATE ...LETTERHEAD
if("MessageSyndicate")
if((src.authenticated==2) && (src.emagged))
- if(CM.lastTimeUsed + 600 > world.time)
+ if(!checkCCcooldown())
usr << "Arrays recycling. Please stand by."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
return
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING COORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to /??????/.", "")
- if(!input || !(usr in view(1,src)))
+ if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
Syndicate_announce(input, usr)
@@ -301,11 +306,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if("nukerequest") //When there's no other way
if(src.authenticated==2)
- if(CM.lastTimeUsed + 600 > world.time)
+ if(!checkCCcooldown())
usr << "Arrays recycling. Please stand by."
return
var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","")
- if(!input || !(usr in view(1,src)))
+ if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
Nuke_request(input, usr)
usr << "Request sent."
@@ -687,4 +692,4 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications/proc/overrideCooldown()
var/obj/item/weapon/circuitboard/computer/communications/CM = circuit
- CM.lastTimeUsed = 0
+ CM.lastTimeUsed = 0
\ No newline at end of file
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index fca58c4a08..99b44016ad 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -11,6 +11,8 @@
density = 1
layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS
stat = 0
+ verb_say = "states"
+ var/cooldown = 0
var/active = 0
var/icontype = "beacon"
@@ -20,18 +22,17 @@
if(surplus() < 1500)
if(user) user << "The connected wire doesn't have enough current."
return
- for(var/obj/singularity/singulo in world)
+ for(var/obj/singularity/singulo in singularities)
if(singulo.z == z)
singulo.target = src
icon_state = "[icontype]1"
active = 1
- machines |= src
if(user)
user << "You activate the beacon."
/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null)
- for(var/obj/singularity/singulo in world)
+ for(var/obj/singularity/singulo in singularities)
if(singulo.target == src)
singulo.target = null
icon_state = "[icontype]0"
@@ -81,12 +82,18 @@
//stealth direct power usage
/obj/machinery/power/singularity_beacon/process()
if(!active)
- return PROCESS_KILL
+ return
+
+ if(surplus() > 1500)
+ add_load(1500)
+ if(cooldown <= world.time)
+ cooldown = world.time + 100
+ for(var/obj/singularity/singulo in singularities)
+ if(singulo.z == z)
+ say("The [singulo] is now [get_dist(src,singulo)] standard lengths away to the [dir2text(get_dir(src,singulo))]")
else
- if(surplus() > 1500)
- add_load(1500)
- else
- Deactivate()
+ Deactivate()
+ say("Insufficient charge detected - powering down")
/obj/machinery/power/singularity_beacon/syndicate
@@ -120,4 +127,4 @@
/obj/item/device/sbeacondrop/powersink
desc = "A label on it reads: Warning: Activating this device will send a power draining device to your location."
droptype = /obj/item/device/powersink
- origin_tech = "bluespace=4;syndicate=5"
+ origin_tech = "bluespace=4;syndicate=5"
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 763031cdd8..eaef9c6809 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -156,10 +156,7 @@
//BubbleWrap END
if (src && usr.machine==src) //do not reopen closed window
- spawn( 0 )
- src.interact(usr)
- return
- return
+ addtimer(CALLBACK(src, /atom/.proc/interact, usr), 0)
/obj/item/stack/proc/building_checks(datum/stack_recipe/R, multiplier)
if (src.get_amount() < R.req_amount*multiplier)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index ab41b3f511..f9c722cb3f 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -147,7 +147,7 @@
/obj/item/weapon/storage/box/masks
name = "box of sterile masks"
desc = "This box contains sterile medical masks."
- icon_state = "sterile"
+ illustration = "sterile"
/obj/item/weapon/storage/box/masks/New()
..()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 2f6e5db066..72d8e3987b 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -520,6 +520,7 @@
/obj/structure/sink/puddle //splishy splashy ^_^
name = "puddle"
+ desc = "A puddle used for washing one's hands and face."
icon_state = "puddle"
/obj/structure/sink/puddle/attack_hand(mob/M)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index c0190a0fb2..a2df985f7a 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -18,7 +18,7 @@
/turf/open/space/Initialize()
icon_state = SPACE_ICON_STATE
air = space_gas
-
+
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
@@ -60,9 +60,11 @@
/turf/open/space/attack_paw(mob/user)
return src.attack_hand(user)
-/turf/open/space/attackby(obj/item/C, mob/user, params)
+/turf/open/space/attackby(obj/item/C, mob/user, area_restriction)
..()
if(istype(C, /obj/item/stack/rods))
+ if(area_restriction && !istype(get_area(src), area_restriction))
+ return
var/obj/item/stack/rods/R = C
var/obj/structure/lattice/L = locate(/obj/structure/lattice, src)
var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src)
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index dd772aa1ac..e2ca23365b 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -57,9 +57,9 @@
AM.loc = T
AM.newtonian_move(dir)
-//Overwrite because we dont want people building rods in space.
-/turf/open/space/transit/attackby()
- return
+//Overwrite because we dont want people building rods
+/turf/open/space/transit/attackby(obj/item/C, mob/user)
+ ..(C, user, /area/shuttle)
/turf/open/space/transit/Initialize()
..()
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index 8070a9e58b..d2e50a084c 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -35,7 +35,7 @@
usr << "Bad map file: [map]"
return
- var/datum/map_template/M = new(map=map, rename="[map]")
+ var/datum/map_template/M = new(map, "[map]")
if(M.preload_size(map))
usr << "Map template '[map]' ready to place ([M.width]x[M.height])"
SSmapping.map_templates[M.name] = M
diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm
index b8bea629a1..3b7ef0674a 100644
--- a/code/modules/mining/aux_base.dm
+++ b/code/modules/mining/aux_base.dm
@@ -302,19 +302,16 @@ obj/docking_port/stationary/public_mining_dock/onShuttleMove()
if(!Mport)
user << "This station is not equipped with an approprite mining shuttle. Please contact Nanotrasen Support."
return
- var/search_radius = max(Mport.width, Mport.height)*0.5
- var/list/landing_areas = get_areas_in_range(search_radius, landing_spot)
- for(var/area/shuttle/auxillary_base/AB in landing_areas) //You land NEAR the base, not IN it.
- user << "The mining shuttle must not land within the mining base itself."
- SSshuttle.stationary.Remove(Mport)
- qdel(Mport)
- return
+
var/obj/docking_port/mobile/mining_shuttle
+ var/list/landing_turfs = list() //List of turfs where the mining shuttle may land.
for(var/S in SSshuttle.mobile)
var/obj/docking_port/mobile/MS = S
if(MS.id != "mining")
continue
mining_shuttle = MS
+ landing_turfs = mining_shuttle.return_ordered_turfs(x,y,z,dir)
+ break
if(!mining_shuttle) //Not having a mining shuttle is a map issue
user << "No mining shuttle signal detected. Please contact Nanotrasen Support."
@@ -322,6 +319,13 @@ obj/docking_port/stationary/public_mining_dock/onShuttleMove()
qdel(Mport)
return
+ for(var/L in landing_turfs) //You land NEAR the base, not IN it.
+ if(istype(get_area(L), /area/shuttle/auxillary_base))
+ user << "The mining shuttle must not land within the mining base itself."
+ SSshuttle.stationary.Remove(Mport)
+ qdel(Mport)
+ return
+
if(!mining_shuttle.canDock(Mport))
user << "Unable to secure a valid docking zone. Please try again in an open area near, but not within the aux. mining base."
SSshuttle.stationary.Remove(Mport)
@@ -331,7 +335,7 @@ obj/docking_port/stationary/public_mining_dock/onShuttleMove()
aux_base_console.set_mining_mode() //Lets the colony park the shuttle there, now that it has a dock.
user << "Mining shuttle calibration successful! Shuttle interface available at base console."
anchored = 1 //Locks in place to mark the landing zone.
- playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+ playsound(loc, 'sound/machines/ping.ogg', 50, 0)
/obj/structure/mining_shuttle_beacon/proc/clear_cooldown()
anti_spam_cd = 0
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index d444d7d8ca..8101587519 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -319,7 +319,7 @@ field_generator power level display
//I want to avoid using global variables.
spawn(1)
var/temp = 1 //stops spam
- for(var/obj/singularity/O in world)
+ for(var/obj/singularity/O in singularities)
if(O.last_warning && temp)
if((world.time - O.last_warning) > 50) //to stop message-spam
temp = 0
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 29ce8dc79d..b836d321ca 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -36,6 +36,7 @@
..()
START_PROCESSING(SSobj, src)
poi_list |= src
+ singularities |= src
for(var/obj/machinery/power/singularity_beacon/singubeacon in machines)
if(singubeacon.active)
target = singubeacon
@@ -45,6 +46,7 @@
/obj/singularity/Destroy()
STOP_PROCESSING(SSobj, src)
poi_list.Remove(src)
+ singularities.Remove(src)
return ..()
/obj/singularity/Move(atom/newloc, direct)
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index ba4798b5d7..83256a27d6 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -138,7 +138,6 @@
iconF = "flight_on"
add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
-
//Casing
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
@@ -152,17 +151,6 @@
var/obj/item/weapon/gun/energy/kinetic_accelerator/KA = loc
KA.modify_projectile(BB)
- var/turf/proj_turf = get_turf(BB)
- if(!isturf(proj_turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure > 50)
- BB.name = "weakened [BB.name]"
- var/obj/item/projectile/kinetic/K = BB
- K.damage *= K.pressure_decrease
-
-
//Projectiles
/obj/item/projectile/kinetic
name = "kinetic force"
@@ -178,6 +166,17 @@
var/mob_aoe = 0
var/list/hit_overlays = list()
+/obj/item/projectile/kinetic/prehit(atom/target)
+ var/turf/target_turf = get_turf(target)
+ if(!isturf(target_turf))
+ return
+ var/datum/gas_mixture/environment = target_turf.return_air()
+ var/pressure = environment.return_pressure()
+ if(pressure > 50)
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ . = ..()
+
/obj/item/projectile/kinetic/on_range()
strike_thing()
..()
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 5fb80efbdf..002112b717 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -119,7 +119,7 @@
name = "Alien Scalpel"
desc = "An advanced scalpel obtained through Abductor technology."
id = "alien_scalpel"
- req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
build_path = /obj/item/weapon/scalpel/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
@@ -129,7 +129,7 @@
name = "Alien Hemostat"
desc = "An advanced hemostat obtained through Abductor technology."
id = "alien_hemostat"
- req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
build_path = /obj/item/weapon/hemostat/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
@@ -139,7 +139,7 @@
name = "Alien Retractor"
desc = "An advanced retractor obtained through Abductor technology."
id = "alien_retractor"
- req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
build_path = /obj/item/weapon/retractor/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)
@@ -149,7 +149,7 @@
name = "Alien Circular Saw"
desc = "An advanced surgical saw obtained through Abductor technology."
id = "alien_saw"
- req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
build_path = /obj/item/weapon/circular_saw/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
@@ -159,7 +159,7 @@
name = "Alien Drill"
desc = "An advanced drill obtained through Abductor technology."
id = "alien_drill"
- req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
build_path = /obj/item/weapon/surgicaldrill/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_TITANIUM = 1500)
@@ -169,7 +169,7 @@
name = "Alien Cautery"
desc = "An advanced cautery obtained through Abductor technology."
id = "alien_cautery"
- req_tech = list("bio" = 4, "materials" = 4, "abductor" = 3)
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
build_path = /obj/item/weapon/cautery/alien
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_PLASMA = 500, MAT_TITANIUM = 1500)