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"