From e690cea147b9566c346cf3ce2eb8b339173380db Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Jun 2021 18:33:14 -0700 Subject: [PATCH 1/6] fix --- code/game/objects/effects/decals/misc.dm | 3 ++- code/modules/reagents/reagent_containers/spray.dm | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 6b90cfd62c..c734743af1 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -28,8 +28,9 @@ /obj/effect/decal/chempuff/blob_act(obj/structure/blob/B) return -/obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left) +/obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left, size) . = ..() + create_reagents(size, NONE, NO_REAGENTS_VALUE) stream = stream_mode src.speed = speed src.range = src.range_left = range diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index b90815d543..d9dde84a5e 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -74,17 +74,16 @@ return var/range = clamp(get_dist(src, A), 1, current_range) var/wait_step = CEILING(spray_delay * INVERSE(range), world.tick_lag) - var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src), stream_mode, wait_step, range, stream_mode? 1 : range) + var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src), stream_mode, wait_step, range, stream_mode? 1 : range, amount_per_transfer_from_this) var/turf/T = get_turf(src) if(!T) return log_reagent("SPRAY: [key_name(usr)] fired [src] ([REF(src)]) [COORD(T)] at [A] ([REF(A)]) [COORD(A)] (chempuff: [D.reagents.log_list()])") - D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE) if(stream_mode) reagents.trans_to(D, amount_per_transfer_from_this) else reagents.trans_to(D, amount_per_transfer_from_this, 1/range) - D.color = mix_color_from_reagents(D.reagents.reagent_list) + D.add_atom_colour(mix_color_from_reagents(D.reagents.reagent_list), TEMPORARY_COLOUR_PRIORITY) last_spray = world.time D.run_puff(A) From 5ef742ffc1c1b35507d581b83a8a0a835a73a02f Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Jun 2021 18:46:25 -0700 Subject: [PATCH 2/6] logic --- code/game/objects/effects/decals/misc.dm | 22 ++++++++++++++----- .../reagents/reagent_containers/spray.dm | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index c734743af1..7843931511 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -24,6 +24,7 @@ var/range = 3 var/hits_left = 3 var/range_left = 3 + var/list/hit /obj/effect/decal/chempuff/blob_act(obj/structure/blob/B) return @@ -35,12 +36,23 @@ src.speed = speed src.range = src.range_left = range src.hits_left = hits_left + hit = list() + +/obj/effect/decal/chempuff/Destroy() + hit = null + return ..() /obj/effect/decal/chempuff/proc/hit_thing(atom/A) if(A == src || A.invisibility) return - if(!hits_left) + if(!hits_left || hit[A]) return + var/living = isliving(A) + if(!A.density && !living) + return + if(ismob(A) && !living) + return + hit[A] = TRUE if(stream) if(ismob(A)) var/mob/M = A @@ -60,7 +72,6 @@ hit_thing(AM) /obj/effect/decal/chempuff/proc/run_puff(atom/target) - set waitfor = FALSE for(var/i in 1 to range) range_left-- if(!isturf(loc)) @@ -69,11 +80,10 @@ hit_thing(T) if(!hits_left || !isturf(loc)) break - if(hits_left && isturf(loc) && (!stream || !range_left)) + if(isturf(loc) && (!stream || !range_left)) reagents.reaction(loc, VAPOR) - hits_left-- - if(!hits_left) - break + step_towards(target) + sleep(speed) qdel(src) /obj/effect/decal/fakelattice diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index d9dde84a5e..95e55cb29d 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -85,7 +85,7 @@ reagents.trans_to(D, amount_per_transfer_from_this, 1/range) D.add_atom_colour(mix_color_from_reagents(D.reagents.reagent_list), TEMPORARY_COLOUR_PRIORITY) last_spray = world.time - D.run_puff(A) + INVOKE_ASYNC(D, /obj/effect/decal/chempuff/proc/run_puff, A) /obj/item/reagent_containers/spray/attack_self(mob/user) stream_mode = !stream_mode From d59ced8f2854065750796309dd97fe9bcd4d2c5a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Jun 2021 19:15:29 -0700 Subject: [PATCH 3/6] changes --- code/game/objects/effects/decals/misc.dm | 18 +++++++++++++++--- .../reagents/reagent_containers/spray.dm | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 7843931511..e587f9efbf 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -24,6 +24,7 @@ var/range = 3 var/hits_left = 3 var/range_left = 3 + var/firstmove = TRUE var/list/hit /obj/effect/decal/chempuff/blob_act(obj/structure/blob/B) @@ -45,10 +46,12 @@ /obj/effect/decal/chempuff/proc/hit_thing(atom/A) if(A == src || A.invisibility) return + if(firstmove) + return if(!hits_left || hit[A]) return var/living = isliving(A) - if(!A.density && !living) + if(!A.density) return if(ismob(A) && !living) return @@ -71,8 +74,18 @@ . = ..() hit_thing(AM) +/obj/effect/decal/chempuff/Bump(atom/A) + . = ..() + hit_thing(A) + /obj/effect/decal/chempuff/proc/run_puff(atom/target) - for(var/i in 1 to range) + var/safety = 255 + while(range_left) + if(!safety--) + CRASH("Spray ran out of safety.") + step_towards(src, target) + if(firstmove) + firstmove = FALSE range_left-- if(!isturf(loc)) break @@ -82,7 +95,6 @@ break if(isturf(loc) && (!stream || !range_left)) reagents.reaction(loc, VAPOR) - step_towards(target) sleep(speed) qdel(src) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 95e55cb29d..02c8a9802c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -16,7 +16,7 @@ var/stream_mode = 0 //whether we use the more focused mode var/current_range = 3 //the range of tiles the sprayer will reach. var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode. - var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode. + var/stream_range = 3 //the range of tiles the sprayer will reach when in stream mode. var/stream_amount = 10 //the amount of reagents transfered when in stream mode. /// Amount of time it takes for a spray to completely travel. var/spray_delay = 8 From 07af6b755f30415458d41aa544286e6f14c79aed Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Jun 2021 19:17:15 -0700 Subject: [PATCH 4/6] that --- code/game/objects/effects/decals/misc.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index e587f9efbf..9d339562d6 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -43,10 +43,10 @@ hit = null return ..() -/obj/effect/decal/chempuff/proc/hit_thing(atom/A) +/obj/effect/decal/chempuff/proc/hit_thing(atom/A, ignore_firstmove) if(A == src || A.invisibility) return - if(firstmove) + if(firstmove && !ignore_firstmove) return if(!hits_left || hit[A]) return @@ -76,7 +76,7 @@ /obj/effect/decal/chempuff/Bump(atom/A) . = ..() - hit_thing(A) + hit_thing(A, TRUE) /obj/effect/decal/chempuff/proc/run_puff(atom/target) var/safety = 255 From 7091b0467d216728942fc978dd1c1fc9f83b2d06 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Jun 2021 19:30:00 -0700 Subject: [PATCH 5/6] cleaner --- code/game/objects/effects/decals/misc.dm | 41 +++++++++++++----------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 9d339562d6..c959fd9208 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -43,39 +43,38 @@ hit = null return ..() -/obj/effect/decal/chempuff/proc/hit_thing(atom/A, ignore_firstmove) +/// proc called to handle us hitting something +/obj/effect/decal/chempuff/proc/hit_thing(atom/A, bump_hit) + // if the thing is invisible it usually is abstract/underfloor. also, don't hit ourselves. if(A == src || A.invisibility) return - if(firstmove && !ignore_firstmove) + // don't hit anything on the first move unless overridden (see: we're colliding a wall blocking our move out of the first tile) + if(firstmove && !bump_hit) return + // we're out of hits or we already hit it if(!hits_left || hit[A]) return var/living = isliving(A) - if(!A.density) + // if it's not dense and we're a stream instead of a mist, and we're not out of range + if(!A.density && stream && range_left && !bump_hit) return + // non living mobs are effectively abstract if(ismob(A) && !living) return hit[A] = TRUE - if(stream) - if(ismob(A)) - var/mob/M = A - if(!M.lying || !range_left) - reagents.reaction(M, VAPOR) - hits_left-- - else - if(!range_left) - reagents.reaction(A, VAPOR) - else - reagents.reaction(A) - if(ismob(A)) - hits_left-- + reagents.reaction(A, VAPOR) + // mobs absorb enough to decrement hits_left, as well as stuff blocking us. + if(ismob(A) || bump_hit) + hits_left-- /obj/effect/decal/chempuff/Crossed(atom/movable/AM, oldloc) . = ..() + // bump things moving into us as long as we're not on our first move/moving out of origin tile hit_thing(AM) /obj/effect/decal/chempuff/Bump(atom/A) . = ..() + // if we hit something blocking our movement, collide it regardless even if we're still on our origin tile hit_thing(A, TRUE) /obj/effect/decal/chempuff/proc/run_puff(atom/target) @@ -83,18 +82,24 @@ while(range_left) if(!safety--) CRASH("Spray ran out of safety.") + // move towards new turf step_towards(src, target) if(firstmove) + // mark first movement so future Cross()es result in collisions firstmove = FALSE + // decrement range range_left-- + // if we got nullspaced, exit if(!isturf(loc)) break + // hit everything in it for(var/atom/T in loc) hit_thing(T) + // if we got deleted or ran out of hits, stop if(!hits_left || !isturf(loc)) break - if(isturf(loc) && (!stream || !range_left)) - reagents.reaction(loc, VAPOR) + // hit the turf + hit_thing(loc) sleep(speed) qdel(src) From 4a5ca2b851e1e8a76b063cb50e69ed90b5a3b70a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Jun 2021 22:15:25 -0700 Subject: [PATCH 6/6] woo --- code/game/objects/effects/decals/misc.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index c959fd9208..752a5dff2c 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -98,6 +98,9 @@ // if we got deleted or ran out of hits, stop if(!hits_left || !isturf(loc)) break + if(!hits_left || !isturf(loc)) + // yeah yeah sue me it's copypasted code but I don't want to declare a var. + break // hit the turf hit_thing(loc) sleep(speed)