This commit is contained in:
kevinz000
2020-01-25 17:04:07 -07:00
parent 70c9a9a25f
commit ec69b9de4d
4 changed files with 143 additions and 95 deletions
+129 -91
View File
@@ -13,56 +13,85 @@
use_power = TRUE
idle_power_usage = 75
resistance_flags = INDESTRUCTIBLE
var/list/linkedturfs //List contains all of the linked pool turfs to this controller, assignment happens on initialize
var/list/mobs_in_pool = list()//List contains all the mobs currently in the pool.
var/temperature = POOL_NORMAL //1-5 Frigid Cool Normal Warm Scalding
var/srange = 6 //The range of the search for pool turfs, change this for bigger or smaller pools.
var/list/linkedmist = list() //Used to keep track of created mist
var/misted = FALSE //Used to check for mist.
var/cur_reagent = "water"
var/drainable = FALSE
var/drained = FALSE
/// How far it scans for pool objects
var/scan_range = 6
/// Is pool mist currently on?
var/mist_state = FALSE
/// Linked mist effects
var/list/obj/effect/mist/linked_mist = list()
/// Pool turfs
var/list/turf/open/pool/linked_turfs = list()
/// All mobs in pool
var/list/mob/living/mobs_in_pool = list()
/// Is the pool bloody?
var/bloody = 0
var/obj/machinery/pool/drain/linked_drain = null
var/obj/machinery/pool/filter/linked_filter = null
var/interact_delay = 0 //cooldown on messing with settings
var/reagent_delay = 0 //cooldown on reagent ticking
var/shocked = FALSE//Shocks morons, like an airlock.
var/tempunlocked = FALSE
/// Last time we process_reagents()'d
var/last_reagent_process = 0
/// Maximum amount we will take from a beaker
var/max_beaker_transfer = 100
/// Minimum amount of a reagent for it to work on us
var/min_reagent_amount = 10
/// ADMINBUS ONLY - WHETHER OR NOT WE HAVE NOREACT ;)
var/noreact_reagents = FALSE
/// how fast in deciseconds between reagent processes
var/reagent_tick_interval = 5
/// Can we use unsafe temperatures
var/temperature_unlocked = FALSE
/// See __DEFINES/pool.dm, temperature defines
var/temperature = POOL_NORMAL
/// Whether or not the pool can be drained
var/drainable = FALSE
// Whether or not the pool is drained
var/drained = FALSE
/// Pool drain
var/obj/machinery/pool/drain/linked_drain
/// Pool filter
var/obj/machinery/pool/filter/linked_filter
/// Next world.time you can interact with settings
var/interact_delay = 0
/// Airlock style shocks
var/shocked = FALSE
/// Old reagent color, used to determine if update_color needs to reset colors.
var/old_rcolor
/obj/machinery/pool/controller/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)
create_reagents(100)
START_PROCESSING(SSfastprocess, src)
create_reagents(1000)
if(noreact_reagents)
reagents.reagent_holder_flags |= NO_REACTION
wires = new /datum/wires/poolcontroller(src)
scan_things()
/obj/machinery/pool/controller/proc/scan_things()
for(var/turf/open/pool/W in range(srange,src))
LAZYADD(linkedturfs, W)
W.controller = src
for(var/obj/machinery/pool/drain/pooldrain in range(srange,src))
linked_drain = pooldrain
linked_drain.pool_controller = src
for(var/obj/machinery/pool/filter/F in range(srange, src))
linked_filter = F
linked_filter.pool_controller = src
/obj/machinery/pool/controller/Destroy()
STOP_PROCESSING(SSprocessing, src)
linked_drain = null
linked_filter = null
linkedturfs.Cut()
linked_turfs.Cut()
mobs_in_pool.Cut()
return ..()
/obj/machinery/pool/controller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer.
/obj/machinery/pool/controller/proc/scan_things()
var/list/cached = range(scan_range, src)
for(var/turf/open/pool/W in cached)
linked_turfs += W
W.controller = src
for(var/obj/machinery/pool/drain/pooldrain in cached)
linked_drain = pooldrain
linked_drain.pool_controller = src
break
for(var/obj/machinery/pool/filter/F in cached)
linked_filter = F
linked_filter.pool_controller = src
break
/obj/machinery/pool/controller/emag_act(mob/user)
. = ..()
if(!(obj_flags & EMAGGED)) //If it is not already emagged, emag it.
to_chat(user, "<span class='warning'>You disable the [src]'s safety features.</span>")
do_sparks(5, TRUE, src)
obj_flags |= EMAGGED
tempunlocked = TRUE
temperature_unlocked = TRUE
drainable = TRUE
log_game("[key_name(user)] emagged [src]")
message_admins("[key_name_admin(user)] emagged [src]")
@@ -75,31 +104,37 @@
shock(user,50)
if(stat & (BROKEN))
return
if(istype(W,/obj/item/reagent_containers))
if(W.reagents.total_volume >= 100) //check if there's enough reagent
if(!W.reagents.total_volume) //check if there's reagent
for(var/datum/reagent/R in W.reagents.reagent_list)
if(R.name in GLOB.blacklisted_pool_reagents)
to_chat(user, "\The [src] cannot accept [R.name].")
reagents.clear_reagents()
if(R.type in GLOB.blacklisted_pool_reagents)
to_chat(user, "[src] cannot accept [R.name].")
return
if(R.reagent_state == SOLID)
to_chat(user, "The pool cannot accept reagents in solid form!.")
reagents.clear_reagents()
return
reagents.clear_reagents()
W.reagents.copy_to(reagents, 100)
W.reagents.clear_reagents()
user.visible_message("<span class='notice'>\The [src] makes a slurping noise.</span>", "<span class='notice'>All of the contents of \the [W] are quickly suctioned out by the machine!</span")
// This also reacts them. No nitroglycerin deathpools, sorry gamers :(
W.reagents.trans_to(reagents, max_beaker_transfer)
user.visible_message("<span class='notice'>[src] makes a slurping noise.</span>", "<span class='notice'>All of the contents of [W] are quickly suctioned out by the machine!</span")
updateUsrDialog()
var/reagent_names = ""
var/list/reagent_names = list()
var/list/rejected = list()
for(var/datum/reagent/R in reagents.reagent_list)
reagent_names += "[R.name], "
log_game("[key_name(user)] has changed the [src] chems to [reagent_names]")
message_admins("[key_name_admin(user)] has changed the [src] chems to [reagent_names].")
interact_delay = world.time + 15
if(R.volume >= min_reagent_amount)
reagent_names += R.name
else
reagents.remove_reagent(R.type, INFINITY)
rejected += R.name
if(length(reagent_names))
reagent_names = english_list(reagent_names)
log_game("[key_name(user)] has changed the [src] chems to [reagent_names]")
message_admins("[key_name_admin(user)] has changed the [src] chems to [reagent_names].")
if(length(rejected))
rejected = english_list(rejected)
to_chat(user, "<span class='warning'>[src] rejects the following chemicals as they do not have at least [min_reagent_amount] units of volume: [rejected]</span>")
else
to_chat(user, "<span class='notice'>\The [src] beeps unpleasantly as it rejects the beaker. It must not have enough in it.</span>")
to_chat(user, "<span class='notice'>[src] beeps unpleasantly as it rejects the beaker. Why are you trying to feed it an empty beaker?</span>")
return
else if(panel_open && is_wire_tool(W))
wires.interact(user)
@@ -132,9 +167,11 @@
else
return FALSE
/obj/machinery/pool/controller/proc/poolreagent()
if(reagents.reagent_list.len > 0)
for(var/turf/open/pool/W in linkedturfs)
/obj/machinery/pool/controller/proc/process_reagents()
if(last_reagent_process > world.time + reagent_tick_interval)
return
if(length(reagents.reagent_list) > 0)
for(var/turf/open/pool/W in linked_turfs)
for(var/mob/living/carbon/human/swimee in W)
for(var/datum/reagent/R in reagents.reagent_list)
if(R.reagent_state == SOLID)
@@ -144,20 +181,18 @@
for(var/obj/objects in W)
if(W.reagents)
W.reagents.reaction(objects, VAPOR, 1)
reagent_delay = world.time + POOL_REAGENT_TICK_INTERVAL
changecolor()
last_reagent_process = world.time
/obj/machinery/pool/controller/process()
updateUsrDialog()
if(stat & (NOPOWER|BROKEN))
return
if (!drained)
updatePool()
process_pool()
if(reagent_delay <= world.time)
poolreagent()
process_reagents()
/obj/machinery/pool/controller/proc/updatePool()
/obj/machinery/pool/controller/proc/process_pool()
if(!drained)
for(var/mob/living/M in mobs_in_pool)
switch(temperature) //Apply different effects based on what the temperature is set to.
@@ -165,7 +200,7 @@
M.adjust_bodytemperature(50,0,500)
if(POOL_WARM) //Warm
M.adjust_bodytemperature(20,0,360) //Heats up mobs till the termometer shows up
if(POOL_NORMAL) //Normal temp does nothing, because it's just room temperature water.
//Normal temp does nothing, because it's just room temperature water.
if(POOL_COOL)
M.adjust_bodytemperature(-20,250) //Cools mobs till the termometer shows up
if(POOL_FRIGID) //Freezing
@@ -184,17 +219,13 @@
if(prob(35))
to_chat(drownee, "<span class='danger'>You're drowning!</span>")
/* not sure what to do about this part
for(var/obj/effect/decal/cleanable/decal in W)
CHECK_TICK
animate(decal, alpha = 10, time = 20)
QDEL_IN(decal, 25)
if(istype(decal,/obj/effect/decal/cleanable/blood) || istype(decal, /obj/effect/decal/cleanable/trail_holder))
bloody = TRUE
*/
changecolor()
/obj/machinery/pool/controller/proc/set_bloody(state)
if(bloody == state)
return
bloody = state
update_color()
/obj/machinery/pool/controller/proc/changecolor()
/obj/machinery/pool/controller/proc/update_color()
if(drained)
return
var/rcolor
@@ -203,7 +234,7 @@
if(rcolor == old_rcolor)
return // small performance upgrade hopefully?
old_rcolor = rcolor
for(var/X in linkedturfs)
for(var/X in linked_turfs)
var/turf/open/pool/color1 = X
if(bloody)
if(rcolor)
@@ -219,36 +250,26 @@
color1.watereffect.color = null
color1.watertop.color = null
/obj/machinery/pool/controller/proc/miston() //Spawn /obj/effect/mist (from the shower) on all linked pool tiles
for(var/X in linkedturfs)
var/turf/open/pool/W = X
if(W.filled)
var/M = new /obj/effect/mist(W)
if(misted)
return
linkedmist += M
misted = TRUE //var just to keep track of when the mist on proc has been called.
/obj/machinery/pool/controller/proc/mistoff() //Delete all /obj/effect/mist from all linked pool tiles.
for(var/M in linkedmist)
qdel(M)
misted = FALSE //no mist left, turn off the tracking var
/obj/machinery/pool/controller/proc/handle_temp()
interact_delay = world.time + 10
mistoff()
icon_state = "poolc_[temperature]"
if(temperature == POOL_SCALDING)
miston()
/obj/machinery/pool/controller/proc/update_temp()
if(mist_status)
if(temperature < POOL_SCALDING)
mist_off()
else
if(temperature == POOL_SCALDING)
mist_on()
update_icon()
/obj/machinery/pool/controller/update_icon()
. = ..()
icon_state = "poolc_[temperature]"
/obj/machinery/pool/controller/proc/CanUpTemp(mob/user)
if(temperature == POOL_WARM && (tempunlocked || issilicon(user) || IsAdminGhost(user)) || temperature < POOL_WARM)
if(temperature == POOL_WARM && (temperature_unlocked || issilicon(user) || IsAdminGhost(user)) || temperature < POOL_WARM)
return TRUE
return FALSE
/obj/machinery/pool/controller/proc/CanDownTemp(mob/user)
if(temperature == POOL_COOL && (tempunlocked || issilicon(user) || IsAdminGhost(user)) || temperature > POOL_COOL)
if(temperature == POOL_COOL && (temperature_unlocked || issilicon(user) || IsAdminGhost(user)) || temperature > POOL_COOL)
return TRUE
return FALSE
@@ -261,10 +282,12 @@
if(CanUpTemp(usr))
temperature++
handle_temp()
interact_delay = world.time + 15
if(href_list["DecreaseTemp"])
if(CanDownTemp(usr))
temperature--
handle_temp()
interact_delay = world.time + 15
if(href_list["Activate Drain"])
if((drainable || issilicon(usr) || IsAdminGhost(usr)) && !linked_drain.active)
mistoff()
@@ -277,7 +300,7 @@
else
new /obj/effect/waterspout(linked_drain.loc)
temperature = POOL_NORMAL
handle_temp()
update_temp()
bloody = FALSE
updateUsrDialog()
@@ -335,3 +358,18 @@
if(WIRE_SHOCK)
if(!wires.is_cut(wire))
shocked = FALSE
/obj/machinery/pool/controller/proc/mist_on() //Spawn /obj/effect/mist (from the shower) on all linked pool tiles
if(mist_state)
return
mist_state = TRUE
for(var/X in linked_turfs)
var/turf/open/pool/W = X
if(W.filled)
var/M = new /obj/effect/mist(W)
linked_mist += M
/obj/machinery/pool/controller/proc/mistoff() //Delete all /obj/effect/mist from all linked pool tiles.
for(var/M in linked_mist)
qdel(M)
mist_state = FALSE
+1 -1
View File
@@ -86,7 +86,7 @@
whirlm.apply_damage(4, BRUTE, pick("l_leg", "r_leg")) //drain should only target the legs
to_chat(whirlm, "<span class='danger'>Your legs are caught in the drain!</span>")
else
for(var/turf/open/pool/P in controller.linked_turfs))
for(var/turf/open/pool/P in controller.linked_turfs)
P.filled = FALSE
P.update_icon()
for(var/obj/efefct/whirlpool/W in range(1, src))
+8
View File
@@ -80,6 +80,13 @@
// Entered logic
/turf/open/pool/Entered(atom/movable/AM, atom/oldloc)
if(istype(AM, /obj/effect/decal/cleanable))
var/obj/effect/decal/cleanable/C = AM
if(prob(C.bloodiness))
controller.set_bloody(TRUE)
QDEL_IN(AM, 25)
animate(AM, alpha = 10, time = 20)
return ..()
if(!AM.has_gravity(src))
return ..()
if(isliving(AM))
@@ -127,6 +134,7 @@
else if(filled)
AM.adjustStaminaLoss(1)
playsound(src, "water_wade", 20, TRUE)
return ..()
/turf/open/pool/MouseDrop_T(atom/from, mob/user)
. = ..()