diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm
index df83ba66ec..ae3773be74 100644
--- a/code/__defines/dcs/signals.dm
+++ b/code/__defines/dcs/signals.dm
@@ -58,8 +58,8 @@
#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success"
///from base of atom/attackby(): (/obj/item, /mob/living, params)
#define COMSIG_PARENT_ATTACKBY "atom_attackby"
-///Return this in response if you don't want afterattack to be called
- #define COMPONENT_NO_AFTERATTACK (1<<0)
+///Return this in response if you don't want later item attack procs to be called.
+ #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0)
///from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack"
///from base of atom/animal_attack(): (/mob/user)
@@ -94,6 +94,7 @@
#define COMSIG_ATOM_BUMPED "atom_bumped"
///from base of atom/ex_act(): (severity, target)
#define COMSIG_ATOM_EX_ACT "atom_ex_act"
+ #define COMPONENT_IGNORE_EXPLOSION (1<<0)
///from base of atom/emp_act(): (severity)
#define COMSIG_ATOM_EMP_ACT "atom_emp_act"
///from base of atom/fire_act(): (exposed_temperature, exposed_volume)
@@ -225,7 +226,7 @@
// /atom/movable signals
-///from base of atom/movable/Moved(): (/atom)
+///from base of atom/movable/Move(): (atom/newloc, dir, movetime)
#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move"
#define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0)
///from base of atom/movable/Moved(): (/atom, dir)
@@ -778,3 +779,5 @@
#define COMSIG_CONFLICT_ELEMENT_CHECK "conflict_element_check"
/// A conflict was found
#define ELEMENT_CONFLICT_FOUND (1<<0)
+//From reagents touch_x.
+#define COMSIG_REAGENTS_TOUCH "reagent_touch"
diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm
index cc90829619..cdca430fb6 100644
--- a/code/_helpers/turfs.dm
+++ b/code/_helpers/turfs.dm
@@ -121,6 +121,7 @@
var/old_icon1 = T.icon
var/old_decals = T.decals ? T.decals.Copy() : null
+ B.Destroy()
X = B.ChangeTurf(T.type)
X.set_dir(old_dir1)
X.icon_state = old_icon_state1
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index c4edacd933..6cb86b152f 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -191,6 +191,11 @@ The box in your backpack has an oxygen tank and gas mask in it."
desc = "Your battery is about to die! Charge it ASAP!"
icon_state = "c_starving"
+/obj/screen/alert/warm
+ name = "Too Warm"
+ desc = "You're uncomfortably warm. Take off some clothes or tweak the thermostat a few degrees cooler."
+ icon_state = "mildhot"
+
/obj/screen/alert/hot
name = "Too Hot"
desc = "You're flaming hot! Get somewhere cooler and take off any insulating clothing like a fire suit."
@@ -199,6 +204,11 @@ The box in your backpack has an oxygen tank and gas mask in it."
/obj/screen/alert/hot/robot
desc = "The air around you is too hot for a humanoid. Be careful to avoid exposing them to this enviroment."
+/obj/screen/alert/chilly
+ name = "Too Chilly"
+ desc = "You're uncomfortably cold. Rug up or tweak the thermostat a few degrees higher."
+ icon_state = "mildcold"
+
/obj/screen/alert/cold
name = "Too Cold"
desc = "You're freezing cold! Get somewhere warmer and take off any insulating clothing like a space suit."
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 48accdb7fa..c55ec430e3 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -25,28 +25,48 @@ avoid code duplication. This includes items that may sometimes act as a standard
return
return
-// Called at the start of resolve_attackby(), before the actual attack.
-/obj/item/proc/pre_attack(atom/a, mob/user)
- return
+/**
+ * Called at the start of resolve_attackby(), before the actual attack.
+ *
+ * Arguments:
+ * * atom/A - The atom about to be hit
+ * * mob/living/user - The mob doing the htting
+ * * params - click params such as alt/shift etc
+ *
+ * See: [/obj/item/proc/melee_attack_chain]
+ */
+
+/obj/item/proc/pre_attack(atom/A, mob/user, params) //do stuff before attackby!
+ if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return TRUE
+ return FALSE //return TRUE to avoid calling attackby after this proc does stuff
//I would prefer to rename this to attack(), but that would involve touching hundreds of files.
/obj/item/proc/resolve_attackby(atom/A, mob/user, var/attack_modifier = 1, var/click_parameters)
- pre_attack(A, user)
add_fingerprint(user)
+ . = pre_attack(A, user, click_parameters)
+ if(.) // We're returning the value of pre_attack, important if it has a special return.
+ return
return A.attackby(src, user, attack_modifier, click_parameters)
// No comment
/atom/proc/attackby(obj/item/W, mob/user, var/attack_modifier, var/click_parameters)
- if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_NO_AFTERATTACK)
+ if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, W, user, click_parameters) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
return FALSE
/mob/living/attackby(obj/item/I, mob/user, var/attack_modifier, var/click_parameters)
if(!ismob(user))
- return 0
+ return FALSE
+
+ if(SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, I, user, click_parameters) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return FALSE
+
if(can_operate(src, user) && I.do_surgery(src,user))
- return 1
+ return TRUE
+
if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Add - The vore, of course.
+
return I.attack(src, user, user.zone_sel.selecting, attack_modifier)
// Used to get how fast a mob should attack, and influences click delay.
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 3bd1a0afb2..5351139540 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -26,7 +26,9 @@
A.attack_hand(src)
/atom/proc/attack_hand(mob/user as mob)
- return
+ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return TRUE
+ return FALSE
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
return
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 86573474e6..fbad2752ee 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -115,7 +115,7 @@
if(!(mat_container_flags & MATCONTAINER_SILENT))
to_chat(user, "[parent] won't accept [I]!")
return
- . = COMPONENT_NO_AFTERATTACK
+ . = COMPONENT_CANCEL_ATTACK_CHAIN
var/datum/callback/pc = precondition
if(pc && !pc.Invoke(user))
return
@@ -168,7 +168,7 @@
// It shouldn't be possible to add more matter than our max
ASSERT((total_amount + (matter_per_sheet * sheets_to_use)) <= max_amount)
-
+
// Use the amount of sheets from the stack
if(!S.use(sheets_to_use))
to_chat(user, "Something went wrong with your stack. Split it manually and try again.")
@@ -358,7 +358,7 @@
if(materials[M] < (sheet_amt * SHEET_MATERIAL_AMOUNT))
sheet_amt = round(materials[M] / SHEET_MATERIAL_AMOUNT)
- var/obj/item/stack/S = M.stack_type
+ var/obj/item/stack/S = M.stack_type
var/max_stack_size = initial(S.max_amount)
var/count = 0
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 55b6938a7c..3df1820fa9 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -125,6 +125,8 @@
/atom/proc/Bumped(AM as mob|obj)
set waitfor = FALSE
+ SEND_SIGNAL(src, COMSIG_ATOM_BUMPED, AM)
+
// Convenience proc to see if a container is open for chemistry handling
// returns true if open
// false if closed
@@ -166,6 +168,9 @@
return
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
+ if(SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) & COMPONENT_CANCEL_ATTACK_CHAIN)
+ return
+
P.on_hit(src, 0, def_zone)
. = 0
@@ -260,8 +265,8 @@
invisibility = new_invisibility
return TRUE
-/atom/proc/ex_act()
- return
+/atom/proc/ex_act(var/strength = 3)
+ return (SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, strength, src) & COMPONENT_IGNORE_EXPLOSION)
/atom/proc/emag_act(var/remaining_charges, var/mob/user, var/emag_source)
return -1
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 195e02e8fa..ef50823c48 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -85,6 +85,9 @@
if(!loc || !newloc)
return FALSE
+ if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_MOVE, newloc, direct, movetime) & COMPONENT_MOVABLE_BLOCK_PRE_MOVE)
+ return FALSE
+
// Store this early before we might move, it's used several places
var/atom/oldloc = loc
@@ -232,6 +235,9 @@
riding_datum.handle_vehicle_offsets()
for (var/datum/light_source/light as anything in light_sources) // Cycle through the light sources on this atom and tell them to update.
light.source_atom.update_light()
+
+ SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED, old_loc, direction)
+
return TRUE
/atom/movable/set_dir(newdir)
@@ -265,6 +271,9 @@
throwing = 0
if(QDELETED(A))
return
+
+ SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A)
+
A.Bumped(src)
A.last_bumped = world.time
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
index 88da43257d..af29065f96 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/blob.dm
@@ -21,7 +21,7 @@
/turf/unsimulated/wall/supermatter/Destroy()
STOP_PROCESSING(SSturfs, src)
- ..()
+ return ..()
/turf/unsimulated/wall/supermatter/process()
// Only check infrequently.
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index edf81f7180..85fdef0784 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -97,8 +97,8 @@
supervisors = "the Head of Personnel"
selection_color = "#9b633e"
economic_modifier = 5
- access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
- minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
+ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce)
+ minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_RC_announce)
banned_job_species = list("digital", SPECIES_PROMETHEAN)
ideal_character_age = 40
diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm
index 80b32adb37..69e69c15d8 100644
--- a/code/game/jobs/job/exploration_vr.dm
+++ b/code/game/jobs/job/exploration_vr.dm
@@ -43,8 +43,8 @@
pto_type = PTO_EXPLORATION
dept_time_required = 20
- access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder)
- minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder)
+ access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder, access_RC_announce)
+ minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder, access_RC_announce)
outfit_type = /decl/hierarchy/outfit/job/pathfinder
job_description = "The Pathfinder's job is to lead and manage expeditions, and is the primary authority on all off-station expeditions."
alt_titles = list("Expedition Lead" = /datum/alt_title/expedition_lead, "Exploration Manager" = /datum/alt_title/exploration_manager)
diff --git a/code/game/machinery/reagents/pump.dm b/code/game/machinery/reagents/pump.dm
deleted file mode 100644
index c48e8d9834..0000000000
--- a/code/game/machinery/reagents/pump.dm
+++ /dev/null
@@ -1,270 +0,0 @@
-
-/obj/machinery/pump
- name = "fluid pump"
- desc = "A fluid pumping machine."
-
- description_info = "A machine that can pump fluid from certain turfs.
\
- Water can be pumped from any body of water. Certain locations or environmental\
- conditions can cause different byproducts to be produced.
\
- Magma or Lava can be pumped to produce mineralized fluid."
-
- anchored = FALSE
- density = TRUE
-
- icon = 'icons/obj/machines/reagent.dmi'
- icon_state = "pump"
-
- circuit = /obj/item/weapon/circuitboard/fluidpump
-
- var/on = 0
- var/obj/item/weapon/cell/cell = null
- var/use = 200
- var/efficiency = 1
- var/reagents_per_cycle = 40
- var/unlocked = 0
- var/open = 0
-
- var/obj/item/hose_connector/output/Output
-
-// Overlay cache vars.
- var/icon/liquid
- var/icon/tank
- var/icon/powerlow
- var/icon/glass
- var/icon/open_overlay
- var/icon/cell_overlay
-
-/obj/machinery/pump/Initialize()
- create_reagents(200)
- . = ..()
- default_apply_parts()
-
- if(ispath(cell))
- cell = new cell(src)
-
- Output = new(src)
-
- RefreshParts()
- update_icon()
-
-/obj/machinery/pump/update_icon()
- ..()
- if(!tank)
- tank = new/icon(icon, "[icon_state]-volume")
-
- if(!powerlow)
- powerlow = new/icon(icon, "[icon_state]-lowpower")
-
- if(!liquid)
- var/icon/cutter = new/icon(icon, "[icon_state]-volume")
-
- cutter.Blend(rgb(0, 0, 0,), ICON_MULTIPLY)
-
- liquid = new/icon(icon, "[icon_state]-cutting")
-
- liquid.Blend(cutter,ICON_AND)
-
- if(!glass)
- glass = new/icon(icon, "[icon_state]-glass")
-
- glass.Blend(rgb(1,1,1,0.5), ICON_MULTIPLY)
-
- if(!open_overlay)
- open_overlay = new/icon(icon, "[icon_state]-open")
-
- if(!cell_overlay)
- cell_overlay = new/icon(icon, "[icon_state]-cell")
-
- cut_overlays()
- add_overlay(tank)
-
- if(cell && cell.charge < (use * CELLRATE / efficiency))
- add_overlay(powerlow)
-
- if(reagents.total_volume >= 1)
- var/list/hextorgb = hex2rgb(reagents.get_color())
- liquid.GrayScale()
-
- liquid.Blend(rgb(hextorgb[1],hextorgb[2],hextorgb[3]),ICON_MULTIPLY)
-
- add_overlay(liquid)
-
- add_overlay(glass)
-
- if(open)
- add_overlay(open_overlay)
-
- if(cell)
- add_overlay(cell_overlay)
-
- if(on)
- icon_state = "[initial(icon_state)]-running"
-
- else
- icon_state = "[initial(icon_state)]"
-
-/obj/machinery/pump/process()
- if(Output.get_pairing())
- reagents.trans_to_holder(Output.reagents, Output.reagents.maximum_volume)
- if(prob(5))
- visible_message("\The [src] gurgles as it exports fluid.")
-
- if(!on)
- return
-
- if(!cell || (cell.charge < (use * CELLRATE / efficiency)))
- turn_off(TRUE)
- return
-
- handle_pumping()
- update_icon()
-
-/obj/machinery/pump/RefreshParts()
- for(var/obj/item/weapon/stock_parts/manipulator/SM in component_parts)
- efficiency = SM.rating
-
- var/total_bin_rating = 0
- for(var/obj/item/weapon/stock_parts/matter_bin/SB in component_parts)
- total_bin_rating += SB.rating
-
- reagents.maximum_volume = round(initial(reagents.maximum_volume) + 100 * total_bin_rating)
-
- return
-
-/obj/machinery/pump/power_change()
- if(!cell || cell.charge < (use * CELLRATE) || !anchored)
- return turn_off(TRUE)
-
- return FALSE
-
-
-// Returns 0 on failure and 1 on success
-/obj/machinery/pump/proc/turn_on(var/loud = 0)
- if(!cell)
- return 0
- if(cell.charge < (use * CELLRATE))
- return 0
-
- on = 1
- update_icon()
- if(loud)
- visible_message("\The [src] turns on.")
- return 1
-
-/obj/machinery/pump/proc/turn_off(var/loud = 0)
- on = 0
- set_light(0, 0)
- update_icon()
- if(loud)
- visible_message("\The [src] shuts down.")
-
- if(!on)
- return TRUE
-
- return FALSE
-
-/obj/machinery/pump/attack_ai(mob/user as mob)
- if(istype(user, /mob/living/silicon/robot) && Adjacent(user))
- return attack_hand(user)
-
- if(on)
- turn_off(TRUE)
- else
- if(!turn_on(1))
- to_chat(user, "You try to turn on \the [src] but it does not work.")
-
-/obj/machinery/pump/attack_hand(mob/user as mob)
- if(open && cell)
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(cell)
- cell.loc = user.loc
- else
- cell.loc = src.loc
-
- cell.add_fingerprint(user)
- cell.update_icon()
-
- cell = null
- on = 0
- set_light(0)
- to_chat(user, "You remove the power cell.")
- update_icon()
- return
-
- if(on)
- turn_off(TRUE)
- else if(anchored)
- if(!turn_on(1))
- to_chat(user, "You try to turn on \the [src] but it does not work.")
-
- update_icon()
-
-/obj/machinery/pump/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(W.is_screwdriver())
- if(!open)
- if(unlocked)
- unlocked = 0
- to_chat(user, "You screw the battery panel in place.")
- else
- unlocked = 1
- to_chat(user, "You unscrew the battery panel.")
-
- else if(W.is_crowbar())
- if(unlocked)
- if(open)
- open = 0
- overlays = null
- to_chat(user, "You crowbar the battery panel in place.")
- else
- if(unlocked)
- open = 1
- to_chat(user, "You remove the battery panel.")
-
- else if(W.is_wrench())
- if(on)
- to_chat(user, "\The [src] is active. Turn it off before trying to move it!")
- return
- default_unfasten_wrench(user, W, 2 SECONDS)
-
- else if(istype(W, /obj/item/weapon/cell))
- if(open)
- if(cell)
- to_chat(user, "There is a power cell already installed.")
- else
- user.drop_item()
- W.loc = src
- cell = W
- to_chat(user, "You insert the power cell.")
- else
- ..()
- RefreshParts()
- update_icon()
-
-/obj/machinery/pump/proc/handle_pumping()
- var/turf/T = get_turf(src)
-
- if(istype(T, /turf/simulated/floor/water))
- cell.use(use * CELLRATE / efficiency)
- reagents.add_reagent("water", reagents_per_cycle)
-
- if(T.temperature <= T0C)
- reagents.add_reagent("ice", round(reagents_per_cycle / 2, 0.1))
-
- if((istype(T,/turf/simulated/floor/water/pool) || istype(T,/turf/simulated/floor/water/deep/pool)))
- reagents.add_reagent("chlorine", round(reagents_per_cycle / 10 * efficiency, 0.1))
-
- else if(istype(T,/turf/simulated/floor/water/contaminated))
- reagents.add_reagent("vatstabilizer", round(reagents_per_cycle / 2))
-
- if(T.loc.name == "Sea") // Saltwater.
- reagents.add_reagent("sodiumchloride", round(reagents_per_cycle / 10 * efficiency, 0.1))
-
- for(var/turf/simulated/mineral/MT in range(5))
- if(MT.mineral)
- var/obj/effect/mineral/OR = MT.mineral
- reagents.add_reagent(OR.ore_reagent, round(reagents_per_cycle / 20 * efficiency, 0.1))
-
- else if(istype(T, /turf/simulated/floor/lava))
- cell.use(use * CELLRATE / efficiency * 4)
- reagents.add_reagent("mineralizedfluid", round(reagents_per_cycle * efficiency / 2, 0.1))
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 6cf3d624c7..549546b388 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -511,27 +511,37 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(length(heard_masked))
for (var/mob/R in heard_masked)
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 0, name)
+ if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
+ R << 'sound/effects/radio_common_quieter.ogg'
/* --- Process all the mobs that heard the voice normally (understood) --- */
if(length(heard_normal))
for (var/mob/R in heard_normal)
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 0, realname)
+ if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
+ R << 'sound/effects/radio_common_quieter.ogg'
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
if(length(heard_voice))
for (var/mob/R in heard_voice)
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M,0, vname)
+ if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
+ R << 'sound/effects/radio_common_quieter.ogg'
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
// Displays garbled message (ie "f*c* **u, **i*er!")
if(length(heard_garbled))
for (var/mob/R in heard_garbled)
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 1, vname)
+ if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
+ R << 'sound/effects/radio_common_quieter.ogg'
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
if(length(heard_gibberish))
for (var/mob/R in heard_gibberish)
R.hear_radio(message_pieces, verbage, part_a, part_b, part_c, M, 1)
+ if(R.is_preference_enabled(/datum/client_preference/radio_sounds))
+ R << 'sound/effects/radio_common_quieter.ogg'
return 1
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 811167bd22..02dd0426fb 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -87,7 +87,7 @@
// Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called.
var/list/sprite_sheets_obj
- var/toolspeed = 1.0 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
+ var/toolspeed = 1 // This is a multipler on how 'fast' a tool works. e.g. setting this to 0.5 will make the tool work twice as fast.
var/attackspeed = DEFAULT_ATTACK_COOLDOWN // How long click delay will be when using this, in 1/10ths of a second. Checked in the user's get_attack_speed().
var/reach = 1 // Length of tiles it can reach, 1 is adjacent.
var/addblends // Icon overlay for ADD highlights when applicable.
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index a7ba535c3b..e456f22b26 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -62,12 +62,12 @@
/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
if (aiOverride)
- playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
+ //playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
return ..(freq, level)
if(ishuman(src.loc))
var/mob/living/carbon/human/H = src.loc
if(H.l_ear == src || H.r_ear == src)
- playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
+ //playsound(loc, 'sound/effects/radio_common.ogg', 20, 1, 1, preference = /datum/client_preference/radio_sounds)
return ..(freq, level)
return -1
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 2ea9ad0667..b6ad543e6a 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -212,7 +212,11 @@
O.set_dir(user.dir)
O.add_fingerprint(user)
-
+ //VOREStation Addition Start - Let's not store things that get crafted with materials like this, they won't spawn correctly when retrieved.
+ if (isobj(O))
+ var/obj/P = O
+ P.persist_storable = FALSE
+ //VOREStation Addition End
if (istype(O, /obj/item/stack))
var/obj/item/stack/S = O
S.amount = produced
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index cb05e944cf..a13046dc63 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -37,6 +37,8 @@
/*
* Plushies
*/
+// HEY FUTURE PLUSHIE CODERS: IF YOU'RE ADDING A SNOWFLAKE PLUSH ITEM USE PATH /obj/item/toy/plushie/fluff
+// the loadout entry shouldn't be able to grab those if everything goes right
/obj/item/toy/plushie/lizardplushie
name = "lizard plushie"
desc = "An adorable stuffed toy that resembles a lizardperson."
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
index bf6e8c4829..10c57abf85 100644
--- a/code/game/objects/items/weapons/material/misc.dm
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -23,7 +23,20 @@
applies_material_colour = 0
drop_sound = 'sound/items/drop/axe.ogg'
pickup_sound = 'sound/items/pickup/axe.ogg'
+/* VOREStation Removal - We have one already
+/obj/item/weapon/material/knife/machete/hatchet/stone
+ name = "sharp rock"
+ desc = "The secret is to bang the rocks together, guys."
+ force_divisor = 0.2
+ icon_state = "rock"
+ item_state = "rock"
+ attack_verb = list("chopped", "torn", "cut")
+/obj/item/weapon/material/knife/machete/hatchet/stone/set_material(var/new_material)
+ var/old_name = name
+ . = ..()
+ name = old_name
+*/
/obj/item/weapon/material/knife/machete/hatchet/unathiknife
name = "duelling knife"
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
diff --git a/code/game/objects/structures/flora/flora.dm b/code/game/objects/structures/flora/flora.dm
index 4780c89f36..1f7e2d0ba9 100644
--- a/code/game/objects/structures/flora/flora.dm
+++ b/code/game/objects/structures/flora/flora.dm
@@ -13,6 +13,7 @@
var/min_x_scale = 0.9
var/min_y_scale = 0.9
+ var/removal_tool = /obj/item/weapon/shovel
var/harvest_tool = null // The type of item used to harvest the plant.
var/harvest_count = 0
var/destroy_on_harvest = FALSE
@@ -40,23 +41,34 @@
. = ..()
if(harvest_count < max_harvests)
. += get_harvestable_desc()
+ if(harvest_tool)
+ var/obj/item/tool = harvest_tool
+ . += SPAN_NOTICE("\The [src] can be harvested with \a [initial(tool.name)].")
+
+ if(removal_tool)
+ var/obj/item/tool = removal_tool
+ . += SPAN_NOTICE("\The [src] can be removed with \a [initial(tool.name)].")
/obj/structure/flora/proc/get_harvestable_desc()
return "\The [src] seems to have something hanging from it."
/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user)
+
if(can_harvest(W))
var/harvest_spawn = pickweight(harvest_loot)
var/atom/movable/AM = spawn_harvest(harvest_spawn, user)
-
- if(!AM)
- to_chat(user, "You fail to harvest anything from \the [src].")
-
+ if(AM)
+ to_chat(user, SPAN_NOTICE("You harvest \the [AM] from \the [src]."))
else
- to_chat(user, "You harvest \the [AM] from \the [src].")
- if(harvest_count >= max_harvests && destroy_on_harvest)
- qdel(src)
- return
+ to_chat(user, SPAN_NOTICE("You fail to harvest anything from \the [src]."))
+ return
+
+ if(removal_tool && istype(W, removal_tool))
+ to_chat(user, SPAN_WARNING("You start uprooting \the [src]..."))
+ if(do_after(user, 30))
+ visible_message(SPAN_NOTICE("\The [user] uproots and discards \the [src]!"))
+ qdel(src)
+ return
..(W, user)
@@ -450,6 +462,23 @@
desc = "This is a tiny well lit decorative christmas tree."
icon_state = "plant-xmas"
+/obj/structure/flora/mushroom
+ name = "mushroom"
+ desc = "Hey, this one seems like a fun guy."
+ icon_state = "mush1"
+ icon = 'icons/obj/flora/mushrooms.dmi'
+ harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/mushroomslice = 1)
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 2
+ min_harvests = 0
+
+/obj/structure/flora/mushroom/Initialize()
+ . = ..()
+ icon_state = "mush[rand(1,4)]"
+ if(prob(50))
+ adjust_scale(-1, 1)
+ pixel_x = rand(-4, 4)
+
/obj/random/pottedplant
name = "random potted plant"
desc = "This is a random potted plant."
@@ -486,20 +515,11 @@
prob(1);/obj/structure/flora/pottedplant/xmas
)
-
/obj/structure/flora/sif
icon = 'icons/obj/flora/sifflora.dmi'
-/obj/structure/flora/sif/attack_hand(mob/user)
- if (user.a_intent == I_HURT)
- if(do_after(user, 5 SECONDS))
- user.visible_message("\The [user] digs up \the [src.name].", "You dig up \the [src.name].")
- qdel(src)
- else
- user.visible_message("\The [user] pokes \the [src.name].", "You poke \the [src.name].")
-
/datum/category_item/catalogue/flora/subterranean_bulbs
- name = "Sivian Flora - Subterranean Bulbs"
+ name = "Sivian Flora - Cavebulbs"
desc = "A plant which is native to Sif, it continues the trend of being a bioluminescent specimen. These plants \
are generally suited for conditions experienced in caverns, which are generally dark and cold. It is not \
known why this plant evolved to be bioluminescent, however this property has, unintentionally, allowed for \
@@ -512,7 +532,7 @@
value = CATALOGUER_REWARD_EASY
/obj/structure/flora/sif/subterranean
- name = "subterranean plant"
+ name = "subterranean bulbs"
desc = "This is a subterranean plant. It's bulbous ends glow faintly."
icon_state = "glowplant"
light_range = 2
@@ -520,12 +540,15 @@
light_color = "#FF6633"
light_on = TRUE
catalogue_data = list(/datum/category_item/catalogue/flora/subterranean_bulbs)
+ harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/grown/sif/cavebulbs = 1)
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 2
+ min_harvests = 0
/obj/structure/flora/sif/subterranean/Initialize()
icon_state = "[initial(icon_state)][rand(1,2)]"
. = ..()
-
/datum/category_item/catalogue/flora/eyebulbs
name = "Sivian Flora - Eyebulbs"
desc = "A plant native to Sif. On the end of its stems are bulbs which visually resemble \
@@ -534,10 +557,14 @@
value = CATALOGUER_REWARD_EASY
/obj/structure/flora/sif/eyes
- name = "mysterious bulbs"
- desc = "This is a mysterious looking plant. They kind of look like eyeballs. Creepy."
+ name = "eyebulbs"
+ desc = "This is a mysterious-looking plant. They kind of look like eyeballs. Creepy."
icon_state = "eyeplant"
catalogue_data = list(/datum/category_item/catalogue/flora/eyebulbs)
+ harvest_tool = /obj/item/weapon/material/knife
+ max_harvests = 2
+ min_harvests = 0
+ harvest_loot = list(/obj/item/weapon/reagent_containers/food/snacks/grown/sif/eyebulbs = 1)
/obj/structure/flora/sif/eyes/Initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
@@ -551,20 +578,20 @@
value = CATALOGUER_REWARD_TRIVIAL
/obj/structure/flora/sif/tendrils
- name = "stocky tendrils"
+ name = "wabback tendrils"
desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow."
icon_state = "grass"
randomize_size = TRUE
catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils)
harvest_tool = /obj/item/weapon/material/knife
- max_harvests = 1
- min_harvests = -4
+ max_harvests = 3
+ min_harvests = 0
harvest_loot = list(
- /obj/item/seeds/wabback = 15,
- /obj/item/seeds/blackwabback = 1,
- /obj/item/seeds/wildwabback = 30
- )
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/wabback = 15,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/blackwabback = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/wildwabback = 30
+ )
/obj/structure/flora/sif/tendrils/Initialize()
icon_state = "[initial(icon_state)][rand(1,3)]"
@@ -583,26 +610,24 @@
value = CATALOGUER_REWARD_HARD
/obj/structure/flora/sif/frostbelle
- name = "gnarly shrub"
+ name = "frostbelle shrub"
desc = "A stocky plant with fins bearing luminescent veins along its branches."
- icon_state = "grass"
+ icon_state = "frostbelle"
randomize_size = TRUE
catalogue_data = list(/datum/category_item/catalogue/flora/frostbelle)
harvest_tool = /obj/item/weapon/material/knife
max_harvests = 2
- min_harvests = -4
+ min_harvests = 0
harvest_loot = list(
/obj/item/weapon/reagent_containers/food/snacks/frostbelle = 1
- )
+ )
var/variantnum = null
/obj/structure/flora/sif/frostbelle/Initialize()
. = ..()
-
variantnum = rand(1,3)
-
update_icon()
/obj/structure/flora/sif/frostbelle/update_icon()
@@ -610,7 +635,6 @@
if(max_harvests > 0 && harvest_count < max_harvests)
icon_state = "[initial(icon_state)][variantnum]"
-
else
icon_state = initial(icon_state)
diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm
index feb124d489..568904e2f7 100644
--- a/code/game/objects/structures/flora/trees.dm
+++ b/code/game/objects/structures/flora/trees.dm
@@ -306,12 +306,12 @@
harvest_tool = /obj/item/weapon/material/knife
max_harvests = 2
- min_harvests = -4
+ min_harvests = 0
harvest_loot = list(
/obj/item/weapon/reagent_containers/food/snacks/siffruit = 20,
- /obj/item/weapon/reagent_containers/food/snacks/grown/sifpod = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/grown/sif/sifpod = 5,
/obj/item/seeds/sifbulb = 1
- )
+ )
var/light_shift = 0
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index 5e455b2252..ad28552094 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -143,7 +143,7 @@ var/list/flooring_types
/decl/flooring/grass/sif // Subtype for Sif's grass.
name = "growth"
desc = "A natural moss that has adapted to the sheer cold climate."
- flags = TURF_REMOVE_SHOVEL
+ flags = 0
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif"
build_type = /obj/item/stack/tile/grass/sif
@@ -152,7 +152,7 @@ var/list/flooring_types
/decl/flooring/grass/sif/forest
name = "thick growth"
desc = "A natural moss that has adapted to the sheer cold climate."
- flags = TURF_REMOVE_SHOVEL
+ flags = 0
icon = 'icons/turf/outdoors.dmi'
icon_base = "grass_sif_dark"
build_type = /obj/item/stack/tile/grass/sif/forest
diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm
index 486e215325..b63ecf0143 100644
--- a/code/game/turfs/simulated/floor_types.dm
+++ b/code/game/turfs/simulated/floor_types.dm
@@ -30,7 +30,6 @@
new_holder.decals = T.decals ? T.decals.Copy() : null
//Set the destination to be like us
- T.Destroy()
var/turf/simulated/shuttle/new_dest = T.ChangeTurf(my_turf.type,,1)
new_dest.set_dir(my_turf.dir)
new_dest.icon_state = my_turf.icon_state
@@ -97,7 +96,7 @@
/turf/simulated/shuttle/Destroy()
landed_holder = null
- ..()
+ return ..()
// For joined corners touching static lighting turfs, add an overlay to cancel out that part of our lighting overlay.
/turf/simulated/shuttle/proc/update_breaklights()
diff --git a/code/game/turfs/simulated/outdoors/dirt.dm b/code/game/turfs/simulated/outdoors/dirt.dm
index b02bbdd9f0..e4e97388f9 100644
--- a/code/game/turfs/simulated/outdoors/dirt.dm
+++ b/code/game/turfs/simulated/outdoors/dirt.dm
@@ -1,7 +1,8 @@
-/turf/simulated/floor/outdoors/dirt
- name = "dirt"
- desc = "Quite dirty!"
- icon_state = "dirt-dark"
- edge_blending_priority = 2
- turf_layers = list(/turf/simulated/floor/outdoors/rocks)
- initial_flooring = /decl/flooring/dirt
+/turf/simulated/floor/outdoors/dirt
+ name = "dirt"
+ desc = "Quite dirty!"
+ icon_state = "dirt-dark"
+ edge_blending_priority = 2
+ turf_layers = list(/turf/simulated/floor/outdoors/rocks)
+ initial_flooring = /decl/flooring/dirt
+ can_dig = TRUE
diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm
index 65d0e472f1..41aa084773 100644
--- a/code/game/turfs/simulated/outdoors/grass.dm
+++ b/code/game/turfs/simulated/outdoors/grass.dm
@@ -7,6 +7,7 @@ var/list/grass_types = list(
icon_state = "grass0"
edge_blending_priority = 4
initial_flooring = /decl/flooring/grass/outdoors // VOREStation Edit
+ can_dig = TRUE
turf_layers = list(
/turf/simulated/floor/outdoors/rocks,
/turf/simulated/floor/outdoors/dirt
@@ -42,7 +43,6 @@ var/list/grass_types = list(
var/tree_chance = 2
/*
animal_chance = 0.5
-
animal_types = list(
/mob/living/simple_mob/animal/sif/diyaab = 10,
/mob/living/simple_mob/animal/sif/glitterfly = 2,
@@ -96,4 +96,3 @@ var/list/grass_types = list(
/obj/structure/flora/sif/eyes = 5,
/obj/structure/flora/sif/tendrils = 30
)
-
diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm
index 84c91366f1..07d382a161 100644
--- a/code/game/turfs/simulated/outdoors/outdoors.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors.dm
@@ -24,6 +24,42 @@ var/list/turf_edge_cache = list()
// When a turf gets demoted or promoted, this list gets adjusted. The top-most layer is the layer on the bottom of the list, due to how pop() works.
var/list/turf_layers = list(/turf/simulated/floor/outdoors/rocks)
+ var/can_dig = FALSE
+ var/loot_count
+
+/turf/simulated/floor/outdoors/proc/get_loot_type()
+ if(loot_count && prob(60))
+ return pick( \
+ 12;/obj/item/weapon/reagent_containers/food/snacks/worm, \
+ 1;/obj/item/weapon/material/knife/machete/hatchet/stone \
+ )
+
+/turf/simulated/floor/outdoors/Initialize(mapload)
+ . = ..()
+ if(can_dig && prob(33))
+ loot_count = rand(1,3)
+
+/turf/simulated/floor/outdoors/attackby(obj/item/C, mob/user)
+
+ if(can_dig && istype(C, /obj/item/weapon/shovel))
+ to_chat(user, SPAN_NOTICE("\The [user] begins digging into \the [src] with \the [C]."))
+ var/delay = (3 SECONDS * C.toolspeed)
+ user.setClickCooldown(delay)
+ if(do_after(user, delay, src))
+ if(!(locate(/obj/machinery/portable_atmospherics/hydroponics/soil) in contents))
+ var/obj/machinery/portable_atmospherics/hydroponics/soil/soil = new(src)
+ user.visible_message(SPAN_NOTICE("\The [src] digs \a [soil] into \the [src]."))
+ else
+ var/loot_type = get_loot_type()
+ if(loot_type)
+ loot_count--
+ var/obj/item/loot = new loot_type(src)
+ to_chat(user, SPAN_NOTICE("You dug up \a [loot]!"))
+ else
+ to_chat(user, SPAN_NOTICE("You didn't find anything of note in \the [src]."))
+ return
+
+ . = ..()
/turf/simulated/floor/Initialize(mapload)
if(is_outdoors())
@@ -80,6 +116,7 @@ var/list/turf_edge_cache = list()
icon_state = "mud_dark"
edge_blending_priority = 3
initial_flooring = /decl/flooring/mud
+ can_dig = TRUE
/turf/simulated/floor/outdoors/rocks
name = "rocks"
diff --git a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
index a59676834f..1a969fee98 100644
--- a/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
+++ b/code/game/turfs/simulated/outdoors/outdoors_attackby.dm
@@ -1,15 +1,7 @@
// this code here enables people to dig up worms from certain tiles.
/turf/simulated/floor/outdoors/grass/attackby(obj/item/weapon/S as obj, mob/user as mob)
- if(istype(S, /obj/item/weapon/shovel))
- to_chat(user, "You begin to dig in \the [src] with your [S].")
- if(do_after(user, 4 SECONDS * S.toolspeed))
- to_chat(user, "\The [src] has been dug up, a worm pops from the ground.")
- new /obj/item/weapon/reagent_containers/food/snacks/worm(src)
- else
- to_chat(user, "You decide to not finish digging in \the [src].")
- else if(istype(S, /obj/item/stack/tile/floor))
+ if(istype(S, /obj/item/stack/tile/floor))
ChangeTurf(/turf/simulated/floor, preserve_outdoors = TRUE)
return
- else
- ..()
\ No newline at end of file
+ . = ..()
\ No newline at end of file
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index f664e73b40..efd3dbe255 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -45,8 +45,7 @@
/turf/simulated/wall/Destroy()
STOP_PROCESSING(SSturfs, src)
- dismantle_wall(null,null,1)
- ..()
+ return ..()
/turf/simulated/wall/examine_icon()
return icon(icon=initial(icon), icon_state=initial(icon_state))
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 9a4039cb1c..66376f4431 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -34,6 +34,7 @@
var/block_tele = FALSE // If true, most forms of teleporting to or from this turf tile will fail.
var/can_build_into_floor = FALSE // Used for things like RCDs (and maybe lattices/floor tiles in the future), to see if a floor should replace it.
var/list/dangerous_objects // List of 'dangerous' objs that the turf holds that can cause something bad to happen when stepped on, used for AI mobs.
+ var/tmp/changing_turf
/turf/Initialize(mapload)
. = ..()
@@ -42,7 +43,7 @@
//Lighting related
set_luminosity(!(dynamic_lighting))
-
+
if(opacity)
directional_opacity = ALL_CARDINALS
@@ -58,9 +59,14 @@
Be.multiz_turf_new(src, UP)
/turf/Destroy()
- . = QDEL_HINT_IWILLGC
+ if (!changing_turf)
+ stack_trace("Improper turf qdel. Do not qdel turfs directly.")
+ changing_turf = FALSE
cleanbot_reserved_turfs -= src
+ if(connections)
+ connections.erase_all()
..()
+ return QDEL_HINT_IWILLGC
/turf/ex_act(severity)
return 0
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index 5c51101c52..72cb432e1b 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -61,49 +61,29 @@
cut_overlays(TRUE)
RemoveElement(/datum/element/turf_z_transparency)
+ changing_turf = TRUE
+ qdel(src)
+ var/turf/W = new N( locate(src.x, src.y, src.z) )
if(ispath(N, /turf/simulated/floor))
- var/turf/simulated/W = new N( locate(src.x, src.y, src.z) )
if(old_fire)
- fire = old_fire
+ W.fire = old_fire
+ W.RemoveLattice()
+ else if(old_fire)
+ old_fire.RemoveFire()
- if (istype(W,/turf/simulated/floor))
- W.RemoveLattice()
+ if(tell_universe)
+ universe.OnTurfChange(W)
- if(tell_universe)
- universe.OnTurfChange(W)
+ if(air_master)
+ air_master.mark_for_update(W)
- if(air_master)
- air_master.mark_for_update(src) //handle the addition of the new turf.
-
- for(var/turf/space/S in range(W,1))
- S.update_starlight()
-
- W.levelupdate()
- W.update_icon(1)
- W.post_change()
- . = W
-
- else
-
- var/turf/W = new N( locate(src.x, src.y, src.z) )
-
- if(old_fire)
- old_fire.RemoveFire()
-
- if(tell_universe)
- universe.OnTurfChange(W)
-
- if(air_master)
- air_master.mark_for_update(src)
-
- for(var/turf/space/S in range(W,1))
- S.update_starlight()
-
- W.levelupdate()
- W.update_icon(1)
- W.post_change()
- . = W
+ for(var/turf/space/S in range(W, 1))
+ S.update_starlight()
+ W.levelupdate()
+ W.update_icon(1)
+ W.post_change()
+ . = W
dangerous_objects = old_dangerous_objects
diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm
index 8e08b8d26d..c6be94c5ed 100644
--- a/code/game/turfs/unsimulated/planetary.dm
+++ b/code/game/turfs/unsimulated/planetary.dm
@@ -24,7 +24,7 @@
/turf/unsimulated/wall/planetary/Destroy()
SSplanets.removeTurf(src)
- ..()
+ return ..()
/turf/unsimulated/wall/planetary/proc/set_temperature(var/new_temperature)
if(new_temperature == temperature)
diff --git a/code/modules/admin/view_variables/admin_delete.dm b/code/modules/admin/view_variables/admin_delete.dm
index 7976d3bedf..4f9c048fe6 100644
--- a/code/modules/admin/view_variables/admin_delete.dm
+++ b/code/modules/admin/view_variables/admin_delete.dm
@@ -19,6 +19,13 @@
T.ScrapeAway()
else*/
vv_update_display(D, "deleted", VV_MSG_DELETED)
- qdel(D)
+
+ // turfs are special snowflakes that'll explode if qdel'd outside ChangeTurf
+ if (isturf(D))
+ var/turf/T = D
+ T.ChangeTurf(world.turf)
+ else
+ qdel(D)
+
if(!QDELETED(D))
vv_update_display(D, "deleted", "")
diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm
index b10c05c942..d0774dc2a5 100644
--- a/code/modules/artifice/deadringer.dm
+++ b/code/modules/artifice/deadringer.dm
@@ -172,7 +172,4 @@
corpse.adjustBruteLoss(H.getBruteLoss())
corpse.UpdateAppearance()
corpse.regenerate_icons()
- for(var/obj/item/organ/internal/I in corpse.internal_organs)
- var/obj/item/organ/internal/G = I
- G.Destroy()
- return
+ QDEL_NULL_LIST(corpse.internal_organs)
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 5953edb77b..0f9060a1af 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -851,6 +851,12 @@
ckeywhitelist = list("pastelprincedan", "hatterhat")
character_name = list("Masumi Maki", "Harold Robinson")
+/datum/gear/fluff/slimecat_rd_plush
+ path = /obj/item/toy/plushie/fluff/slimeowshi
+ display_name = "slimecat RD plushie"
+ ckeywhitelist = list("pastelprincedan")
+ character_name = list("Kiyoshi Maki", "Masumi Maki")
+
// Q CKEYS
// R CKEYS
diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm
index 8b566fe3c9..615e16bf5d 100644
--- a/code/modules/client/preference_setup/loadout/loadout_general.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_general.dm
@@ -53,7 +53,11 @@
/datum/gear/plushie/New()
..()
var/list/plushies = list()
- for(var/obj/item/toy/plushie/plushie_type as anything in subtypesof(/obj/item/toy/plushie) - /obj/item/toy/plushie/therapy)
+ var/list/blacklisted_types = list()
+ // look if theres a better way to do this im all ears
+ blacklisted_types += subtypesof(/obj/item/toy/plushie/therapy)
+ blacklisted_types += subtypesof(/obj/item/toy/plushie/fluff)
+ for(var/obj/item/toy/plushie/plushie_type as anything in subtypesof(/obj/item/toy/plushie) - blacklisted_types)
plushies[initial(plushie_type.name)] = plushie_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(plushies))
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 5292209807..780895db22 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -482,6 +482,12 @@
var/efficiency = 1 - H.get_pressure_weakness(environment.return_pressure()) // You need to have a good seal for effective cooling
var/env_temp = get_environment_temperature() //wont save you from a fire
var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
+ var/thermal_protection = H.get_heat_protection(env_temp) // ... unless you've got a good suit.
+
+ if(thermal_protection < 0.99) //For some reason, < 1 returns false if the value is 1.
+ temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
+ else
+ temp_adj = min(H.bodytemperature - thermostat, max_cooling)
if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision
return
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index e31c546310..a5cf92e706 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -849,6 +849,32 @@
nutriment_desc = list("dryness" = 2, "bread" = 2)
bitesize = 1
+/obj/item/weapon/reagent_containers/food/snacks/carpmeat
+ name = "fillet"
+ desc = "A fillet of carp meat"
+ icon_state = "fishfillet"
+ filling_color = "#FFDEFE"
+ center_of_mass = list("x"=17, "y"=13)
+ bitesize = 6
+
+ var/toxin_type = "carpotoxin"
+ var/toxin_amount = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/carpmeat/Initialize()
+ . = ..()
+ reagents.add_reagent("seafood", 3)
+ if(toxin_type && toxin_amount)
+ reagents.add_reagent(toxin_type, toxin_amount)
+
+/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish
+ desc = "A fillet of fish meat."
+ toxin_type = null
+
+/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
+ desc = "A fillet of sivian fish meat."
+ filling_color = "#2c2cff"
+ color = "#2c2cff"
+
/obj/item/weapon/reagent_containers/food/snacks/crab_legs
name = "steamed crab legs"
desc = "Crab legs steamed and buttered to perfection. One day when the boss gets hungry..."
@@ -873,7 +899,7 @@
/obj/item/weapon/reagent_containers/food/snacks/fishfingers/Initialize()
. = ..()
- reagents.add_reagent("protein", 4)
+ reagents.add_reagent("seafood", 4)
/obj/item/weapon/reagent_containers/food/snacks/zestfish
name = "Zesty Fish"
@@ -885,7 +911,70 @@
/obj/item/weapon/reagent_containers/food/snacks/zestfish/Initialize()
. = ..()
- reagents.add_reagent("protein", 4)
+ reagents.add_reagent("seafood", 4)
+
+/obj/item/weapon/reagent_containers/food/snacks/mushroomslice
+ name = "mushroom slice"
+ desc = "A slice of mushroom."
+ icon_state = "hugemushroomslice"
+ filling_color = "#E0D7C5"
+ center_of_mass = list("x"=17, "y"=16)
+ nutriment_amt = 3
+ nutriment_desc = list("raw" = 2, "mushroom" = 2)
+ bitesize = 6
+
+/obj/item/weapon/reagent_containers/food/snacks/mushroomslice/Initialize()
+ . = ..()
+ reagents.add_reagent("psilocybin", 3)
+
+/obj/item/weapon/reagent_containers/food/snacks/tomatomeat
+ name = "tomato slice"
+ desc = "A slice from a huge tomato"
+ icon_state = "tomatomeat"
+ filling_color = "#DB0000"
+ center_of_mass = list("x"=17, "y"=16)
+ nutriment_amt = 3
+ nutriment_desc = list("raw" = 2, "tomato" = 3)
+ bitesize = 6
+
+/obj/item/weapon/reagent_containers/food/snacks/bearmeat
+ name = "bear meat"
+ desc = "A very manly slab of meat."
+ icon_state = "bearmeat"
+ filling_color = "#DB0000"
+ center_of_mass = list("x"=16, "y"=10)
+ bitesize = 3
+
+/obj/item/weapon/reagent_containers/food/snacks/bearmeat/Initialize()
+ . = ..()
+ reagents.add_reagent("protein", 12)
+ reagents.add_reagent("hyperzine", 5)
+
+/obj/item/weapon/reagent_containers/food/snacks/xenomeat
+ name = "xenomeat"
+ desc = "A slab of green meat. Smells like acid."
+ icon_state = "xenomeat"
+ filling_color = "#43DE18"
+ center_of_mass = list("x"=16, "y"=10)
+ bitesize = 6
+
+/obj/item/weapon/reagent_containers/food/snacks/xenomeat/Initialize()
+ . = ..()
+ reagents.add_reagent("protein", 6)
+ reagents.add_reagent("pacid",6)
+
+/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat // Substitute for recipes requiring xeno meat.
+ name = "spider meat"
+ desc = "A slab of green meat."
+ icon_state = "xenomeat"
+ filling_color = "#43DE18"
+ center_of_mass = list("x"=16, "y"=10)
+ bitesize = 6
+
+/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat/Initialize()
+ . = ..()
+ reagents.add_reagent("spidertoxin",6)
+ reagents.remove_reagent("pacid",6)
/obj/item/weapon/reagent_containers/food/snacks/meatball
name = "meatball"
@@ -3857,7 +3946,8 @@
/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/Initialize()
. = ..()
- reagents.add_reagent("protein", 1)
+ reagents.add_reagent("fishbait", 9)
+ reagents.add_reagent("protein", 3)
/obj/item/weapon/reagent_containers/food/snacks/cutlet
name = "cutlet"
@@ -3869,7 +3959,8 @@
/obj/item/weapon/reagent_containers/food/snacks/cutlet/Initialize()
. = ..()
- reagents.add_reagent("protein", 2)
+ reagents.add_reagent("fishbait", 15)
+ reagents.add_reagent("protein", 5)
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball
name = "raw meatball"
@@ -3881,7 +3972,8 @@
/obj/item/weapon/reagent_containers/food/snacks/rawmeatball/Initialize()
. = ..()
- reagents.add_reagent("protein", 2)
+ reagents.add_reagent("fishbait", 30)
+ reagents.add_reagent("protein", 10)
/obj/item/weapon/reagent_containers/food/snacks/hotdog
name = "hotdog"
diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm
index e7a16f5364..e7c010bc7e 100644
--- a/code/modules/food/food/snacks/meat.dm
+++ b/code/modules/food/food/snacks/meat.dm
@@ -58,37 +58,6 @@
reagents.remove_reagent("triglyceride", INFINITY)
//Chicken is low fat. Less total calories than other meats
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat
- name = "fillet"
- desc = "A fillet of carp meat"
- icon_state = "fishfillet"
- filling_color = "#FFDEFE"
- center_of_mass = list("x"=17, "y"=13)
- bitesize = 6
-
- var/toxin_type = "carpotoxin"
- var/toxin_amount = 3
-
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat/Initialize()
- . = ..()
- reagents.add_reagent("protein", 3)
- reagents.add_reagent(toxin_type, toxin_amount)
-
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
- desc = "A fillet of sivian fish meat."
- filling_color = "#2c2cff"
- color = "#2c2cff"
- toxin_type = "neurotoxic_protein"
- toxin_amount = 2
-
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish
- toxin_type = "murk_protein"
-
-/obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish
- desc = "A fillet of fish meat."
- toxin_type = "neurotoxic_protein"
- toxin_amount = 1
-
/obj/item/weapon/reagent_containers/food/snacks/crabmeat
name = "crustacean legs"
desc = "... Coffee? Is that you?"
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 23029971c4..bc2bfaffb8 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -185,13 +185,17 @@
pocell.charge = pocell.maxcharge
qdel(src)
return
- else if(W.sharp)
+
+ if(W.sharp)
+
if(seed.kitchen_tag == "pumpkin") // Ugggh these checks are awful.
user.show_message("You carve a face into [src]!", 1)
new /obj/item/clothing/head/pumpkinhead (user.loc)
qdel(src)
return
- else if(seed.chems)
+
+ if(seed.chems)
+
if(W.sharp && W.edge && !isnull(seed.chems["woodpulp"]))
user.show_message("You make planks out of \the [src]!", 1)
playsound(src, 'sound/effects/woodcutting.ogg', 50, 1)
@@ -209,36 +213,49 @@
to_chat(user, "You add the newly-formed wood to the stack. It now contains [NG.get_amount()] planks.")
qdel(src)
return
- else if(!isnull(seed.chems["potato"]))
+
+ if(seed.kitchen_tag == "sunflower")
+ new /obj/item/weapon/reagent_containers/food/snacks/rawsunflower(get_turf(src))
+ to_chat(user, SPAN_NOTICE("You remove the seeds from the flower, slightly damaging them."))
+ qdel(src)
+ return
+
+ if(seed.kitchen_tag == "potato" || !isnull(seed.chems["potato"]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(get_turf(src))
qdel(src)
return
- else if(!isnull(seed.chems["carrotjuice"]))
+
+ if(!isnull(seed.chems["carrotjuice"]))
to_chat(user, "You slice \the [src] into sticks.")
new /obj/item/weapon/reagent_containers/food/snacks/carrotfries(get_turf(src))
qdel(src)
return
- else if(!isnull(seed.chems["pineapplejuice"]))
+
+ if(!isnull(seed.chems["pineapplejuice"]))
to_chat(user, "You slice \the [src] into rings.")
new /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring(get_turf(src))
qdel(src)
return
- else if(!isnull(seed.chems["soymilk"]))
+
+ if(!isnull(seed.chems["soymilk"]))
to_chat(user, "You roughly chop up \the [src].")
new /obj/item/weapon/reagent_containers/food/snacks/soydope(get_turf(src))
qdel(src)
return
- else if(seed.get_trait(TRAIT_FLESH_COLOUR))
+
+ if(seed.get_trait(TRAIT_FLESH_COLOUR))
to_chat(user, "You slice up \the [src].")
var/slices = rand(3,5)
var/reagents_to_transfer = round(reagents.total_volume/slices)
for(var/i=1; i<=slices; i++)
var/obj/item/weapon/reagent_containers/food/snacks/fruit_slice/F = new(get_turf(src),seed)
- if(reagents_to_transfer) reagents.trans_to_obj(F,reagents_to_transfer)
+ if(reagents_to_transfer)
+ reagents.trans_to_obj(F,reagents_to_transfer)
qdel(src)
return
- ..()
+
+ . = ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
. = ..()
diff --git a/code/modules/hydroponics/grown_predefined.dm b/code/modules/hydroponics/grown_predefined.dm
index d8187fb24e..643d27030a 100644
--- a/code/modules/hydroponics/grown_predefined.dm
+++ b/code/modules/hydroponics/grown_predefined.dm
@@ -3,6 +3,3 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus
plantname = "ambrosiadeus"
-
-/obj/item/weapon/reagent_containers/food/snacks/grown/sifpod
- plantname = "sifbulb"
diff --git a/code/modules/hydroponics/grown_sif.dm b/code/modules/hydroponics/grown_sif.dm
new file mode 100644
index 0000000000..3075fc148f
--- /dev/null
+++ b/code/modules/hydroponics/grown_sif.dm
@@ -0,0 +1,39 @@
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif
+ var/seeds = 0
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/Initialize(mapload, planttype) // Wild Sifplants have some seeds you can extract with a knife.
+ . = ..()
+ seeds = rand(1, 2)
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/examine(mob/user)
+ . = ..()
+ if(seeds)
+ to_chat(user, SPAN_NOTICE("You can see [seeds] seed\s in \the [src]. You might be able to extract them with a sharp object."))
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/attackby(var/obj/item/weapon/W, var/mob/living/user)
+ if(seed && W.sharp && seeds > 0)
+ var/take_seeds = min(seeds, rand(1,2))
+ seeds -= take_seeds
+ to_chat(user, SPAN_NOTICE("You stick \the [W] into \the [src] and lever out [take_seeds] seed\s."))
+ for(var/i = 1 to take_seeds)
+ new /obj/item/seeds(get_turf(src), seed.name)
+ return
+ . = ..()
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/sifpod
+ plantname = "sifbulb"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/wabback
+ plantname = "wabback"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/blackwabback
+ plantname = "blackwabback"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/wildwabback
+ plantname = "wildwabback"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/eyebulbs
+ plantname = "eyebulbs"
+
+/obj/item/weapon/reagent_containers/food/snacks/grown/sif/cavebulbs
+ plantname = "cavebulbs"
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
index 29b31ebc57..4a08f897da 100644
--- a/code/modules/hydroponics/seed_packets.dm
+++ b/code/modules/hydroponics/seed_packets.dm
@@ -13,7 +13,9 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds)
var/datum/seed/seed
var/modified = 0
-/obj/item/seeds/Initialize()
+/obj/item/seeds/Initialize(var/ml, var/_seed_type)
+ if(_seed_type in SSplants.seeds)
+ seed_type = _seed_type
update_seed()
. = ..()
diff --git a/code/modules/hydroponics/seedtypes/apples.dm b/code/modules/hydroponics/seedtypes/apples.dm
index 7044a0c6dc..4bd8a0bade 100644
--- a/code/modules/hydroponics/seedtypes/apples.dm
+++ b/code/modules/hydroponics/seedtypes/apples.dm
@@ -43,7 +43,7 @@
/datum/seed/apple/sif
name = "sifbulb"
- seed_name = "sivian tree"
+ seed_name = "sivian pod"
display_name = "sivian pod"
kitchen_tag = "apple"
chems = list("nutriment" = list(1,5),"sifsap" = list(10,20))
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
index 4a9e37e30e..7c05176cb9 100644
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ b/code/modules/hydroponics/trays/tray_soil.dm
@@ -32,6 +32,16 @@
/obj/machinery/portable_atmospherics/hydroponics/soil/CanPass()
return 1
+/obj/machinery/portable_atmospherics/hydroponics/soil/attackby(obj/item/O, mob/user)
+ if(istype(O, /obj/item/weapon/shovel) && user.a_intent == I_HURT)
+ user.visible_message(SPAN_NOTICE("\The [user] begins filling in \the [src]."))
+ if(do_after(user, 3 SECONDS) && !QDELETED(src))
+ user.visible_message(SPAN_NOTICE("\The [user] fills in \the [src]."))
+ qdel(src)
+ return
+ . = ..()
+
+
// Holder for vine plants.
// Icons for plants are generated as overlays, so setting it to invisible wouldn't work.
// Hence using a blank icon.
diff --git a/code/modules/materials/materials/organic/wood.dm b/code/modules/materials/materials/organic/wood.dm
index 4702186ad8..d82eab063b 100644
--- a/code/modules/materials/materials/organic/wood.dm
+++ b/code/modules/materials/materials/organic/wood.dm
@@ -45,7 +45,9 @@
new /datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]"),
new /datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"),
new /datum/stack_recipe("painting easel", /obj/structure/easel, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"),
- new /datum/stack_recipe("painting frame", /obj/item/frame/painting, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]")
+ new /datum/stack_recipe("painting frame", /obj/item/frame/painting, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"),
+ new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"),
+ new /datum/stack_recipe("shovel", /obj/item/weapon/shovel/wood, 2, time = 10, on_floor = TRUE, supplied_material = "[name]")
)
/datum/material/wood/sif
diff --git a/code/modules/materials/sheets/organic/tanning/hide.dm b/code/modules/materials/sheets/organic/tanning/hide.dm
index b6b7778132..e8dadfce73 100644
--- a/code/modules/materials/sheets/organic/tanning/hide.dm
+++ b/code/modules/materials/sheets/organic/tanning/hide.dm
@@ -20,7 +20,7 @@
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh")
var/scraped = 0
- while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide
+ while(amount > 0 && do_after(user, 2.5 SECONDS, user))
//Try locating an exisitng stack on the tile and add to there if possible
var/obj/item/stack/hairlesshide/H = null
for(var/obj/item/stack/hairlesshide/HS in user.loc) // Could be scraping something inside a locker, hence the .loc, not get_turf
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 100b7bbe9b..39fd970aff 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -128,6 +128,26 @@
edge = TRUE
var/digspeed = 40
+/obj/item/weapon/shovel/wood
+ icon_state = "whiteshovel"
+ item_state = "whiteshovel"
+ var/datum/material/material
+
+/obj/item/weapon/shovel/wood/Initialize(var/ml, var/_mat)
+ . = ..()
+ material = get_material_by_name(_mat)
+ if(!istype(material))
+ material = null
+ else
+ name = "[material.display_name] shovel"
+ matter = list("[material.name]" = 50)
+ update_icon()
+
+/obj/item/weapon/shovel/wood/update_icon()
+ . = ..()
+ color = material ? material.icon_colour : initial(color)
+ alpha = min(max(255 * material.opacity, 80), 255)
+
/obj/item/weapon/shovel/spade
name = "spade"
desc = "A small tool for digging and moving dirt."
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 9f0442ec0b..332be68e24 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -8,31 +8,34 @@ var/list/mining_overlay_cache = list()
density = TRUE
opacity = 1 // YW edit. Stops all my unsimulated tiles from being seethrough.
+/*
/turf/unsimulated/mineral/ice
name = "Ice wall"
desc = "Frigid Ice that seems to be stronger then most manmade structures"
icon = 'icons/turf/snow_new.dmi'
icon_state = "Icerock"
+*/
-
+
/turf/simulated/mineral //wall piece
name = "rock"
icon = 'icons/turf/walls.dmi'
icon_state = "rock"
- var/rock_side_icon_state = "rock_side"
- var/sand_icon_state = "asteroid"
- var/rock_icon_state = "rock"
- var/random_icon = 0
oxygen = 0
nitrogen = 0
opacity = 1
density = TRUE
blocks_air = 1
temperature = T0C
-
can_dirty = FALSE
+ var/floor_name = "sand"
+ var/rock_side_icon_state = "rock_side"
+ var/sand_icon_state = "asteroid"
+ var/rock_icon_state = "rock"
+ var/random_icon = 0
+
var/ore/mineral
var/sand_dug
var/mined_ore = 0
@@ -74,6 +77,10 @@ var/list/mining_overlay_cache = list()
has_resources = 1
+/turf/simulated/mineral/ChangeTurf(turf/N, tell_universe, force_lighting_update, preserve_outdoors)
+ clear_ore_effects()
+ . = ..()
+
// Alternative rock wall sprites.
/turf/simulated/mineral/light
icon_state = "rock-light"
@@ -118,6 +125,14 @@ var/list/mining_overlay_cache = list()
blocks_air = 0
can_build_into_floor = TRUE
+/turf/simulated/mineral/floor/mud
+ icon_state = "mud"
+ sand_icon_state = "mud"
+
+/turf/simulated/mineral/floor/dirt
+ icon_state = "dirt"
+ sand_icon_state = "dirt"
+
//Alternative sand floor sprite.
/turf/simulated/mineral/floor/light
icon_state = "sand-light"
@@ -149,6 +164,7 @@ var/list/mining_overlay_cache = list()
opacity = 0
blocks_air = 0
can_build_into_floor = TRUE
+ clear_ore_effects()
update_general()
/turf/simulated/mineral/proc/make_wall()
@@ -232,7 +248,7 @@ var/list/mining_overlay_cache = list()
//We are a sand floor
else
- name = "sand"
+ name = floor_name
icon = 'icons/turf/flooring/asteroid.dmi'
icon_state = sand_icon_state
diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm
index a678ff319c..02d36e54f5 100644
--- a/code/modules/mob/freelook/update_triggers.dm
+++ b/code/modules/mob/freelook/update_triggers.dm
@@ -15,6 +15,12 @@
/turf/simulated/Destroy()
updateVisibility(src)
+ if(zone)
+ if(can_safely_remove_from_zone())
+ c_copy_air()
+ zone.remove(src)
+ else
+ zone.rebuild()
return ..()
/turf/simulated/Initialize()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 91a30f0b42..9d3b6753ac 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -21,6 +21,16 @@
#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
+#define COLD_ALERT_SEVERITY_LOW 1 // Constants passed to the cold and heat alerts.
+#define COLD_ALERT_SEVERITY_MODERATE 2
+#define COLD_ALERT_SEVERITY_MAX 3
+#define ENVIRONMENT_COMFORT_MARKER_COLD 1
+
+#define HOT_ALERT_SEVERITY_LOW 1
+#define HOT_ALERT_SEVERITY_MODERATE 2
+#define HOT_ALERT_SEVERITY_MAX 3
+#define ENVIRONMENT_COMFORT_MARKER_HOT 2
+
#define RADIATION_SPEED_COEFFICIENT 0.1
#define HUMAN_COMBUSTION_TEMP 524 //524k is the sustained combustion temperature of human fat
@@ -564,7 +574,7 @@
// Hot air hurts :(
- if((breath.temperature < species.breath_cold_level_1 || breath.temperature > species.breath_heat_level_1) && !(COLD_RESISTANCE in mutations))
+ if((breath.temperature <= species.cold_discomfort_level || breath.temperature >= species.heat_discomfort_level) && !(COLD_RESISTANCE in mutations))
if(breath.temperature <= species.breath_cold_level_1)
if(prob(20))
@@ -573,27 +583,37 @@
if(prob(20))
to_chat(src, "You feel your face burning and a searing heat in your lungs!")
- if(breath.temperature >= species.breath_heat_level_1)
- if(breath.temperature < species.breath_heat_level_2)
- apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Heat")
- throw_alert("temp", /obj/screen/alert/hot, 1)
- else if(breath.temperature < species.breath_heat_level_3)
- apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Heat")
- throw_alert("temp", /obj/screen/alert/hot, 2)
- else
+ if(breath.temperature >= species.heat_discomfort_level)
+
+ if(breath.temperature >= species.breath_heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Heat")
- throw_alert("temp", /obj/screen/alert/hot, 3)
-
- else if(breath.temperature <= species.breath_cold_level_1)
- if(breath.temperature > species.breath_cold_level_2)
- apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold")
- throw_alert("temp", /obj/screen/alert/cold, 1)
- else if(breath.temperature > species.breath_cold_level_3)
- apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold")
- throw_alert("temp", /obj/screen/alert/cold, 2)
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MAX)
+ else if(breath.temperature >= species.breath_heat_level_2)
+ apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Heat")
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MODERATE)
+ else if(breath.temperature >= species.breath_heat_level_1)
+ apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Heat")
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_LOW)
+ else if(species.get_environment_discomfort(src, ENVIRONMENT_COMFORT_MARKER_HOT))
+ throw_alert("temp", /obj/screen/alert/warm, HOT_ALERT_SEVERITY_LOW)
else
+ clear_alert("temp")
+
+ else if(breath.temperature <= species.cold_discomfort_level)
+
+ if(breath.temperature <= species.breath_cold_level_3)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Cold")
- throw_alert("temp", /obj/screen/alert/cold, 3)
+ throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MAX)
+ else if(breath.temperature <= species.breath_cold_level_2)
+ apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold")
+ throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_LOW)
+ else if(breath.temperature <= species.breath_cold_level_1)
+ apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold")
+ throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MODERATE)
+ else if(species.get_environment_discomfort(src, ENVIRONMENT_COMFORT_MARKER_COLD))
+ throw_alert("temp", /obj/screen/alert/chilly, COLD_ALERT_SEVERITY_LOW)
+ else
+ clear_alert("temp")
//breathing in hot/cold air also heats/cools you a bit
var/temp_adj = breath.temperature - bodytemperature
@@ -605,15 +625,12 @@
var/relative_density = breath.total_moles / (MOLES_CELLSTANDARD * BREATH_PERCENTAGE)
temp_adj *= relative_density
- if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX
- if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX
- //to_world("Breath: [breath.temperature], [src]: [bodytemperature], Adjusting: [temp_adj]")
- bodytemperature += temp_adj
+ if(temp_adj > BODYTEMP_HEATING_MAX)
+ temp_adj = BODYTEMP_HEATING_MAX
+ if(temp_adj < BODYTEMP_COOLING_MAX)
+ temp_adj = BODYTEMP_COOLING_MAX
- else if(breath.temperature >= species.heat_discomfort_level)
- species.get_environment_discomfort(src,"heat")
- else if(breath.temperature <= species.cold_discomfort_level)
- species.get_environment_discomfort(src,"cold")
+ bodytemperature += temp_adj
else
clear_alert("temp")
@@ -690,13 +707,13 @@
if(bodytemperature >= species.heat_level_2)
if(bodytemperature >= species.heat_level_3)
burn_dam = HEAT_DAMAGE_LEVEL_3
- throw_alert("temp", /obj/screen/alert/hot, 3)
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MAX)
else
burn_dam = HEAT_DAMAGE_LEVEL_2
- throw_alert("temp", /obj/screen/alert/hot, 2)
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MODERATE)
else
burn_dam = HEAT_DAMAGE_LEVEL_1
- throw_alert("temp", /obj/screen/alert/hot, 1)
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_LOW)
take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature")
diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm
index 23c2de457f..bcb9de1f29 100644
--- a/code/modules/mob/living/carbon/human/species/species_getters.dm
+++ b/code/modules/mob/living/carbon/human/species/species_getters.dm
@@ -79,9 +79,6 @@
/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type)
- if(!prob(10))
- return
-
/* // Commented out because clothes should not prevent you from feeling cold if your body temperature has already dropped. You can absolutely feel cold through clothing, and feel too warm without clothing. ???
var/covered = 0 // Basic coverage can help.
for(var/obj/item/clothing/clothes in H)
@@ -92,11 +89,15 @@
break
*/
- switch(msg_type)
- if("cold")
- to_chat(H, "[pick(cold_discomfort_strings)]")
- if("heat")
- to_chat(H, "[pick(heat_discomfort_strings)]")
+ var/discomfort_message
+ if(msg_type == ENVIRONMENT_COMFORT_MARKER_COLD && length(cold_discomfort_strings) /*&& !covered*/)
+ discomfort_message = pick(cold_discomfort_strings)
+ else if(msg_type == ENVIRONMENT_COMFORT_MARKER_HOT && length(heat_discomfort_strings) /*&& covered*/)
+ discomfort_message = pick(heat_discomfort_strings)
+
+ if(discomfort_message && prob(5))
+ to_chat(H, SPAN_DANGER(discomfort_message))
+ return !!discomfort_message
/datum/species/proc/get_random_name(var/gender)
if(!name_language)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 83bf0a8b1e..3d6ebe9739 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -263,15 +263,15 @@
if(environment)
switch(environment.temperature) //310.055 optimal body temp
if(400 to INFINITY)
- throw_alert("temp", /obj/screen/alert/hot/robot, 2)
+ throw_alert("temp", /obj/screen/alert/hot/robot, HOT_ALERT_SEVERITY_MODERATE)
if(360 to 400)
- throw_alert("temp", /obj/screen/alert/hot/robot, 1)
+ throw_alert("temp", /obj/screen/alert/hot/robot, HOT_ALERT_SEVERITY_LOW)
if(260 to 360)
clear_alert("temp")
if(200 to 260)
- throw_alert("temp", /obj/screen/alert/cold/robot, 1)
+ throw_alert("temp", /obj/screen/alert/cold/robot, COLD_ALERT_SEVERITY_LOW)
else
- throw_alert("temp", /obj/screen/alert/cold/robot, 2)
+ throw_alert("temp", /obj/screen/alert/cold/robot, COLD_ALERT_SEVERITY_MODERATE)
//Oxygen and fire does nothing yet!!
// if (src.oxygen) src.oxygen.icon_state = "oxy[src.oxygen_alert ? 1 : 0]"
diff --git a/code/modules/mob/living/simple_mob/life.dm b/code/modules/mob/living/simple_mob/life.dm
index ebe36b48f0..f8d833a480 100644
--- a/code/modules/mob/living/simple_mob/life.dm
+++ b/code/modules/mob/living/simple_mob/life.dm
@@ -156,10 +156,10 @@
//Atmos effect
if(bodytemperature < minbodytemp)
adjustFireLoss(cold_damage_per_tick)
- throw_alert("temp", /obj/screen/alert/cold, 3)
+ throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MAX)
else if(bodytemperature > maxbodytemp)
adjustFireLoss(heat_damage_per_tick)
- throw_alert("temp", /obj/screen/alert/hot, 3)
+ throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MAX)
else
clear_alert("temp")
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
index 8608c6f7a7..582b304935 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/fish.dm
@@ -132,7 +132,7 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/javelin)
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
/datum/category_item/catalogue/fauna/icebass
name = "Sivian Fauna - Glitter Bass"
@@ -159,7 +159,7 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/icebass)
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
var/max_red = 150
var/min_red = 50
@@ -248,7 +248,7 @@
var/image/head_image
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
/mob/living/simple_mob/animal/passive/fish/rockfish/Initialize()
. = ..()
@@ -295,7 +295,7 @@
has_eye_glow = TRUE
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/fish/sif
/datum/category_item/catalogue/fauna/murkin
name = "Sivian Fauna - Murkfish"
@@ -325,4 +325,4 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat/sif/murkfish
/decl/mob_organ_names/fish
- hit_zones = list("head", "body", "dorsal fin", "left pectoral fin", "right pectoral fin", "tail fin")
+ hit_zones = list("head", "body", "dorsal fin", "left pectoral fin", "right pectoral fin", "tail fin")
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index 65acf1d25a..5eb6a57deb 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -809,6 +809,22 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/ears/rabbit_swept
+ name = "Rabbit Ears (swept back)"
+ desc = ""
+ icon = 'icons/mob/vore/ears_32x64.dmi'
+ icon_state = "rabbit-swept"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/antlers_large
+ name = "Antlers (large)"
+ desc = ""
+ icon = 'icons/mob/vore/ears_32x64.dmi'
+ icon_state = "antlers_large"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/datum/sprite_accessory/ears/kittyr
name = "kitty right only, colorable"
icon = 'icons/mob/vore/ears_uneven.dmi'
diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm
index 7a3a4da632..65014be37f 100644
--- a/code/modules/modular_computers/hardware/network_card.dm
+++ b/code/modules/modular_computers/hardware/network_card.dm
@@ -103,7 +103,7 @@ var/global/ntnet_card_uid = 1
var/holderz = get_z(holder2)
if(!holderz) //no reception in nullspace
return 0
- var/list/zlevels_in_range = using_map.get_map_levels(holderz, FALSE)
+ var/list/zlevels_in_range = using_map.get_map_levels(holderz, FALSE)// VOREStation Edit - , om_range = DEFAULT_OVERMAP_RANGE)
var/list/zlevels_in_long_range = using_map.get_map_levels(holderz, TRUE, om_range = DEFAULT_OVERMAP_RANGE) - zlevels_in_range
var/best = 0
for(var/obj/machinery/ntnet_relay/R as anything in ntnet_global.relays)
diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm
index 4c16b991bc..a76a39b60e 100644
--- a/code/modules/overmap/ships/landable.dm
+++ b/code/modules/overmap/ships/landable.dm
@@ -199,11 +199,10 @@
switch(status)
if(SHIP_STATUS_LANDED)
var/obj/effect/overmap/visitable/location = loc
- if(istype(loc, /obj/effect/overmap/visitable/sector))
- return "Landed on \the [location.name]. Use secondary thrust to get clear before activating primary engines."
- if(istype(loc, /obj/effect/overmap/visitable/ship))
+ if(location.in_space)
return "Docked with \the [location.name]. Use secondary thrust to get clear before activating primary engines."
- return "Docked with an unknown object."
+ else
+ return "Landed on \the [location.name]. Use secondary thrust to get clear before activating primary engines."
if(SHIP_STATUS_TRANSIT)
return "Maneuvering under secondary thrust."
if(SHIP_STATUS_OVERMAP)
diff --git a/code/modules/overmap/spacetravel.dm b/code/modules/overmap/spacetravel.dm
index ae1bca7335..4d24fd7039 100644
--- a/code/modules/overmap/spacetravel.dm
+++ b/code/modules/overmap/spacetravel.dm
@@ -14,6 +14,9 @@
// But pick an empty z level to use
map_z += global.using_map.get_empty_zlevel()
. = ..()
+ if(!map_z[1])
+ log_and_message_admins("Could not create empty sector at [x], [y]. No available z levels to allocate.")
+ return INITIALIZE_HINT_QDEL
testing("Temporary sector at [x],[y],[z] was created, corresponding zlevel is [english_list(map_z)].")
/obj/effect/overmap/visitable/sector/temporary/Destroy()
@@ -22,6 +25,9 @@
testing("Temporary sector at [x],[y] was destroyed, returning empty zlevel [map_z[1]] to map datum.")
return ..()
+/obj/effect/overmap/visitable/sector/temporary/find_z_levels()
+ LAZYADD(map_z, global.using_map.get_empty_zlevel())
+
/obj/effect/overmap/visitable/sector/temporary/proc/is_empty(var/mob/observer)
if(!LAZYLEN(map_z))
log_and_message_admins("CANARY: [src] tried to check is_empty, but map_z is `[map_z || "null"]`")
@@ -44,7 +50,10 @@
var/obj/effect/overmap/visitable/sector/temporary/res = locate() in overmap_turf
if(istype(res))
return res
- return new /obj/effect/overmap/visitable/sector/temporary(overmap_turf)
+ res = new /obj/effect/overmap/visitable/sector/temporary(overmap_turf)
+ if(QDELETED(res))
+ res = null
+ return res
/atom/movable/proc/lost_in_space()
for(var/atom/movable/AM in contents)
@@ -130,8 +139,10 @@
if(O != M && O.in_space && prob(50))
TM = O
break
- if(!TM)
+ if(!istype(TM))
TM = get_deepspace(M.x,M.y)
+ if(!istype(TM))
+ return
nz = pick(TM.get_space_zlevels())
testing("spacetravel chose [nz],[ny],[nz] in sector [TM] @ ([TM.x],[TM.y],[TM.z])")
@@ -143,5 +154,7 @@
var/mob/D = A
if(D.pulling)
D.pulling.forceMove(dest)
+ else
+ to_world("CANARY: Could not move [A] to [nx], [ny], [nz]: [dest ? "[dest]" : "null"]")
M.cleanup()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index a22149f752..f727c2db10 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -105,11 +105,16 @@
return
-/obj/item/weapon/paper/Initialize(mapload)
- . = ..()
+/obj/item/weapon/paper/Initialize(mapload, var/text, var/title)
+ . = ..()
- if(mapload) // Jank, but we do this to prevent maploaded papers from somehow stacking across rounds if re-added to the board by a player.
- was_maploaded = TRUE
+ if(istext(title))
+ name = title
+ if(istext(text))
+ info = text
+
+ if(mapload) // Jank, but we do this to prevent maploaded papers from somehow stacking across rounds if re-added to the board by a player.
+ was_maploaded = TRUE
/obj/item/weapon/paper/New(var/newloc, var/text, var/title)
..()
diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm
index d36e7a80a1..a563f16c11 100644
--- a/code/modules/random_map/random_map.dm
+++ b/code/modules/random_map/random_map.dm
@@ -24,6 +24,9 @@ var/global/list/map_count = list()
var/floor_type = /turf/simulated/floor
var/target_turf_type
+ var/skip_dense = FALSE
+ var/keep_outside = FALSE
+
// Storage for the final iteration of the map.
var/list/map = list() // Actual map.
@@ -61,11 +64,16 @@ var/global/list/map_count = list()
rand_seed(seed)
priority_process = 1
+ var/failed = FALSE
for(var/i = 0;i[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG)
- return
- if(!do_not_announce) admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG)
+ if(!generate())
+ failed = TRUE
+
+ if(!do_not_announce)
+ if(!failed)
+ admin_notice("[capitalize(name)] generation completed in [round(0.1*(world.timeofday-start_time),0.1)] seconds.", R_DEBUG)
+ else
+ admin_notice("[capitalize(name)] failed to generate ([round(0.1*(world.timeofday-start_time),0.1)] seconds): could not produce sane map.", R_DEBUG)
/datum/random_map/proc/get_map_cell(var/x,var/y)
if(!map)
@@ -162,11 +170,11 @@ var/global/list/map_count = list()
if(!current_cell)
return 0
var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z)
- if(!T || (target_turf_type && !istype(T,target_turf_type)))
+ if(!T || (skip_dense && T.density) || (target_turf_type && !istype(T,target_turf_type)))
return 0
var/newpath = get_appropriate_path(map[current_cell])
if(newpath)
- T.ChangeTurf(newpath)
+ T.ChangeTurf(newpath, preserve_outdoors = keep_outside)
get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y))
return T
diff --git a/code/modules/reagents/machinery/pump.dm b/code/modules/reagents/machinery/pump.dm
new file mode 100644
index 0000000000..6c9302d61e
--- /dev/null
+++ b/code/modules/reagents/machinery/pump.dm
@@ -0,0 +1,205 @@
+/obj/machinery/pump
+ name = "fluid pump"
+ desc = "A fluid pumping machine."
+
+ description_info = "A machine that can pump fluid from certain turfs.
\
+ Water can be pumped from any body of water. Certain locations or environmental\
+ conditions can cause different byproducts to be produced.
\
+ Magma or Lava can be pumped to produce mineralized fluid."
+
+ anchored = 0
+ density = 1
+
+ icon = 'icons/obj/machines/reagent.dmi'
+ icon_state = "pump"
+
+ circuit = /obj/item/weapon/circuitboard/fluidpump
+ active_power_usage = 200 * CELLRATE
+
+ var/obj/item/weapon/cell/cell = null
+ var/obj/item/hose_connector/output/Output = null
+ var/reagents_per_cycle = 40
+ var/on = 0
+ var/unlocked = 0
+ var/open = 0
+
+/obj/machinery/pump/Initialize()
+ create_reagents(200)
+ . = ..()
+ default_apply_parts()
+ cell = default_use_hicell()
+
+ Output = new(src)
+
+ RefreshParts()
+ update_icon()
+
+/obj/machinery/pump/Destroy()
+ QDEL_NULL(cell)
+ QDEL_NULL(Output)
+ . = ..()
+
+/obj/machinery/pump/RefreshParts()
+ var/obj/item/weapon/stock_parts/manipulator/SM = locate() in component_parts
+ active_power_usage = initial(active_power_usage) / SM.rating
+
+ var/motor_power = 0
+ for(var/obj/item/weapon/stock_parts/motor/M in component_parts)
+ motor_power += M.rating
+ reagents_per_cycle = initial(reagents_per_cycle) * motor_power / 2
+
+ var/bin_size = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/SB in component_parts)
+ bin_size += SB.rating
+
+ // New holder might have different volume. Transfer everything to a new holder to account for this.
+ var/datum/reagents/R = new(round(initial(reagents.maximum_volume) + 100 * bin_size), src)
+ src.reagents.trans_to_holder(R, src.reagents.total_volume)
+ qdel(src.reagents)
+ src.reagents = R
+
+/obj/machinery/pump/update_icon()
+ ..()
+ cut_overlays()
+ add_overlay("[icon_state]-tank")
+ if(!(cell?.check_charge(active_power_usage)))
+ add_overlay("[icon_state]-lowpower")
+
+ if(reagents.total_volume >= 1)
+ var/image/I = image(icon, "[icon_state]-volume")
+ I.color = reagents.get_color()
+ add_overlay(I)
+ add_overlay("[icon_state]-glass")
+
+ if(open)
+ add_overlay("[icon_state]-open")
+ if(istype(cell))
+ add_overlay("[icon_state]-cell")
+
+ icon_state = "[initial(icon_state)][on ? "-running" : ""]"
+
+/obj/machinery/pump/process()
+ if(!on)
+ return
+
+ if(!anchored || !(cell?.use(active_power_usage)))
+ set_state(FALSE)
+ return
+
+ var/turf/T = get_turf(src)
+ if(!istype(T))
+ return
+ T.pump_reagents(reagents, reagents_per_cycle)
+ update_icon()
+
+ if(Output.get_pairing())
+ reagents.trans_to_holder(Output.reagents, Output.reagents.maximum_volume)
+ if(prob(5))
+ visible_message("\The [src] gurgles as it pumps fluid.")
+
+
+// Sets the power state, if possible.
+// Returns TRUE/FALSE on power state changing
+// var/target = target power state
+// var/message = TRUE/FALSE whether to make a message about state change
+/obj/machinery/pump/proc/set_state(var/target, var/message = TRUE)
+ if(target == on)
+ return FALSE
+
+ if(!on && (!(cell?.check_charge(active_power_usage)) || !anchored))
+ return FALSE
+
+ on = !on
+ update_icon()
+ if(message)
+ if(on)
+ message = SPAN_NOTICE("\The [src] turns on.")
+ else
+ message = SPAN_NOTICE("\The [src] shuts down.")
+ visible_message(message)
+ return TRUE
+
+/obj/machinery/pump/attack_robot(mob/user)
+ return attack_hand(user)
+
+/obj/machinery/pump/attack_ai(mob/user)
+ if(!set_state(!on))
+ to_chat(user, "You try to toggle \the [src] but it does not respond.")
+
+/obj/machinery/pump/attack_hand(mob/user)
+ if(open && istype(cell))
+ user.put_in_hands(cell)
+ cell.add_fingerprint(user)
+ cell.update_icon()
+ cell = null
+ set_state(FALSE)
+ to_chat(user, "You remove the power cell.")
+ return
+
+ if(!set_state(!on))
+ to_chat(user, "You try to toggle \the [src] but it does not respond.")
+
+/obj/machinery/pump/attackby(obj/item/weapon/W, mob/user)
+ . = TRUE
+ if(W.is_screwdriver() && !open)
+ to_chat(user, SPAN_NOTICE("You [unlocked ? "screw" : "unscrew"] the battery panel."))
+ unlocked = !unlocked
+
+ else if(W.is_crowbar() && unlocked)
+ to_chat(user, open ? \
+ "You crowbar the battery panel in place." : \
+ "You remove the battery panel." \
+ )
+ open = !open
+
+ else if(W.is_wrench())
+ if(on)
+ to_chat(user, "\The [src] is active. Turn it off before trying to move it!")
+ return FALSE
+ default_unfasten_wrench(user, W, 2 SECONDS)
+
+ else if(istype(W, /obj/item/weapon/cell) && open)
+ if(istype(cell))
+ to_chat(user, "There is a power cell already installed.")
+ return FALSE
+ user.drop_from_inventory(W, src)
+ to_chat(user, "You insert the power cell.")
+
+ else
+ . = ..()
+
+ RefreshParts()
+ update_icon()
+
+
+/turf/proc/pump_reagents()
+ return
+
+/turf/simulated/floor/lava/pump_reagents(var/datum/reagents/R, var/volume)
+ . = ..()
+ R.add_reagent("mineralizedfluid", round(volume / 2, 0.1))
+
+
+/turf/simulated/floor/water/pump_reagents(var/datum/reagents/R, var/volume)
+ . = ..()
+ R.add_reagent("water", round(volume, 0.1))
+
+ if(temperature <= T0C)
+ R.add_reagent("ice", round(volume / 2, 0.1))
+
+ for(var/turf/simulated/mineral/M in orange(5))
+ if(istype(M.mineral, /obj/effect/mineral))
+ var/obj/effect/mineral/ore = M.mineral
+ reagents.add_reagent(ore.ore_reagent, round(volume / 2, 0.1))
+
+/turf/simulated/floor/water/pool/pump_reagents(var/datum/reagents/R, var/volume)
+ . = ..()
+ R.add_reagent("chlorine", round(volume / 10, 0.1))
+
+/turf/simulated/floor/water/deep/pool/pump_reagents(var/datum/reagents/R, var/volume)
+ . = ..()
+ R.add_reagent("chlorine", round(volume / 10, 0.1))
+
+/turf/simulated/floor/water/contaminated/pump_reagents(var/datum/reagents/R, var/volume)
+ . = ..()
+ R.add_reagent("vatstabilizer", round(volume / 2, 0.1))
\ No newline at end of file
diff --git a/code/modules/reagents/reactions/instant/instant.dm b/code/modules/reagents/reactions/instant/instant.dm
index 99296a04a6..05bcb5bd20 100644
--- a/code/modules/reagents/reactions/instant/instant.dm
+++ b/code/modules/reagents/reactions/instant/instant.dm
@@ -1122,14 +1122,12 @@
name = "Neutralize Carpotoxin"
id = "carpotoxin_neutral"
result = "protein"
- required_reagents = list("radium" = 1, "carpotoxin" = 1, "sifsap" = 1)
- catalysts = list("sifsap" = 10)
- result_amount = 2
+ required_reagents = list("enzyme" = 1, "carpotoxin" = 1, "sifsap" = 1)
+ result_amount = 1
/decl/chemical_reaction/instant/neutralize_spidertoxin
name = "Neutralize Spidertoxin"
id = "spidertoxin_neutral"
result = "protein"
- required_reagents = list("radium" = 1, "spidertoxin" = 1, "sifsap" = 1)
- catalysts = list("sifsap" = 10)
- result_amount = 2
\ No newline at end of file
+ required_reagents = list("enzyme" = 1, "spidertoxin" = 1, "sifsap" = 1)
+ result_amount = 1
\ No newline at end of file
diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm
index 0c002c3be8..98ada320e2 100644
--- a/code/modules/reagents/reagents/_reagents.dm
+++ b/code/modules/reagents/reagents/_reagents.dm
@@ -48,12 +48,15 @@
// This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing.
/datum/reagent/proc/touch_mob(var/mob/M, var/amount)
+ SEND_SIGNAL(M, COMSIG_REAGENTS_TOUCH, src, amount)
return
/datum/reagent/proc/touch_obj(var/obj/O, var/amount) // Acid melting, cleaner cleaning, etc
+ SEND_SIGNAL(O, COMSIG_REAGENTS_TOUCH, src, amount)
return
/datum/reagent/proc/touch_turf(var/turf/T, var/amount) // Cleaner cleaning, lube lubbing, etc, all go here
+ SEND_SIGNAL(T, COMSIG_REAGENTS_TOUCH, src, amount)
return
/datum/reagent/proc/on_mob_life(var/mob/living/carbon/M, var/alien, var/datum/reagents/metabolism/location) // Currently, on_mob_life is called on carbons. Any interaction with non-carbon mobs (lube) will need to be done in touch_mob.
diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm
index 4b2744c823..901b803cbb 100644
--- a/code/modules/reagents/reagents/core.dm
+++ b/code/modules/reagents/reagents/core.dm
@@ -31,6 +31,9 @@
/datum/reagent/blood/touch_turf(var/turf/simulated/T)
if(!istype(T) || volume < 3)
return
+
+ ..()
+
if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human))
blood_splatter(T, src, 1)
else if(istype(data["donor"], /mob/living/carbon/alien))
@@ -169,6 +172,8 @@
if(!istype(T))
return
+ ..()
+
var/datum/gas_mixture/environment = T.return_air()
var/min_temperature = T0C + 100 // 100C, the boiling point of water
@@ -190,14 +195,19 @@
T.wet_floor(1)
/datum/reagent/water/touch_obj(var/obj/O, var/amount)
+ ..()
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
+ else if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/cube))
+ var/obj/item/weapon/reagent_containers/food/snacks/cube/cube = O
+ cube.Expand()
else
O.water_act(amount / 5)
/datum/reagent/water/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
// First, kill slimes.
if(istype(L, /mob/living/simple_mob/slime))
@@ -252,6 +262,7 @@
glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
/datum/reagent/fuel/touch_turf(var/turf/T, var/amount)
+ ..()
new /obj/effect/decal/cleanable/liquid_fuel(T, amount, FALSE)
remove_self(amount)
return
@@ -261,5 +272,6 @@
M.adjustToxLoss(4 * removed)
/datum/reagent/fuel/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 10) // Splashing people with welding fuel to make them easy to ignite!
diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm
index b243a4768c..e64d00ba9d 100644
--- a/code/modules/reagents/reagents/dispenser.dm
+++ b/code/modules/reagents/reagents/dispenser.dm
@@ -49,6 +49,7 @@
M.ingested.remove_reagent(R.id, removed * effect)
/datum/reagent/carbon/touch_turf(var/turf/T)
+ ..()
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, T)
if (!dirtoverlay)
@@ -106,6 +107,7 @@
allergen_factor = 0.5 //simulates mixed drinks containing less of the allergen, as they have only a single actual reagent unlike food
/datum/reagent/ethanol/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 15)
@@ -199,6 +201,7 @@
M.hallucination = max(M.hallucination, halluci)
/datum/reagent/ethanol/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/item/weapon/paper))
var/obj/item/weapon/paper/paperaffected = O
paperaffected.clearpaper()
@@ -342,6 +345,7 @@
M.adjustToxLoss(100)
/datum/reagent/radium/touch_turf(var/turf/T)
+ ..()
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T)
@@ -430,6 +434,7 @@
M.take_organ_damage(0, removed * power * 0.1) // Balance. The damage is instant, so it's weaker. 10 units -> 5 damage, double for pacid. 120 units beaker could deal 60, but a) it's burn, which is not as dangerous, b) it's a one-use weapon, c) missing with it will splash it over the ground and d) clothes give some protection, so not everything will hit
/datum/reagent/acid/touch_obj(var/obj/O)
+ ..()
if(O.unacidable)
return
if((istype(O, /obj/item) || istype(O, /obj/effect/plant)) && (volume > meltdose))
diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm
index 8de9abd0b3..b72aafbacd 100644
--- a/code/modules/reagents/reagents/food_drinks.dm
+++ b/code/modules/reagents/reagents/food_drinks.dm
@@ -170,6 +170,8 @@
if(!istype(T))
return
+ ..()
+
var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space))
var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles)
@@ -386,6 +388,7 @@
allergen_type = ALLERGEN_GRAINS //Flour is made from grain
/datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T)
+ ..()
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/flour(T)
@@ -565,6 +568,7 @@
glass_desc = "Durian paste. It smells horrific."
/datum/reagent/nutriment/durian/touch_mob(var/mob/M, var/amount)
+ ..()
if(iscarbon(M) && !M.isSynthetic())
var/message = pick("Oh god, it smells disgusting here.", "What is that stench?", "That's an awful odor.")
to_chat(M, "[message]")
@@ -574,6 +578,7 @@
return ..()
/datum/reagent/nutriment/durian/touch_turf(var/turf/T, var/amount)
+ ..()
if(istype(T))
var/obj/effect/decal/cleanable/chemcoating/C = new /obj/effect/decal/cleanable/chemcoating(T)
C.reagents.add_reagent(id, amount)
diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm
index 66c9ad45d1..a7c0ad5911 100644
--- a/code/modules/reagents/reagents/medicine.dm
+++ b/code/modules/reagents/reagents/medicine.dm
@@ -346,6 +346,7 @@
M.adjustToxLoss(3 * removed)
/datum/reagent/tricorlidaze/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5)
var/obj/item/stack/medical/bruise_pack/C = O
var/packname = C.name
@@ -1272,6 +1273,7 @@
M.add_chemical_effect(CE_PAINKILLER, 20 * M.species.chem_strength_pain) // 5 less than paracetamol.
/datum/reagent/spacomycaze/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/item/stack/medical/crude_pack) && round(volume) >= 1)
var/obj/item/stack/medical/crude_pack/C = O
var/packname = C.name
@@ -1308,10 +1310,12 @@
M.adjustToxLoss(2 * removed)
/datum/reagent/sterilizine/touch_obj(var/obj/O)
+ ..()
O.germ_level -= min(volume*20, O.germ_level)
O.was_bloodied = null
/datum/reagent/sterilizine/touch_turf(var/turf/T)
+ ..()
T.germ_level -= min(volume*20, T.germ_level)
for(var/obj/item/I in T.contents)
I.was_bloodied = null
@@ -1325,6 +1329,7 @@
//VOREstation edit end
/datum/reagent/sterilizine/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
if(istype(L, /mob/living/simple_mob/slime))
var/mob/living/simple_mob/slime/S = L
diff --git a/code/modules/reagents/reagents/modifiers.dm b/code/modules/reagents/reagents/modifiers.dm
index bed5da5f47..22b1f047c7 100644
--- a/code/modules/reagents/reagents/modifiers.dm
+++ b/code/modules/reagents/reagents/modifiers.dm
@@ -42,6 +42,7 @@
affect_blood(M, alien, removed * 0.6)
/datum/reagent/modapplying/cryofluid/touch_mob(var/mob/M, var/amount)
+ ..()
if(isliving(M))
var/mob/living/L = M
for(var/I = 1 to rand(1, round(amount + 1)))
@@ -49,6 +50,7 @@
return
/datum/reagent/modapplying/cryofluid/touch_turf(var/turf/T, var/amount)
+ ..()
if(istype(T, /turf/simulated/floor/water) && prob(amount))
T.visible_message("\The [T] crackles loudly as the cryogenic fluid causes it to boil away, leaving behind a hard layer of ice.")
T.ChangeTurf(/turf/simulated/floor/outdoors/ice, 1, 1, TRUE)
diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm
index 6b219ae243..02538a8373 100644
--- a/code/modules/reagents/reagents/other.dm
+++ b/code/modules/reagents/reagents/other.dm
@@ -114,14 +114,17 @@
color_weight = 20
/datum/reagent/paint/touch_turf(var/turf/T)
+ ..()
if(istype(T) && !istype(T, /turf/space))
T.color = color
/datum/reagent/paint/touch_obj(var/obj/O)
+ ..()
if(istype(O))
O.color = color
/datum/reagent/paint/touch_mob(var/mob/M)
+ ..()
if(istype(M) && !istype(M, /mob/observer)) //painting ghosts: not allowed
M.color = color //maybe someday change this to paint only clothes and exposed body parts for human mobs.
@@ -267,6 +270,7 @@
M.apply_effect(5 * removed, IRRADIATE, 0)
/datum/reagent/uranium/touch_turf(var/turf/T)
+ ..()
if(volume >= 3)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T)
@@ -288,7 +292,7 @@
name = "Lithium-6"
id = "lithium6"
description = "An isotope of lithium. It has 3 neutrons, but shares all chemical characteristics with regular lithium."
-
+
/datum/reagent/helium/helium3
name = "Helium-3"
id = "helium3"
@@ -321,11 +325,11 @@
/datum/reagent/supermatter/affect_ingest(mob/living/carbon/M, alien, removed)
. = ..()
M.ash()
-
+
/datum/reagent/supermatter/affect_blood(mob/living/carbon/M, alien, removed)
. = ..()
M.ash()
-
+
/datum/reagent/adrenaline
name = "Adrenaline"
@@ -361,6 +365,7 @@
cult.remove_antagonist(M.mind)
/datum/reagent/water/holywater/touch_turf(var/turf/T)
+ ..()
if(volume >= 5)
T.holy = 1
return
@@ -408,6 +413,7 @@
touch_met = 50
/datum/reagent/thermite/touch_turf(var/turf/T)
+ ..()
if(volume >= 5)
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
@@ -417,6 +423,7 @@
return
/datum/reagent/thermite/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 5)
@@ -433,14 +440,17 @@
touch_met = 50
/datum/reagent/space_cleaner/touch_mob(var/mob/M)
+ ..()
if(iscarbon(M))
var/mob/living/carbon/C = M
C.clean_blood()
/datum/reagent/space_cleaner/touch_obj(var/obj/O)
+ ..()
O.clean_blood()
/datum/reagent/space_cleaner/touch_turf(var/turf/T)
+ ..()
if(volume >= 1)
if(istype(T, /turf/simulated))
var/turf/simulated/S = T
@@ -488,6 +498,7 @@
M.vomit()
/datum/reagent/space_cleaner/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L, /mob/living/carbon/human))
var/mob/living/carbon/human/H = L
if(H.wear_mask)
@@ -506,6 +517,7 @@
color = "#009CA8"
/datum/reagent/lube/touch_turf(var/turf/simulated/T)
+ ..()
if(!istype(T))
return
if(volume >= 1)
@@ -520,6 +532,7 @@
color = "#C7FFFF"
/datum/reagent/silicate/touch_obj(var/obj/O)
+ ..()
if(istype(O, /obj/structure/window))
var/obj/structure/window/W = O
W.apply_silicate(volume)
@@ -593,9 +606,11 @@
color = "#F2F3F4"
/datum/reagent/luminol/touch_obj(var/obj/O)
+ ..()
O.reveal_blood()
/datum/reagent/luminol/touch_mob(var/mob/living/L)
+ ..()
L.reveal_blood()
/datum/reagent/nutriment/biomass
@@ -631,13 +646,14 @@
M.adjustToxLoss(2 * removed)
M.adjustCloneLoss(2 * removed)
-/datum/reagent/fishbait
+/datum/reagent/nutriment/fishbait
name = "Fish Bait"
id = "fishbait"
description = "A natural slurry that particularily appeals to fish."
- taste_description = "earthy"
+ taste_description = "slimy dirt"
reagent_state = LIQUID
color = "#62764E"
+ nutriment_factor = 15
//YW Edit Start
/datum/reagent/nutriment/paper //Paper is made from cellulose. You can eat it. It doesn't fill you up very much at all.
diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm
index 23fc080e8c..6b7c2c66fe 100644
--- a/code/modules/reagents/reagents/toxins.dm
+++ b/code/modules/reagents/reagents/toxins.dm
@@ -67,7 +67,7 @@
/datum/reagent/toxin/neurotoxic_protein
name = "toxic protein"
id = "neurotoxic_protein"
- description = "A weak neurotoxic chemical commonly found in Sivian fish meat."
+ description = "A weak neurotoxic chemical."
taste_description = "fish"
reagent_state = LIQUID
color = "#005555"
@@ -96,6 +96,7 @@
var/fire_mult = 30
/datum/reagent/toxin/hydrophoron/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / fire_mult)
@@ -107,6 +108,7 @@
/datum/reagent/toxin/hydrophoron/touch_turf(var/turf/simulated/T)
if(!istype(T))
return
+ ..()
T.assume_gas("phoron", CEILING(volume/2, 1), T20C)
for(var/turf/simulated/floor/target_tile in range(0,T))
target_tile.assume_gas("phoron", volume/2, 400+T0C)
@@ -148,6 +150,7 @@
skin_danger = 1
/datum/reagent/toxin/phoron/touch_mob(var/mob/living/L, var/amount)
+ ..()
if(istype(L))
L.adjust_fire_stacks(amount / 5)
@@ -169,6 +172,7 @@
..()
/datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T, var/amount)
+ ..()
if(!istype(T))
return
T.assume_gas("volatile_fuel", amount, T20C)
@@ -390,6 +394,7 @@
color = "#e67819"
/datum/reagent/toxin/fertilizer/tannin/touch_obj(var/obj/O, var/volume)
+ ..()
if(istype(O, /obj/item/stack/hairlesshide))
var/obj/item/stack/hairlesshide/HH = O
HH.rapidcure(round(volume))
@@ -405,6 +410,7 @@
strength = 4
/datum/reagent/toxin/plantbgone/touch_turf(var/turf/T)
+ ..()
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
if(locate(/obj/effect/overlay/wallrot) in W)
@@ -413,6 +419,7 @@
W.visible_message("The fungi are completely dissolved by the solution!")
/datum/reagent/toxin/plantbgone/touch_obj(var/obj/O, var/volume)
+ ..()
if(istype(O, /obj/effect/plant))
qdel(O)
else if(istype(O, /obj/effect/alien/weeds/))
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 4c2c38c9b5..cda9fd9071 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -1445,4 +1445,14 @@
item_state = "revclaymoremob"
force = 1
sharp = TRUE
- edge = TRUE
\ No newline at end of file
+ edge = TRUE
+
+//PastelPrinceDan - Kiyoshi/Masumi Maki
+/obj/item/toy/plushie/fluff/slimeowshi
+ name = "Slime-Cat Research Director plushie"
+ desc = "An adorable stuffed toy that resembles a slime. It's pink, and has little cat ears, as well as a tail! Atop its head is a small beret with a Research Director's insignia."
+ icon = 'icons/vore/custom_items_vr.dmi'
+ icon_state = "kimeowshi"
+ attack_verb = list("blorbled", "slimed", "absorbed", "glomped")
+ gender = PLURAL // this seems like a good idea but probably prone to changing. todo: ask dan
+ // the only reason this thought is relevant because the base slimeplush has its gender set to female
\ No newline at end of file
diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm
index f9ac6ef4f5..e725254f0b 100644
--- a/code/modules/xenoarcheaology/anomaly_container.dm
+++ b/code/modules/xenoarcheaology/anomaly_container.dm
@@ -14,6 +14,15 @@
if(A)
contain(A)
+ else
+ for(var/obj/Ob in loc)
+ if(can_contain(Ob))
+ contain(Ob)
+ break
+
+/obj/structure/anomaly_container/proc/can_contain(var/obj/O)
+ return O.is_anomalous()
+
/obj/structure/anomaly_container/attack_hand(var/mob/user)
release()
@@ -37,7 +46,11 @@
underlays.Cut()
desc = initial(desc)
-/obj/machinery/artifact/MouseDrop(var/obj/structure/anomaly_container/over_object)
- if(istype(over_object) && Adjacent(over_object) && CanMouseDrop(over_object, usr))
- Bumped(usr)
- over_object.contain(src)
\ No newline at end of file
+/atom/MouseDrop(var/obj/structure/anomaly_container/over_object)
+ . = ..()
+
+ if(istype(over_object))
+ if(!QDELETED(src) && istype(loc, /turf) && is_anomalous() && Adjacent(over_object) && CanMouseDrop(over_object, usr))
+ Bumped(usr)
+ over_object.contain(src)
+
diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm
index e723561a73..7a2d73474a 100644
--- a/code/modules/xenoarcheaology/artifacts/artifact.dm
+++ b/code/modules/xenoarcheaology/artifacts/artifact.dm
@@ -5,42 +5,25 @@
icon_state = "ano00"
var/icon_num = 0
density = TRUE
- var/datum/artifact_effect/my_effect
- var/datum/artifact_effect/secondary_effect
- var/being_used = 0
-
- var/predefined_effects = FALSE
-
- var/predefined_primary
- var/predefined_secondary
var/predefined_icon_num
- var/predefined_triggers = FALSE
+ var/datum/component/artifact_master/artifact_master = /datum/component/artifact_master
- var/predefined_trig_primary
- var/predefined_trig_secondary
+ var/being_used = 0
/obj/machinery/artifact/New()
..()
- if(predefined_effects && predefined_primary)
- my_effect = new predefined_primary(src)
+ if(ispath(artifact_master))
+ AddComponent(artifact_master)
- if(predefined_secondary)
- secondary_effect = new predefined_secondary(src)
- if(prob(75))
- secondary_effect.ToggleActivate(0)
+ artifact_master = GetComponent(artifact_master)
- else
- var/effecttype = pick(subtypesof(/datum/artifact_effect))
- my_effect = new effecttype(src)
+ if(!istype(artifact_master))
+ return
- if(prob(75))
- effecttype = pick(subtypesof(/datum/artifact_effect))
- secondary_effect = new effecttype(src)
- if(prob(75))
- secondary_effect.ToggleActivate(0)
+ var/datum/artifact_effect/my_effect = artifact_master.get_primary()
if(!isnull(predefined_icon_num))
icon_num = predefined_icon_num
@@ -77,299 +60,10 @@
if(prob(60))
my_effect.trigger = pick(TRIGGER_TOUCH, TRIGGER_HEAT, TRIGGER_COLD, TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO)
- if(predefined_triggers)
- if(predefined_trig_primary && my_effect)
- my_effect.trigger = predefined_trig_primary
-
- if(predefined_trig_secondary && secondary_effect)
- secondary_effect.trigger = predefined_trig_secondary
-
-/obj/machinery/artifact/proc/choose_effect()
- var/effect_type = tgui_input_list(usr, "What type do you want?", "Effect Type", subtypesof(/datum/artifact_effect))
- if(effect_type)
- my_effect = new effect_type(src)
- if(tgui_alert(usr, "Do you want a secondary effect?", "Second Effect", list("No", "Yes")) == "Yes")
- var/second_effect_type = tgui_input_list(usr, "What type do you want as well?", "Second Effect Type", subtypesof(/datum/artifact_effect) - effect_type)
- secondary_effect = new second_effect_type(src)
- else
- secondary_effect = null
-
-
-/obj/machinery/artifact/process()
- var/turf/L = loc
- if(!istype(L)) // We're inside a container or on null turf, either way stop processing effects
- return
-
- if(my_effect)
- my_effect.process()
- if(secondary_effect)
- secondary_effect.process()
-
- if(pulledby)
- Bumped(pulledby)
-
- //if either of our effects rely on environmental factors, work that out
- var/trigger_cold = 0
- var/trigger_hot = 0
- var/trigger_phoron = 0
- var/trigger_oxy = 0
- var/trigger_co2 = 0
- var/trigger_nitro = 0
- if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) )
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/env = T.return_air()
- if(env)
- if(env.temperature < 225)
- trigger_cold = 1
- else if(env.temperature > 375)
- trigger_hot = 1
-
- if(env.gas["phoron"] >= 10)
- trigger_phoron = 1
- if(env.gas["oxygen"] >= 10)
- trigger_oxy = 1
- if(env.gas["carbon_dioxide"] >= 10)
- trigger_co2 = 1
- if(env.gas["nitrogen"] >= 10)
- trigger_nitro = 1
-
- //COLD ACTIVATION
- if(trigger_cold)
- if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_COLD && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //HEAT ACTIVATION
- if(trigger_hot)
- if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //PHORON GAS ACTIVATION
- if(trigger_phoron)
- if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //OXYGEN GAS ACTIVATION
- if(trigger_oxy)
- if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_OXY && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //CO2 GAS ACTIVATION
- if(trigger_co2)
- if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
- //NITROGEN GAS ACTIVATION
- if(trigger_nitro)
- if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
- else
- if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated)
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/attack_hand(var/mob/user as mob)
- if (get_dist(user, src) > 1)
- to_chat(user, "You can't reach [src] from here.")
- return
- if(ishuman(user) && user:gloves)
- to_chat(user, "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
- return
-
- src.add_fingerprint(user)
-
- if(my_effect.trigger == TRIGGER_TOUCH)
- to_chat(user, "You touch [src].")
- my_effect.ToggleActivate()
- else
- to_chat(user, "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
-
- if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH)
- secondary_effect.ToggleActivate(0)
-
- if (my_effect.effect == EFFECT_TOUCH)
- my_effect.DoEffectTouch(user)
-
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated)
- secondary_effect.DoEffectTouch(user)
-
-/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
-
- if (istype(W, /obj/item/weapon/reagent_containers/))
- if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
- if(my_effect.trigger == TRIGGER_WATER)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
- if(my_effect.trigger == TRIGGER_ACID)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1))
- if(my_effect.trigger == TRIGGER_VOLATILE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amatoxin", 1) || W.reagents.has_reagent("neurotoxin", 1))
- if(my_effect.trigger == TRIGGER_TOXIN)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\
- istype(W,/obj/item/weapon/melee/energy) ||\
- istype(W,/obj/item/weapon/melee/cultblade) ||\
- istype(W,/obj/item/weapon/card/emag) ||\
- istype(W,/obj/item/device/multitool))
- if (my_effect.trigger == TRIGGER_ENERGY)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
- secondary_effect.ToggleActivate(0)
-
- else if (istype(W,/obj/item/weapon/flame) && W:lit ||\
- istype(W,/obj/item/weapon/weldingtool) && W:welding)
- if(my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25))
- secondary_effect.ToggleActivate(0)
- else
- ..()
- if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/Bumped(M as mob|obj)
- ..()
- if(istype(M,/obj))
- if(M:throwforce >= 10)
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves))
- var/warn = 0
-
- if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
- my_effect.ToggleActivate()
- warn = 1
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25))
- secondary_effect.ToggleActivate(0)
- warn = 1
-
- if (my_effect.effect == EFFECT_TOUCH && prob(50))
- my_effect.DoEffectTouch(M)
- warn = 1
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50))
- secondary_effect.DoEffectTouch(M)
- warn = 1
-
- if(warn)
- to_chat(M, "You accidentally touch \the [src].")
+/obj/machinery/artifact/update_icon()
..()
-/obj/machinery/artifact/Bump(var/atom/bumped)
- if(istype(bumped,/obj))
- if(bumped:throwforce >= 10)
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
- else if(ishuman(bumped) && GetAnomalySusceptibility(bumped) >= 0.5)
- var/warn = 0
-
- if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
- my_effect.ToggleActivate()
- warn = 1
- if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25))
- secondary_effect.ToggleActivate(0)
- warn = 1
-
- if (my_effect.effect == EFFECT_TOUCH && prob(50))
- my_effect.DoEffectTouch(bumped)
- warn = 1
- if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50))
- secondary_effect.DoEffectTouch(bumped)
- warn = 1
-
- if(warn)
- to_chat(bumped, "You accidentally touch \the [src] as it hits you.")
-
- ..()
-
-/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P)
- if(istype(P,/obj/item/projectile/bullet))
- if(my_effect.trigger == TRIGGER_FORCE)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
- secondary_effect.ToggleActivate(0)
-
- else if(istype(P,/obj/item/projectile/beam) ||\
- istype(P,/obj/item/projectile/ion) ||\
- istype(P,/obj/item/projectile/energy))
- if(my_effect.trigger == TRIGGER_ENERGY)
- my_effect.ToggleActivate()
- if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
- secondary_effect.ToggleActivate(0)
-
-/obj/machinery/artifact/ex_act(severity)
- switch(severity)
- if(1.0) qdel(src)
- if(2.0)
- if (prob(50))
- qdel(src)
- else
- if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
- secondary_effect.ToggleActivate(0)
- if(3.0)
- if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
- my_effect.ToggleActivate()
- if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
- secondary_effect.ToggleActivate(0)
- return
-
-/obj/machinery/artifact/Moved()
- . = ..()
- if(my_effect)
- my_effect.UpdateMove()
- if(secondary_effect)
- secondary_effect.UpdateMove()
+ if(LAZYLEN(artifact_master.get_active_effects()))
+ icon_state = "ano[icon_num]1"
+ else
+ icon_state = "ano[icon_num]0"
diff --git a/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm b/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
index edec0dd052..bc0fa92645 100644
--- a/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
+++ b/code/modules/xenoarcheaology/artifacts/predefined/_predefined.dm
@@ -1,15 +1,3 @@
/obj/machinery/artifact/predefined
name = "alien artifact"
- desc = "A large alien device."
-
- predefined_effects = TRUE
-
- predefined_primary = null
- predefined_secondary = null
-
- predefined_icon_num = null
-
- predefined_triggers = FALSE
-
- predefined_trig_primary = null
- predefined_trig_secondary = null
+ desc = "A large alien device."
\ No newline at end of file
diff --git a/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm b/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
index 6a81c02b8b..c4141ff192 100644
--- a/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
+++ b/code/modules/xenoarcheaology/artifacts/predefined/hungry_statue.dm
@@ -2,14 +2,12 @@
name = "alien artifact"
desc = "A large alien device."
- predefined_effects = TRUE
-
- predefined_primary = /datum/artifact_effect/animate_anomaly
- predefined_secondary = /datum/artifact_effect/vampire
+ artifact_master = /datum/component/artifact_master/hungry_statue
predefined_icon_num = 14
- predefined_triggers = TRUE
-
- predefined_trig_primary = TRIGGER_OXY
- predefined_trig_secondary = TRIGGER_OXY
+/datum/component/artifact_master/hungry_statue
+ make_effects = list(
+ /datum/artifact_effect/animate_anomaly,
+ /datum/artifact_effect/vampire
+ )
diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm
index 7baa254643..b260f0b62a 100644
--- a/code/modules/xenoarcheaology/boulder.dm
+++ b/code/modules/xenoarcheaology/boulder.dm
@@ -75,8 +75,8 @@
var/obj/O = new spawn_type(get_turf(src))
if(istype(O, /obj/machinery/artifact))
var/obj/machinery/artifact/X = O
- if(X.my_effect)
- X.my_effect.artifact_id = artifact_find.artifact_id
+ if(X.artifact_master)
+ X.artifact_master.artifact_id = artifact_find.artifact_id
O.anchored = FALSE // Anchored finds are lame.
src.visible_message("\The [src] suddenly crumbles away.")
else
diff --git a/code/modules/xenoarcheaology/effect.dm b/code/modules/xenoarcheaology/effect.dm
index 8b9dd625c1..145bd3e258 100644
--- a/code/modules/xenoarcheaology/effect.dm
+++ b/code/modules/xenoarcheaology/effect.dm
@@ -3,19 +3,47 @@
var/effect = EFFECT_TOUCH
var/effectrange = 4
var/trigger = TRIGGER_TOUCH
- var/atom/holder
+ var/datum/component/artifact_master/master
var/activated = 0
- var/chargelevel = 0
+ var/chargelevel = 1
var/chargelevelmax = 10
var/artifact_id = ""
var/effect_type = 0
-/datum/artifact_effect/New(var/atom/location)
+ var/req_type = /atom/movable
+
+ var/image/active_effect
+ var/effect_icon = 'icons/effects/effects.dmi'
+ var/effect_state = "sparkles"
+ var/effect_color = "#ffffff"
+
+ // The last time the effect was toggled.
+ var/last_activation = 0
+
+/datum/artifact_effect/Destroy()
+ if(master)
+ master = null
..()
- holder = location
+
+/datum/artifact_effect/proc/get_master_holder() // Return the effectmaster's holder, if it is set to an effectmaster. Otherwise, master is the target object.
+ if(istype(master))
+ return master.holder
+ else
+ return master
+
+/datum/artifact_effect/New(var/datum/component/artifact_master/newmaster)
+ ..()
+
+ master = newmaster
effect = rand(0, MAX_EFFECT)
trigger = rand(0, MAX_TRIGGER)
+ if(effect_icon && effect_state)
+ if(effect_state == "sparkles")
+ effect_state = "sparkles_[rand(1,4)]"
+ active_effect = image(effect_icon, effect_state)
+ active_effect.color = effect_color
+
//this will be replaced by the excavation code later, but it's here just in case
artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
@@ -36,21 +64,32 @@
/datum/artifact_effect/proc/ToggleActivate(var/reveal_toggle = 1)
//so that other stuff happens first
- spawn(0)
+ set waitfor = FALSE
+
+ var/atom/target = get_master_holder()
+
+ if(world.time - last_activation > 1 SECOND)
+ last_activation = world.time
if(activated)
activated = 0
else
activated = 1
- if(reveal_toggle && holder)
- if(istype(holder, /obj/machinery/artifact))
- var/obj/machinery/artifact/A = holder
- A.icon_state = "ano[A.icon_num][activated]"
+ if(reveal_toggle && target)
+ if(!isliving(target))
+ target.update_icon()
var/display_msg
if(activated)
display_msg = pick("momentarily glows brightly!","distorts slightly for a moment!","flickers slightly!","vibrates!","shimmers slightly for a moment!")
else
display_msg = pick("grows dull!","fades in intensity!","suddenly becomes very still!","suddenly becomes very quiet!")
- var/atom/toplevelholder = holder
+
+ if(active_effect)
+ if(activated)
+ target.underlays.Add(active_effect)
+ else
+ target.underlays.Remove(active_effect)
+
+ var/atom/toplevelholder = target
while(!istype(toplevelholder.loc, /turf))
toplevelholder = toplevelholder.loc
toplevelholder.visible_message("[bicon(toplevelholder)] [toplevelholder] [display_msg]")
diff --git a/code/modules/xenoarcheaology/effect_master.dm b/code/modules/xenoarcheaology/effect_master.dm
new file mode 100644
index 0000000000..f654724b32
--- /dev/null
+++ b/code/modules/xenoarcheaology/effect_master.dm
@@ -0,0 +1,421 @@
+
+/*
+ * Here there be the base component for artifacts.
+ */
+
+/atom/proc/is_anomalous()
+ return (GetComponent(/datum/component/artifact_master))
+
+/atom/proc/become_anomalous()
+ if(!is_anomalous())
+ AddComponent(/datum/component/artifact_master)
+ if(istype(src, /obj/item))
+ var/obj/item/I = src
+ LAZYINITLIST(I.origin_tech)
+ if(prob(50))
+ I.origin_tech[TECH_PRECURSOR] += 1
+ else
+ I.origin_tech[TECH_ARCANE] += 1
+ var/rand_tech = pick(\
+ TECH_MATERIAL,\
+ TECH_ENGINEERING,\
+ TECH_PHORON,\
+ TECH_POWER,\
+ TECH_BLUESPACE,\
+ TECH_BIO,\
+ TECH_COMBAT,\
+ TECH_MAGNET,\
+ TECH_DATA,\
+ TECH_ILLEGAL\
+ )
+ LAZYSET(I.origin_tech, rand_tech, rand(4,7))
+
+/datum/component/artifact_master
+ var/atom/holder
+ var/list/my_effects
+
+ dupe_type = /datum/component/artifact_master
+
+ var/effect_generation_chance = 100
+
+ var/list/make_effects
+
+ var/artifact_id
+
+/datum/component/artifact_master/New()
+ . = ..()
+ holder = parent
+
+ if(!holder)
+ qdel(src)
+ return
+
+ my_effects = list()
+
+ START_PROCESSING(SSobj, src)
+
+ do_setup()
+ return
+
+/*
+ * Component System Registry.
+ * Here be dragons.
+ */
+
+/datum/component/artifact_master/proc/DoRegistry()
+//Melee Hit
+ RegisterSignal(holder, COMSIG_PARENT_ATTACKBY, /datum/component/artifact_master/proc/on_attackby, override = FALSE)
+//Explosions
+ RegisterSignal(holder, COMSIG_ATOM_EX_ACT, /datum/component/artifact_master/proc/on_exact, override = FALSE)
+//Bullets
+ RegisterSignal(holder, COMSIG_ATOM_BULLET_ACT, /datum/component/artifact_master/proc/on_bullet, override = FALSE)
+
+//Attackhand
+ RegisterSignal(holder, COMSIG_ATOM_ATTACK_HAND, /datum/component/artifact_master/proc/on_attack_hand, override = FALSE)
+
+//Bumped / Bumping
+ RegisterSignal(holder, COMSIG_MOVABLE_BUMP, /datum/component/artifact_master/proc/on_bump, override = FALSE)
+ RegisterSignal(holder, COMSIG_ATOM_BUMPED, /datum/component/artifact_master/proc/on_bumped, override = FALSE)
+
+//Moved
+ RegisterSignal(holder, COMSIG_MOVABLE_MOVED, /datum/component/artifact_master/proc/on_moved, override = FALSE)
+
+//Splashed with a reagent.
+ RegisterSignal(holder, COMSIG_REAGENTS_TOUCH, /datum/component/artifact_master/proc/on_reagent, override = FALSE)
+
+/*
+ *
+ */
+
+/datum/component/artifact_master/proc/get_active_effects()
+ var/list/active_effects = list()
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(my_effect.activated)
+ active_effects |= my_effect
+
+ return active_effects
+
+/datum/component/artifact_master/proc/add_effect()
+ var/effect_type = input(usr, "What type do you want?", "Effect Type") as null|anything in subtypesof(/datum/artifact_effect)
+ if(effect_type)
+ var/datum/artifact_effect/my_effect = new effect_type(src)
+ if(istype(holder, my_effect.req_type))
+ my_effects += my_effect
+
+ else
+ to_chat(usr, "This effect can not be applied to this atom type.")
+ qdel(my_effect)
+
+/datum/component/artifact_master/proc/remove_effect()
+ var/to_remove_effect = input(usr, "What effect do you want to remove?", "Remove Effect") as null|anything in my_effects
+
+ if(to_remove_effect)
+ var/datum/artifact_effect/AE = to_remove_effect
+ my_effects.Remove(to_remove_effect)
+ qdel(AE)
+
+/datum/component/artifact_master/Destroy()
+ holder = null
+ for(var/datum/artifact_effect/AE in my_effects)
+ AE.master = null
+ qdel(AE)
+
+ STOP_PROCESSING(SSobj,src)
+
+ . = ..()
+
+/datum/component/artifact_master/proc/do_setup()
+ if(LAZYLEN(make_effects))
+ for(var/path in make_effects)
+ var/datum/artifact_effect/new_effect = new path(src)
+ if(istype(holder, new_effect.req_type))
+ my_effects += new_effect
+
+ else
+ generate_effects()
+
+ DoRegistry()
+
+/datum/component/artifact_master/proc/generate_effects()
+ while(effect_generation_chance > 0)
+ var/chosen_path = pick(subtypesof(/datum/artifact_effect))
+ if(effect_generation_chance >= 100) // If we're above 100 percent, just cut a flat amount and add an effect.
+ var/datum/artifact_effect/AE = new chosen_path(src)
+ if(istype(holder, AE.req_type))
+ my_effects += AE
+ effect_generation_chance -= 30
+ else
+ AE.master = src
+ qdel(AE)
+ continue
+
+ effect_generation_chance /= 2
+
+ if(prob(effect_generation_chance)) // Otherwise, add effects as normal, with decreasing probability.
+ my_effects += new chosen_path(src)
+
+ effect_generation_chance = round(effect_generation_chance)
+
+/datum/component/artifact_master/proc/get_holder() // Returns the holder.
+ return holder
+
+/datum/component/artifact_master/proc/get_primary()
+ if(LAZYLEN(my_effects))
+ return my_effects[1]
+ return FALSE
+
+/*
+ * Trigger code.
+ */
+
+/datum/component/artifact_master/proc/on_exact()
+ var/severity = args[2]
+ var/triggered = FALSE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ switch(severity)
+ if(1.0)
+ if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT || my_effect.trigger == TRIGGER_ENERGY)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+ if(2.0)
+ if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+ if(3.0)
+ if (my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+
+ if(triggered)
+ return COMPONENT_IGNORE_EXPLOSION
+
+ return
+
+/datum/component/artifact_master/proc/on_bullet()
+ var/obj/item/projectile/P = args[2]
+ var/triggered = TRUE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(istype(P,/obj/item/projectile/bullet))
+ if(my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+
+ else if(istype(P,/obj/item/projectile/beam) ||\
+ istype(P,/obj/item/projectile/ion) ||\
+ istype(P,/obj/item/projectile/energy))
+ if(my_effect.trigger == TRIGGER_ENERGY)
+ my_effect.ToggleActivate()
+ triggered = TRUE
+
+ if(triggered)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+ return
+
+/datum/component/artifact_master/proc/on_bump()
+ var/atom/bumped = args[2]
+ var/warn = FALSE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(istype(bumped,/obj))
+ if(bumped:throwforce >= 10)
+ if(my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+
+ else if(ishuman(bumped) && GetAnomalySusceptibility(bumped) >= 0.5)
+ if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
+ my_effect.ToggleActivate()
+ warn = 1
+
+ if (my_effect.effect == EFFECT_TOUCH && prob(50))
+ my_effect.DoEffectTouch(bumped)
+ warn = 1
+
+ if(warn && isliving(bumped))
+ to_chat(bumped, "You accidentally touch \the [holder] as it hits you.")
+
+/datum/component/artifact_master/proc/on_bumped()
+ var/atom/movable/M = args[2]
+ var/warn = FALSE
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(istype(M,/obj))
+ if(M:throwforce >= 10)
+ if(my_effect.trigger == TRIGGER_FORCE)
+ my_effect.ToggleActivate()
+
+ else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves))
+ if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
+ my_effect.ToggleActivate()
+ warn = 1
+
+ if (my_effect.effect == EFFECT_TOUCH && prob(50))
+ my_effect.DoEffectTouch(M)
+ warn = 1
+
+ if(warn && isliving(M))
+ to_chat(M, "You accidentally touch \the [holder].")
+
+/datum/component/artifact_master/proc/on_attack_hand()
+ var/mob/living/user = args[2]
+ if(!istype(user))
+ return
+
+ if (get_dist(user, holder) > 1)
+ to_chat(user, "You can't reach [holder] from here.")
+ return
+ if(ishuman(user) && user:gloves)
+ to_chat(user, "You touch [holder] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
+ return
+
+ var/triggered = FALSE
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+
+ if(my_effect.trigger == TRIGGER_TOUCH)
+ triggered = TRUE
+ my_effect.ToggleActivate()
+
+ if (my_effect.effect == EFFECT_TOUCH)
+ triggered = TRUE
+ my_effect.DoEffectTouch(user)
+
+ if(triggered)
+ to_chat(user, "You touch [holder].")
+
+ else
+ to_chat(user, "You touch [holder], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].")
+
+
+/datum/component/artifact_master/proc/on_attackby()
+ var/obj/item/weapon/W = args[2]
+ for(var/datum/artifact_effect/my_effect in my_effects)
+
+ if (istype(W, /obj/item/weapon/reagent_containers))
+ if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
+ if(my_effect.trigger == TRIGGER_WATER)
+ my_effect.ToggleActivate()
+ else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1))
+ if(my_effect.trigger == TRIGGER_ACID)
+ my_effect.ToggleActivate()
+ else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1))
+ if(my_effect.trigger == TRIGGER_VOLATILE)
+ my_effect.ToggleActivate()
+ else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amatoxin", 1) || W.reagents.has_reagent("neurotoxin", 1))
+ if(my_effect.trigger == TRIGGER_TOXIN)
+ my_effect.ToggleActivate()
+ else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\
+ istype(W,/obj/item/weapon/melee/energy) ||\
+ istype(W,/obj/item/weapon/melee/cultblade) ||\
+ istype(W,/obj/item/weapon/card/emag) ||\
+ istype(W,/obj/item/device/multitool))
+ if (my_effect.trigger == TRIGGER_ENERGY)
+ my_effect.ToggleActivate()
+
+ else if (istype(W,/obj/item/weapon/flame) && W:lit ||\
+ istype(W,/obj/item/weapon/weldingtool) && W:welding)
+ if(my_effect.trigger == TRIGGER_HEAT)
+ my_effect.ToggleActivate()
+ else
+ if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
+ my_effect.ToggleActivate()
+
+/datum/component/artifact_master/proc/on_reagent()
+ var/datum/reagent/Touching = args[2]
+
+ var/list/water = list("hydrogen", "water")
+ var/list/acid = list("sacid", "pacid", "diethylamine")
+ var/list/volatile = list("phoron","thermite")
+ var/list/toxic = list("toxin","cyanide","amatoxin","neurotoxin")
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(Touching.id in water)
+ if(my_effect.trigger == TRIGGER_WATER)
+ my_effect.ToggleActivate()
+ else if(Touching.id in acid)
+ if(my_effect.trigger == TRIGGER_ACID)
+ my_effect.ToggleActivate()
+ else if(Touching.id in volatile)
+ if(my_effect.trigger == TRIGGER_VOLATILE)
+ my_effect.ToggleActivate()
+ else if(Touching.id in toxic)
+ if(my_effect.trigger == TRIGGER_TOXIN)
+ my_effect.ToggleActivate()
+
+/datum/component/artifact_master/proc/on_moved()
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(my_effect)
+ my_effect.UpdateMove()
+
+/datum/component/artifact_master/process()
+ if(!holder) // Some instances can be created and rapidly lose their holder, if they are destroyed rapidly on creation. IE, during excavation.
+ STOP_PROCESSING(SSobj, src)
+ if(!QDELETED(src))
+ qdel(src)
+ return
+
+ var/turf/L = holder.loc
+ if(!istype(L) && !isliving(L)) // We're inside a non-mob container or on null turf, either way stop processing effects
+ return
+
+ if(istype(holder, /atom/movable))
+ var/atom/movable/HA = holder
+ if(HA.pulledby)
+ on_bumped(holder, HA.pulledby)
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ if(my_effect)
+ my_effect.UpdateMove()
+
+ //if any of our effects rely on environmental factors, work that out
+ var/trigger_cold = 0
+ var/trigger_hot = 0
+ var/trigger_phoron = 0
+ var/trigger_oxy = 0
+ var/trigger_co2 = 0
+ var/trigger_nitro = 0
+
+ var/turf/T = get_turf(holder)
+ var/datum/gas_mixture/env = T.return_air()
+ if(env)
+ if(env.temperature < 225)
+ trigger_cold = 1
+ else if(env.temperature > 375)
+ trigger_hot = 1
+
+ if(env.gas["phoron"] >= 10)
+ trigger_phoron = 1
+ if(env.gas["oxygen"] >= 10)
+ trigger_oxy = 1
+ if(env.gas["carbon_dioxide"] >= 10)
+ trigger_co2 = 1
+ if(env.gas["nitrogen"] >= 10)
+ trigger_nitro = 1
+
+ for(var/datum/artifact_effect/my_effect in my_effects)
+ my_effect.artifact_id = artifact_id
+
+ my_effect.process()
+
+ //COLD ACTIVATION
+ if(my_effect.trigger == TRIGGER_COLD && (trigger_cold ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //HEAT ACTIVATION
+ if(my_effect.trigger == TRIGGER_HEAT && (trigger_hot ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //PHORON GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_PHORON && (trigger_phoron ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //OXYGEN GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_OXY && (trigger_oxy ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //CO2 GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_CO2 && (trigger_co2 ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
+ //NITROGEN GAS ACTIVATION
+ if(my_effect.trigger == TRIGGER_NITRO && (trigger_nitro ^ my_effect.activated))
+ my_effect.ToggleActivate()
+
diff --git a/code/modules/xenoarcheaology/effects/animate_anomaly.dm b/code/modules/xenoarcheaology/effects/animate_anomaly.dm
index c0c17e4aaf..7cf3e408e9 100644
--- a/code/modules/xenoarcheaology/effects/animate_anomaly.dm
+++ b/code/modules/xenoarcheaology/effects/animate_anomaly.dm
@@ -4,6 +4,9 @@
effect_type = EFFECT_PSIONIC
var/mob/living/target = null
+ effect_state = "pulsing"
+ effect_color = "#00c3ff"
+
/datum/artifact_effect/animate_anomaly/ToggleActivate(var/reveal_toggle = 1)
..()
find_target()
@@ -13,21 +16,24 @@
effectrange = max(3, effectrange)
/datum/artifact_effect/animate_anomaly/proc/find_target()
- if(!target || target.z != holder.z || get_dist(target, holder) > effectrange)
+ var/atom/masterholder = get_master_holder()
+
+ if(!target || target.z != masterholder.z || get_dist(target, masterholder) > effectrange)
var/mob/living/ClosestMob = null
- for(var/mob/living/L in range(effectrange, holder))
+ for(var/mob/living/L in range(effectrange, get_turf(masterholder)))
if(!L.mind)
continue
if(!ClosestMob)
ClosestMob = L
continue
if(!L.stat)
- if(get_dist(holder, L) < get_dist(holder, ClosestMob))
+ if(get_dist(masterholder, L) < get_dist(masterholder, ClosestMob))
ClosestMob = L
target = ClosestMob
/datum/artifact_effect/animate_anomaly/DoEffectTouch(var/mob/living/user)
+ var/atom/holder = get_master_holder()
var/obj/O = holder
var/turf/T = get_step_away(O, user)
@@ -36,25 +42,23 @@
O.visible_message("\The [holder] lurches away from [user]")
/datum/artifact_effect/animate_anomaly/DoEffectAura()
- var/obj/O = holder
- if(!target || target.z != O.z || get_dist(target, O) > effectrange)
- target = null
- find_target()
- var/turf/T = get_step_to(O, target)
+ var/obj/O = get_master_holder()
+ find_target()
- if(target && istype(T) && istype(O.loc, /turf))
- if(get_dist(O, T) > 1)
- O.Move(T)
- O.visible_message("\The [holder] lurches toward [target]")
+ if(!target || !istype(O))
+ return
+
+ O.dir = get_dir(O, target)
+
+ if(!target || !istype(O))
+ return
+
+ O.dir = get_dir(O, target)
+
+ if(istype(O.loc, /turf))
+ if(get_dist(O.loc, target.loc) > 1)
+ O.Move(get_step_to(O, target))
+ O.visible_message("\The [O] lurches toward [target]")
/datum/artifact_effect/animate_anomaly/DoEffectPulse()
- var/obj/O = holder
- if(!target || target.z != O.z || get_dist(target, O) > effectrange)
- target = null
- find_target()
- var/turf/T = get_step_to(O, target)
-
- if(target && istype(T) && istype(O.loc, /turf))
- if(get_dist(O, T) > 1)
- O.Move(T)
- O.visible_message("\The [holder] lurches toward [target]")
+ DoEffectAura()
diff --git a/code/modules/xenoarcheaology/effects/badfeeling.dm b/code/modules/xenoarcheaology/effects/badfeeling.dm
index a0aa7dc775..2a7e480e18 100644
--- a/code/modules/xenoarcheaology/effects/badfeeling.dm
+++ b/code/modules/xenoarcheaology/effects/badfeeling.dm
@@ -25,6 +25,9 @@
"OH GOD!",
"HELP ME!")
+ effect_state = "summoning"
+ effect_color = "#643232"
+
/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user)
if(user)
if (istype(user, /mob/living/carbon/human))
@@ -39,6 +42,7 @@
H.dizziness += rand(3,5)
/datum/artifact_effect/badfeeling/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -53,6 +57,7 @@
return 1
/datum/artifact_effect/badfeeling/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/berserk.dm b/code/modules/xenoarcheaology/effects/berserk.dm
index a221c9104c..4965747909 100644
--- a/code/modules/xenoarcheaology/effects/berserk.dm
+++ b/code/modules/xenoarcheaology/effects/berserk.dm
@@ -2,6 +2,9 @@
name = "berserk"
effect_type = EFFECT_PSIONIC
+ effect_state = "summoning"
+ effect_color = "#5f0000"
+
/datum/artifact_effect/berserk/proc/apply_berserk(var/mob/living/L)
if(!istype(L))
return FALSE
@@ -28,6 +31,7 @@
return TRUE
/datum/artifact_effect/berserk/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
@@ -36,6 +40,7 @@
return TRUE
/datum/artifact_effect/berserk/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/cannibal.dm b/code/modules/xenoarcheaology/effects/cannibal.dm
index 04a0b5a9e8..ad584ccc7c 100644
--- a/code/modules/xenoarcheaology/effects/cannibal.dm
+++ b/code/modules/xenoarcheaology/effects/cannibal.dm
@@ -25,6 +25,9 @@
"Butcher them!",
"Feast!")
+ effect_state = "summoning"
+ effect_color = "#c50303"
+
/datum/artifact_effect/cannibalfeeling/DoEffectTouch(var/mob/user)
if(user)
if (istype(user, /mob/living/carbon/human))
@@ -41,6 +44,7 @@
H.nutrition = H.nutrition / 1.5
/datum/artifact_effect/cannibalfeeling/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -57,6 +61,7 @@
return 1
/datum/artifact_effect/cannibalfeeling/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/cellcharge.dm b/code/modules/xenoarcheaology/effects/cellcharge.dm
index b5c8e6224b..42f64eb8dd 100644
--- a/code/modules/xenoarcheaology/effects/cellcharge.dm
+++ b/code/modules/xenoarcheaology/effects/cellcharge.dm
@@ -4,6 +4,8 @@
effect_type = EFFECT_ELECTRO
var/last_message
+ effect_color = "#ffee06"
+
/datum/artifact_effect/cellcharge/DoEffectTouch(var/mob/user)
if(user)
if(isrobot(user))
@@ -14,6 +16,7 @@
return 1
/datum/artifact_effect/cellcharge/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
@@ -42,6 +45,7 @@
return 1
/datum/artifact_effect/cellcharge/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
diff --git a/code/modules/xenoarcheaology/effects/celldrain.dm b/code/modules/xenoarcheaology/effects/celldrain.dm
index ee279032ec..c8a270c059 100644
--- a/code/modules/xenoarcheaology/effects/celldrain.dm
+++ b/code/modules/xenoarcheaology/effects/celldrain.dm
@@ -4,6 +4,9 @@
effect_type = EFFECT_ELECTRO
var/last_message
+ effect_state = "pulsing"
+ effect_color = "#fbff02"
+
/datum/artifact_effect/celldrain/DoEffectTouch(var/mob/user)
if(user)
if(istype(user, /mob/living/silicon/robot))
@@ -16,6 +19,7 @@
return 1
/datum/artifact_effect/celldrain/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
@@ -44,6 +48,7 @@
return 1
/datum/artifact_effect/celldrain/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/obj/machinery/power/apc/C in GLOB.apcs)
diff --git a/code/modules/xenoarcheaology/effects/cold.dm b/code/modules/xenoarcheaology/effects/cold.dm
index 9855ac280b..f20fdf00d5 100644
--- a/code/modules/xenoarcheaology/effects/cold.dm
+++ b/code/modules/xenoarcheaology/effects/cold.dm
@@ -3,6 +3,8 @@
name = "cold"
var/target_temp
+ effect_color = "#b3f6ff"
+
/datum/artifact_effect/cold/New()
..()
target_temp = rand(0, 250)
@@ -10,6 +12,7 @@
effect_type = pick(EFFECT_ORGANIC, EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/cold/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
to_chat(user, "A chill passes up your spine!")
var/datum/gas_mixture/env = holder.loc.return_air()
@@ -17,6 +20,7 @@
env.temperature = max(env.temperature - rand(5,50), 0)
/datum/artifact_effect/cold/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/datum/gas_mixture/env = holder.loc.return_air()
if(env && env.temperature > target_temp)
diff --git a/code/modules/xenoarcheaology/effects/dnaswitch.dm b/code/modules/xenoarcheaology/effects/dnaswitch.dm
index c4c36cb5b1..f9d20475f7 100644
--- a/code/modules/xenoarcheaology/effects/dnaswitch.dm
+++ b/code/modules/xenoarcheaology/effects/dnaswitch.dm
@@ -4,6 +4,9 @@
effect_type = EFFECT_ORGANIC
var/severity
+ effect_state = "smoke"
+ effect_color = "#77ff83"
+
/datum/artifact_effect/dnaswitch/New()
..()
if(effect == EFFECT_AURA)
@@ -28,6 +31,7 @@
return 1
/datum/artifact_effect/dnaswitch/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -47,6 +51,7 @@
scramble(0, H, weakness * severity)
/datum/artifact_effect/dnaswitch/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/carbon/human/H in range(200, T))
diff --git a/code/modules/xenoarcheaology/effects/electric_field.dm b/code/modules/xenoarcheaology/effects/electric_field.dm
index 3b27e8fe42..1ba181bb45 100644
--- a/code/modules/xenoarcheaology/effects/electric_field.dm
+++ b/code/modules/xenoarcheaology/effects/electric_field.dm
@@ -3,7 +3,10 @@
name = "electric field"
effect_type = EFFECT_ENERGY
+ effect_color = "#ffff00"
+
/datum/artifact_effect/electric_field/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
var/list/nearby_mobs = list()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
if(L == user) // You're "grounded" when you contact the artifact.
@@ -27,6 +30,7 @@
L.electrocute_act(rand(25, 40), holder, 0.75, BP_TORSO)
/datum/artifact_effect/electric_field/DoEffectAura()
+ var/atom/holder = get_master_holder()
var/list/nearby_mobs = list()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
if(!L.stat)
@@ -48,6 +52,7 @@
L.electrocute_act(rand(1, 10), holder, 0.75, BP_TORSO)
/datum/artifact_effect/electric_field/DoEffectPulse()
+ var/atom/holder = get_master_holder()
var/list/nearby_mobs = list()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
if(!L.stat)
diff --git a/code/modules/xenoarcheaology/effects/emp.dm b/code/modules/xenoarcheaology/effects/emp.dm
index fd30420b57..8b9d969a3e 100644
--- a/code/modules/xenoarcheaology/effects/emp.dm
+++ b/code/modules/xenoarcheaology/effects/emp.dm
@@ -2,11 +2,14 @@
name = "emp"
effect_type = EFFECT_ELECTRO
+ effect_state = "empdisable"
+
/datum/artifact_effect/emp/New()
..()
effect = EFFECT_PULSE
/datum/artifact_effect/emp/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
empulse(T, effectrange/4, effectrange/3, effectrange/2, effectrange)
diff --git a/code/modules/xenoarcheaology/effects/feysight.dm b/code/modules/xenoarcheaology/effects/feysight.dm
index 379dc0cc54..70bceb7bcc 100644
--- a/code/modules/xenoarcheaology/effects/feysight.dm
+++ b/code/modules/xenoarcheaology/effects/feysight.dm
@@ -2,6 +2,9 @@
name = "feysight"
effect_type = EFFECT_PSIONIC
+ effect_state = "pulsing"
+ effect_color = "#00c763"
+
/datum/artifact_effect/feysight/proc/apply_modifier(var/mob/living/L)
if(!istype(L))
return FALSE
@@ -28,6 +31,7 @@
return TRUE
/datum/artifact_effect/feysight/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
@@ -36,6 +40,7 @@
return TRUE
/datum/artifact_effect/feysight/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/L in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/forcefield.dm b/code/modules/xenoarcheaology/effects/forcefield.dm
index f4f1a3ab07..661563ccc7 100644
--- a/code/modules/xenoarcheaology/effects/forcefield.dm
+++ b/code/modules/xenoarcheaology/effects/forcefield.dm
@@ -3,11 +3,15 @@
var/list/created_field = list()
effect_type = EFFECT_PARTICLE
+ effect_state = "shield-old"
+ effect_color = "#00b7ff"
+
/datum/artifact_effect/forcefield/New()
..()
trigger = TRIGGER_TOUCH
/datum/artifact_effect/forcefield/ToggleActivate()
+ var/atom/holder = get_master_holder()
..()
if(created_field.len)
for(var/obj/effect/energy_field/F in created_field)
@@ -35,6 +39,7 @@
E.adjust_strength(0.25, 0)
/datum/artifact_effect/forcefield/UpdateMove()
+ var/atom/holder = get_master_holder()
if(created_field.len && holder)
var/turf/T = get_turf(holder)
while(created_field.len < 16)
diff --git a/code/modules/xenoarcheaology/effects/gaia.dm b/code/modules/xenoarcheaology/effects/gaia.dm
index 1a89149818..42869fd556 100644
--- a/code/modules/xenoarcheaology/effects/gaia.dm
+++ b/code/modules/xenoarcheaology/effects/gaia.dm
@@ -5,6 +5,8 @@
var/list/my_glitterflies = list()
+ effect_color = "#8cd448"
+
/datum/artifact_effect/gaia/proc/age_plantlife(var/obj/machinery/portable_atmospherics/hydroponics/Tray = null)
if(istype(Tray) && Tray.seed)
Tray.health += rand(1,3) * HYDRO_SPEED_MULTIPLIER
@@ -30,6 +32,7 @@
P.update_icon()
/datum/artifact_effect/gaia/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
to_chat(user, "You feel the presence of something long forgotten.")
for(var/obj/machinery/portable_atmospherics/hydroponics/Tray in view(world.view,get_turf(holder)))
age_plantlife(Tray)
@@ -44,6 +47,7 @@
age_plantlife(P)
/datum/artifact_effect/gaia/DoEffectAura()
+ var/atom/holder = get_master_holder()
for(var/obj/machinery/portable_atmospherics/hydroponics/Tray in view(effectrange,holder))
age_plantlife(Tray)
if(prob(2))
@@ -57,6 +61,7 @@
age_plantlife(P)
/datum/artifact_effect/gaia/DoEffectPulse()
+ var/atom/holder = get_master_holder()
for(var/obj/machinery/portable_atmospherics/hydroponics/Tray in view(effectrange,holder))
age_plantlife(Tray)
if(prob(10))
@@ -70,6 +75,7 @@
age_plantlife(P)
/datum/artifact_effect/gaia/process()
+ var/atom/holder = get_master_holder()
..()
listclearnulls(my_glitterflies)
diff --git a/code/modules/xenoarcheaology/effects/gasco2.dm b/code/modules/xenoarcheaology/effects/gasco2.dm
index 264dca7352..5543517dac 100644
--- a/code/modules/xenoarcheaology/effects/gasco2.dm
+++ b/code/modules/xenoarcheaology/effects/gasco2.dm
@@ -1,18 +1,22 @@
/datum/artifact_effect/gasco2
name = "CO2 creation"
+ effect_color = "#a5a5a5"
+
/datum/artifact_effect/gasco2/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("carbon_dioxide", rand(2, 15))
/datum/artifact_effect/gasco2/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gasnitro.dm b/code/modules/xenoarcheaology/effects/gasnitro.dm
index 42b440fc1c..e076ff3aa3 100644
--- a/code/modules/xenoarcheaology/effects/gasnitro.dm
+++ b/code/modules/xenoarcheaology/effects/gasnitro.dm
@@ -1,18 +1,22 @@
/datum/artifact_effect/gasnitro
name = "N2 creation"
+ effect_color = "#c2d3d8"
+
/datum/artifact_effect/gasnitro/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("nitrogen", rand(2, 15))
/datum/artifact_effect/gasnitro/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gasoxy.dm b/code/modules/xenoarcheaology/effects/gasoxy.dm
index bb159509dc..798154e38a 100644
--- a/code/modules/xenoarcheaology/effects/gasoxy.dm
+++ b/code/modules/xenoarcheaology/effects/gasoxy.dm
@@ -7,12 +7,14 @@
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasoxy/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("oxygen", rand(2, 15))
/datum/artifact_effect/gasoxy/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gasphoron.dm b/code/modules/xenoarcheaology/effects/gasphoron.dm
index b84296fbb8..66cdee98c2 100644
--- a/code/modules/xenoarcheaology/effects/gasphoron.dm
+++ b/code/modules/xenoarcheaology/effects/gasphoron.dm
@@ -1,18 +1,22 @@
/datum/artifact_effect/gasphoron
name = "phoron creation"
+ effect_color = "#c408ba"
+
/datum/artifact_effect/gasphoron/New()
..()
effect = pick(EFFECT_TOUCH, EFFECT_AURA)
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gasphoron/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("phoron", rand(2, 15))
/datum/artifact_effect/gasphoron/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/gassleeping.dm b/code/modules/xenoarcheaology/effects/gassleeping.dm
index 3c12f8f91c..a77ca5b88d 100644
--- a/code/modules/xenoarcheaology/effects/gassleeping.dm
+++ b/code/modules/xenoarcheaology/effects/gassleeping.dm
@@ -7,12 +7,14 @@
effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH)
/datum/artifact_effect/gassleeping/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
holder_loc.assume_gas("nitrous_oxide", rand(2, 15))
/datum/artifact_effect/gassleeping/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/holder_loc = holder.loc
if(istype(holder_loc))
diff --git a/code/modules/xenoarcheaology/effects/goodfeeling.dm b/code/modules/xenoarcheaology/effects/goodfeeling.dm
index c5d05adc5e..42b1be7e3a 100644
--- a/code/modules/xenoarcheaology/effects/goodfeeling.dm
+++ b/code/modules/xenoarcheaology/effects/goodfeeling.dm
@@ -23,6 +23,9 @@
"You're so happy suddenly, you almost want to dance and sing.",
"You feel like the world is out to help you.")
+ effect_state = "summoning"
+ effect_color = "#009118"
+
/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user)
if(user)
if (istype(user, /mob/living/carbon/human))
@@ -37,6 +40,7 @@
H.dizziness += rand(3,5)
/datum/artifact_effect/goodfeeling/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -51,6 +55,7 @@
return 1
/datum/artifact_effect/goodfeeling/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/gravitational_waves.dm b/code/modules/xenoarcheaology/effects/gravitational_waves.dm
index 6798eef64c..d34b352ea0 100644
--- a/code/modules/xenoarcheaology/effects/gravitational_waves.dm
+++ b/code/modules/xenoarcheaology/effects/gravitational_waves.dm
@@ -5,10 +5,14 @@
var/last_wave_pull = 0
+ effect_state = "gravisphere"
+ effect_color = "#d8c3ff"
+
/datum/artifact_effect/gravity_wave/DoEffectTouch(var/mob/user)
gravwave(user, effectrange, STAGE_TWO)
/datum/artifact_effect/gravity_wave/DoEffectAura()
+ var/atom/holder = get_master_holder()
var/seconds_since_last_pull = max(0, round((last_wave_pull - world.time) / 10))
if(prob(10 + seconds_since_last_pull))
@@ -17,6 +21,7 @@
gravwave(get_turf(holder), effectrange, STAGE_TWO)
/datum/artifact_effect/gravity_wave/DoEffectPulse()
+ var/atom/holder = get_master_holder()
holder.visible_message("\The [holder] distorts as local gravity intensifies, and shifts toward it.")
gravwave(get_turf(holder), effectrange, STAGE_TWO)
diff --git a/code/modules/xenoarcheaology/effects/heal.dm b/code/modules/xenoarcheaology/effects/heal.dm
index 39bb09d04e..313bbc011e 100644
--- a/code/modules/xenoarcheaology/effects/heal.dm
+++ b/code/modules/xenoarcheaology/effects/heal.dm
@@ -1,6 +1,7 @@
/datum/artifact_effect/heal
name = "heal"
effect_type = EFFECT_ORGANIC
+ effect_color = "#4649ff"
/datum/artifact_effect/heal/DoEffectTouch(var/mob/toucher)
//todo: check over this properly
@@ -33,6 +34,7 @@
return 1
/datum/artifact_effect/heal/DoEffectAura()
+ var/atom/holder = get_master_holder()
//todo: check over this properly
if(holder)
var/turf/T = get_turf(holder)
@@ -49,6 +51,7 @@
C.updatehealth()
/datum/artifact_effect/heal/DoEffectPulse()
+ var/atom/holder = get_master_holder()
//todo: check over this properly
if(holder)
var/turf/T = get_turf(holder)
diff --git a/code/modules/xenoarcheaology/effects/heat.dm b/code/modules/xenoarcheaology/effects/heat.dm
index 720d146443..0bb3ae1f10 100644
--- a/code/modules/xenoarcheaology/effects/heat.dm
+++ b/code/modules/xenoarcheaology/effects/heat.dm
@@ -2,6 +2,7 @@
/datum/artifact_effect/heat
name = "heat"
var/target_temp
+ effect_color = "#ff6600"
/datum/artifact_effect/heat/New()
..()
@@ -10,6 +11,7 @@
target_temp = rand(300, 600)
/datum/artifact_effect/heat/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
if(holder)
to_chat(user, " You feel a wave of heat travel up your spine!")
var/datum/gas_mixture/env = holder.loc.return_air()
@@ -17,6 +19,7 @@
env.temperature += rand(5,50)
/datum/artifact_effect/heat/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/datum/gas_mixture/env = holder.loc.return_air()
if(env && env.temperature < target_temp)
diff --git a/code/modules/xenoarcheaology/effects/hurt.dm b/code/modules/xenoarcheaology/effects/hurt.dm
index 14aff4e624..a2c8d54163 100644
--- a/code/modules/xenoarcheaology/effects/hurt.dm
+++ b/code/modules/xenoarcheaology/effects/hurt.dm
@@ -2,6 +2,8 @@
name = "hurt"
effect_type = EFFECT_ORGANIC
+ effect_color = "#6d1212"
+
/datum/artifact_effect/hurt/DoEffectTouch(var/mob/toucher)
if(toucher)
var/weakness = GetAnomalySusceptibility(toucher)
@@ -20,6 +22,7 @@
C.weakened += 6 * weakness
/datum/artifact_effect/hurt/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(src.effectrange,T))
@@ -35,6 +38,7 @@
C.updatehealth()
/datum/artifact_effect/hurt/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(effectrange, T))
diff --git a/code/modules/xenoarcheaology/effects/poltergeist.dm b/code/modules/xenoarcheaology/effects/poltergeist.dm
index 189c0ea4cd..5b270fd38c 100644
--- a/code/modules/xenoarcheaology/effects/poltergeist.dm
+++ b/code/modules/xenoarcheaology/effects/poltergeist.dm
@@ -3,6 +3,9 @@
name = "poltergeist"
effect_type = EFFECT_ENERGY
+ effect_state = "shield2"
+ effect_color = "#a824c9"
+
/datum/artifact_effect/poltergeist/proc/throw_at_mob(var/mob/living/target, var/damage = 20)
var/list/valid_targets = list()
@@ -19,6 +22,7 @@
throw_at_mob(user, rand(10, 30))
/datum/artifact_effect/poltergeist/DoEffectAura()
+ var/atom/holder = get_master_holder()
var/mob/living/target = null
for(var/mob/living/L in oview(get_turf(holder), effectrange))
if(L.stat || !L.mind)
@@ -33,6 +37,7 @@
throw_at_mob(target, rand(15, 30))
/datum/artifact_effect/poltergeist/DoEffectPulse()
+ var/atom/holder = get_master_holder()
var/mob/living/target = null
for(var/mob/living/L in oview(get_turf(holder), effectrange))
if(L.stat || !L.mind)
diff --git a/code/modules/xenoarcheaology/effects/radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm
index e38540eb04..88a37b3e06 100644
--- a/code/modules/xenoarcheaology/effects/radiate.dm
+++ b/code/modules/xenoarcheaology/effects/radiate.dm
@@ -2,6 +2,8 @@
name = "radiation"
var/radiation_amount
+ effect_color = "#007006"
+
/datum/artifact_effect/radiate/New()
..()
radiation_amount = rand(1, 10)
@@ -14,11 +16,13 @@
return 1
/datum/artifact_effect/radiate/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
SSradiation.flat_radiate(holder, radiation_amount, src.effectrange)
return 1
/datum/artifact_effect/radiate/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
SSradiation.radiate(holder, ((radiation_amount * 3) * (sqrt(src.effectrange)))) //Need to get feedback on this //VOREStation Edit - Was too crazy-strong.
return 1
diff --git a/code/modules/xenoarcheaology/effects/resurrect.dm b/code/modules/xenoarcheaology/effects/resurrect.dm
index e54ca276ea..0fbb8c6aef 100644
--- a/code/modules/xenoarcheaology/effects/resurrect.dm
+++ b/code/modules/xenoarcheaology/effects/resurrect.dm
@@ -4,7 +4,11 @@
var/stored_life = 0
+ effect_state = "pulsing"
+ effect_color = "#ff0000"
+
/datum/artifact_effect/resurrect/proc/steal_life(var/mob/living/target = null)
+ var/atom/holder = get_master_holder()
if(!istype(target))
return 0
@@ -16,6 +20,7 @@
return 0
/datum/artifact_effect/resurrect/proc/give_life(var/mob/living/target = null)
+ var/atom/holder = get_master_holder()
if(!istype(target))
return
@@ -34,6 +39,7 @@
stored_life = 0
/datum/artifact_effect/resurrect/proc/attempt_revive(var/mob/living/L = null)
+ var/atom/holder = get_master_holder()
spawn()
if(istype(L, /mob/living/simple_mob))
var/mob/living/simple_mob/SM = L
@@ -70,6 +76,7 @@
holder.visible_message("\The [H]'s eyes open in a flash of light!")
/datum/artifact_effect/resurrect/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
stored_life += 4 * steal_life(L)
@@ -80,6 +87,7 @@
break
/datum/artifact_effect/resurrect/DoEffectAura()
+ var/atom/holder = get_master_holder()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
stored_life += steal_life(L)
@@ -90,6 +98,7 @@
break
/datum/artifact_effect/resurrect/DoEffectPulse()
+ var/atom/holder = get_master_holder()
for(var/mob/living/L in oview(effectrange, get_turf(holder)))
stored_life += 2 * steal_life(L)
diff --git a/code/modules/xenoarcheaology/effects/roboheal.dm b/code/modules/xenoarcheaology/effects/roboheal.dm
index 0052a53979..16660029b7 100644
--- a/code/modules/xenoarcheaology/effects/roboheal.dm
+++ b/code/modules/xenoarcheaology/effects/roboheal.dm
@@ -2,6 +2,8 @@
name = "robotic healing"
var/last_message
+ effect_color = "#3879ad"
+
/datum/artifact_effect/roboheal/New()
..()
effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE)
@@ -16,6 +18,7 @@
return 1
/datum/artifact_effect/roboheal/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
@@ -28,6 +31,7 @@
return 1
/datum/artifact_effect/roboheal/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/robohurt.dm b/code/modules/xenoarcheaology/effects/robohurt.dm
index 8ed47a9e28..8b93e04ead 100644
--- a/code/modules/xenoarcheaology/effects/robohurt.dm
+++ b/code/modules/xenoarcheaology/effects/robohurt.dm
@@ -2,6 +2,8 @@
name = "robotic harm"
var/last_message
+ effect_color = "#5432cf"
+
/datum/artifact_effect/robohurt/New()
..()
effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE)
@@ -16,6 +18,7 @@
return 1
/datum/artifact_effect/robohurt/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
@@ -28,6 +31,7 @@
return 1
/datum/artifact_effect/robohurt/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/sleepy.dm b/code/modules/xenoarcheaology/effects/sleepy.dm
index 6a0439460a..244814a1da 100644
--- a/code/modules/xenoarcheaology/effects/sleepy.dm
+++ b/code/modules/xenoarcheaology/effects/sleepy.dm
@@ -1,6 +1,7 @@
//todo
/datum/artifact_effect/sleepy
name = "sleepy"
+ effect_color = "#a36fa1"
/datum/artifact_effect/sleepy/New()
..()
@@ -20,6 +21,7 @@
return 1
/datum/artifact_effect/sleepy/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/human/H in range(src.effectrange,T))
@@ -34,6 +36,7 @@
return 1
/datum/artifact_effect/sleepy/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for(var/mob/living/carbon/human/H in range(src.effectrange, T))
diff --git a/code/modules/xenoarcheaology/effects/stun.dm b/code/modules/xenoarcheaology/effects/stun.dm
index ab00465477..12ca276b93 100644
--- a/code/modules/xenoarcheaology/effects/stun.dm
+++ b/code/modules/xenoarcheaology/effects/stun.dm
@@ -1,5 +1,6 @@
/datum/artifact_effect/stun
name = "stun"
+ effect_color = "#00eeff"
/datum/artifact_effect/stun/New()
..()
@@ -16,6 +17,7 @@
C.Stun(rand(1,10) * susceptibility)
/datum/artifact_effect/stun/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(src.effectrange,T))
@@ -30,6 +32,7 @@
to_chat(C, "You feel numb.")
/datum/artifact_effect/stun/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/carbon/C in range(src.effectrange,T))
diff --git a/code/modules/xenoarcheaology/effects/teleport.dm b/code/modules/xenoarcheaology/effects/teleport.dm
index 36b90afd31..2c766323db 100644
--- a/code/modules/xenoarcheaology/effects/teleport.dm
+++ b/code/modules/xenoarcheaology/effects/teleport.dm
@@ -1,8 +1,11 @@
/datum/artifact_effect/teleport
name = "teleport"
effect_type = EFFECT_BLUESPACE
+ effect_state = "pulsing"
+ effect_color = "#88ffdb"
/datum/artifact_effect/teleport/DoEffectTouch(var/mob/user)
+ var/atom/holder = get_master_holder()
var/weakness = GetAnomalySusceptibility(user)
if(prob(100 * weakness))
to_chat(user, "You are suddenly zapped away elsewhere!")
@@ -20,6 +23,7 @@
sparks.start()
/datum/artifact_effect/teleport/DoEffectAura()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/M in range(src.effectrange,T))
@@ -39,6 +43,7 @@
sparks.start()
/datum/artifact_effect/teleport/DoEffectPulse()
+ var/atom/holder = get_master_holder()
if(holder)
var/turf/T = get_turf(holder)
for (var/mob/living/M in range(src.effectrange, T))
diff --git a/code/modules/xenoarcheaology/effects/vampire.dm b/code/modules/xenoarcheaology/effects/vampire.dm
index e5a069b935..7c6ed91a5f 100644
--- a/code/modules/xenoarcheaology/effects/vampire.dm
+++ b/code/modules/xenoarcheaology/effects/vampire.dm
@@ -9,7 +9,11 @@
var/charges = 0
var/list/nearby_mobs = list()
+ effect_state = "gravisphere"
+ effect_color = "#ff0000"
+
/datum/artifact_effect/vampire/proc/bloodcall(var/mob/living/carbon/human/M)
+ var/atom/holder = get_master_holder()
last_bloodcall = world.time
if(istype(M))
playsound(holder, pick('sound/hallucinations/wail.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/far_noise.ogg'), 50, 1, -3)
@@ -23,30 +27,29 @@
B.target_turf = pick(range(1, get_turf(holder)))
B.blood_DNA = list()
B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
- M.vessel.remove_reagent("blood",rand(25,50))
+ M.vessel.remove_reagent("blood",rand(10,30))
/datum/artifact_effect/vampire/DoEffectTouch(var/mob/user)
bloodcall(user)
DoEffectAura()
/datum/artifact_effect/vampire/DoEffectAura()
- if (nearby_mobs.len)
+ var/atom/holder = get_master_holder()
+ if(nearby_mobs.len)
nearby_mobs.Cut()
-
var/turf/T = get_turf(holder)
for(var/mob/living/L in oview(effectrange, T))
if(!L.stat && L.mind)
nearby_mobs |= L
- if(world.time - last_bloodcall > bloodcall_interval && nearby_mobs.len)
+ if(world.time - bloodcall_interval >= last_bloodcall && LAZYLEN(nearby_mobs))
var/mob/living/carbon/human/M = pick(nearby_mobs)
- if(M in view(effectrange,holder) && M.health > 20)
- if(prob(50))
- bloodcall(M)
- holder.Beam(M, icon_state = "drainbeam", time = 1 SECOND)
+ if(get_dist(M, T) <= effectrange && M.health > 20)
+ bloodcall(M)
+ holder.Beam(M, icon_state = "drainbeam", time = 1 SECOND)
- if(world.time - last_eat > eat_interval)
+ if(world.time - last_eat >= eat_interval)
var/obj/effect/decal/cleanable/blood/B = locate() in range(2,holder)
if(B)
last_eat = world.time
@@ -62,13 +65,13 @@
if(charges >= 10)
charges -= 10
var/manifestation = pick(/obj/item/device/soulstone, /mob/living/simple_mob/faithless/cult/strong, /mob/living/simple_mob/creature/cult/strong, /mob/living/simple_mob/animal/space/bats/cult/strong)
- new manifestation(get_turf(pick(view(1,T))))
+ new manifestation(pick(RANGE_TURFS(1,T)))
if(charges >= 3)
if(prob(5))
charges -= 1
var/spawn_type = pick(/mob/living/simple_mob/animal/space/bats, /mob/living/simple_mob/creature, /mob/living/simple_mob/faithless)
- new spawn_type(get_turf(pick(view(1,T))))
+ new spawn_type(pick(RANGE_TURFS(1,T)))
playsound(holder, pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 50, 1, -3)
if(charges >= 1 && nearby_mobs.len && prob(15 * nearby_mobs.len))
diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
index 2b6e125855..354c160a8a 100644
--- a/code/modules/xenoarcheaology/finds/find_spawning.dm
+++ b/code/modules/xenoarcheaology/finds/find_spawning.dm
@@ -15,18 +15,20 @@
var/additional_desc = ""
var/obj/item/weapon/new_item
var/source_material = ""
- var/apply_material_decorations = 1
- var/apply_image_decorations = 0
+ var/apply_material_decorations = TRUE
+ var/apply_image_decorations = FALSE
var/material_descriptor = ""
- var/apply_prefix = 1
+ var/apply_prefix = TRUE
+
+ var/become_anomalous = FALSE
if(prob(40))
material_descriptor = pick("rusted ","dusty ","archaic ","fragile ", "damaged", "pristine")
source_material = pick("cordite","quadrinium","steel","titanium","aluminium","ferritic-alloy","plasteel","duranium")
- var/talkative = 0
+ var/talkative = FALSE
if(prob(5))
- talkative = 1
+ talkative = TRUE
//for all items here:
//icon_state
@@ -41,7 +43,7 @@
new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "bowl"
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(prob(40))
new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
if(prob(20))
@@ -55,7 +57,7 @@
new_item = new /obj/item/weapon/reagent_containers/glass/beaker(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "urn[rand(1,2)]"
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(prob(20))
additional_desc = "It [pick("whispers faintly","makes a quiet roaring sound","whistles softly","thrums quietly","throbs")] if you put it to your ear."
if(ARCHAEO_CUTLERY)
@@ -88,7 +90,9 @@
item_type = "instrument"
icon_state = "instrument"
if(prob(30))
- apply_image_decorations = 1
+ become_anomalous = TRUE
+ if(prob(30))
+ apply_image_decorations = TRUE
additional_desc = "[pick("You're not sure how anyone could have played this",\
"You wonder how many mouths the creator had",\
"You wonder what it sounds like",\
@@ -109,16 +113,16 @@
chance += 10
item_type = new_item.name
- apply_prefix = 0
- apply_material_decorations = 0
- apply_image_decorations = 1
+ apply_prefix = FALSE
+ apply_material_decorations = FALSE
+ apply_image_decorations = TRUE
if(ARCHAEO_HANDCUFFS)
item_type = "handcuffs"
new_item = new /obj/item/weapon/handcuffs(src.loc)
additional_desc = "[pick("They appear to be for securing two things together","Looks kinky","Doesn't seem like a children's toy")]."
if(ARCHAEO_BEARTRAP)
item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/beartrap(src.loc)
if(prob(40))
new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
@@ -130,7 +134,7 @@
new_item = new /obj/item/weapon/flame/lighter(src.loc)
additional_desc = "There is a tiny device attached."
if(prob(30))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_BOX)
item_type = "box"
new_item = new /obj/item/weapon/storage/box(src.loc)
@@ -142,7 +146,7 @@
new_box.max_storage_space = rand(storage_amount, storage_amount * 10)
if(prob(30))
LAZYSET(new_item.origin_tech, TECH_ARCANE, 1)
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_GASTANK)
item_type = "[pick("cylinder","tank","chamber")]"
if(prob(25))
@@ -163,12 +167,12 @@
new_item = new /obj/item/weapon/tool/screwdriver(src.loc)
if(prob(40))
new_item.color = rgb(rand(0,255),rand(0,255),rand(0,255))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
additional_desc = "[pick("It doesn't look safe.",\
"You wonder what it was used for",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains on it")]."
if(ARCHAEO_METAL)
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
var/list/possible_spawns = list()
possible_spawns += /obj/item/stack/material/steel
possible_spawns += /obj/item/stack/material/plasteel
@@ -193,9 +197,11 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "pen1"
LAZYSET(new_item.origin_tech, TECH_ARCANE, 1)
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_CRYSTAL)
- apply_prefix = 0
+ if(prob(40))
+ become_anomalous = TRUE
+ apply_prefix = FALSE
if(prob(25))
icon = 'icons/obj/xenoarchaeology.dmi'
item_type = "smooth green crystal"
@@ -210,9 +216,9 @@
icon_state = "changerock"
additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.")
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
if(prob(10))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(prob(25))
new_item = new /obj/item/device/soulstone(src.loc)
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
@@ -220,18 +226,18 @@
LAZYSET(new_item.origin_tech, TECH_ARCANE, 2)
if(ARCHAEO_CULTBLADE)
//cultblade
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/melee/cultblade(src.loc)
- apply_material_decorations = 0
- apply_image_decorations = 0
+ apply_material_decorations = FALSE
+ apply_image_decorations = FALSE
if(ARCHAEO_TELEBEACON)
new_item = new /obj/item/device/radio/beacon(src.loc)
- talkative = 0
+ talkative = FALSE
new_item.icon = 'icons/obj/xenoarchaeology.dmi'
new_item.icon_state = "unknown[rand(1,4)]"
new_item.desc = ""
if(ARCHAEO_CLAYMORE)
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/material/sword(src.loc)
new_item.force = 10
new_item.name = pick("great-sword","claymore","longsword","broadsword","shortsword","gladius")
@@ -241,7 +247,7 @@
new_item.icon_state = "blade1"
if(ARCHAEO_CULTROBES)
//arcane clothing
- apply_prefix = 0
+ apply_prefix = FALSE
var/list/possible_spawns = list(/obj/item/clothing/head/culthood,
/obj/item/clothing/head/culthood/magus,
/obj/item/clothing/head/culthood/alt,
@@ -252,25 +258,28 @@
LAZYSET(new_item.origin_tech, TECH_ARCANE, 1)
if(ARCHAEO_SOULSTONE)
//soulstone
- apply_prefix = 0
+ become_anomalous = TRUE
+ apply_prefix = FALSE
new_item = new /obj/item/device/soulstone(src.loc)
item_type = new_item.name
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
LAZYSET(new_item.origin_tech, TECH_ARCANE, 2)
if(ARCHAEO_SHARD)
if(prob(50))
new_item = new /obj/item/weapon/material/shard(src.loc)
else
new_item = new /obj/item/weapon/material/shard/phoron(src.loc)
- apply_prefix = 0
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_prefix = FALSE
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_RODS)
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/stack/rods(src.loc)
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_STOCKPARTS)
+ if(prob(30))
+ become_anomalous = TRUE
var/list/possible_spawns = typesof(/obj/item/weapon/stock_parts)
possible_spawns -= /obj/item/weapon/stock_parts
possible_spawns -= /obj/item/weapon/stock_parts/subspace
@@ -278,9 +287,9 @@
var/new_type = pick(possible_spawns)
new_item = new new_type(src.loc)
item_type = new_item.name
- apply_material_decorations = 0
+ apply_material_decorations = FALSE
if(ARCHAEO_KATANA)
- apply_prefix = 0
+ apply_prefix = FALSE
new_item = new /obj/item/weapon/material/sword/katana(src.loc)
new_item.force = 10
new_item.name = "katana"
@@ -349,9 +358,11 @@
item_type = "gun"
if(ARCHAEO_UNKNOWN)
+ if(prob(20))
+ become_anomalous = TRUE
//completely unknown alien device
if(prob(50))
- apply_image_decorations = 0
+ apply_image_decorations = FALSE
if(ARCHAEO_FOSSIL)
//fossil bone/skull
//new_item = new /obj/item/weapon/fossil/base(src.loc)
@@ -362,30 +373,30 @@
var/spawn_type = pickweight(candidates)
new_item = new spawn_type(src.loc)
- apply_prefix = 0
+ apply_prefix = FALSE
additional_desc = "A fossilised part of an alien, long dead."
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_SHELL)
//fossil shell
new_item = new /obj/item/weapon/fossil/shell(src.loc)
- apply_prefix = 0
+ apply_prefix = FALSE
additional_desc = "A fossilised, pre-Stygian alien crustacean."
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(prob(10))
- apply_image_decorations = 1
+ apply_image_decorations = TRUE
if(ARCHAEO_PLANT)
//fossil plant
new_item = new /obj/item/weapon/fossil/plant(src.loc)
item_type = new_item.name
additional_desc = "A fossilised shred of alien plant matter."
- apply_image_decorations = 0
- apply_material_decorations = 0
- apply_prefix = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
+ apply_prefix = FALSE
if(ARCHAEO_REMAINS_HUMANOID)
//humanoid remains
- apply_prefix = 0
+ apply_prefix = FALSE
item_type = "humanoid [pick("remains","skeleton")]"
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
@@ -396,11 +407,11 @@
"The bones are scored by numerous burns and partially melted.",\
"The are battered and broken, in some cases less than splinters are left.",\
"The mouth is wide open in a death rictus, the victim would appear to have died screaming.")
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_REMAINS_ROBOT)
//robot remains
- apply_prefix = 0
+ apply_prefix = FALSE
item_type = "[pick("mechanical","robotic","cyborg")] [pick("remains","chassis","debris")]"
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
@@ -411,11 +422,11 @@
"The chassis is scored by numerous burns and partially melted.",\
"The chassis is battered and broken, in some cases only chunks of metal are left.",\
"A pile of wires and crap metal that looks vaguely robotic.")
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_REMAINS_XENO)
//xenos remains
- apply_prefix = 0
+ apply_prefix = FALSE
item_type = "alien [pick("remains","skeleton")]"
icon = 'icons/effects/blood.dmi'
icon_state = "remainsxeno"
@@ -427,8 +438,8 @@
"The are battered and broken, in some cases less than splinters are left.",\
"This creature would have been twisted and monstrous when it was alive.",\
"It doesn't look human.")
- apply_image_decorations = 0
- apply_material_decorations = 0
+ apply_image_decorations = FALSE
+ apply_material_decorations = FALSE
if(ARCHAEO_GASMASK)
//gas mask
if(prob(25))
@@ -551,7 +562,7 @@
var/obj/item/weapon/reagent_containers/syringe/S = new_item
S.volume = 30
- //If S hasn't initialized yet, S.reagents will be null.
+ //If S hasn't initialized yet, S.reagents will be null.
//However, in that case Initialize will set the maximum volume to the volume for us, so we don't need to do anything.
S.reagents?.maximum_volume = 30
@@ -680,6 +691,9 @@
new_item.origin_tech[TECH_ARCANE] += 1
new_item.origin_tech[TECH_PRECURSOR] += 1
+ if(become_anomalous)
+ new_item.become_anomalous()
+
var/turf/simulated/mineral/T = get_turf(new_item)
if(istype(T))
T.last_find = new_item
@@ -691,3 +705,6 @@
LAZYINITLIST(origin_tech)
origin_tech[TECH_ARCANE] += 1
origin_tech[TECH_PRECURSOR] += 1
+
+ if(become_anomalous)
+ become_anomalous()
diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
index 44afa6ea2c..32259e774a 100644
--- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm
@@ -138,13 +138,37 @@
var/obj/machinery/artifact/A = scanned_obj
var/out = "Anomalous alien device - composed of an unknown alloy.
"
- if(A.my_effect)
- out += A.my_effect.getDescription()
+ var/datum/component/artifact_master/AMast = A.artifact_master
+ var/datum/artifact_effect/AEff = AMast.get_primary()
- if(A.secondary_effect && A.secondary_effect.activated)
+ out += AEff.getDescription()
+
+ if(AMast.my_effects.len > 1)
out += "
Internal scans indicate ongoing secondary activity operating independently from primary systems.
"
- out += A.secondary_effect.getDescription()
+ for(var/datum/artifact_effect/my_effect in A.artifact_master.my_effects - AEff)
+
+ if(my_effect)
+ out += my_effect.getDescription()
return out
else
+
+ var/datum/component/artifact_master/ScannedMaster = scanned_obj.GetComponent(/datum/component/artifact_master)
+
+ if(istype(ScannedMaster))
+ var/out = "Anomalous reality warp - Object has been altered to disobey known laws of physics.
"
+
+ var/datum/artifact_effect/AEff = ScannedMaster.get_primary()
+
+ out += AEff.getDescription()
+
+ if(ScannedMaster.my_effects.len > 1)
+ out += "
Resonant scans indicate asynchronous reality modulation:
"
+ for(var/datum/artifact_effect/my_effect in ScannedMaster.my_effects - AEff)
+
+ if(my_effect)
+ out += my_effect.getDescription()
+
+ return out
+
return "[scanned_obj.name] - mundane application."
diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
index 05aa87442d..03f0fdb484 100644
--- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm
+++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm
@@ -148,10 +148,12 @@
cur_artifact = analysed
//if both effects are active, we can't harvest either
- if(cur_artifact.my_effect && cur_artifact.my_effect.activated && cur_artifact.secondary_effect && cur_artifact.secondary_effect.activated)
+ var/list/active_effects = cur_artifact.artifact_master.get_active_effects()
+
+ if(active_effects.len > 1)
atom_say("Cannot harvest. Source is emitting conflicting energy signatures.")
return
- if(!cur_artifact.my_effect.activated && !(cur_artifact.secondary_effect && cur_artifact.secondary_effect.activated))
+ else if(!active_effects.len)
atom_say("Cannot harvest. No energy emitting from source.")
return
@@ -163,34 +165,24 @@
//
var/datum/artifact_effect/source_effect
+ var/datum/artifact_effect/active_effect = active_effects[1]
//if we already have charge in the battery, we can only recharge it from the source artifact
if(inserted_battery.stored_charge > 0)
var/battery_matches_primary_id = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.my_effect.artifact_id)
+ if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.artifact_master.artifact_id)
battery_matches_primary_id = 1
- if(battery_matches_primary_id && cur_artifact.my_effect.activated)
+ if(battery_matches_primary_id && active_effect.activated)
//we're good to recharge the primary effect!
- source_effect = cur_artifact.my_effect
-
- var/battery_matches_secondary_id = 0
- if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.secondary_effect.artifact_id)
- battery_matches_secondary_id = 1
- if(battery_matches_secondary_id && cur_artifact.secondary_effect.activated)
- //we're good to recharge the secondary effect!
- source_effect = cur_artifact.secondary_effect
+ source_effect = active_effect
if(!source_effect)
atom_say("Cannot harvest. Battery is charged with a different energy signature.")
else
//we're good to charge either
- if(cur_artifact.my_effect.activated)
+ if(active_effect.activated)
//charge the primary effect
- source_effect = cur_artifact.my_effect
-
- else if(cur_artifact.secondary_effect.activated)
- //charge the secondary effect
- source_effect = cur_artifact.secondary_effect
+ source_effect = active_effect
if(source_effect)
@@ -258,3 +250,134 @@
inserted_battery.battery_effect.ToggleActivate()
src.visible_message("[name] states, \"Battery dump completed.\"")
icon_state = "incubator"
+
+/obj/machinery/artifact_harvester/Topic(href, href_list)
+
+ if (href_list["harvest"])
+ if(!inserted_battery)
+ src.visible_message("[src] states, \"Cannot harvest. No battery inserted.\"")
+
+ else if(inserted_battery.stored_charge >= inserted_battery.capacity)
+ src.visible_message("[src] states, \"Cannot harvest. battery is full.\"")
+
+ else
+
+ //locate artifact on analysis pad
+ cur_artifact = null
+ var/articount = 0
+ var/obj/machinery/artifact/analysed
+ for(var/obj/machinery/artifact/A in get_turf(owned_scanner))
+ analysed = A
+ articount++
+
+ if(articount <= 0)
+ var/message = "[src] states, \"Cannot harvest. No noteworthy energy signature isolated.\""
+ src.visible_message(message)
+
+ else if(analysed && analysed.being_used)
+ src.visible_message("[src] states, \"Cannot harvest. Source already being harvested.\"")
+
+ else
+ if(articount > 1)
+ state("Cannot harvest. Too many artifacts on the pad.")
+ else if(analysed)
+ cur_artifact = analysed
+
+ //if both effects are active, we can't harvest either
+ var/list/active_effects = cur_artifact.artifact_master.get_active_effects()
+
+ if(active_effects.len > 1)
+ src.visible_message("[src] states, \"Cannot harvest. Source is emitting conflicting energy signatures.\"")
+ else if(!active_effects.len)
+ src.visible_message("[src] states, \"Cannot harvest. No energy emitting from source.\"")
+
+ else
+ //see if we can clear out an old effect
+ //delete it when the ids match to account for duplicate ids having different effects
+ if(inserted_battery.battery_effect && inserted_battery.stored_charge <= 0)
+ qdel(inserted_battery.battery_effect)
+ inserted_battery.battery_effect = null
+
+ //
+ var/datum/artifact_effect/source_effect
+ var/datum/artifact_effect/active_effect = active_effects[1]
+
+ //if we already have charge in the battery, we can only recharge it from the source artifact
+ if(inserted_battery.stored_charge > 0)
+ var/battery_matches_primary_id = 0
+ if(inserted_battery.battery_effect && inserted_battery.battery_effect.artifact_id == cur_artifact.artifact_master.artifact_id)
+ battery_matches_primary_id = 1
+ if(battery_matches_primary_id && active_effect.activated)
+ //we're good to recharge the primary effect!
+ source_effect = active_effect
+
+ if(!source_effect)
+ src.visible_message("[src] states, \"Cannot harvest. Battery is charged with a different energy signature.\"")
+ else
+ //we're good to charge either
+ if(active_effect.activated)
+ //charge the primary effect
+ source_effect = active_effect
+
+ if(source_effect)
+ harvesting = 1
+ update_use_power(USE_POWER_ACTIVE)
+ cur_artifact.anchored = 1
+ cur_artifact.being_used = 1
+ icon_state = "incubator_on"
+ var/message = "[src] states, \"Beginning energy harvesting.\""
+ src.visible_message(message)
+ last_process = world.time
+
+ //duplicate the artifact's effect datum
+ if(!inserted_battery.battery_effect)
+ var/effecttype = source_effect.type
+ var/datum/artifact_effect/E = new effecttype(inserted_battery)
+
+ //duplicate it's unique settings
+ for(var/varname in list("chargelevelmax","artifact_id","effect","effectrange","trigger"))
+ E.vars[varname] = source_effect.vars[varname]
+
+ //copy the new datum into the battery
+ inserted_battery.battery_effect = E
+ inserted_battery.stored_charge = 0
+
+ if (href_list["stopharvest"])
+ if(harvesting)
+ if(harvesting < 0 && inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate()
+ harvesting = 0
+ cur_artifact.anchored = 0
+ cur_artifact.being_used = 0
+ cur_artifact = null
+ src.visible_message("[name] states, \"Energy harvesting interrupted.\"")
+ icon_state = "incubator"
+
+ if (href_list["ejectbattery"])
+ src.inserted_battery.loc = src.loc
+ src.inserted_battery = null
+
+ if (href_list["drainbattery"])
+ if(inserted_battery)
+ if(inserted_battery.battery_effect && inserted_battery.stored_charge > 0)
+ if(alert("This action will dump all charge, safety gear is recommended before proceeding","Warning","Continue","Cancel"))
+ if(!inserted_battery.battery_effect.activated)
+ inserted_battery.battery_effect.ToggleActivate(1)
+ last_process = world.time
+ harvesting = -1
+ update_use_power(USE_POWER_ACTIVE)
+ icon_state = "incubator_on"
+ var/message = "[src] states, \"Warning, battery charge dump commencing.\""
+ src.visible_message(message)
+ else
+ var/message = "[src] states, \"Cannot dump energy. Battery is drained of charge already.\""
+ src.visible_message(message)
+ else
+ var/message = "[src] states, \"Cannot dump energy. No battery inserted.\""
+ src.visible_message(message)
+
+ if(href_list["close"])
+ usr << browse(null, "window=artharvester")
+ usr.unset_machine(src)
+
+ updateDialog()
diff --git a/code/modules/xenobio2/mob/xeno.dm b/code/modules/xenobio2/mob/xeno.dm
index 9996be9e61..d50063081a 100644
--- a/code/modules/xenobio2/mob/xeno.dm
+++ b/code/modules/xenobio2/mob/xeno.dm
@@ -101,7 +101,12 @@ Also includes Life and New
stasis += hit.stasisforce
..()
+<<<<<<< HEAD
/mob/living/simple_mob/xeno/Destroy()
traitdat.Destroy() //Let's clean up after ourselves.
traitdat = null
+=======
+/mob/living/simple_animal/xeno/Destroy()
+ QDEL_NULL(traitdat)
+>>>>>>> a7877d86e50... Merge pull request #8341 from MistakeNot4892/qdel
..()
\ No newline at end of file
diff --git a/code/modules/xenobio2/mob/xeno_product.dm b/code/modules/xenobio2/mob/xeno_product.dm
index a9989c3c45..91d66d429b 100644
--- a/code/modules/xenobio2/mob/xeno_product.dm
+++ b/code/modules/xenobio2/mob/xeno_product.dm
@@ -12,7 +12,6 @@ Xenobiological product lives here as a basic type.
var/nameVar = "blah"
/obj/item/xenoproduct/Destroy()
- traits.Destroy() //Let's not leave any traits hanging around.
- traits = null
+ QDEL_NULL(traits)
..()
\ No newline at end of file
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index f762fe371c..e2abc031b1 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/vore/ears_32x64.dmi b/icons/mob/vore/ears_32x64.dmi
index a661c9e3c7..df92e62a42 100644
Binary files a/icons/mob/vore/ears_32x64.dmi and b/icons/mob/vore/ears_32x64.dmi differ
diff --git a/icons/obj/flora/mushrooms.dmi b/icons/obj/flora/mushrooms.dmi
new file mode 100644
index 0000000000..755acb8d64
Binary files /dev/null and b/icons/obj/flora/mushrooms.dmi differ
diff --git a/icons/obj/machines/reagent.dmi b/icons/obj/machines/reagent.dmi
index 7495451380..7a284942bc 100644
Binary files a/icons/obj/machines/reagent.dmi and b/icons/obj/machines/reagent.dmi differ
diff --git a/icons/turf/flooring/asteroid.dmi b/icons/turf/flooring/asteroid.dmi
index 9df9089658..c7f2b12948 100644
Binary files a/icons/turf/flooring/asteroid.dmi and b/icons/turf/flooring/asteroid.dmi differ
diff --git a/icons/vore/custom_items_vr.dmi b/icons/vore/custom_items_vr.dmi
index 3c05eb5d57..ca6f3dfa19 100644
Binary files a/icons/vore/custom_items_vr.dmi and b/icons/vore/custom_items_vr.dmi differ
diff --git a/maps/cynosure/cynosure-1.dmm b/maps/cynosure/cynosure-1.dmm
index 61b5d30ceb..4b0fbde3b8 100644
--- a/maps/cynosure/cynosure-1.dmm
+++ b/maps/cynosure/cynosure-1.dmm
@@ -11831,7 +11831,7 @@
"zw" = (
/obj/effect/floor_decal/borderfloorwhite,
/obj/effect/floor_decal/corner/purple/border,
-/obj/structure/bed/chair/sofa/beige/left{
+/obj/structure/bed/chair/sofa/left/beige{
dir = 1
},
/obj/structure/extinguisher_cabinet{
@@ -12128,7 +12128,7 @@
},
/obj/effect/floor_decal/borderfloorwhite,
/obj/effect/floor_decal/corner/purple/border,
-/obj/structure/bed/chair/sofa/beige/right{
+/obj/structure/bed/chair/sofa/right/beige{
dir = 1
},
/turf/simulated/floor/tiled/neutral,
@@ -16534,6 +16534,9 @@
/area/surface/station/hallway/primary/bmt/west/elevator)
"Kc" = (
/obj/structure/stairs/spawner/south,
+/obj/structure/railing{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/surface/station/medical/hallway/bmt)
"Kd" = (
@@ -19063,6 +19066,9 @@
/turf/simulated/floor/plating,
/area/surface/station/maintenance/incineratormaint)
"Ph" = (
+/obj/structure/railing{
+ dir = 4
+ },
/turf/simulated/floor/tiled/dark,
/area/surface/station/medical/hallway/bmt)
"Pi" = (
@@ -54513,7 +54519,7 @@ RQ
RQ
xW
xW
-RQ
+xW
RQ
RQ
RQ
@@ -55025,7 +55031,7 @@ RQ
RQ
RQ
RQ
-xW
+RQ
xW
xW
xW
@@ -56327,7 +56333,7 @@ RQ
RQ
RQ
RQ
-RQ
+Kj
Kj
Kj
Kj
diff --git a/maps/cynosure/cynosure-2.dmm b/maps/cynosure/cynosure-2.dmm
index d723bb4373..832f0090da 100644
--- a/maps/cynosure/cynosure-2.dmm
+++ b/maps/cynosure/cynosure-2.dmm
@@ -2056,6 +2056,12 @@
},
/turf/simulated/floor/tiled/techfloor,
/area/surface/station/ai/upload_foyer)
+"aZV" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/dark,
+/area/surface/station/engineering/hallway)
"aZZ" = (
/obj/machinery/portable_atmospherics/hydroponics,
/obj/effect/floor_decal/borderfloorwhite/corner{
@@ -6768,7 +6774,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/structure/window/reinforced,
/turf/simulated/floor/tiled,
/area/surface/station/engineering/hallway)
"dfs" = (
@@ -8592,7 +8597,6 @@
/obj/machinery/camera/network/medbay{
c_tag = "MED - Operating Theatre 2"
},
-/obj/machinery/optable,
/turf/simulated/floor/tiled/white,
/area/surface/station/medical/surgery2)
"ecL" = (
@@ -14432,12 +14436,8 @@
/area/surface/station/crew_quarters/heads/hop)
"gEG" = (
/obj/machinery/power/smes/buildable{
-<<<<<<< HEAD
- RCon_tag = "Solar - Northeast";
-=======
RCon_tag = "Solar - West";
cur_coils = 2;
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
input_attempt = 1;
input_level = 300000;
output_level = 200000
@@ -21729,6 +21729,10 @@
d2 = 8;
icon_state = "4-8"
},
+/obj/structure/cable{
+ d2 = 4;
+ icon_state = "0-4"
+ },
/obj/machinery/power/sensor{
name = "Powernet Sensor - Master Grid";
name_tag = "Master"
@@ -22531,6 +22535,9 @@
/area/surface/station/medical/emt_bay)
"kxM" = (
/obj/structure/stairs/spawner/east,
+/obj/structure/railing{
+ dir = 1
+ },
/turf/simulated/floor/tiled/dark,
/area/surface/station/engineering/hallway)
"kyJ" = (
@@ -25996,9 +26003,6 @@
dir = 6
},
/obj/effect/floor_decal/steeldecal/steel_decals_central7,
-/obj/machinery/recharger/wallcharger{
- pixel_x = 32
- },
/obj/structure/table/steel_reinforced,
/obj/item/ammo_magazine/s45/practice,
/obj/item/ammo_magazine/s45/practice,
@@ -26015,6 +26019,12 @@
/obj/item/ammo_magazine/m9mmt/practice,
/obj/item/weapon/storage/box/blanks/large,
/obj/item/weapon/storage/box/blanks/large,
+/obj/machinery/magnetic_controller{
+ autolink = 1;
+ density = 0;
+ dir = 4;
+ pixel_x = 30
+ },
/turf/simulated/floor/tiled,
/area/surface/station/security/range)
"maD" = (
@@ -31500,6 +31510,10 @@
},
/turf/simulated/floor/tiled/steel_grid,
/area/surface/station/medical/reception)
+"otX" = (
+/obj/machinery/optable,
+/turf/simulated/floor/tiled/white,
+/area/surface/station/medical/surgery2)
"oub" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -37594,7 +37608,6 @@
/obj/machinery/camera/network/medbay{
c_tag = "MED - Operating Theatre 1"
},
-/obj/machinery/optable,
/turf/simulated/floor/tiled/white,
/area/surface/station/medical/surgery)
"qVW" = (
@@ -39226,6 +39239,10 @@
/obj/random/maintenance/clean,
/turf/simulated/floor/plating,
/area/surface/station/maintenance/surgery)
+"rIW" = (
+/obj/machinery/optable,
+/turf/simulated/floor/tiled/white,
+/area/surface/station/medical/surgery)
"rJl" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
@@ -42586,6 +42603,10 @@
/obj/machinery/recharger/wallcharger{
pixel_x = 32
},
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 32;
+ pixel_y = -10
+ },
/turf/simulated/floor/tiled,
/area/surface/station/security/range)
"toQ" = (
@@ -47994,7 +48015,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/structure/window/reinforced,
/turf/simulated/floor/tiled,
/area/surface/station/engineering/hallway)
"vNz" = (
@@ -86168,7 +86188,7 @@ dns
red
kBa
kMw
-psC
+rIW
lVJ
ykd
suW
@@ -88738,7 +88758,7 @@ bBP
vJx
esD
dRW
-ycR
+otX
vVA
uBt
toG
@@ -92132,7 +92152,7 @@ ekV
eJU
rxO
dfk
-lsu
+aZV
dlE
sUN
drL
diff --git a/maps/cynosure/cynosure-3.dmm b/maps/cynosure/cynosure-3.dmm
index 7c9e1683f4..9853cf2bdb 100644
--- a/maps/cynosure/cynosure-3.dmm
+++ b/maps/cynosure/cynosure-3.dmm
@@ -8712,7 +8712,7 @@
/turf/simulated/floor/plating,
/area/surface/station/rnd/lab)
"fOa" = (
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/obj/effect/landmark/start{
@@ -8771,15 +8771,19 @@
/turf/simulated/floor/tiled/techfloor/grid,
/area/surface/station/ai_monitored/storage/eva)
"fSH" = (
-/obj/machinery/computer/general_air_control/supermatter_core{
- dir = 8
- },
/obj/effect/floor_decal/borderfloor{
dir = 4
},
/obj/effect/floor_decal/corner/yellow/border{
dir = 4
},
+/obj/machinery/computer/general_air_control/supermatter_core{
+ dir = 8;
+ input_tag = "cooling_in";
+ name = "Engine Cooling Control";
+ output_tag = "cooling_out";
+ sensors = list("engine_sensor" = "Engine Core")
+ },
/turf/simulated/floor/tiled,
/area/surface/station/engineering/reactor_monitoring)
"fTe" = (
@@ -26922,7 +26926,7 @@
/turf/simulated/floor/tiled/white,
/area/surface/station/rnd/research)
"rLU" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 4
},
/obj/effect/landmark/start{
diff --git a/maps/cynosure/cynosure-4.dmm b/maps/cynosure/cynosure-4.dmm
index 0f67278d5c..deece45f47 100644
--- a/maps/cynosure/cynosure-4.dmm
+++ b/maps/cynosure/cynosure-4.dmm
@@ -1473,7 +1473,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 5
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"pq" = (
/obj/structure/cable/yellow,
@@ -1572,7 +1576,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 6
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"qc" = (
/obj/effect/floor_decal/borderfloor{
@@ -1899,7 +1907,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 10
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"ta" = (
/obj/structure/cable{
@@ -2461,13 +2473,21 @@
/obj/effect/floor_decal/techfloor{
dir = 6
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"zJ" = (
/obj/effect/floor_decal/techfloor/corner{
dir = 6
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"zO" = (
/obj/machinery/atmospherics/pipe/simple/hidden/black,
@@ -2586,7 +2606,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 9
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"BD" = (
/obj/effect/floor_decal/borderfloor{
@@ -2855,7 +2879,11 @@
/obj/effect/floor_decal/techfloor{
dir = 5
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"Eq" = (
/obj/structure/cable{
@@ -3024,7 +3052,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 9
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"Gq" = (
/obj/structure/bed/chair/shuttle,
@@ -3148,7 +3180,11 @@
/obj/effect/floor_decal/techfloor{
dir = 9
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"Hk" = (
/obj/effect/floor_decal/techfloor,
@@ -4212,7 +4248,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 10
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"QG" = (
/obj/structure/window/reinforced{
@@ -4733,7 +4773,11 @@
/obj/effect/floor_decal/techfloor/corner{
dir = 5
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"UY" = (
/obj/structure/window/reinforced,
@@ -5050,7 +5094,11 @@
/obj/effect/floor_decal/techfloor{
dir = 10
},
-/turf/simulated/floor/tiled/techfloor,
+/turf/simulated/floor/tiled/techfloor{
+ nitrogen = 100;
+ oxygen = 0;
+ temperature = 73
+ },
/area/tcommsat/cynosure/chamber)
"Yb" = (
/obj/effect/floor_decal/industrial/warning{
diff --git a/maps/cynosure/cynosure-6.dmm b/maps/cynosure/cynosure-6.dmm
index c736f85e2e..5fbfaa4e5b 100644
--- a/maps/cynosure/cynosure-6.dmm
+++ b/maps/cynosure/cynosure-6.dmm
@@ -94,7 +94,7 @@
},
/obj/machinery/access_button{
command = "cycle_interior";
- frequency = 1331;
+ frequency = 1380;
master_tag = "ninja_shuttle";
name = "interior access button";
pixel_x = -25;
@@ -530,7 +530,7 @@
/obj/machinery/atmospherics/pipe/manifold4w/visible,
/obj/machinery/access_button{
command = "cycle_interior";
- frequency = 1331;
+ frequency = 1380;
master_tag = "merc_shuttle";
name = "interior access button";
pixel_x = 25;
@@ -797,7 +797,7 @@
"aTS" = (
/obj/machinery/access_button{
command = "cycle_exterior";
- frequency = 1331;
+ frequency = 1380;
master_tag = "vox_west_control";
req_one_access = list(150)
},
@@ -1267,7 +1267,7 @@
opacity = 0
},
/obj/machinery/door/airlock/voidcraft{
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_outer";
name = "Ship External Access";
req_access = list(150)
@@ -1786,7 +1786,7 @@
/area/holodeck/source_courtroom)
"ccc" = (
/obj/machinery/airlock_sensor{
- frequency = 1331;
+ frequency = 1380;
id_tag = "ninja_shuttle_sensor";
pixel_y = 28
},
@@ -2055,7 +2055,7 @@
/area/syndicate_station)
"ctM" = (
/obj/machinery/door/airlock/hatch{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_southwest_lock";
req_access = list(150)
},
@@ -2292,7 +2292,7 @@
/area/shuttle/supply)
"cKC" = (
/obj/machinery/airlock_sensor{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_east_sensor";
pixel_x = -25
},
@@ -2789,8 +2789,8 @@
"dqX" = (
/obj/machinery/access_button{
command = "cycle_exterior";
- frequency = 1331;
- master_tag = "vox_east_control";
+ frequency = 1380;
+ master_tag = "skipjack_shuttle";
req_access = list(150)
},
/turf/simulated/wall/skipjack,
@@ -4011,7 +4011,7 @@
/area/ninja_dojo/start)
"eOt" = (
/obj/machinery/door/airlock/voidcraft/vertical{
- frequency = 1331;
+ frequency = 1380;
id_tag = "ninja_shuttle_outer";
name = "Ship External Hatch";
req_access = list(150)
@@ -4327,8 +4327,8 @@
/obj/machinery/atmospherics/pipe/simple/visible,
/obj/machinery/access_button{
command = "cycle_interior";
- frequency = 1331;
- master_tag = "vox_east_control";
+ frequency = 1380;
+ master_tag = "skipjack_shuttle";
pixel_x = 22;
req_access = list(150)
},
@@ -4344,6 +4344,15 @@
name = "plating"
},
/area/skipjack_station)
+"fgd" = (
+/obj/structure/bed/chair{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor/darkred,
+/area/shuttle/syndicate_elite/mothership)
"fhd" = (
/obj/structure/table/rack,
/obj/item/weapon/gun/projectile/automatic/wt550,
@@ -4979,13 +4988,12 @@
/obj/structure/bed/chair{
dir = 4
},
-/obj/machinery/embedded_controller/radio/airlock/docking_port{
- frequency = 1331;
+/obj/machinery/embedded_controller/radio/simple_docking_controller{
+ frequency = 1380;
id_tag = "merc_elite_shuttle";
- pixel_x = -24;
- pixel_y = -2;
- req_access = list(150);
- tag_exterior_door = "merc_elite_shuttle_hatch"
+ pixel_x = -25;
+ req_one_access = list(150);
+ tag_door = "merc_elite_shuttle_hatch"
},
/turf/simulated/shuttle/floor/darkred,
/area/shuttle/syndicate_elite/mothership)
@@ -6931,7 +6939,7 @@
/area/syndicate_station/start)
"idR" = (
/obj/machinery/embedded_controller/radio/airlock/airlock_controller{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_west_control";
pixel_x = 24;
req_access = list(150);
@@ -6942,7 +6950,7 @@
},
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 8;
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_west_vent"
},
/obj/machinery/light/small,
@@ -8983,7 +8991,7 @@
"kqh" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 4;
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_pump"
},
/obj/machinery/light/small,
@@ -8994,7 +9002,7 @@
/area/skipjack_station/start)
"kqS" = (
/obj/machinery/airlock_sensor{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_west_sensor";
pixel_x = 25
},
@@ -10883,7 +10891,7 @@
/area/holodeck/source_picnicarea)
"mrF" = (
/obj/machinery/door/airlock/hatch{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_southeast_lock";
req_access = list(150)
},
@@ -11582,6 +11590,9 @@
/obj/structure/bed/chair{
dir = 4
},
+/obj/machinery/light{
+ dir = 8
+ },
/turf/simulated/shuttle/floor/darkred,
/area/shuttle/syndicate_elite/mothership)
"ngK" = (
@@ -11761,7 +11772,7 @@
/area/centcom/specops)
"nsa" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_west_vent"
},
/turf/simulated/shuttle/plating,
@@ -12228,7 +12239,7 @@
dir = 4
},
/obj/machinery/door/airlock/voidcraft/vertical{
- frequency = 1331;
+ frequency = 1380;
id_tag = "ninja_shuttle_inner";
name = "Ship Internal Hatch";
req_access = list(150)
@@ -12601,7 +12612,7 @@
/area/syndicate_station/start)
"otk" = (
/obj/machinery/door/airlock/hatch{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_northeast_lock";
req_access = list(150)
},
@@ -13651,7 +13662,7 @@
"pFK" = (
/obj/machinery/access_button{
command = "cycle_interior";
- frequency = 1331;
+ frequency = 1380;
master_tag = "merc_shuttle";
name = "interior access button";
pixel_x = -25;
@@ -14779,7 +14790,7 @@
/obj/machinery/atmospherics/pipe/simple/visible,
/obj/machinery/access_button{
command = "cycle_interior";
- frequency = 1331;
+ frequency = 1380;
master_tag = "vox_west_control";
pixel_x = -22;
req_one_access = list(150)
@@ -15526,7 +15537,7 @@
"rzx" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 8;
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_pump"
},
/obj/effect/shuttle_landmark{
@@ -15676,7 +15687,7 @@
/area/syndicate_station/start)
"rGU" = (
/obj/machinery/door/airlock/voidcraft/vertical{
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_inner";
name = "Ship External Access";
req_access = list(150)
@@ -15688,7 +15699,7 @@
/area/syndicate_station/start)
"rHT" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_east_vent"
},
/turf/simulated/shuttle/plating,
@@ -15731,7 +15742,7 @@
"rKS" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 8;
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_pump"
},
/turf/simulated/shuttle/floor/voidcraft/dark,
@@ -15837,10 +15848,10 @@
/area/centcom/main_hall)
"rOP" = (
/obj/machinery/atmospherics/pipe/manifold/visible{
- dir = 8
+ dir = 4
},
/obj/machinery/door/airlock/voidcraft/vertical{
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_inner";
name = "Ship External Access";
req_access = list(150)
@@ -17084,18 +17095,18 @@
"teW" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 4;
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_pump"
},
/obj/machinery/embedded_controller/radio/airlock/docking_port{
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle";
pixel_x = 24;
pixel_y = -2;
req_access = list(150)
},
/obj/machinery/airlock_sensor{
- frequency = 1331;
+ frequency = 1380;
id_tag = "merc_shuttle_sensor";
pixel_x = 28;
pixel_y = 8
@@ -17213,10 +17224,7 @@
},
/area/skipjack_station)
"tnL" = (
-/turf/simulated/shuttle/wall/dark{
- hard_corner = 1;
- join_group = "shuttle_ert"
- },
+/turf/simulated/shuttle/wall/dark/hard_corner,
/area/shuttle/response_ship/start)
"tos" = (
/obj/machinery/light{
@@ -20354,7 +20362,7 @@
/area/syndicate_station/start)
"wJs" = (
/obj/machinery/door/airlock/hatch{
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_northwest_lock";
req_access = list(150)
},
@@ -20402,12 +20410,12 @@
"wNk" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 4;
- frequency = 1331;
+ frequency = 1380;
id_tag = "vox_east_vent"
},
/obj/machinery/light/small,
/obj/machinery/embedded_controller/radio/airlock/docking_port{
- frequency = 1331;
+ frequency = 1380;
id_tag = "skipjack_shuttle";
pixel_x = -24;
req_access = list(150);
@@ -21809,14 +21817,14 @@
/area/shuttle/escape/centcom)
"ymb" = (
/obj/machinery/embedded_controller/radio/airlock/docking_port{
- frequency = 1331;
+ frequency = 1380;
id_tag = "ninja_shuttle";
pixel_y = -25;
req_access = list(150)
},
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
dir = 4;
- frequency = 1331;
+ frequency = 1380;
id_tag = "ninja_shuttle_pump"
},
/obj/machinery/button/remote/blast_door{
@@ -85785,7 +85793,7 @@ dFI
eUF
eUF
fSe
-fSe
+fgd
hht
iai
iSX
diff --git a/maps/cynosure/cynosure-7.dmm b/maps/cynosure/cynosure-7.dmm
index f80655426c..cc01185cfe 100644
--- a/maps/cynosure/cynosure-7.dmm
+++ b/maps/cynosure/cynosure-7.dmm
@@ -1675,7 +1675,7 @@ oR
oR
oR
oR
-eL
+oR
oR
oR
oR
@@ -1916,8 +1916,6 @@ oR
oR
oR
oR
-eL
-eL
oR
oR
oR
@@ -1925,23 +1923,25 @@ oR
oR
oR
oR
-eL
-eL
-oR
-oR
-eL
oR
oR
oR
oR
-eL
oR
oR
-eL
oR
-eL
-eL
-eL
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
oR
oR
oR
@@ -2164,40 +2164,40 @@ oR
oR
oR
oR
-eL
oR
oR
oR
oR
-eL
oR
oR
oR
-eL
-oR
-eL
oR
oR
oR
-eL
oR
oR
oR
-eL
oR
oR
oR
-eL
-eL
-eL
-oR
-eL
oR
oR
-eL
-eL
-eL
-eL
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
oR
oR
oR
@@ -2421,37 +2421,29 @@ oR
oR
oR
oR
-eL
-oR
-oR
-eL
-oR
-eL
-eL
-oR
-oR
-eL
oR
oR
oR
-eL
-eL
oR
oR
oR
-eL
oR
oR
-<<<<<<< HEAD
-eL
-eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
-Wi
-Wi
-Wi
-Wi
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
oR
oR
oR
@@ -2683,52 +2675,43 @@ oR
oR
oR
oR
-eL
+oR
+oR
oR
eL
-oR
-oR
-<<<<<<< HEAD
-eL
-=======
-oR
-oR
-oR
-oR
-oR
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
eL
oR
oR
oR
oR
-<<<<<<< HEAD
+oR
+oR
+oR
+oR
+oR
+oR
+eL
+oR
+eL
+oR
+oR
+oR
+eL
eL
oR
eL
-=======
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
eL
oR
oR
-oR
-<<<<<<< HEAD
eL
-Wi
-Wi
-Wi
-Wi
+oR
+eL
+eL
eL
-=======
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
oR
oR
@@ -2748,12 +2731,6 @@ oR
oR
oR
oR
-<<<<<<< HEAD
-FR
-=======
-oR
-oR
-oR
oR
oR
oR
@@ -2769,7 +2746,6 @@ oR
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
oR
oR
@@ -2966,60 +2942,40 @@ oR
oR
oR
oR
-<<<<<<< HEAD
-=======
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
-oR
-Wi
-Wi
-Wi
-oR
-<<<<<<< HEAD
eL
+oR
eL
oR
oR
+oR
+eL
+oR
+oR
+oR
+eL
+oR
+oR
+oR
eL
eL
-Wi
-Wi
-Wi
-eL
eL
oR
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+eL
eL
-=======
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
-<<<<<<< HEAD
eL
-oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
oR
oR
@@ -3257,14 +3213,6 @@ oR
oR
oR
oR
-<<<<<<< HEAD
-eL
-eL
-eL
-Wi
-Wi
-Wi
-oR
Wi
Wi
Wi
@@ -3274,7 +3222,6 @@ Wi
Wi
Wi
Wi
-=======
oR
oR
oR
@@ -3289,24 +3236,29 @@ oR
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
+oR
+oR
oR
oR
eL
eL
+oR
+oR
+oR
+eL
+oR
+oR
eL
eL
oR
+Wi
+Wi
+Wi
+Wi
+oR
+oR
+oR
eL
oR
oR
@@ -3546,41 +3498,33 @@ oR
oR
oR
oR
-<<<<<<< HEAD
oR
oR
+eL
+oR
+oR
+eL
+oR
+oR
+oR
+oR
+eL
+oR
+eL
+oR
+eL
+oR
+oR
+eL
+oR
+eL
Wi
Wi
Wi
Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Hb
-Wi
eL
oR
eL
-eL
-eL
-eL
-eL
-eL
-eL
-oR
-eL
-=======
oR
oR
oR
@@ -3621,7 +3565,6 @@ uP
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
oR
oR
@@ -3835,17 +3778,28 @@ oR
oR
oR
oR
+oR
+oR
+oR
+oR
+oR
+oR
+Wi
+Wi
+Wi
+oR
eL
eL
oR
oR
-<<<<<<< HEAD
-Wi
-Wi
-Wi
+eL
+eL
Wi
Wi
Wi
+eL
+eL
+oR
Wi
Wi
Wi
@@ -3865,20 +3819,6 @@ Wi
Wi
Wi
Wi
-=======
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
-oR
-<<<<<<< HEAD
-=======
-uP
-oR
-oR
-oR
-uP
oR
uP
oR
@@ -3890,15 +3830,12 @@ oR
oR
uP
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
oR
uP
uP
uP
oR
-<<<<<<< HEAD
-=======
uP
oR
oR
@@ -3906,7 +3843,6 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
oR
oR
@@ -4123,48 +4059,45 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+oR
+oR
+oR
+oR
+oR
+eL
+eL
+eL
+Wi
+Wi
+Wi
+oR
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+oR
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+oR
+eL
+oR
+eL
eL
eL
eL
oR
-eL
-oR
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Hb
-Hb
-Hb
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Hb
-Hb
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-eL
-eL
-eL
-oR
-oR
-oR
-oR
-oR
-oR
-=======
oR
oR
oR
@@ -4180,7 +4113,6 @@ oR
uP
uP
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
uP
oR
@@ -4424,38 +4356,40 @@ oR
oR
oR
oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Hb
+Hb
+Wi
eL
oR
-oR
-<<<<<<< HEAD
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Hb
-Hb
-Wi
-Wi
-Hb
-Wi
-Wi
-Wi
-Hb
-Hb
-Hb
-Hb
-Wi
-Wi
-Wi
-oR
-Wi
-Wi
-Wi
-oR
+eL
+eL
+eL
+eL
+eL
eL
eL
oR
@@ -4463,8 +4397,6 @@ oR
oR
oR
oR
-=======
-uP
oR
uP
oR
@@ -4492,7 +4424,7 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
uP
uP
@@ -4716,81 +4648,78 @@ oR
oR
oR
oR
-oR
-<<<<<<< HEAD
-eL
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Wi
-Wi
-Wi
-Hb
-Hb
-Hb
-Wi
-Wi
-Hb
-Hb
-Hb
-Wi
-Wi
-Wi
-Wi
eL
eL
-eL
-=======
-oR
-oR
-oR
-oR
-oR
-oR
-uP
-oR
-uP
-uP
-uP
-oR
-uP
-uP
-oR
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-oR
-uP
-oR
-oR
-uP
-oR
-oR
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
oR
eL
-eL
+oR
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Hb
+Hb
+Wi
+Wi
+Wi
+Wi
+oR
+oR
+oR
+oR
+oR
+oR
+uP
+oR
+uP
+uP
+uP
+oR
+uP
+uP
+oR
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+oR
+uP
+oR
+oR
+uP
+oR
+oR
+oR
+
+
+oR
oR
oR
oR
@@ -5004,9 +4933,15 @@ oR
oR
oR
oR
+eL
+eL
+eL
oR
-<<<<<<< HEAD
-oR
+
+eL
+
+
+
oR
Wi
Wi
@@ -5015,10 +4950,12 @@ Wi
Wi
Wi
Wi
-Wi
-Wi
-Wi
Hb
+Hb
+Hb
+Hb
+Wi
+Wi
Wi
Wi
Wi
@@ -5026,7 +4963,7 @@ Hb
Hb
Hb
Wi
-Hb
+Wi
Wi
Wi
Wi
@@ -5034,14 +4971,17 @@ Wi
eL
eL
eL
+
+
eL
oR
oR
oR
oR
-=======
+
+
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -5296,40 +5236,52 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+
+
+eL
+
+oR
+oR
eL
oR
oR
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Hb
+Hb
+Hb
+Wi
+Wi
+Hb
+Wi
+Wi
+Wi
+Hb
+Hb
+Hb
+Hb
+Wi
+Wi
+Wi
+oR
+Wi
+Wi
+Wi
+oR
eL
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Wi
-Wi
-Hb
-Wi
-Hb
-Hb
-Wi
-Hb
-Hb
-Hb
-Wi
-Wi
-Wi
-Wi
-Wi
+eL
+
+
eL
eL
eL
-eL
-eL
-=======
+
oR
oR
oR
@@ -5373,9 +5325,10 @@ uP
oR
uP
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
+
oR
oR
oR
@@ -5394,13 +5347,13 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
oR
oR
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -5595,42 +5548,51 @@ oR
oR
oR
oR
+oR
+oR
+oR
+oR
+
+eL
+Wi
+Wi
+Wi
+
+
+
+Wi
+Wi
+Wi
+Wi
+Hb
+Wi
+Wi
+Wi
+Hb
+Hb
+Hb
+Wi
+Wi
+Hb
+Hb
+Hb
+Wi
+Wi
+Wi
+Wi
+eL
+eL
eL
oR
+
eL
-oR
-oR
-oR
-<<<<<<< HEAD
-Wi
-Wi
-Wi
-Wi
-Hb
-Wi
-Wi
-Wi
-Hb
-Wi
-Hb
-Hb
-Hb
-Hb
-Hb
-Wi
-Hb
-Wi
-Wi
-Wi
-oR
-oR
eL
+
oR
oR
oR
oR
-oR
-=======
+
oR
uP
uP
@@ -5663,10 +5625,11 @@ uP
uP
uP
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
+
oR
oR
oR
@@ -5885,66 +5848,73 @@ oR
oR
oR
oR
-eL
oR
+oR
+oR
+oR
+oR
+
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+
+oR
+oR
+uP
+uP
+uP
+oR
+uP
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+Hb
+Hb
+Wi
+Wi
+Wi
+Hb
+
+Hb
+uP
+uP
+uP
+uP
+uP
+Hb
+Hb
+
+Hb
+Wi
+Hb
+Wi
+Wi
+Wi
+Wi
+
eL
eL
eL
-oR
-<<<<<<< HEAD
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Hb
-Wi
-Wi
-=======
-oR
-oR
-uP
-uP
-uP
-oR
-uP
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-Hb
-Hb
-Hb
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-Hb
-uP
-uP
-uP
-uP
-uP
-Hb
-Hb
-<<<<<<< HEAD
-Hb
-Wi
-Hb
-Hb
-Hb
-Wi
-Wi
-Wi
-Wi
+eL
+
oR
oR
oR
oR
oR
-=======
+
Hb
uP
uP
@@ -5955,7 +5925,7 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -5984,6 +5954,7 @@ oR
oR
oR
oR
+
oR
oR
oR
@@ -6174,17 +6145,21 @@ pM
oR
oR
oR
-<<<<<<< HEAD
+
+oR
+
+
eL
-=======
+
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
eL
-eL
oR
-<<<<<<< HEAD
+oR
+
eL
Wi
Wi
@@ -6192,7 +6167,10 @@ Wi
Wi
Wi
Wi
-=======
+
+Wi
+
+
oR
oR
uP
@@ -6205,8 +6183,11 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
Hb
+Wi
+Wi
Hb
Hb
uP
@@ -6216,40 +6197,43 @@ uP
uP
uP
Hb
-<<<<<<< HEAD
+
+Wi
+Hb
+
+
+
Hb
Hb
Wi
Wi
Wi
-Hb
Wi
+
+
+
+Hb
+Hb
+Hb
+uP
+uP
+uP
+oR
+uP
+uP
+uP
+oR
+uP
+uP
+
+oR
+oR
+
Wi
-=======
-Hb
-Hb
-Hb
-uP
-uP
-uP
-oR
-uP
-uP
-uP
-oR
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-Wi
-oR
-oR
-oR
-oR
-oR
eL
-oR
+eL
+eL
+eL
eL
oR
oR
@@ -6272,6 +6256,12 @@ oR
oR
oR
oR
+
+oR
+oR
+FR
+
+
oR
oR
oR
@@ -6470,76 +6460,88 @@ oR
oR
oR
oR
-<<<<<<< HEAD
-eL
-eL
-oR
-Wi
-Wi
-Wi
-Wi
-Wi
-Hb
-Hb
-=======
-oR
-oR
-oR
-oR
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-Hb
-uP
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-Hb
-Hb
-Hb
-uP
-uP
-Hb
-Hb
-Hb
-<<<<<<< HEAD
-Hb
-Wi
-Wi
-Wi
-Wi
-Wi
-=======
-uP
-uP
-uP
-uP
-uP
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-uP
-uP
-oR
-<<<<<<< HEAD
-=======
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-eL
+
eL
oR
oR
+oR
+Wi
+Wi
+Wi
+Wi
+Hb
+Wi
+Wi
+Wi
+Hb
+
+Wi
+
+
+oR
+oR
+oR
+oR
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+Hb
+uP
+uP
+uP
+
+
+Hb
+Hb
+Hb
+uP
+uP
+Hb
+Hb
+Hb
+
+
+
+Hb
+Wi
+Wi
+
+Wi
+Wi
+Wi
+
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+
+oR
+uP
+uP
+oR
+
eL
oR
+
+
+
+oR
+
+
+oR
+oR
+oR
+oR
+oR
oR
oR
oR
@@ -6752,17 +6754,19 @@ pM
oR
oR
oR
-<<<<<<< HEAD
+
+oR
+
+
+eL
+
+oR
eL
oR
eL
-oR
eL
eL
-Wi
-Wi
-Wi
-Wi
+oR
Wi
Wi
Wi
@@ -6770,40 +6774,49 @@ Wi
Wi
Hb
Hb
-=======
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-Hb
-uP
-uP
-uP
-Hb
-<<<<<<< HEAD
Wi
Wi
-=======
+Hb
+Hb
+
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+
+Hb
+uP
+uP
+uP
+Hb
+
+Wi
+
+Hb
+Hb
+
+Wi
+
+
Hb
Hb
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
Hb
uP
uP
@@ -6815,10 +6828,7 @@ uP
uP
oR
oR
-eL
-eL
-eL
-eL
+oR
oR
oR
oR
@@ -7038,78 +7048,96 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+
+
oR
+
eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
-<<<<<<< HEAD
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-=======
-oR
-oR
-uP
-oR
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-Hb
-uP
-uP
-Hb
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-Hb
-Hb
-uP
-Hb
-Hb
-<<<<<<< HEAD
-Wi
-Hb
-Hb
-Wi
-Wi
-Wi
-Wi
+
eL
+
+
+Wi
+
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+
+oR
+oR
+uP
+oR
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+Hb
+uP
+uP
+Hb
+
+Wi
+Hb
+Hb
+
+uP
+
+Hb
+Hb
+uP
+Hb
+Hb
+
+Wi
+
+Hb
+Hb
+Wi
+Wi
+Wi
+Hb
+Wi
+Wi
+oR
+oR
+
+Wi
+
+
+Hb
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+
+oR
+oR
+
+oR
oR
oR
eL
oR
-=======
-Hb
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-oR
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
-oR
+eL
oR
oR
oR
@@ -7327,21 +7355,26 @@ oR
oR
oR
oR
+eL
oR
-<<<<<<< HEAD
+
eL
eL
+oR
Wi
Wi
Wi
Wi
Wi
Hb
-Wi
-Wi
Hb
+
+Hb
+Hb
+Hb
+
Wi
-=======
+
oR
uP
oR
@@ -7362,36 +7395,47 @@ uP
Hb
Hb
Hb
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
Hb
Hb
uP
Hb
-<<<<<<< HEAD
-Wi
+
+Wi
+Hb
+Hb
Wi
Wi
Wi
Wi
Wi
+
+
eL
-=======
+
uP
uP
uP
oR
+
oR
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
-oR
-oR
-<<<<<<< HEAD
+
eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+eL
+
+
+oR
+oR
+
+eL
+
+
oR
oR
oR
@@ -7412,14 +7456,17 @@ PH
oR
oR
oR
+
+
oR
oR
oR
-<<<<<<< HEAD
+
oR
+
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -7616,10 +7663,11 @@ oR
oR
oR
oR
-oR
-oR
-<<<<<<< HEAD
eL
+oR
+
+eL
+oR
eL
eL
Wi
@@ -7628,26 +7676,29 @@ Wi
Wi
Wi
Wi
+Wi
+Wi
+Wi
+Hb
Hb
Hb
Hb
Wi
-Hb
-Hb
Wi
Hb
-Hb
Wi
Wi
Wi
Wi
oR
+oR
eL
-oR
eL
-oR
+
eL
-=======
+eL
+
+
oR
oR
uP
@@ -7680,8 +7731,9 @@ uP
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
+
oR
oR
oR
@@ -7710,12 +7762,12 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
oR
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -7912,8 +7964,9 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
eL
+oR
eL
eL
oR
@@ -7921,13 +7974,14 @@ Wi
Wi
Wi
Wi
-eL
Wi
Wi
Wi
Hb
+
+
Wi
-=======
+
oR
uP
oR
@@ -7946,20 +8000,26 @@ Hb
uP
Hb
Hb
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
Hb
+uP
+Hb
+Hb
+
Wi
Hb
-<<<<<<< HEAD
-Wi
+Hb
Wi
Wi
Wi
Wi
eL
+
+
eL
eL
-=======
+
uP
uP
uP
@@ -7972,16 +8032,15 @@ uP
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
-eL
-eL
oR
-<<<<<<< HEAD
+
eL
-=======
+
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
uP
oR
@@ -8006,6 +8065,12 @@ oR
oR
oR
oR
+
+oR
+oR
+FR
+
+
oR
oR
oR
@@ -8204,23 +8269,28 @@ oR
oR
oR
oR
-eL
oR
oR
-<<<<<<< HEAD
-Wi
-Wi
-Wi
-Wi
-Wi
+
eL
+eL
+
+
+
+Wi
+Wi
+Wi
+Wi
Wi
-Hb
Hb
Wi
Wi
+Hb
Wi
+Hb
Wi
+Hb
+Hb
Wi
Wi
Wi
@@ -8228,12 +8298,16 @@ Wi
Wi
Wi
eL
+
+oR
+
eL
eL
eL
eL
eL
-=======
+
+
oR
uP
oR
@@ -8261,21 +8335,28 @@ uP
uP
uP
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+eL
+oR
+oR
+eL
+
+
+
oR
oR
oR
uP
uP
oR
-<<<<<<< HEAD
+
eL
eL
-=======
+
oR
uP
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -8496,39 +8577,45 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+eL
+eL
+
+
+oR
+
+eL
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Hb
+Hb
+Hb
+Wi
+Hb
+Hb
+Wi
+Hb
+Hb
+Wi
+Wi
+Wi
+Wi
oR
eL
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
+oR
eL
-eL
-eL
-eL
-eL
-eL
-=======
+
uP
oR
uP
oR
+
+eL
+
uP
uP
uP
@@ -8551,13 +8638,14 @@ uP
uP
uP
uP
+
oR
oR
uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -8783,33 +8871,43 @@ oR
oR
oR
oR
+
+
oR
-<<<<<<< HEAD
-eL
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-oR
+
+
eL
eL
eL
oR
+Wi
+Wi
+Wi
+Wi
+eL
+Wi
+Wi
+Wi
+Hb
+Wi
+Hb
+Wi
+Hb
+Wi
+Wi
+Wi
+Wi
+Wi
+eL
+eL
+eL
oR
-=======
+
+eL
+eL
+
+oR
+
oR
uP
oR
@@ -8844,11 +8942,9 @@ oR
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
+
oR
+
oR
eL
oR
@@ -8864,6 +8960,8 @@ oR
oR
oR
oR
+oR
+oR
PH
oR
oR
@@ -9070,37 +9168,36 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
eL
-eL
-Wi
-Wi
-Wi
+oR
oR
Wi
Wi
Wi
Wi
Wi
+eL
+Wi
+Hb
+Hb
+Wi
+Wi
+Wi
Wi
Wi
Wi
Wi
Wi
Wi
-oR
Wi
eL
eL
eL
-oR
-oR
eL
-oR
-oR
-oR
eL
-=======
+eL
+
oR
oR
oR
@@ -9128,7 +9225,7 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -9148,12 +9245,15 @@ oR
oR
oR
oR
+
+
oR
oR
oR
-<<<<<<< HEAD
+
+
FR
-=======
+
oR
oR
PH
@@ -9165,7 +9265,7 @@ oR
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -9360,36 +9460,44 @@ oR
oR
oR
oR
-eL
oR
-<<<<<<< HEAD
-eL
-eL
-eL
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
+
oR
oR
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
-eL
oR
-eL
oR
+
+
+eL
+eL
+
+eL
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
eL
eL
eL
eL
-=======
+eL
+eL
+
oR
uP
uP
@@ -9422,7 +9530,7 @@ uP
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -9447,13 +9555,16 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+
+
oR
oR
oR
+
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -9652,8 +9763,13 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+oR
+oR
+
+
eL
+
oR
eL
Wi
@@ -9662,20 +9778,22 @@ Wi
Wi
Wi
Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
oR
eL
eL
-oR
-Wi
-Wi
-oR
-Wi
-Wi
eL
-eL
-eL
-eL
-=======
+
oR
oR
oR
@@ -9712,22 +9830,24 @@ oR
uP
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
+oR
+oR
+
eL
+
+
eL
oR
+
+
+
+oR
+oR
+oR
oR
-<<<<<<< HEAD
eL
-eL
-oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
-oR
oR
oR
oR
@@ -9939,27 +10059,33 @@ pM
pM
oR
oR
-eL
oR
oR
oR
oR
-<<<<<<< HEAD
-eL
-Wi
-Wi
-Wi
-Wi
-Wi
-Wi
oR
+
eL
eL
-oR
+Wi
+Wi
+Wi
oR
Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+
+
eL
-=======
+
oR
oR
uP
@@ -9990,35 +10116,43 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
+Wi
eL
+
+eL
+eL
+oR
+
oR
oR
eL
eL
oR
-<<<<<<< HEAD
+
eL
-=======
+
uP
uP
+
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
+eL
oR
oR
-<<<<<<< HEAD
+
oR
oR
+eL
+eL
oR
-oR
-oR
-oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -10231,32 +10365,45 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+
+
oR
oR
+
+eL
+oR
eL
eL
+
eL
-=======
+Wi
+Wi
+Wi
+Wi
+Wi
+
+
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
eL
oR
-<<<<<<< HEAD
+
+
Wi
Wi
oR
-eL
-oR
oR
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
eL
-eL
-eL
-oR
-eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -10314,13 +10461,16 @@ oR
oR
oR
oR
+
+
oR
-<<<<<<< HEAD
+
oR
oR
+
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -10517,7 +10667,11 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+oR
+oR
+
+
eL
eL
eL
@@ -10526,62 +10680,74 @@ eL
eL
eL
eL
+
eL
oR
eL
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+oR
+eL
+eL
+oR
+Wi
+Wi
+oR
+Wi
+Wi
+eL
+eL
+eL
+eL
+
+oR
+
+eL
+eL
+
+oR
+
+oR
oR
eL
eL
oR
oR
oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+
+oR
+uP
+uP
+uP
+oR
+
eL
oR
oR
-eL
-oR
-oR
-oR
-eL
-eL
-=======
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-uP
-uP
-uP
-oR
-<<<<<<< HEAD
-eL
-oR
-oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
uP
@@ -10808,7 +10974,9 @@ pM
oR
oR
oR
-<<<<<<< HEAD
+
+
+
oR
oR
oR
@@ -10816,21 +10984,37 @@ eL
eL
eL
eL
-eL
-oR
-eL
-eL
+
eL
oR
oR
-=======
-oR
+oR
+
+oR
+
+eL
+Wi
+Wi
+Wi
+Wi
+Wi
+Wi
+
+
oR
oR
oR
+Wi
+eL
oR
+eL
oR
+eL
oR
+
+eL
+eL
+
uP
uP
uP
@@ -10848,25 +11032,27 @@ uP
uP
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
uP
uP
uP
uP
oR
+
oR
-<<<<<<< HEAD
+
+oR
+eL
oR
oR
oR
oR
oR
oR
-oR
-=======
+
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -10897,11 +11083,11 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -11100,33 +11286,44 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+oR
+
+
eL
eL
eL
eL
eL
+
eL
eL
eL
oR
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-eL
eL
oR
-oR
+Wi
+Wi
oR
eL
oR
oR
+eL
+eL
+eL
oR
-=======
+eL
+oR
+eL
+oR
+
+eL
+eL
+eL
+eL
+
+
+
oR
uP
oR
@@ -11162,7 +11359,7 @@ oR
oR
oR
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
@@ -11383,74 +11580,88 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+
+
eL
oR
+
oR
eL
eL
+eL
+eL
+eL
+eL
+eL
+eL
+eL
+
+oR
+eL
oR
eL
eL
oR
+
+oR
+oR
+
+
+uP
+oR
+
+
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+oR
+uP
+uP
+
+oR
+uP
+uP
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+oR
+
+
+uP
+uP
+
+oR
+oR
+uP
+uP
+oR
+
eL
-=======
-oR
-oR
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-uP
-oR
-<<<<<<< HEAD
-=======
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-oR
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-uP
-uP
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-oR
-<<<<<<< HEAD
-=======
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-uP
-uP
-oR
-<<<<<<< HEAD
eL
+
+eL
+oR
+oR
+eL
+
+
+oR
+oR
+oR
eL
eL
oR
oR
eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
-oR
-oR
oR
oR
oR
@@ -11472,13 +11683,13 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
oR
oR
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -11674,43 +11885,59 @@ oR
oR
oR
oR
-eL
oR
oR
-<<<<<<< HEAD
-eL
-oR
-eL
-eL
-=======
-oR
-uP
-oR
-oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-uP
-uP
-uP
-uP
-uP
-uP
-uP
-oR
-uP
-uP
-oR
-<<<<<<< HEAD
-oR
+
oR
oR
eL
eL
+eL
+eL
+eL
oR
eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+eL
+eL
+
+
+eL
+oR
+eL
+eL
+
+oR
+uP
+oR
+oR
+
+oR
+oR
+uP
+uP
+uP
+uP
+uP
+uP
+uP
+oR
+uP
+uP
+oR
+
+
+oR
+oR
+oR
+eL
+oR
+eL
+
+eL
+
+
+
+
oR
uP
uP
@@ -11728,11 +11955,15 @@ uP
oR
oR
oR
-<<<<<<< HEAD
+
+eL
+
+
oR
oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
+
oR
oR
oR
@@ -11958,12 +12189,21 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+eL
+eL
+eL
+eL
+eL
+eL
+eL
+
+
oR
oR
eL
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -11976,39 +12216,49 @@ oR
uP
uP
oR
-<<<<<<< HEAD
+
+
eL
-=======
+
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
uP
uP
uP
oR
-<<<<<<< HEAD
+
+
+
eL
-=======
+
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
uP
+
oR
uP
uP
uP
uP
oR
-<<<<<<< HEAD
+
oR
oR
oR
+eL
+eL
oR
oR
oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+eL
+
+
+
+
oR
oR
oR
@@ -12235,15 +12485,26 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
+oR
+eL
+
+
eL
eL
-=======
+
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
+
+eL
+eL
+oR
+eL
+
uP
uP
uP
@@ -12254,10 +12515,11 @@ uP
uP
uP
oR
-<<<<<<< HEAD
-=======
+
+
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
uP
uP
@@ -12270,23 +12532,31 @@ oR
uP
oR
oR
+
+eL
+eL
+eL
+
oR
uP
uP
oR
oR
-<<<<<<< HEAD
+
oR
oR
oR
oR
+
oR
-=======
+
uP
oR
+eL
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
+eL
oR
oR
oR
@@ -12315,14 +12585,14 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
oR
oR
oR
FR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -12516,48 +12786,63 @@ oR
oR
oR
oR
-<<<<<<< HEAD
-=======
+
+eL
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
+
+oR
+
+
oR
oR
oR
oR
oR
-<<<<<<< HEAD
+
+
+
+oR
+
+eL
+
+uP
+uP
+uP
+uP
+uP
+oR
+uP
+uP
+uP
+oR
+oR
+oR
+
+eL
+eL
oR
eL
-=======
-uP
-uP
-uP
-uP
+
uP
oR
uP
uP
-uP
-oR
-oR
-oR
-uP
-oR
-uP
-uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
oR
oR
oR
+
oR
-<<<<<<< HEAD
+
oR
oR
oR
oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -12794,8 +13079,11 @@ oR
oR
oR
oR
-<<<<<<< HEAD
-=======
+
+eL
+
+
+
uP
uP
uP
@@ -12804,32 +13092,35 @@ uP
uP
uP
uP
+
oR
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
-oR
-oR
-oR
-oR
-oR
-oR
-oR
-uP
-uP
-oR
-oR
-oR
-uP
-oR
-oR
-oR
-oR
-oR
+
oR
oR
oR
oR
eL
+oR
+oR
+oR
+
eL
+
+uP
+uP
+
+oR
+oR
+oR
+uP
+oR
+oR
+oR
+oR
+oR
+oR
+oR
+oR
oR
oR
oR
@@ -13052,15 +13343,19 @@ oR
oR
oR
oR
+eL
+eL
oR
-oR
-oR
-<<<<<<< HEAD
+
oR
oR
eL
-=======
+
+eL
+
+
uP
+
oR
oR
uP
@@ -13068,7 +13363,7 @@ uP
oR
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
uP
oR
@@ -13091,11 +13386,15 @@ uP
oR
oR
oR
-<<<<<<< HEAD
+
+eL
+
+
oR
oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
+
oR
oR
oR
@@ -13321,29 +13620,39 @@ oR
oR
oR
oR
+eL
oR
-<<<<<<< HEAD
-=======
+
+eL
+eL
+
+
+
uP
+
oR
oR
uP
oR
uP
uP
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
oR
+
+eL
+
oR
oR
uP
oR
-<<<<<<< HEAD
+
+oR
+
oR
oR
oR
-oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -13633,8 +13942,8 @@ oR
oR
oR
oR
-oR
-oR
+eL
+eL
oR
oR
oR
@@ -13652,7 +13961,7 @@ oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
oR
oR
@@ -13683,8 +13992,8 @@ oR
FR
oR
oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
@@ -13885,17 +14194,21 @@ uP
oR
oR
oR
+
+eL
+
uP
uP
oR
+
oR
oR
oR
oR
-<<<<<<< HEAD
+
oR
-=======
->>>>>>> 339281e2f8d... Merge pull request #8382 from PrismaticGynoid/mapfixes8
+
+
oR
oR
oR
diff --git a/maps/cynosure/overmap/sectors.dm b/maps/cynosure/overmap/sectors.dm
new file mode 100644
index 0000000000..968a30544c
--- /dev/null
+++ b/maps/cynosure/overmap/sectors.dm
@@ -0,0 +1,50 @@
+// Overmap object for Sif, hanging in the void of space
+/obj/effect/overmap/visitable/planet/Sif
+ name = "Sif"
+ desc = "A cold, Earth-like planet. Cynosure Station is located here."
+ map_z = list(
+ Z_LEVEL_STATION_ONE,
+ Z_LEVEL_STATION_TWO,
+ Z_LEVEL_STATION_THREE,
+ Z_LEVEL_SURFACE_WILD
+ )
+ base = 1
+ in_space = 0
+ start_x = 10
+ start_y = 10
+ skybox_offset_x = 128
+ skybox_offset_y = 128
+ surface_color = "#2D545B"
+ mountain_color = "#735555"
+ ice_color = "FFFFFF"
+ icecaps = "icecaps"
+ initial_generic_waypoints = list(
+ "nav_pad3_cynosure", //Northwest Pad 3,
+ "nav_pad4_cynosure" //Northwest Pad 4
+ )
+
+
+/obj/effect/overmap/visitable/planet/Sif/Initialize()
+ atmosphere = new(CELL_VOLUME)
+ atmosphere.adjust_gas_temp("oxygen", MOLES_O2STANDARD, 273)
+ atmosphere.adjust_gas_temp("nitrogen", MOLES_N2STANDARD, 273)
+
+ . = ..()
+
+ docking_codes = null
+
+/obj/effect/overmap/visitable/planet/Sif/get_skybox_representation()
+ var/image/tmp = ..()
+ tmp.pixel_x = skybox_offset_x
+ tmp.pixel_y = skybox_offset_y
+ return tmp
+/obj/effect/overmap/visitable/telecomm_sat
+ name = "Telecommunications Satellite"
+ icon_state = "object"
+ initial_generic_waypoints = list(
+ "nav_telecomm_dockarm" //Tcomm sat docking
+ )
+ in_space = 1
+ start_x = 10
+ start_y = 10
+ map_z = list(Z_LEVEL_TCOMM, Z_LEVEL_EMPTY_SPACE)
diff --git a/maps/cynosure/submaps/16x11/OldDorms.dmm b/maps/cynosure/submaps/16x11/OldDorms.dmm
index 42598f0135..445e2357b9 100644
--- a/maps/cynosure/submaps/16x11/OldDorms.dmm
+++ b/maps/cynosure/submaps/16x11/OldDorms.dmm
@@ -2,7 +2,7 @@
"aK" = (/turf/simulated/floor/tiled/freezer,/area/template_noop)
"bo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/stack/tile/floor,/turf/simulated/floor/plating,/area/template_noop)
"bt" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/template_noop)
-"bx" = (/obj/structure/bed/chair/sofa/beige/right{dir = 4},/turf/simulated/floor/wood/broken,/area/template_noop)
+"bx" = (/obj/structure/bed/chair/sofa/right/beige{dir = 4},/turf/simulated/floor/wood/broken,/area/template_noop)
"bI" = (/obj/machinery/vending/snack{dir = 4},/turf/simulated/floor/tiled/dark,/area/template_noop)
"cy" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/tiled/dark,/area/template_noop)
"cD" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor/tiled,/area/template_noop)
@@ -66,7 +66,7 @@
"MG" = (/obj/machinery/vending/cola{dir = 4},/turf/simulated/floor/tiled/dark,/area/template_noop)
"MI" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1},/turf/simulated/floor/wood,/area/template_noop)
"NW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1},/turf/simulated/floor/plating,/area/template_noop)
-"Od" = (/obj/structure/bed/chair/sofa/beige/right{dir = 4},/obj/item/frame/apc,/turf/simulated/floor/wood,/area/template_noop)
+"Od" = (/obj/structure/bed/chair/sofa/right/beige{dir = 4},/obj/item/frame/apc,/turf/simulated/floor/wood,/area/template_noop)
"QN" = (/turf/simulated/wall,/area/template_noop)
"QT" = (/obj/structure/table/standard,/obj/machinery/light_construct{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8},/turf/simulated/floor/wood,/area/template_noop)
"Rm" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/tiled/dark,/area/template_noop)
@@ -75,7 +75,7 @@
"Td" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/freezer,/area/template_noop)
"TQ" = (/obj/structure/table/standard,/obj/item/weapon/coin/silver,/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/turf/simulated/floor/plating,/area/template_noop)
"Ul" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/template_noop)
-"Vt" = (/obj/structure/bed/chair/sofa/beige/left{dir = 4},/turf/simulated/floor/wood,/area/template_noop)
+"Vt" = (/obj/structure/bed/chair/sofa/left/beige{dir = 4},/turf/simulated/floor/wood,/area/template_noop)
"Xg" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled/dark,/area/template_noop)
"Xi" = (/obj/structure/table/standard,/obj/item/frame,/turf/simulated/floor/plating,/area/template_noop)
"Xz" = (/obj/item/frame/extinguisher_cabinet,/turf/simulated/floor/tiled/dark,/area/template_noop)
diff --git a/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm b/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm
index 49d0f2963b..c1d7fe3f7c 100644
--- a/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm
+++ b/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm
@@ -1060,7 +1060,7 @@
/turf/simulated/floor/tiled,
/area/offmap/aerostat/inside/drillstorage)
"cR" = (
-/obj/structure/bed/chair/sofa/purp/left,
+/obj/structure/bed/chair/sofa/left/purp,
/obj/structure/sign/painting/public{
pixel_y = 30
},
@@ -1696,7 +1696,7 @@
/turf/simulated/floor/tiled/white,
/area/offmap/aerostat/inside/firingrange)
"eE" = (
-/obj/structure/bed/chair/sofa/purp/right,
+/obj/structure/bed/chair/sofa/right/purp,
/obj/structure/sign/painting/public{
pixel_y = 30
},
@@ -1752,7 +1752,7 @@
/obj/machinery/camera/network/research_outpost{
dir = 4
},
-/obj/structure/bed/chair/sofa/purp/left{
+/obj/structure/bed/chair/sofa/left/purp{
dir = 4
},
/turf/simulated/floor/tiled/dark,
@@ -1796,7 +1796,7 @@
/obj/structure/sign/painting/public{
pixel_x = -30
},
-/obj/structure/bed/chair/sofa/purp/right{
+/obj/structure/bed/chair/sofa/right/purp{
dir = 4
},
/turf/simulated/floor/tiled/dark,
@@ -3190,7 +3190,7 @@
/obj/machinery/camera/network/research_outpost{
dir = 8
},
-/obj/structure/bed/chair/sofa/purp/right{
+/obj/structure/bed/chair/sofa/right/purp{
dir = 8
},
/turf/simulated/floor/tiled/dark,
@@ -4662,7 +4662,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/bed/chair/sofa/purp/left{
+/obj/structure/bed/chair/sofa/left/purp{
dir = 8
},
/turf/simulated/floor/tiled/dark,
diff --git a/maps/gateway_vr/eggnogtown.dmm b/maps/gateway_vr/eggnogtown.dmm
index de787f7cab..eda19d994e 100644
--- a/maps/gateway_vr/eggnogtown.dmm
+++ b/maps/gateway_vr/eggnogtown.dmm
@@ -586,7 +586,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/kitchihome/den)
"bU" = (
-/obj/structure/bed/chair/sofa/beige/right{
+/obj/structure/bed/chair/sofa/right/beige{
dir = 8
},
/turf/simulated/floor/wood{
@@ -610,7 +610,7 @@
/turf/simulated/floor/bmarble,
/area/gateway/eggnogtown/hall/north)
"ca" = (
-/obj/structure/bed/chair/sofa/beige/corner{
+/obj/structure/bed/chair/sofa/corner/beige{
dir = 1
},
/turf/simulated/floor/wmarble,
@@ -619,7 +619,7 @@
/turf/simulated/wall/wood,
/area/gateway/eggnogtown/cavehome/office)
"cn" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 4
},
/turf/simulated/floor/wood,
@@ -729,7 +729,7 @@
/turf/simulated/open,
/area/gateway/eggnogtown/storage)
"do" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 8
},
/turf/simulated/floor/wood{
@@ -790,7 +790,7 @@
/turf/simulated/floor/outdoors/grass/forest,
/area/gateway/eggnogtown/greenhouse)
"dM" = (
-/obj/structure/bed/chair/sofa/beige/left{
+/obj/structure/bed/chair/sofa/left/beige{
dir = 8
},
/turf/simulated/floor/wood{
@@ -867,7 +867,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/kitchihome)
"ez" = (
-/obj/structure/bed/chair/sofa/beige/left{
+/obj/structure/bed/chair/sofa/left/beige{
dir = 8
},
/turf/simulated/floor/wood{
@@ -896,7 +896,7 @@
},
/area/gateway/eggnogtown/cavehome)
"eO" = (
-/obj/structure/bed/chair/sofa/beige/right{
+/obj/structure/bed/chair/sofa/right/beige{
dir = 8
},
/turf/simulated/floor/wood{
@@ -1377,7 +1377,7 @@
/turf/simulated/floor/tiled/steel_ridged,
/area/gateway/eggnogtown/dining)
"lS" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 1
},
/turf/simulated/floor/wood,
@@ -1428,7 +1428,7 @@
},
/area/gateway/eggnogtown/stokeswashere)
"mv" = (
-/obj/structure/bed/chair/sofa/black/corner,
+/obj/structure/bed/chair/sofa/corner/black,
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/hall/south)
"mw" = (
@@ -1853,7 +1853,7 @@
/turf/simulated/wall/iron,
/area/gateway/eggnogtown/alipad/bedroom)
"sE" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 8
},
/turf/simulated/floor/wood{
@@ -1861,7 +1861,7 @@
},
/area/gateway/eggnogtown/eastcaveland)
"sF" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 1
},
/turf/simulated/floor/wood{
@@ -2204,7 +2204,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/hall/south)
"wR" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 4
},
/turf/simulated/floor/wood{
@@ -2230,7 +2230,7 @@
/turf/simulated/floor/carpet/bcarpet,
/area/gateway/eggnogtown/loniabode)
"xq" = (
-/obj/structure/bed/chair/sofa/beige/corner{
+/obj/structure/bed/chair/sofa/corner/beige{
dir = 8
},
/turf/simulated/floor/wmarble,
@@ -2282,7 +2282,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/bar)
"ys" = (
-/obj/structure/bed/chair/sofa/beige/corner,
+/obj/structure/bed/chair/sofa/corner/beige,
/turf/simulated/floor/wmarble,
/area/gateway/eggnogtown/arturoswolfden)
"yt" = (
@@ -2340,7 +2340,7 @@
},
/area/gateway/eggnogtown/sigloo)
"zr" = (
-/obj/structure/bed/chair/sofa/black/right,
+/obj/structure/bed/chair/sofa/right/black,
/turf/simulated/floor/wood{
temperature = 258.15
},
@@ -2376,7 +2376,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/visitorlounge)
"zU" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 4
},
/turf/simulated/floor/carpet/bcarpet,
@@ -2603,7 +2603,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/kitchihome/bedroom)
"CP" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 1
},
/turf/simulated/floor/wood,
@@ -2655,7 +2655,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/visitorlounge/room2)
"DR" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 8
},
/turf/simulated/floor/wood,
@@ -2712,7 +2712,7 @@
/turf/simulated/floor/reinforced,
/area/gateway/eggnogtown/hall)
"ES" = (
-/obj/structure/bed/chair/sofa/black/left,
+/obj/structure/bed/chair/sofa/left/black,
/turf/simulated/floor/wood{
temperature = 258.15
},
@@ -2766,7 +2766,7 @@
},
/area/gateway/eggnogtown/stokeswashere)
"FL" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 4
},
/turf/simulated/floor/wood{
@@ -2988,7 +2988,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/arturoswolfden)
"IW" = (
-/obj/structure/bed/chair/sofa/black/left,
+/obj/structure/bed/chair/sofa/left/black,
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/hall/south)
"Jc" = (
@@ -3107,7 +3107,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/hall/south)
"KI" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 1
},
/obj/item/weapon/card/id{
@@ -3266,7 +3266,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/kitchihome/diningroom)
"MI" = (
-/obj/structure/bed/chair/sofa/black/right,
+/obj/structure/bed/chair/sofa/right/black,
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/hall/south)
"MN" = (
@@ -3365,7 +3365,7 @@
/turf/simulated/floor/wood,
/area/gateway/eggnogtown/kitchihome)
"Oq" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 4
},
/turf/simulated/floor/carpet/bcarpet,
@@ -3763,7 +3763,7 @@
/turf/simulated/floor/carpet/bcarpet,
/area/gateway/eggnogtown/loniabode)
"TH" = (
-/obj/structure/bed/chair/sofa/black/right,
+/obj/structure/bed/chair/sofa/right/black,
/turf/simulated/floor/wood{
temperature = 258.15
},
@@ -3991,7 +3991,7 @@
/turf/simulated/wall/wood,
/area/gateway/eggnogtown/loniabode)
"Xm" = (
-/obj/structure/bed/chair/sofa/black/left,
+/obj/structure/bed/chair/sofa/left/black,
/turf/simulated/floor/wood{
temperature = 258.15
},
@@ -4117,7 +4117,7 @@
},
/area/gateway/eggnogtown/cavehome)
"YD" = (
-/obj/structure/bed/chair/sofa/black/corner{
+/obj/structure/bed/chair/sofa/corner/black{
dir = 1
},
/turf/simulated/floor/wood,
@@ -4129,7 +4129,7 @@
/turf/simulated/floor/reinforced,
/area/gateway/eggnogtown)
"YP" = (
-/obj/structure/bed/chair/sofa/beige/corner{
+/obj/structure/bed/chair/sofa/corner/beige{
dir = 4
},
/turf/simulated/floor/wmarble,
diff --git a/maps/gateway_vr/eggnogtownunderground.dmm b/maps/gateway_vr/eggnogtownunderground.dmm
index d7ea90b144..7da812dcca 100644
--- a/maps/gateway_vr/eggnogtownunderground.dmm
+++ b/maps/gateway_vr/eggnogtownunderground.dmm
@@ -326,7 +326,7 @@
/turf/simulated/floor/tiled/steel_ridged,
/area/gateway/eggnogtown/hotsprings)
"kS" = (
-/obj/structure/bed/chair/sofa/black/right,
+/obj/structure/bed/chair/sofa/right/black,
/turf/simulated/floor/plating/eris/under{
temperature = 258.15
},
@@ -369,7 +369,7 @@
/turf/simulated/floor/tiled/steel_ridged,
/area/gateway/eggnogtown/hotspring)
"nh" = (
-/obj/structure/bed/chair/sofa/black/corner,
+/obj/structure/bed/chair/sofa/corner/black,
/turf/simulated/floor/plating/eris/under{
temperature = 258.15
},
@@ -578,7 +578,7 @@
},
/area/gateway/eggnogtown/vibeout)
"Aw" = (
-/obj/structure/bed/chair/sofa/black/corner{
+/obj/structure/bed/chair/sofa/corner/black{
dir = 8
},
/turf/simulated/floor/plating/eris/under{
@@ -906,7 +906,7 @@
},
/area/gateway/eggnogtown/hotsprings)
"ZR" = (
-/obj/structure/bed/chair/sofa/black/left{
+/obj/structure/bed/chair/sofa/left/black{
dir = 1
},
/turf/simulated/floor/plating/eris/under{
diff --git a/maps/gateway_vr/variable/arynthilake_a.dmm b/maps/gateway_vr/variable/arynthilake_a.dmm
index 42f3f1b517..ccf5fd4fe0 100644
--- a/maps/gateway_vr/variable/arynthilake_a.dmm
+++ b/maps/gateway_vr/variable/arynthilake_a.dmm
@@ -1414,7 +1414,7 @@
},
/area/gateway/arynthilake/dome)
"yl" = (
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/turf/simulated/floor/carpet,
@@ -1528,7 +1528,7 @@
/turf/simulated/floor/carpet/purcarpet,
/area/gateway/arynthilake/dome)
"BX" = (
-/obj/structure/bed/chair/sofa/brown/corner,
+/obj/structure/bed/chair/sofa/corner/brown,
/turf/simulated/floor/carpet,
/area/gateway/arynthilake/dome)
"Cl" = (
@@ -1719,7 +1719,7 @@
/turf/simulated/floor/carpet/sblucarpet,
/area/gateway/arynthilake/dome)
"Hp" = (
-/obj/structure/bed/chair/sofa/brown/corner{
+/obj/structure/bed/chair/sofa/corner/brown{
dir = 1
},
/obj/effect/landmark/mcguffin_spawner,
@@ -1736,7 +1736,7 @@
/turf/simulated/floor/outdoors/newdirt,
/area/gateway/arynthilake)
"HR" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 8
},
/turf/simulated/floor/carpet,
diff --git a/maps/gateway_vr/variable/arynthilake_b.dmm b/maps/gateway_vr/variable/arynthilake_b.dmm
index 612294d96b..a7e041b07f 100644
--- a/maps/gateway_vr/variable/arynthilake_b.dmm
+++ b/maps/gateway_vr/variable/arynthilake_b.dmm
@@ -553,7 +553,7 @@
/turf/simulated/floor/tiled/eris/white/brown_platform,
/area/gateway/arynthilake/dome)
"ku" = (
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/turf/simulated/floor/carpet,
@@ -1038,7 +1038,7 @@
/turf/simulated/floor/tiled/eris/steel/techfloor,
/area/gateway/arynthilake/dome)
"vH" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -2123,7 +2123,7 @@
},
/area/gateway/arynthilake/dome)
"TD" = (
-/obj/structure/bed/chair/sofa/brown/corner{
+/obj/structure/bed/chair/sofa/corner/brown{
dir = 1
},
/turf/simulated/floor/carpet,
@@ -2141,7 +2141,7 @@
/area/gateway/arynthilake/engine)
"Uj" = (
/obj/effect/landmark/mcguffin_spawner,
-/obj/structure/bed/chair/sofa/brown/corner,
+/obj/structure/bed/chair/sofa/corner/brown,
/turf/simulated/floor/carpet,
/area/gateway/arynthilake/dome)
"Uk" = (
diff --git a/maps/gateway_vr/variable/honlethhighlands_a.dmm b/maps/gateway_vr/variable/honlethhighlands_a.dmm
index db7570d4ef..7bb7359a33 100644
--- a/maps/gateway_vr/variable/honlethhighlands_a.dmm
+++ b/maps/gateway_vr/variable/honlethhighlands_a.dmm
@@ -573,7 +573,7 @@
/obj/effect/floor_decal/techfloor{
dir = 8
},
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 4
},
/turf/simulated/floor/tiled/techfloor,
@@ -920,7 +920,7 @@
},
/area/gateway/honlethhighlands/caves)
"nI" = (
-/obj/structure/bed/chair/sofa/green/left{
+/obj/structure/bed/chair/sofa/left/green{
dir = 4
},
/turf/simulated/floor/wood,
@@ -2133,7 +2133,7 @@
},
/area/gateway/honlethhighlands/caves)
"HY" = (
-/obj/structure/bed/chair/sofa/green/right{
+/obj/structure/bed/chair/sofa/right/green{
dir = 4
},
/turf/simulated/floor/wood,
@@ -2249,7 +2249,7 @@
/obj/effect/floor_decal/techfloor{
dir = 8
},
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/turf/simulated/floor/tiled/techfloor,
diff --git a/maps/gateway_vr/variable/honlethhighlands_b.dmm b/maps/gateway_vr/variable/honlethhighlands_b.dmm
index 7de8389bc7..9a62e9b846 100644
--- a/maps/gateway_vr/variable/honlethhighlands_b.dmm
+++ b/maps/gateway_vr/variable/honlethhighlands_b.dmm
@@ -560,7 +560,7 @@
/obj/effect/floor_decal/techfloor{
dir = 8
},
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 4
},
/turf/simulated/floor/tiled/techfloor,
@@ -913,7 +913,7 @@
/turf/simulated/floor/tiled/techfloor,
/area/gateway/honlethhighlands/gate)
"nI" = (
-/obj/structure/bed/chair/sofa/green/left{
+/obj/structure/bed/chair/sofa/left/green{
dir = 4
},
/turf/simulated/floor/wood,
@@ -2125,7 +2125,7 @@
},
/area/gateway/honlethhighlands/town/garden)
"HY" = (
-/obj/structure/bed/chair/sofa/green/right{
+/obj/structure/bed/chair/sofa/right/green{
dir = 4
},
/turf/simulated/floor/wood,
@@ -2249,7 +2249,7 @@
/obj/effect/floor_decal/techfloor{
dir = 8
},
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/turf/simulated/floor/tiled/techfloor,
diff --git a/maps/offmap_vr/om_ships/curashuttle.dmm b/maps/offmap_vr/om_ships/curashuttle.dmm
index a09407b77f..b6299d55df 100644
--- a/maps/offmap_vr/om_ships/curashuttle.dmm
+++ b/maps/offmap_vr/om_ships/curashuttle.dmm
@@ -813,7 +813,7 @@
/turf/simulated/floor/tiled,
/area/shuttle/curabitur/curashuttle/med)
"bE" = (
-/obj/structure/bed/chair/sofa/teal/left{
+/obj/structure/bed/chair/sofa/left/teal{
dir = 1
},
/obj/structure/cable{
@@ -888,7 +888,7 @@
dir = 1;
pixel_y = -29
},
-/obj/structure/bed/chair/sofa/teal/right{
+/obj/structure/bed/chair/sofa/right/teal{
dir = 1
},
/obj/structure/cable{
diff --git a/maps/offmap_vr/om_ships/itglight.dmm b/maps/offmap_vr/om_ships/itglight.dmm
index c422341e98..99c70134b5 100644
--- a/maps/offmap_vr/om_ships/itglight.dmm
+++ b/maps/offmap_vr/om_ships/itglight.dmm
@@ -1148,7 +1148,7 @@
/turf/simulated/floor/carpet/sblucarpet,
/area/itglight/captain)
"gS" = (
-/obj/structure/bed/chair/sofa/brown/right,
+/obj/structure/bed/chair/sofa/right/brown,
/obj/item/device/radio/intercom{
dir = 1;
pixel_y = 25
@@ -1177,7 +1177,7 @@
/turf/simulated/floor/tiled/eris/steel/brown_platform,
/area/itglight/metingroom)
"gX" = (
-/obj/structure/bed/chair/sofa/brown/left,
+/obj/structure/bed/chair/sofa/left/brown,
/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/machinery/alarm/angled/hidden{
dir = 8;
@@ -6391,7 +6391,7 @@
/turf/simulated/floor/tiled/monotile,
/area/itglight/lockers)
"MY" = (
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -6623,7 +6623,7 @@
/turf/simulated/floor/airless,
/area/itglight/portsolars)
"Ol" = (
-/obj/structure/bed/chair/sofa/brown/corner{
+/obj/structure/bed/chair/sofa/corner/brown{
dir = 1
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -8501,7 +8501,7 @@
},
/area/itglight/shuttlebay)
"Zs" = (
-/obj/structure/bed/chair/sofa/brown/left,
+/obj/structure/bed/chair/sofa/left/brown,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 8
},
diff --git a/maps/om_adventure/pois/cabin1.dmm b/maps/om_adventure/pois/cabin1.dmm
index 0adc084576..289930ef77 100644
--- a/maps/om_adventure/pois/cabin1.dmm
+++ b/maps/om_adventure/pois/cabin1.dmm
@@ -83,7 +83,7 @@
/turf/simulated/floor/outdoors/newdirt,
/area/om_adventure/poi/cabin1)
"C" = (
-/obj/structure/bed/chair/sofa/brown/corner,
+/obj/structure/bed/chair/sofa/corner/brown,
/turf/simulated/floor/wood,
/area/om_adventure/poi/cabin1)
"D" = (
@@ -116,13 +116,13 @@
/turf/simulated/wall/log,
/area/om_adventure/poi/cabin1)
"R" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 8
},
/turf/simulated/floor/wood,
/area/om_adventure/poi/cabin1)
"S" = (
-/obj/structure/bed/chair/sofa/brown/right,
+/obj/structure/bed/chair/sofa/right/brown,
/turf/simulated/floor/wood,
/area/om_adventure/poi/cabin1)
"T" = (
diff --git a/maps/om_adventure/pois/cabin2.dmm b/maps/om_adventure/pois/cabin2.dmm
index 31b9b10e2d..005b5b3a1e 100644
--- a/maps/om_adventure/pois/cabin2.dmm
+++ b/maps/om_adventure/pois/cabin2.dmm
@@ -53,7 +53,7 @@
/turf/simulated/floor/wood,
/area/om_adventure/poi/cabin2)
"t" = (
-/obj/structure/bed/chair/sofa/brown/corner,
+/obj/structure/bed/chair/sofa/corner/brown,
/turf/simulated/floor/carpet/bcarpet,
/area/om_adventure/poi/cabin2)
"u" = (
@@ -64,7 +64,7 @@
/turf/simulated/floor/tiled/techmaint,
/area/om_adventure/poi/cabin2)
"v" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 8
},
/turf/simulated/floor/carpet/bcarpet,
@@ -124,7 +124,7 @@
/turf/simulated/floor/wood,
/area/om_adventure/poi/cabin2)
"K" = (
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 4
},
/turf/simulated/floor/carpet/bcarpet,
@@ -149,7 +149,7 @@
/turf/simulated/floor/bmarble,
/area/om_adventure/poi/cabin2)
"P" = (
-/obj/structure/bed/chair/sofa/brown/corner{
+/obj/structure/bed/chair/sofa/corner/brown{
dir = 1
},
/turf/simulated/floor/carpet/bcarpet,
diff --git a/maps/om_adventure/pois/medicalcenter.dmm b/maps/om_adventure/pois/medicalcenter.dmm
index aea560a0af..53520a5d26 100644
--- a/maps/om_adventure/pois/medicalcenter.dmm
+++ b/maps/om_adventure/pois/medicalcenter.dmm
@@ -43,7 +43,7 @@
/turf/simulated/floor/tiled/eris/white/orangecorner,
/area/om_adventure/poi/medicalcenter)
"z" = (
-/obj/structure/bed/chair/sofa/blue/left{
+/obj/structure/bed/chair/sofa/left/blue{
dir = 8
},
/turf/simulated/floor/tiled/eris/white/orangecorner,
@@ -52,7 +52,7 @@
/turf/simulated/wall/eris/r_wall,
/area/om_adventure/poi/medicalcenter)
"C" = (
-/obj/structure/bed/chair/sofa/blue/right,
+/obj/structure/bed/chair/sofa/right/blue,
/turf/simulated/floor/tiled/eris/white/orangecorner,
/area/om_adventure/poi/medicalcenter)
"D" = (
@@ -111,7 +111,7 @@
/turf/simulated/floor/tiled/eris/white/orangecorner,
/area/om_adventure/poi/medicalcenter)
"Z" = (
-/obj/structure/bed/chair/sofa/blue/corner,
+/obj/structure/bed/chair/sofa/corner/blue,
/obj/tether_away_spawner/spookyland,
/turf/simulated/floor/tiled/eris/white/orangecorner,
/area/om_adventure/poi/medicalcenter)
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index 96d7089303..b5834349cb 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -89784,7 +89784,7 @@
/turf/simulated/floor/wood,
/area/library)
"dky" = (
-/obj/structure/bed/chair/sofa/brown/right{
+/obj/structure/bed/chair/sofa/right/brown{
dir = 8
},
/turf/simulated/floor/carpet,
@@ -90703,7 +90703,7 @@
/turf/simulated/floor/wood,
/area/library)
"dmi" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 8
},
/turf/simulated/floor/carpet,
diff --git a/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm b/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm
index 6d6cc6cdbb..785dc57cc6 100644
--- a/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm
+++ b/maps/submaps/surface_submaps/mountains/speakeasy_vr.dmm
@@ -15,10 +15,10 @@
"u" = (/obj/structure/table/gamblingtable,/obj/machinery/light/poi{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"v" = (/obj/structure/table/fancyblack,/obj/item/clothing/mask/smokable/cigarette/cigar,/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
"w" = (/turf/simulated/wall/wood,/area/submap/Speakeasy)
-"x" = (/obj/structure/bed/chair/sofa/blue/left{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
+"x" = (/obj/structure/bed/chair/sofa/left/blue{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"B" = (/turf/simulated/floor/wood,/area/submap/Speakeasy)
"C" = (/turf/simulated/mineral/floor/cave,/area/submap/Speakeasy)
-"D" = (/obj/structure/bed/chair/sofa/black/corner{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
+"D" = (/obj/structure/bed/chair/sofa/corner/black{dir = 4},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"E" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/simulated/floor/carpet/turcarpet,/area/submap/Speakeasy)
"H" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/wood,/area/submap/Speakeasy)
"I" = (/obj/structure/table/woodentable,/obj/random/drinkbottle,/turf/simulated/floor/wood,/area/submap/Speakeasy)
@@ -28,7 +28,7 @@
"N" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/submap/Speakeasy)
"O" = (/obj/machinery/light/poi{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"R" = (/obj/structure/bed/chair/sofa/black{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
-"U" = (/obj/structure/bed/chair/sofa/blue/right{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
+"U" = (/obj/structure/bed/chair/sofa/right/blue{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"V" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_soft/full{dir = 1},/turf/simulated/floor/wood,/area/submap/Speakeasy)
"W" = (/obj/structure/bed/chair/wood,/turf/simulated/floor/wood,/area/submap/Speakeasy)
"X" = (/obj/structure/table/woodentable,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/simulated/floor/wood,/area/submap/Speakeasy)
diff --git a/maps/submaps/surface_submaps/plains/emptycabin.dmm b/maps/submaps/surface_submaps/plains/emptycabin.dmm
index 35cbfa4e1b..9627dc4b9b 100644
--- a/maps/submaps/surface_submaps/plains/emptycabin.dmm
+++ b/maps/submaps/surface_submaps/plains/emptycabin.dmm
@@ -35,7 +35,7 @@
/turf/simulated/floor/wood/sif/virgo3b,
/area/submap/EmptyCabin)
"i" = (
-/obj/structure/bed/chair/sofa/blue/left{
+/obj/structure/bed/chair/sofa/left/blue{
dir = 1
},
/turf/simulated/floor/wood/sif/virgo3b,
@@ -135,7 +135,7 @@
/turf/simulated/floor/wood/sif/virgo3b,
/area/submap/EmptyCabin)
"J" = (
-/obj/structure/bed/chair/sofa/blue/right{
+/obj/structure/bed/chair/sofa/right/blue{
dir = 1
},
/turf/simulated/floor/wood/sif/virgo3b,
diff --git a/maps/submaps/surface_submaps/plains/lonehome.dmm b/maps/submaps/surface_submaps/plains/lonehome.dmm
index 49d75bc624..2b0fca5b59 100644
--- a/maps/submaps/surface_submaps/plains/lonehome.dmm
+++ b/maps/submaps/surface_submaps/plains/lonehome.dmm
@@ -1,4 +1,4 @@
-"at" = (/obj/structure/bed/chair/sofa/black/right{dir = 1},/turf/simulated/floor/wood,/area/submap/lonehome)
+"at" = (/obj/structure/bed/chair/sofa/right/black{dir = 1},/turf/simulated/floor/wood,/area/submap/lonehome)
"au" = (/obj/item/organ/internal/lungs/vox,/obj/item/weapon/beartrap/hunting{anchored = 1; deployed = 1},/obj/structure/curtain/black,/obj/random/junk,/obj/random/junk,/obj/random/junk,/turf/simulated/floor,/area/submap/lonehome)
"aw" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/lonehome)
"aI" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/flora/pottedplant/fern{pixel_y = 12},/obj/structure/table/bench/wooden,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/submap/lonehome)
@@ -46,7 +46,7 @@
"nT" = (/obj/item/stack/cable_coil,/turf/simulated/floor/wood/broken,/area/submap/lonehome)
"ox" = (/obj/structure/closet/cabinet,/obj/item/weapon/storage/wallet/random,/obj/item/weapon/towel/random,/obj/item/weapon/melee/umbrella/random,/obj/random/ammo,/obj/random/cigarettes,/obj/random/contraband,/obj/random/junk,/obj/random/maintenance/security,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/wood,/area/submap/lonehome)
"oS" = (/obj/structure/closet/cabinet,/obj/random/tech_supply/component,/obj/random/tech_supply/component,/obj/random/tech_supply/component,/obj/random/tech_supply/component,/obj/random/tech_supply/component,/obj/random/toolbox,/obj/random/toolbox,/turf/simulated/floor/wood,/area/submap/lonehome)
-"oZ" = (/obj/structure/bed/chair/sofa/black/left,/turf/simulated/floor/wood,/area/submap/lonehome)
+"oZ" = (/obj/structure/bed/chair/sofa/left/black,/turf/simulated/floor/wood,/area/submap/lonehome)
"pb" = (/obj/structure/fence/cut/large{dir = 8},/turf/template_noop,/area/submap/lonehome)
"po" = (/obj/structure/sign/periodic,/turf/simulated/wall/wood,/area/submap/lonehome)
"pX" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood/broken,/area/submap/lonehome)
@@ -78,7 +78,7 @@
"xM" = (/obj/structure/fence/cut/large{dir = 8},/turf/simulated/floor/outdoors/grass/heavy,/area/submap/lonehome)
"xO" = (/obj/item/clothing/suit/straight_jacket,/turf/simulated/floor,/area/submap/lonehome)
"yh" = (/turf/simulated/floor/outdoors/dirt,/area/submap/lonehome)
-"yn" = (/obj/structure/window/reinforced/polarized{dir = 8; id = "h_living"},/obj/structure/bed/chair/sofa/black/corner{dir = 1},/turf/simulated/floor/wood,/area/submap/lonehome)
+"yn" = (/obj/structure/window/reinforced/polarized{dir = 8; id = "h_living"},/obj/structure/bed/chair/sofa/corner/black{dir = 1},/turf/simulated/floor/wood,/area/submap/lonehome)
"yr" = (/obj/item/weapon/reagent_containers/blood,/obj/item/weapon/pack/cardemon,/obj/item/weapon/pack/cardemon,/obj/item/weapon/deck/tarot,/obj/structure/table/wooden_reinforced,/turf/simulated/floor/wood,/area/submap/lonehome)
"yt" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/carpet/sblucarpet,/area/submap/lonehome)
"yF" = (/obj/structure/bed/chair/sofa/black{dir = 1},/turf/simulated/floor/wood,/area/submap/lonehome)
@@ -147,7 +147,7 @@
"Wf" = (/obj/structure/bed/padded,/obj/random/trash,/obj/random/trash,/obj/random/trash,/obj/random/trash,/obj/random/trash,/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/random/junk,/obj/item/weapon/bedsheet/ian,/turf/simulated/floor/wood,/area/submap/lonehome)
"Wj" = (/obj/machinery/gibber/autogibber{emagged = 1},/turf/simulated/floor,/area/submap/lonehome)
"Wn" = (/obj/structure/fence/cut/medium{dir = 4},/turf/template_noop,/area/submap/lonehome)
-"WQ" = (/obj/structure/window/reinforced/polarized{dir = 8; id = "h_living"},/obj/structure/bed/chair/sofa/black/corner{dir = 4},/turf/simulated/floor/wood,/area/submap/lonehome)
+"WQ" = (/obj/structure/window/reinforced/polarized{dir = 8; id = "h_living"},/obj/structure/bed/chair/sofa/corner/black{dir = 4},/turf/simulated/floor/wood,/area/submap/lonehome)
"Xc" = (/obj/item/weapon/module/power_control,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/submap/lonehome)
"Xz" = (/obj/item/weapon/material/shard,/turf/template_noop,/area/submap/lonehome)
"Ys" = (/obj/item/weapon/pen/fountain,/turf/simulated/floor/wood,/area/submap/lonehome)
diff --git a/maps/submaps/surface_submaps/plains/lonehome_vr.dmm b/maps/submaps/surface_submaps/plains/lonehome_vr.dmm
index 117d531273..776d5a25a2 100644
--- a/maps/submaps/surface_submaps/plains/lonehome_vr.dmm
+++ b/maps/submaps/surface_submaps/plains/lonehome_vr.dmm
@@ -187,7 +187,7 @@
dir = 8;
id = "h_living"
},
-/obj/structure/bed/chair/sofa/black/corner{
+/obj/structure/bed/chair/sofa/corner/black{
dir = 1
},
/turf/simulated/floor/wood/virgo3b,
@@ -197,7 +197,7 @@
/turf/simulated/floor/wood/virgo3b,
/area/submap/lonehome)
"aE" = (
-/obj/structure/bed/chair/sofa/black/left,
+/obj/structure/bed/chair/sofa/left/black,
/turf/simulated/floor/wood/virgo3b,
/area/submap/lonehome)
"aF" = (
@@ -371,7 +371,7 @@
dir = 8;
id = "h_living"
},
-/obj/structure/bed/chair/sofa/black/corner{
+/obj/structure/bed/chair/sofa/corner/black{
dir = 4
},
/turf/simulated/floor/wood/virgo3b,
@@ -383,7 +383,7 @@
/turf/simulated/floor/wood/virgo3b,
/area/submap/lonehome)
"bi" = (
-/obj/structure/bed/chair/sofa/black/right{
+/obj/structure/bed/chair/sofa/right/black{
dir = 1
},
/turf/simulated/floor/wood/virgo3b,
diff --git a/maps/submaps/surface_submaps/plains/oldhotel.dmm b/maps/submaps/surface_submaps/plains/oldhotel.dmm
index febe52a0ce..92e7accd62 100644
--- a/maps/submaps/surface_submaps/plains/oldhotel.dmm
+++ b/maps/submaps/surface_submaps/plains/oldhotel.dmm
@@ -36,7 +36,7 @@
/turf/simulated/floor/carpet/sblucarpet/virgo3b,
/area/submap/oldhotel)
"da" = (
-/obj/structure/bed/chair/sofa/teal/right,
+/obj/structure/bed/chair/sofa/right/teal,
/turf/simulated/floor/carpet/sblucarpet/virgo3b,
/area/submap/oldhotel)
"dn" = (
@@ -94,7 +94,7 @@
/turf/simulated/wall/wood,
/area/submap/oldhotel)
"if" = (
-/obj/structure/bed/chair/sofa/teal/left{
+/obj/structure/bed/chair/sofa/left/teal{
dir = 8
},
/turf/simulated/floor/carpet/sblucarpet/virgo3b,
@@ -275,7 +275,7 @@
/turf/simulated/floor/wood/virgo3b,
/area/submap/oldhotel)
"vh" = (
-/obj/structure/bed/chair/sofa/teal/corner,
+/obj/structure/bed/chair/sofa/corner/teal,
/turf/simulated/floor/carpet/sblucarpet/virgo3b,
/area/submap/oldhotel)
"vA" = (
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index f658a6da07..a92c25c064 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -19614,7 +19614,7 @@
/turf/simulated/floor/tiled,
/area/rnd/hallway)
"aGr" = (
-/obj/structure/bed/chair/sofa/brown/right,
+/obj/structure/bed/chair/sofa/right/brown,
/obj/effect/floor_decal/borderfloor{
dir = 1
},
@@ -19630,7 +19630,7 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/cargostore/office)
"aGs" = (
-/obj/structure/bed/chair/sofa/brown/corner,
+/obj/structure/bed/chair/sofa/corner/brown,
/obj/effect/landmark/start{
name = "Cargo Technician"
},
@@ -19951,7 +19951,7 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/cargostore/office)
"aGU" = (
-/obj/structure/bed/chair/sofa/brown/left{
+/obj/structure/bed/chair/sofa/left/brown{
dir = 8
},
/obj/effect/floor_decal/borderfloor{
diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm
index ec4a1f04f6..10a69fe130 100644
--- a/maps/~map_system/maps.dm
+++ b/maps/~map_system/maps.dm
@@ -208,13 +208,21 @@ var/list/all_maps = list()
return text2num(pickweight(candidates))
/datum/map/proc/get_empty_zlevel()
+ // Try to free up a z level from existing temp sectors
+ if(!empty_levels.len)
+ for(var/Z in map_sectors)
+ var/obj/effect/overmap/visitable/sector/temporary/T = map_sectors[Z]
+ T.cleanup() // If we can release some of these, do that.
+
+ // Else, we need to buy a new one.
if(!empty_levels.len)
world.increment_max_z()
empty_levels += world.maxz
return pick_n_take(empty_levels)
/datum/map/proc/cache_empty_zlevel(var/z)
- empty_levels |= z
+ if(z) // Else, it's not a valid z and we want to expunge it
+ empty_levels |= z
// Get a list of 'nearby' or 'connected' zlevels.
// You should at least return a list with the given z if nothing else.
diff --git a/sound/effects/radio_common_quieter.ogg b/sound/effects/radio_common_quieter.ogg
new file mode 100644
index 0000000000..b4686b58ea
Binary files /dev/null and b/sound/effects/radio_common_quieter.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index b049aab1af..09731cb3c5 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -990,7 +990,6 @@
#include "code\game\machinery\pipe\pipe_dispenser.dm"
#include "code\game\machinery\pipe\pipe_recipes.dm"
#include "code\game\machinery\pipe\pipelayer.dm"
-#include "code\game\machinery\reagents\pump.dm"
#include "code\game\machinery\telecomms\broadcaster.dm"
#include "code\game\machinery\telecomms\broadcaster_vr.dm"
#include "code\game\machinery\telecomms\logbrowser.dm"
@@ -2439,6 +2438,7 @@
#include "code\modules\hydroponics\grown.dm"
#include "code\modules\hydroponics\grown_inedible.dm"
#include "code\modules\hydroponics\grown_predefined.dm"
+#include "code\modules\hydroponics\grown_sif.dm"
#include "code\modules\hydroponics\seed.dm"
#include "code\modules\hydroponics\seed_datums_vr.dm"
#include "code\modules\hydroponics\seed_datums_yw.dm"
@@ -3723,6 +3723,7 @@
#include "code\modules\reagents\machinery\chemalyzer.dm"
#include "code\modules\reagents\machinery\distillery.dm"
#include "code\modules\reagents\machinery\grinder.dm"
+#include "code\modules\reagents\machinery\pump.dm"
#include "code\modules\reagents\machinery\dispenser\_defines.dm"
#include "code\modules\reagents\machinery\dispenser\cartridge.dm"
#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm"
@@ -4107,6 +4108,7 @@
#include "code\modules\xenoarcheaology\anomaly_container.dm"
#include "code\modules\xenoarcheaology\boulder.dm"
#include "code\modules\xenoarcheaology\effect.dm"
+#include "code\modules\xenoarcheaology\effect_master.dm"
#include "code\modules\xenoarcheaology\manuals.dm"
#include "code\modules\xenoarcheaology\misc.dm"
#include "code\modules\xenoarcheaology\sampling.dm"