From 70c9a9a25f99b349005bc29d6d8fadc59acd6e08 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 22 Jan 2020 16:36:44 -0700
Subject: [PATCH] logic
---
code/__DEFINES/move_force.dm | 2 +-
code/modules/pool/pool_controller.dm | 1 +
code/modules/pool/pool_drain.dm | 156 +++++++++++++++------------
code/modules/pool/pool_main.dm | 27 ++---
tgstation.dme | 1 +
5 files changed, 98 insertions(+), 89 deletions(-)
diff --git a/code/__DEFINES/move_force.dm b/code/__DEFINES/move_force.dm
index ec31388c72..1f8819b0c8 100644
--- a/code/__DEFINES/move_force.dm
+++ b/code/__DEFINES/move_force.dm
@@ -17,4 +17,4 @@
#define MOVE_FORCE_NORMAL MOVE_FORCE_DEFAULT
#define MOVE_FORCE_WEAK (MOVE_FORCE_DEFAULT / 2)
#define MOVE_FORCE_VERY_WEAK ((MOVE_FORCE_DEFAULT / MOVE_FORCE_CRUSH_RATIO) + 1)
-#define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3))
\ No newline at end of file
+#define MOVE_FORCE_EXTREMELY_WEAK (MOVE_FORCE_DEFAULT / (MOVE_FORCE_CRUSH_RATIO * 3))
diff --git a/code/modules/pool/pool_controller.dm b/code/modules/pool/pool_controller.dm
index f3046eee1f..786fd2a5f5 100644
--- a/code/modules/pool/pool_controller.dm
+++ b/code/modules/pool/pool_controller.dm
@@ -12,6 +12,7 @@
density = TRUE
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
diff --git a/code/modules/pool/pool_drain.dm b/code/modules/pool/pool_drain.dm
index 7739b7d0c1..51f340a69c 100644
--- a/code/modules/pool/pool_drain.dm
+++ b/code/modules/pool/pool_drain.dm
@@ -3,116 +3,132 @@
icon_state = "drain"
desc = "A suction system to remove the contents of the pool, and sometimes small objects. Do not insert fingers."
anchored = TRUE
+ /// Active/on?
var/active = FALSE
- var/status = FALSE //1 is drained, 0 is full.
- var/srange = 6
- var/timer = 0
+ /// Filling or draining
+ var/filling = FALSE
+ /// Drain item suction range
+ var/item_suction_range = 2
+ /// Fill mode knock away range
+ var/fill_push_range = 6
+ /// Drain mode suction range
+ var/drain_suck_range = 6
+ /// Parent controller
+ var/obj/machinery/pool/controller/pool_controller
+ /// Cycles left for fill/drain while active
+ var/cycles_left = 0
+ /// Mobs we are swirling around
+ var/list/whirling_mobs
+
var/cooldown
- var/obj/machinery/pool/controller/pool_controller = null
/obj/machinery/pool/drain/Initialize()
START_PROCESSING(SSprocessing, src)
- . = ..()
+ whirling_mobs = list()
+ return ..()
/obj/machinery/pool/drain/Destroy()
pool_controller.linked_drain = null
pool_controller = null
+ whirling_mobs = null
return ..()
+// This should probably start using move force sometime in the future but I'm lazy.
/obj/machinery/pool/drain/process()
- if(!status) //don't pool/drain an empty pool.
- for(var/obj/item/absorbo in orange(1,src))
- if(absorbo.w_class == WEIGHT_CLASS_TINY)
- step_towards(absorbo, src)
- var/dist = get_dist(src, absorbo)
- if(dist == 0)
- absorbo.forceMove(pool_controller.linked_filter)
+ if(!filling)
+ for(var/obj/item/I in range(min(item_suction_range, 10), src))
+ if(!I.anchored && (I.w_class == WEIGHT_CLASS_SMALL))
+ step_towards(I, src)
+ if((I.w_class == WEIGHT_CLASS_TINY) && (get_dist(I, src) == 0))
+ I.forceMove(pool_controller.linked_filter)
if(active)
- if(status) //if filling up, get back to normal position
- if(timer > 0)
- playsound(src, 'sound/effects/fillingwatter.ogg', 100, TRUE)
- timer--
- for(var/obj/whirlo in orange(1,src))
- if(!whirlo.anchored )
- step_away(whirlo,src)
- for(var/mob/living/carbon/human/whirlm in orange(2,src))
- step_away(whirlm,src)
- else if(!timer)
- for(var/turf/open/pool/undrained in range(5,src))
- undrained.filled = TRUE
- undrained.update_icon()
- for(var/obj/effect/waterspout/undrained3 in range(1,src))
- qdel(undrained3)
+ if(filling)
+ if(timer-- > 0)
+ playsound(src, 'sound/efefcts/fillingwatter.ogg', 100, TRUE)
+ for(var/obj/O in orange(min(fill_push_range, 10), src))
+ if(!O.anchored)
+ step_away(O, src)
+ for(var/mob/M in orange(min(fill_push_range, 10), src)) //compiler fastpath apparently?
+ if(!M.anchored && isliving(M))
+ step_away(M, src)
+ else
+ for(var/turf/open/pool/P in controller.linked_turfs)
+ P.filled = TRUE
+ P.update_ion()
+ for(var/obj/effect/waterspout/S in range(1, src))
+ qdel(S)
pool_controller.drained = FALSE
if(pool_controller.bloody < 1000)
pool_controller.bloody /= 2
- if(pool_controller.bloody > 1000)
+ else
pool_controller.bloody /= 4
pool_controller.changecolor()
- status = FALSE
+ filling = FALSE
active = FALSE
- return
- if(!status) //if draining, change everything.
- if(timer > 0)
+ else
+ if(timer-- > 0)
playsound(src, 'sound/effects/pooldrain.ogg', 100, TRUE)
playsound(src, "water_wade", 60, TRUE)
- timer--
- for(var/obj/whirlo in orange(2,src))
- if(!whirlo.anchored )
- step_towards(whirlo,src)
- for(var/mob/living/carbon/human/whirlm in orange(2,src))
- step_towards(whirlm,src)
- if(prob(20))
- whirlm.Knockdown(40)
- for(var/i in list(1,2,4,8,4,2,1)) //swirl!
- whirlm.dir = i
- sleep(1)
- if(whirlm.forceMove(loc))
- if(whirlm.health <= -50) //If very damaged, gib.
- whirlm.gib()
- if(whirlm.stat != CONSCIOUS || whirlm.lying) // If
- whirlm.adjustBruteLoss(5)
+ for(var/obj/O in orange(min(drain_suck_range, 10), src))
+ if(!O.anchored)
+ step_towards(O, src)
+ for(var/mob/M in orange(min(drain_suck_range, 10), src))
+ if(isliving(M) && !M.anchored)
+ step_towards(M, src)
+ whirl_mob(M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
playsound(src, pick('sound/misc/crack.ogg','sound/misc/crunch.ogg'), 50, TRUE)
- to_chat(whirlm, "You're caught in the drain!")
- continue
- else
- playsound(src, pick('sound/misc/crack.ogg','sound/misc/crunch.ogg'), 50, TRUE)
- whirlm.apply_damage(4, BRUTE, pick("l_leg", "r_leg")) //drain should only target the legs
- to_chat(whirlm, "Your legs are caught in the drain!")
- continue
-
- else if(!timer)
- for(var/turf/open/pool/drained in range(5,src))
- drained.filled = FALSE
- drained.update_icon()
- for(var/obj/effect/whirlpool/drained3 in range(1,src))
- qdel(drained3)
- for(var/obj/machinery/pool/controller/drained4 in range(5,src))
- drained4.drained = TRUE
- drained4.mistoff()
- status = TRUE
+ if(H.lying) //down for any reason
+ H.adjustBruteLoss(5)
+ to_chat(whirlm, "You're caught in the drain!")
+ else
+ whirlm.apply_damage(4, BRUTE, pick("l_leg", "r_leg")) //drain should only target the legs
+ to_chat(whirlm, "Your legs are caught in the drain!")
+ else
+ 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))
+ qdel(W)
+ linked_controller.drained = TRUE
+ linked_controller.mistoff()
active = FALSE
+ filling = TRUE
+
+/// dangerous proc don't fuck with, admins
+/obj/machinery/pool/drain/proc/whirl_mob(mob/living/L, duration = 8, delay = 1)
+ set waitfor = FALSE
+ if(whirling_mobs[L])
+ return
+ whirling_mobs[L] = TRUE
+ for(var/i in 1 to min(duration, 100))
+ L.setDir(turn(L.dir, 90))
+ sleep(delay)
+ whirling_mobs -= L
/obj/machinery/pool/filter
name = "Filter"
icon_state = "filter"
desc = "The part of the pool where all the IDs, ATV keys, and pens, and other dangerous things get trapped."
- var/obj/machinery/pool/controller/pool_controller = null
+ var/obj/machinery/pool/controller/pool_controller
/obj/machinery/pool/filter/Destroy()
pool_controller.linked_filter = null
pool_controller = null
return ..()
-/obj/machinery/pool/filter/emag_act(user as mob)
+/obj/machinery/pool/filter/emag_act(mob/living/user)
+ . = ..()
if(!(obj_flags & EMAGGED))
to_chat(user, "You disable the [src]'s shark filter! Run!")
obj_flags |= EMAGGED
do_sparks(5, TRUE, src)
icon_state = "filter_b"
addtimer(CALLBACK(src, /obj/machinery/pool/filter/proc/spawn_shark), 50)
- log_game("[key_name(user)] emagged the pool filter and spawned a shark")
- message_admins("[key_name_admin(user)] emagged the pool filter and spawned a shark")
+ var/msg = "[key_name(user)] emagged the pool filter and spawned a shark"
+ log_game(msg)
+ message_admins(msg)
/obj/machinery/pool/filter/proc/spawn_shark()
if(prob(50))
diff --git a/code/modules/pool/pool_main.dm b/code/modules/pool/pool_main.dm
index eb98a2f4fb..abc7611b3f 100644
--- a/code/modules/pool/pool_main.dm
+++ b/code/modules/pool/pool_main.dm
@@ -82,21 +82,15 @@
/turf/open/pool/Entered(atom/movable/AM, atom/oldloc)
if(!AM.has_gravity(src))
return ..()
-
-
-/turf/open/pool/Entered(atom/A, turf/OL)
- ..()
- if(isliving(A))
- var/mob/living/M = A
- if(!M.mob_has_gravity())
- return
- if(!M.swimming)
- M.swimming = TRUE
- controller.mobs_in_pool.Add(M)
- if(locate(/obj/structure/pool/ladder) in M.loc)
+ if(isliving(AM))
+ var/mob/living/victim = AM
+ if(!SEND_SIGNAL(victim, COMSIG_IS_SWIMMING)) //poor guy not swimming time to dunk them!
+ victim.AddElement(/datum/element/swimming)
+ controller.mobs_in_pool += victim
+ if(locate(/obj/structure/pool/ladder) in victim.loc) //safe climbing
return
- if(iscarbon(M))
- var/mob/living/carbon/H = M
+ if(iscarbon(AM)) //FUN TIME!
+ var/mob/living/carbon/H = victim
if(filled)
if (H.wear_mask && H.wear_mask.flags_cover & MASKCOVERSMOUTH)
H.visible_message("[H] falls in the water!",
@@ -131,11 +125,8 @@
H.Knockdown(40)
playsound(src, 'sound/effects/woodhit.ogg', 60, TRUE, 1)
else if(filled)
- M.adjustStaminaLoss(1)
+ AM.adjustStaminaLoss(1)
playsound(src, "water_wade", 20, TRUE)
- return
-
-
/turf/open/pool/MouseDrop_T(atom/from, mob/user)
. = ..()
diff --git a/tgstation.dme b/tgstation.dme
index 7b8da809a1..b9cef8faea 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -478,6 +478,7 @@
#include "code\datums\elements\dusts_on_catatonia.dm"
#include "code\datums\elements\earhealing.dm"
#include "code\datums\elements\ghost_role_eligibility.dm"
+#include "code\datums\elements\swimming.dm"
#include "code\datums\elements\wuv.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"