From 19a3aca61950b18376b0efd4cf8d224e4926466a Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Tue, 10 Dec 2019 15:33:15 +0100
Subject: [PATCH 01/32] I fear for my powernet
---
code/__HELPERS/areas.dm | 131 ++++++++++++++++++
code/__HELPERS/game.dm | 4 +-
code/__HELPERS/unsorted.dm | 76 ----------
code/datums/components/virtual_reality.dm | 2 +-
code/datums/diseases/wizarditis.dm | 2 +-
code/datums/weather/weather.dm | 5 +-
code/datums/wires/airalarm.dm | 4 +-
code/game/area/Space_Station_13_areas.dm | 24 +++-
code/game/area/areas.dm | 105 ++++++++++----
code/game/gamemodes/events.dm | 5 +-
code/game/machinery/cell_charger.dm | 2 +-
code/game/machinery/doors/firedoor.dm | 2 +-
code/game/machinery/firealarm.dm | 14 +-
code/game/machinery/recharger.dm | 2 +-
.../game/mecha/equipment/tools/other_tools.dm | 4 +-
.../effects/effect_system/effects_foam.dm | 2 +-
code/game/objects/items/crayons.dm | 4 +-
code/game/objects/structures/ai_core.dm | 2 +-
code/game/objects/structures/displaycase.dm | 2 +-
code/modules/VR/vr_sleeper.dm | 27 ++--
code/modules/admin/verbs/debug.dm | 16 ++-
.../atmospherics/machinery/airalarm.dm | 20 +--
.../components/unary_devices/vent_pump.dm | 4 +-
.../components/unary_devices/vent_scrubber.dm | 4 +-
code/modules/mob/living/silicon/ai/life.dm | 10 +-
.../hostile/megafauna/colossus.dm | 58 ++++----
.../simple_animal/hostile/megafauna/legion.dm | 2 +-
code/modules/power/apc.dm | 80 +++++------
code/modules/power/lighting.dm | 4 +-
code/modules/power/power.dm | 3 +-
.../xenobiology/crossbreeding/consuming.dm | 2 +-
icons/turf/areas.dmi | Bin 38318 -> 38605 bytes
.../code/game/gamemodes/gangs/dominator.dm | 4 +-
.../code/game/gamemodes/gangs/gang_decals.dm | 4 +-
.../code/game/gamemodes/gangs/gang_items.dm | 2 +-
.../code/game/machinery/firealarm.dm | 2 +-
36 files changed, 386 insertions(+), 248 deletions(-)
diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm
index 1f5b82f7bf..316c159fb8 100644
--- a/code/__HELPERS/areas.dm
+++ b/code/__HELPERS/areas.dm
@@ -1,5 +1,81 @@
#define BP_MAX_ROOM_SIZE 300
+//Repopulates sortedAreas list
+/proc/repopulate_sorted_areas()
+ GLOB.sortedAreas = list()
+
+ for(var/area/A in world)
+ GLOB.sortedAreas.Add(A)
+
+ sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
+
+/area/proc/addSorted()
+ GLOB.sortedAreas.Add(src)
+ sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
+
+//Takes: Area type as a text string from a variable.
+//Returns: Instance for the area in the world.
+/proc/get_area_instance_from_text(areatext)
+ if(istext(areatext))
+ areatext = text2path(areatext)
+ return GLOB.areas_by_type[areatext]
+
+//Takes: Area type as text string or as typepath OR an instance of the area.
+//Returns: A list of all areas of that type in the world.
+/proc/get_areas(areatype, subtypes=TRUE)
+ if(istext(areatype))
+ areatype = text2path(areatype)
+ else if(isarea(areatype))
+ var/area/areatemp = areatype
+ areatype = areatemp.type
+ else if(!ispath(areatype))
+ return null
+
+ var/list/areas = list()
+ if(subtypes)
+ var/list/cache = typecacheof(areatype)
+ for(var/V in GLOB.sortedAreas)
+ var/area/A = V
+ if(cache[A.type])
+ areas += V
+ else
+ for(var/V in GLOB.sortedAreas)
+ var/area/A = V
+ if(A.type == areatype)
+ areas += V
+ return areas
+
+//Takes: Area type as text string or as typepath OR an instance of the area.
+//Returns: A list of all turfs in areas of that type of that type in the world.
+/proc/get_area_turfs(areatype, target_z = 0, subtypes=FALSE)
+ if(istext(areatype))
+ areatype = text2path(areatype)
+ else if(isarea(areatype))
+ var/area/areatemp = areatype
+ areatype = areatemp.type
+ else if(!ispath(areatype))
+ return null
+
+ var/list/turfs = list()
+ if(subtypes)
+ var/list/cache = typecacheof(areatype)
+ for(var/V in GLOB.sortedAreas)
+ var/area/A = V
+ if(!cache[A.type])
+ continue
+ for(var/turf/T in A)
+ if(target_z == 0 || target_z == T.z)
+ turfs += T
+ else
+ for(var/V in GLOB.sortedAreas)
+ var/area/A = V
+ if(A.type != areatype)
+ continue
+ for(var/turf/T in A)
+ if(target_z == 0 || target_z == T.z)
+ turfs += T
+ return turfs
+
// Gets an atmos isolated contained space
// Returns an associative list of turf|dirs pairs
// The dirs are connected turfs in the same space
@@ -96,4 +172,59 @@
to_chat(creator, "You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")
return TRUE
+
+/**
+ * Returns either the base area the target's belongs to or the target's area itself.
+ */
+/proc/get_base_area(atom/target)
+ var/area/A = get_area(target)
+ if(A?.master_area)
+ return A.master_area
+ return A
+
+/**
+ * Returns either null, or a list containing all the sub_areas associated with the base area the target is located in.
+ * If include_base is TRUE, the base area will also be added to the return list.
+ */
+/proc/get_sub_areas(atom/target, include_base = FALSE)
+ var/area/A = get_area(target)
+ if(!A)
+ return
+ . = list()
+ if(A.master_area)
+ A = A.master_area
+ if(include_base)
+ . += A
+ if(A.sub_areas)
+ . += A.sub_areas
+
+/**
+ * Proc for purposes similar to the get_areas_turfs(), but aimed to include associated areas.
+ * Only takes area (A) instances and paths, no text strings.
+ * Returns a list of all turfs found in the associated sub_areas (including the base's if include_base is TRUE)
+ * and located in the same z as target_z, or anywhere if the latter is 0
+ */
+
+/proc/get_sub_areas_turfs(area/A, target_z = 0, include_base = TRUE)
+ var/list/contents = get_sub_areas_contents(A, include_base)
+ . = list()
+ for(var/turf/T in contents)
+ if(target_z == 0 || target_z == T.z)
+ . += T
+/**
+ * Simple proc that returns all a sum of all contents from all associated areas,
+ * Think of the above but for all contents, not just turfs, and without target z.
+ */
+
+/proc/get_sub_areas_contents(area/A, include_base = TRUE)
+ if(ispath(A))
+ A = GLOB.areas_by_type[A]
+ if(!A)
+ return
+ if(A.master_area)
+ A = A.master_area
+ . = list(A.contents)
+ for(var/i in A.sub_areas)
+ . += A.sub_areas[i].contents
+
#undef BP_MAX_ROOM_SIZE
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index d76fc7731a..4b43782b12 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -8,8 +8,8 @@
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))
#define CULT_POLL_WAIT 2400
-/proc/get_area_name(atom/X, format_text = FALSE)
- var/area/A = isarea(X) ? X : get_area(X)
+/proc/get_area_name(atom/X, format_text = FALSE, get_base_area = FALSE)
+ var/area/A = get_base_area ? get_base_area(X) : get_area(X)
if(!A)
return null
return format_text ? format_text(A.name) : A.name
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 9abe42ea8e..1080dc5710 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -566,82 +566,6 @@ Turf and target are separate in case you want to teleport some distance from a t
else
return 0
-//Repopulates sortedAreas list
-/proc/repopulate_sorted_areas()
- GLOB.sortedAreas = list()
-
- for(var/area/A in world)
- GLOB.sortedAreas.Add(A)
-
- sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
-
-/area/proc/addSorted()
- GLOB.sortedAreas.Add(src)
- sortTim(GLOB.sortedAreas, /proc/cmp_name_asc)
-
-//Takes: Area type as a text string from a variable.
-//Returns: Instance for the area in the world.
-/proc/get_area_instance_from_text(areatext)
- if(istext(areatext))
- areatext = text2path(areatext)
- return GLOB.areas_by_type[areatext]
-
-//Takes: Area type as text string or as typepath OR an instance of the area.
-//Returns: A list of all areas of that type in the world.
-/proc/get_areas(areatype, subtypes=TRUE)
- if(istext(areatype))
- areatype = text2path(areatype)
- else if(isarea(areatype))
- var/area/areatemp = areatype
- areatype = areatemp.type
- else if(!ispath(areatype))
- return null
-
- var/list/areas = list()
- if(subtypes)
- var/list/cache = typecacheof(areatype)
- for(var/V in GLOB.sortedAreas)
- var/area/A = V
- if(cache[A.type])
- areas += V
- else
- for(var/V in GLOB.sortedAreas)
- var/area/A = V
- if(A.type == areatype)
- areas += V
- return areas
-
-//Takes: Area type as text string or as typepath OR an instance of the area.
-//Returns: A list of all turfs in areas of that type of that type in the world.
-/proc/get_area_turfs(areatype, target_z = 0, subtypes=FALSE)
- if(istext(areatype))
- areatype = text2path(areatype)
- else if(isarea(areatype))
- var/area/areatemp = areatype
- areatype = areatemp.type
- else if(!ispath(areatype))
- return null
-
- var/list/turfs = list()
- if(subtypes)
- var/list/cache = typecacheof(areatype)
- for(var/V in GLOB.sortedAreas)
- var/area/A = V
- if(!cache[A.type])
- continue
- for(var/turf/T in A)
- if(target_z == 0 || target_z == T.z)
- turfs += T
- else
- for(var/V in GLOB.sortedAreas)
- var/area/A = V
- if(A.type != areatype)
- continue
- for(var/turf/T in A)
- if(target_z == 0 || target_z == T.z)
- turfs += T
- return turfs
-
/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/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm
index 7bad836e47..d72b741abe 100644
--- a/code/datums/components/virtual_reality.dm
+++ b/code/datums/components/virtual_reality.dm
@@ -114,7 +114,7 @@
to_chat(mastermind, "You feel everything fading away...")
dreamer.death(FALSE)
if(cleanup)
- var/obj/effect/vr_clean_master/cleanbot = locate() in get_area(M)
+ var/obj/effect/vr_clean_master/cleanbot = locate() in get_base_area(M)
if(cleanbot)
LAZYADD(cleanbot.corpse_party, M)
if(vr_sleeper)
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index b288046380..3a74663643 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/wizarditis.dm
@@ -94,7 +94,7 @@ STI KALY - blind
var/area/thearea = pick(theareas)
var/list/L = list()
- for(var/turf/T in get_area_turfs(thearea.type))
+ for(var/turf/T in thearea)
if(T.z != affected_mob.z)
continue
if(T.name == "space")
diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm
index a3b666dcc6..01b9facbb8 100644
--- a/code/datums/weather/weather.dm
+++ b/code/datums/weather/weather.dm
@@ -50,7 +50,10 @@
stage = STARTUP_STAGE
var/list/affectareas = list()
for(var/V in get_areas(area_type))
- affectareas += V
+ var/area/A = V
+ affectareas |= A
+ if(A.sub_areas)
+ affectareas |= A.sub_areas
for(var/V in protected_areas)
affectareas -= get_areas(V)
for(var/V in affectareas)
diff --git a/code/datums/wires/airalarm.dm b/code/datums/wires/airalarm.dm
index 6eb4dc04db..0c4715e27e 100644
--- a/code/datums/wires/airalarm.dm
+++ b/code/datums/wires/airalarm.dm
@@ -46,7 +46,7 @@
A.mode = 1 // AALARM_MODE_SCRUB
A.apply_mode()
if(WIRE_ALARM) // Clear alarms.
- var/area/AA = get_area(A)
+ var/area/AA = get_base_area(A)
if(AA.atmosalert(0, holder))
A.post_alert(0)
A.update_icon()
@@ -68,7 +68,7 @@
A.mode = 3 // AALARM_MODE_PANIC
A.apply_mode()
if(WIRE_ALARM) // Post alarm.
- var/area/AA = get_area(A)
+ var/area/AA = get_base_area(A)
if(AA.atmosalert(2, holder))
A.post_alert(2)
A.update_icon()
\ No newline at end of file
diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm
index fa66306302..733a5ace75 100644
--- a/code/game/area/Space_Station_13_areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -403,7 +403,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/dorms
name = "Dormitories"
icon_state = "Sleep"
- safe = TRUE
/area/crew_quarters/dorms/male
name = "Male Dorm"
@@ -413,6 +412,29 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Female Dorm"
icon_state = "Sleep"
+/area/crew_quarters/dorms/cabin
+ name = "Dorms Cabin One"
+ icon_state = "sleep_cabin"
+ safe = TRUE
+
+/area/crew_quarters/dorms/cabin/two
+ name = "Dorms Cabin Two"
+
+/area/crew_quarters/dorms/cabin/three
+ name = "Dorms Cabin Three"
+
+/area/crew_quarters/dorms/cabin/four
+ name = "Dorms Cabin Four"
+
+/area/crew_quarters/dorms/cabin/five
+ name = "Dorms Cabin Five"
+
+/area/crew_quarters/dorms/cabin/six
+ name = "Dorms Cabin Six"
+
+/area/crew_quarters/dorms/cabin/seven
+ name = "Dorms Cabin Seven"
+
/area/crew_quarters/rehab_dome
name = "Rehabilitation Dome"
icon_state = "Sleep"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 612c3cba42..74e238cdc0 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -63,6 +63,15 @@
var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default?
var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with
+/**
+ * These two vars allow for multiple unique areas to be linked to a master area
+ * for reasons such as APC powernet nodes, fire alarms and similar, without sacrificing
+ * their own flags, statuses, variables and uniqueness.
+ * Friendly reminder: don't varedit area paths, make new typepaths instead.
+ */
+ var/list/area/sub_areas //list of typepaths of the areas you wish to link here, will be replaced with a list of references on mapload.
+ var/area/master_area //The area we wish to use in place of src for certain actions such as APC area linking.
+
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
GLOBAL_LIST_EMPTY(teleportlocs)
@@ -121,10 +130,31 @@ GLOBAL_LIST_EMPTY(teleportlocs)
reg_in_areas_in_z()
+ //so far I'm only implementing it on mapped unique areas, it's easier this way.
+ if(unique && LAZYLEN(sub_areas))
+ var/paths = sub_areas.Copy()
+ sub_areas = null
+ for(var/type in paths)
+ var/area/A = GLOB.areas_by_type[type]
+ if(!A)
+ /* By chance an area not loaded in the station, ruin or map, let's not bother for now.
+ WARNING("No area of type [type] found in GLOB.areas_by_type for [src]'s linked areas.")
+ */
+ continue
+ if(A == src)
+ WARNING("\"[src]\" area a attempted to link with itself.")
+ continue
+ if(A.master_area)
+ WARNING("[src] attempted to link with [A] while the latter is already linked to another area ([A.master_area]).")
+ continue
+ LAZYADD(sub_areas, A)
+ A.master_area = src
+
return INITIALIZE_HINT_LATELOAD
/area/LateInitialize()
- power_change() // all machines set to current power level, also updates icon
+ if(!master_area) //we don't want to run it twice.
+ power_change() // all machines set to current power level, also updates icon
/area/proc/reg_in_areas_in_z()
if(contents.len)
@@ -147,6 +177,19 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/Destroy()
if(GLOB.areas_by_type[type] == src)
GLOB.areas_by_type[type] = null
+ if(master_area)
+ LAZYREMOVE(master_area, src)
+ master_area = null
+ if(sub_areas)
+ for(var/i in sub_areas)
+ var/area/A = i
+ A.master_area = null
+ sub_areas -= A
+ if(A.requires_power)
+ A.power_light = FALSE
+ A.power_equip = FALSE
+ A.power_environ = FALSE
+ INVOKE_ASYNC(A, .proc/power_change)
STOP_PROCESSING(SSobj, src)
return ..()
@@ -212,9 +255,11 @@ GLOBAL_LIST_EMPTY(teleportlocs)
var/datum/computer_file/program/alarm_monitor/p = item
p.cancelAlarm("Atmosphere", src, source)
- src.atmosalm = danger_level
- return 1
- return 0
+ atmosalm = danger_level
+ for(var/i in sub_areas)
+ sub_areas[i].atmosalm = danger_level
+ return TRUE
+ return FALSE
/area/proc/ModifyFiredoors(opening)
if(firedoors)
@@ -239,7 +284,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
return
if (!fire)
- set_fire_alarm_effect()
+ set_fire_alarm_effects(TRUE)
ModifyFiredoors(FALSE)
for(var/item in firealarms)
var/obj/machinery/firealarm/F = item
@@ -262,7 +307,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/proc/firereset(obj/source)
if (fire)
- unset_fire_alarm_effects()
+ set_fire_alarm_effects(FALSE)
ModifyFiredoors(TRUE)
for(var/item in firealarms)
var/obj/machinery/firealarm/F = item
@@ -298,9 +343,9 @@ GLOBAL_LIST_EMPTY(teleportlocs)
return
//Trigger alarm effect
- set_fire_alarm_effect()
+ set_fire_alarm_effects(TRUE)
//Lockdown airlocks
- for(var/obj/machinery/door/DOOR in src)
+ for(var/obj/machinery/door/DOOR in get_sub_areas_contents(src))
close_and_lock_door(DOOR)
for (var/i in GLOB.silicon_mobs)
@@ -309,23 +354,16 @@ GLOBAL_LIST_EMPTY(teleportlocs)
//Cancel silicon alert after 1 minute
addtimer(CALLBACK(SILICON, /mob/living/silicon.proc/cancelAlarm,"Burglar",src,trigger), 600)
-/area/proc/set_fire_alarm_effect()
- fire = TRUE
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- for(var/alarm in firealarms)
- var/obj/machinery/firealarm/F = alarm
- F.update_fire_light(fire)
- for(var/obj/machinery/light/L in src)
- L.update()
-
-/area/proc/unset_fire_alarm_effects()
- fire = FALSE
+/area/proc/set_fire_alarm_effects(boolean)
+ fire = boolean
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
for(var/alarm in firealarms)
var/obj/machinery/firealarm/F = alarm
F.update_fire_light(fire)
for(var/obj/machinery/light/L in src)
L.update()
+ for(var/i in sub_areas)
+ sub_areas[i].fire = boolean
/area/proc/updateicon()
var/weather_icon
@@ -370,26 +408,34 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/proc/power_change()
for(var/obj/machinery/M in src) // for each machine in the area
M.power_change() // reverify power status (to update icons etc.)
+ if(sub_areas)
+ for(var/i in sub_areas)
+ var/area/A = i
+ A.power_light = power_light
+ A.power_equip = power_equip
+ A.power_environ = power_environ
+ INVOKE_ASYNC(A, .proc/power_change)
updateicon()
/area/proc/usage(chan)
- var/used = 0
switch(chan)
if(LIGHT)
- used += used_light
+ . += used_light
if(EQUIP)
- used += used_equip
+ . += used_equip
if(ENVIRON)
- used += used_environ
+ . += used_environ
if(TOTAL)
- used += used_light + used_equip + used_environ
+ . += used_light + used_equip + used_environ
if(STATIC_EQUIP)
- used += static_equip
+ . += static_equip
if(STATIC_LIGHT)
- used += static_light
+ . += static_light
if(STATIC_ENVIRON)
- used += static_environ
- return used
+ . += static_environ
+ if(sub_areas)
+ for(var/i in sub_areas)
+ . += sub_areas[i].usage(chan)
/area/proc/addStaticPower(value, powerchannel)
switch(powerchannel)
@@ -404,6 +450,9 @@ GLOBAL_LIST_EMPTY(teleportlocs)
used_equip = 0
used_light = 0
used_environ = 0
+ if(sub_areas)
+ for(var/i in sub_areas)
+ sub_areas[i].clear_usage()
/area/proc/use_power(amount, chan)
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 8d3254933a..d0671dd285 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -12,7 +12,7 @@
var/list/skipped_areas = list(/area/engine/engineering, /area/engine/supermatter, /area/engine/atmospherics_engine, /area/ai_monitored/turret_protected/ai)
for(var/area/A in world)
- if( !A.requires_power || A.always_unpowered )
+ if( !A.requires_power || A.always_unpowered || A.master_area)
continue
var/skip = 0
@@ -61,8 +61,9 @@
S.output_attempt = 1
S.update_icon()
S.power_change()
+
for(var/area/A in world)
- if(!istype(A, /area/space) && !istype(A, /area/shuttle) && !istype(A, /area/arrival))
+ if(!istype(A, /area/space) && !istype(A, /area/shuttle) && !istype(A, /area/arrival) && !A.always_unpowered && !A.master_area)
A.power_light = TRUE
A.power_equip = TRUE
A.power_environ = TRUE
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 1839e44e3b..c0317f0c94 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -44,7 +44,7 @@
var/area/a = loc.loc // Gets our locations location, like a dream within a dream
if(!isarea(a))
return
- if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
+ if(!a.powered(EQUIP)) // There's no APC in this area, don't try to cheat power!
to_chat(user, "[src] blinks red as you try to insert the cell!")
return
if(!user.transferItemToLoc(W,src))
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index dec41b0a59..61ad9f7c41 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -44,7 +44,7 @@
/obj/machinery/door/firedoor/proc/CalculateAffectingAreas()
remove_from_areas()
- affecting_areas = get_adjacent_open_areas(src) | get_area(src)
+ affecting_areas = get_adjacent_open_areas(src) | get_base_area(src)
for(var/I in affecting_areas)
var/area/A = I
LAZYADD(A.firedoors, src)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 5c2676c2b9..fd7d2216ce 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -44,7 +44,7 @@
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
update_icon()
- myarea = get_area(src)
+ myarea = get_base_area(src)
LAZYADD(myarea.firealarms, src)
/obj/machinery/firealarm/Destroy()
@@ -116,14 +116,14 @@
if(!is_operational() && (last_alarm+FIREALARM_COOLDOWN < world.time))
return
last_alarm = world.time
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
A.firealert(src)
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75)
/obj/machinery/firealarm/proc/reset()
if(!is_operational())
return
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
A.firereset(src)
/obj/machinery/firealarm/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
@@ -142,7 +142,7 @@
else
data["seclevel"] = "green"
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
data["alarm"] = A.fire
return data
@@ -306,7 +306,7 @@
/obj/machinery/firealarm/partyalarm/reset()
if (stat & (NOPOWER|BROKEN))
return
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if (!A || !A.party)
return
A.party = FALSE
@@ -315,7 +315,7 @@
/obj/machinery/firealarm/partyalarm/alarm()
if (stat & (NOPOWER|BROKEN))
return
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if (!A || A.party || A.name == "Space")
return
A.party = TRUE
@@ -325,5 +325,5 @@
/obj/machinery/firealarm/partyalarm/ui_data(mob/user)
. = ..()
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
.["alarm"] = A && A.party
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 927608d3d5..001ef94163 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -53,7 +53,7 @@
//Checks to make sure he's not in space doing it, and that the area got proper power.
var/area/a = get_area(src)
- if(!isarea(a) || a.power_equip == 0)
+ if(!a || !a.powered(EQUIP))
to_chat(user, "[src] blinks red as you try to insert [G].")
return 1
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index a8ba9850ff..579273d5e5 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -283,7 +283,7 @@
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/proc/get_charge()
if(equip_ready) //disabled
return
- var/area/A = get_area(chassis)
+ var/area/A = get_base_area(chassis)
var/pow_chan = get_power_channel(A)
if(pow_chan)
return 1000 //making magic
@@ -328,7 +328,7 @@
occupant_message("No powercell detected.")
return
if(cur_charge < chassis.cell.maxcharge)
- var/area/A = get_area(chassis)
+ var/area/A = get_base_area(chassis)
if(A)
var/pow_chan
for(var/c in list(EQUIP,ENVIRON,LIGHT))
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 10ee73915c..a3ba63108c 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -126,7 +126,7 @@
T.PlaceOnTop(/turf/open/floor/plating/foam)
for(var/direction in GLOB.cardinals)
var/turf/cardinal_turf = get_step(T, direction)
- if(get_area(cardinal_turf) != get_area(T)) //We're at an area boundary, so let's block off this turf!
+ if(get_base_area(cardinal_turf) != get_area(T)) //We're at an area boundary, so let's block off this turf!
new/obj/structure/foamedmetal(T)
break
flick("[icon_state]-disolve", src)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 2a7b5d24cd..4a8c46e551 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -425,7 +425,7 @@
/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target)
// Check area validity.
// Reject space, player-created areas, and non-station z-levels.
- var/area/A = get_area(target)
+ var/area/A = get_base_area(target)
if(!A || (!is_station_level(A.z)) || !A.valid_territory)
to_chat(user, "[A] is unsuitable for tagging.")
return FALSE
@@ -459,7 +459,7 @@
qdel(old_marking)
var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang)
- var/area/territory = get_area(target)
+ var/area/territory = get_base_area(target)
new /obj/effect/decal/cleanable/crayon/gang(target,G.gang,"graffiti",0,user) // Heres the gang tag.
to_chat(user, "You tagged [territory] for your gang!")
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 8964d1ca41..0b8732fb1c 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -52,7 +52,7 @@
var/area/A = get_area(src)
if(!A.blob_allowed)
return FALSE
- if(!A.power_equip)
+ if(!A.powered(EQUIP))
return FALSE
if(!SSmapping.level_trait(T.z,ZTRAIT_STATION))
return FALSE
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 771b4bc04e..df1b6cadf8 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -80,7 +80,7 @@
/obj/structure/displaycase/proc/trigger_alarm()
//Activate Anti-theft
if(alert)
- var/area/alarmed = get_area(src)
+ var/area/alarmed = get_base_area(src)
alarmed.burglaralert(src)
playsound(src, 'sound/effects/alert.ogg', 50, 1)
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index 72cbdc1409..dd9620e3be 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -211,17 +211,20 @@
/obj/effect/vr_clean_master/Initialize()
. = ..()
- vr_area = get_area(src)
- addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
+ vr_area = get_base_area(src)
+ addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES, TIMER_LOOP)
/obj/effect/vr_clean_master/proc/clean_up()
- if (vr_area)
- for (var/obj/item/ammo_casing/casing in vr_area)
- qdel(casing)
- for(var/obj/effect/decal/cleanable/C in vr_area)
- qdel(C)
- for (var/A in corpse_party)
- var/mob/M = A
- if(get_area(M) == vr_area && M.stat == DEAD)
- qdel(M)
- addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
+ if (!vr_area)
+ qdel(src)
+ return
+ var/list/contents = get_sub_areas_contents(src)
+ for (var/obj/item/ammo_casing/casing in contents)
+ qdel(casing)
+ for(var/obj/effect/decal/cleanable/C in contents)
+ qdel(C)
+ for (var/A in corpse_party)
+ var/mob/M = A
+ if(!QDELETED(M) && (M in contents) && M.stat == DEAD)
+ qdel(M)
+ corpse_party -= M
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 53fdb315b5..e474e4c9fe 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -541,7 +541,9 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
var/list/areas_all = list()
var/list/areas_with_APC = list()
var/list/areas_with_multiple_APCs = list()
+ var/list/sub_areas_APC = list()
var/list/areas_with_air_alarm = list()
+ var/list/sub_areas_air_alarm = list()
var/list/areas_with_RC = list()
var/list/areas_with_light = list()
var/list/areas_with_LS = list()
@@ -578,6 +580,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
if(!A)
dat += "Skipped over [APC] in invalid location, [APC.loc]."
continue
+ LAZYSET(sub_areas_APC, A.type, get_sub_areas(A, FALSE))
if(!(A.type in areas_with_APC))
areas_with_APC.Add(A.type)
else if(A.type in areas_all)
@@ -585,10 +588,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
CHECK_TICK
for(var/obj/machinery/airalarm/AA in GLOB.machines)
- var/area/A = get_area(AA)
+ var/area/A = get_base_area(AA)
if(!A) //Make sure the target isn't inside an object, which results in runtimes.
dat += "Skipped over [AA] in invalid location, [AA.loc].
"
continue
+ LAZYSET(sub_areas_air_alarm, A.type, get_sub_areas(A, FALSE))
if(!(A.type in areas_with_air_alarm))
areas_with_air_alarm.Add(A.type)
CHECK_TICK
@@ -638,8 +642,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
areas_with_camera.Add(A.type)
CHECK_TICK
- var/list/areas_without_APC = areas_all - areas_with_APC
- var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm
+ var/list/areas_without_APC = areas_all - (areas_with_APC + flatten_list(sub_areas_APC))
+ var/list/areas_without_air_alarm = areas_all - (areas_with_air_alarm + flatten_list(sub_areas_air_alarm))
var/list/areas_without_RC = areas_all - areas_with_RC
var/list/areas_without_light = areas_all - areas_with_light
var/list/areas_without_LS = areas_all - areas_with_LS
@@ -656,12 +660,18 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
dat += "
AREAS WITH MULTIPLE APCS:
"
for(var/areatype in areas_with_multiple_APCs)
dat += "[areatype]
"
+ if(sub_areas_APC[areatype])
+ dat += " SUB-AREAS:
"
+ dat += jointext(sub_areas_APC[areatype], "
")
CHECK_TICK
if(areas_without_air_alarm.len)
dat += "AREAS WITHOUT AN AIR ALARM:
"
for(var/areatype in areas_without_air_alarm)
dat += "[areatype]
"
+ if(sub_areas_air_alarm[areatype])
+ dat += " SUB-AREAS:
"
+ dat += jointext(sub_areas_air_alarm[areatype], "
")
CHECK_TICK
if(areas_without_RC.len)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 58ab9c6183..9ef04d8641 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -207,7 +207,7 @@
pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
if(name == initial(name))
- name = "[get_area_name(src)] Air Alarm"
+ name = "[get_area_name(src, get_base_area = TRUE)] Air Alarm"
power_change()
set_frequency(frequency)
@@ -250,7 +250,7 @@
"danger_level" = danger_level,
)
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
data["atmos_alarm"] = A.atmosalm
data["fire_alarm"] = A.fire
@@ -386,7 +386,7 @@
send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
. = TRUE
if("set_external_pressure", "set_internal_pressure")
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
if(!isnull(target) && !..())
send_signal(device_id, list("[action]" = target), usr)
@@ -420,12 +420,12 @@
apply_mode()
. = TRUE
if("alarm")
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if(A.atmosalert(2, src))
post_alert(2)
. = TRUE
if("reset")
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if(A.atmosalert(0, src))
post_alert(0)
. = TRUE
@@ -456,7 +456,7 @@
return 0
/obj/machinery/airalarm/proc/refresh_all()
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
for(var/id_tag in A.air_vent_names)
var/list/I = A.air_vent_info[id_tag]
if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
@@ -507,7 +507,7 @@
return "Flood"
/obj/machinery/airalarm/proc/apply_mode()
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
switch(mode)
if(AALARM_MODE_SCRUBBING)
for(var/device_id in A.air_scrub_names)
@@ -645,7 +645,7 @@
icon_state = "alarm1"
var/overlay_state = AALARM_OVERLAY_OFF
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
switch(max(danger_level, A.atmosalm))
if(0)
add_overlay(AALARM_OVERLAY_GREEN)
@@ -715,7 +715,7 @@
return
var/datum/signal/alert_signal = new(list(
- "zone" = get_area_name(src),
+ "zone" = get_area_name(src, get_base_area = TRUE),
"type" = "Atmospheric"
))
if(alert_level==2)
@@ -728,7 +728,7 @@
frequency.post_signal(src, alert_signal, range = -1)
/obj/machinery/airalarm/proc/apply_danger_level()
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
var/new_area_danger_level = 0
for(var/obj/machinery/airalarm/AA in A)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 75f2a60f80..c98204d274 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -124,7 +124,7 @@
id_tag = assign_uid_vents()
/obj/machinery/atmospherics/components/unary/vent_pump/Destroy()
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if (A)
A.air_vent_names -= id_tag
A.air_vent_info -= id_tag
@@ -312,7 +312,7 @@
"sigtype" = "status"
))
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if(!A.air_vent_names[id_tag])
name = "\improper [A.name] vent pump #[A.air_vent_names.len + 1]"
A.air_vent_names[id_tag] = name
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index 8585471ea4..d31c35dd16 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -63,7 +63,7 @@
pixel_y = PIPING_LAYER_P_Y
/obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy()
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if (A)
A.air_scrub_names -= id_tag
A.air_scrub_info -= id_tag
@@ -135,7 +135,7 @@
"sigtype" = "status"
))
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if(!A.air_scrub_names[id_tag])
name = "\improper [A.name] air scrubber #[A.air_scrub_names.len + 1]"
A.air_scrub_names[id_tag] = name
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 15a04235cc..1147042c8c 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -53,11 +53,11 @@
if(NONE)
return FALSE
if(POWER_REQ_ALL)
- return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
+ return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
if(POWER_REQ_CLOCKCULT)
for(var/obj/effect/clockwork/sigil/transmission/ST in range(src, SIGIL_ACCESS_RANGE))
return FALSE
- return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
+ return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
@@ -100,7 +100,7 @@
sleep(50)
var/turf/T = get_turf(src)
var/area/AIarea = get_area(src)
- if(AIarea && AIarea.power_equip)
+ if(AIarea && AIarea.powered(EQUIP))
if(!isspaceturf(T))
ai_restore_power()
return
@@ -120,7 +120,7 @@
var/PRP //like ERP with the code, at least this stuff is no more 4x sametext
for (PRP=1, PRP<=4, PRP++)
T = get_turf(src)
- AIarea = get_area(src)
+ AIarea = get_base_area(src)
if(AIarea)
for (var/obj/machinery/power/apc/APC in AIarea)
if (!(APC.stat & BROKEN))
@@ -134,7 +134,7 @@
to_chat(src, "Lost connection with the APC!")
aiRestorePowerRoutine = POWER_RESTORATION_SEARCH_APC
return
- if(AIarea.power_equip)
+ if(AIarea.powered(EQUIP))
if(!isspaceturf(T))
ai_restore_power()
return
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 51a9d8d62b..e691a30d3a 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -479,34 +479,36 @@ Difficulty: Very Hard
NewTerrainTables = /obj/structure/table/abductor
/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method)
- if(..())
- var/area/A = get_area(src)
- if(!A.outdoors && !(A in affected_targets))
- for(var/atom/Stuff in A)
- if(isturf(Stuff))
- var/turf/T = Stuff
- if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
- var/turf/open/O = T.ChangeTurf(NewTerrainFloors)
- if(O.air)
- var/datum/gas_mixture/G = O.air
- G.copy_from_turf(O)
- if(prob(florachance) && NewFlora.len && !is_blocked_turf(O, TRUE))
- var/atom/Picked = pick(NewFlora)
- new Picked(O)
- continue
- if(iswallturf(T) && NewTerrainWalls)
- T.ChangeTurf(NewTerrainWalls)
- continue
- if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs)
- var/obj/structure/chair/Original = Stuff
- var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
- C.setDir(Original.dir)
- qdel(Stuff)
- continue
- if(istype(Stuff, /obj/structure/table) && NewTerrainTables)
- new NewTerrainTables(Stuff.loc)
- continue
- affected_targets += A
+ . = ..()
+ if(!.)
+ return
+ for(var/i in get_sub_areas(src, include_base = TRUE))
+ var/area/A = i
+ if(A.outdoors || (A in affected_targets))
+ continue
+ affected_targets += A
+ for(var/stuff in A)
+ var/atom/target = stuff
+ if(isturf(target))
+ var/turf/T = target
+ if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
+ var/turf/open/O = T.ChangeTurf(NewTerrainFloors)
+ if(O.air)
+ var/datum/gas_mixture/G = O.air
+ G.copy_from_turf(O)
+ if(NewFlora.len && prob(florachance) && !is_blocked_turf(O, TRUE))
+ var/atom/Picked = pick(NewFlora)
+ new Picked(O)
+ else if(iswallturf(T) && NewTerrainWalls)
+ T.ChangeTurf(NewTerrainWalls)
+ else if(NewTerrainChairs && istype(target, /obj/structure/chair))
+ var/obj/structure/chair/Original = target
+ var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
+ C.setDir(Original.dir)
+ qdel(target)
+ else if(NewTerrainTables && istype(target, /obj/structure/table))
+ new NewTerrainTables(target.loc)
+ qdel(target)
/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
observer_desc = "This crystal generates a projectile when activated."
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 5bfabe376e..fa7103dc0d 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -170,7 +170,7 @@ Difficulty: Medium
to_chat(user, "The staff is still recharging!")
return
- var/area/user_area = get_area(user)
+ var/area/user_area = get_base_area(user)
var/turf/user_turf = get_turf(user)
if(!user_area || !user_turf || (user_area.type in excluded_areas))
to_chat(user, "Something is preventing you from using the staff here.")
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 5e3888a8c5..ecb2d6c29d 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -56,6 +56,8 @@
integrity_failure = 50
var/damage_deflection = 10
resistance_flags = FIRE_PROOF
+ armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
+ req_access = list(ACCESS_ENGINE_EQUIP)
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON
var/lon_range = 1.5
@@ -147,12 +149,39 @@
if(terminal)
terminal.connect_to_network()
-/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
- if (!req_access)
- req_access = list(ACCESS_ENGINE_EQUIP)
- if (!armor)
- armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
- ..()
+/obj/machinery/power/apc/Initialize(mapload, ndir, building = FALSE)
+ . = ..()
+ var/area/A = get_base_area(src)
+ if(!building)
+ has_electronics = APC_ELECTRONICS_SECURED
+ // is starting with a power cell installed, create it and set its charge level
+ if(cell_type)
+ cell = new cell_type
+ cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
+
+ //if area isn't specified use current
+ if(areastring)
+ area = get_area_instance_from_text(areastring)
+ if(!area)
+ area = A
+ stack_trace("Bad areastring path for [src], [src.areastring]")
+ else if(isarea(A) && !areastring)
+ area = A
+ if(auto_name)
+ name = "\improper [A.name] APC"
+ update_icon()
+
+ make_terminal()
+
+ else
+ area = A
+ opened = APC_COVER_OPENED
+ operating = FALSE
+ name = "\improper [A.name] APC"
+ stat |= MAINT
+ update_icon()
+ addtimer(CALLBACK(src, .proc/update), 5)
+
GLOB.apcs_list += src
wires = new /datum/wires/apc(src)
@@ -163,9 +192,6 @@
src.tdir = dir // to fix Vars bug
setDir(SOUTH)
- if(auto_name)
- name = "\improper [get_area(src)] APC"
-
switch(tdir)
if(NORTH)
pixel_y = 23
@@ -175,14 +201,6 @@
pixel_x = 24
if(WEST)
pixel_x = -25
- if (building)
- area = get_area(src)
- opened = APC_COVER_OPENED
- operating = FALSE
- name = "[area.name] APC"
- stat |= MAINT
- src.update_icon()
- addtimer(CALLBACK(src, .proc/update), 5)
/obj/machinery/power/apc/Destroy()
GLOB.apcs_list -= src
@@ -216,32 +234,6 @@
terminal.setDir(tdir)
terminal.master = src
-/obj/machinery/power/apc/Initialize(mapload)
- . = ..()
- if(!mapload)
- return
- has_electronics = APC_ELECTRONICS_SECURED
- // is starting with a power cell installed, create it and set its charge level
- if(cell_type)
- cell = new cell_type
- cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
-
- var/area/A = src.loc.loc
-
- //if area isn't specified use current
- if(areastring)
- src.area = get_area_instance_from_text(areastring)
- if(!src.area)
- src.area = A
- stack_trace("Bad areastring path for [src], [src.areastring]")
- else if(isarea(A) && src.areastring == null)
- src.area = A
- update_icon()
-
- make_terminal()
-
- addtimer(CALLBACK(src, .proc/update), 5)
-
/obj/machinery/power/apc/examine(mob/user)
. = ..()
if(stat & BROKEN)
@@ -1376,7 +1368,7 @@
return
for(var/A in GLOB.ai_list)
var/mob/living/silicon/ai/I = A
- if(get_area(I) == area)
+ if(get_base_area(I) == area)
return
failure_timer = max(failure_timer, round(duration))
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index cdbaa29a3b..782d9e89ed 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -294,7 +294,7 @@
cut_overlays()
switch(status) // set icon_states
if(LIGHT_OK)
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if(emergency_mode || (A && A.fire))
icon_state = "[base_state]_emergency"
else
@@ -323,7 +323,7 @@
var/CO = bulb_colour
if(color)
CO = color
- var/area/A = get_area(src)
+ var/area/A = get_base_area(src)
if (A && A.fire)
CO = bulb_emergency_colour
else if (nightshift_enabled)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 58a259de3a..5f8d1e822b 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -382,6 +382,7 @@
return null
/area/proc/get_apc()
+ var/target = master_area ? master_area : src
for(var/obj/machinery/power/apc/APC in GLOB.apcs_list)
- if(APC.area == src)
+ if(APC.area == target)
return APC
\ No newline at end of file
diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm
index d6536f4fdd..e976016a0b 100644
--- a/code/modules/research/xenobiology/crossbreeding/consuming.dm
+++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm
@@ -212,7 +212,7 @@ Consuming extracts:
taste = "sugar and starlight"
/obj/item/slime_cookie/bluespace/do_effect(mob/living/M, mob/user)
- var/list/L = get_area_turfs(get_area(get_turf(M)))
+ var/list/L = get_sub_areas_turfs(get_area(M))
var/turf/target
while (L.len && !target)
var/I = rand(1, L.len)
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index fe60cf6c0d63504c16c97738d39175d735f290fc..aad3e78590e9d275cf62bee4a4e1bea67b2ef47a 100644
GIT binary patch
delta 36061
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
delta 35754
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