diff --git a/code/__HELPERS/yelling.dm b/code/__HELPERS/yelling.dm index 2dc2d0aec6..7fec64c276 100644 --- a/code/__HELPERS/yelling.dm +++ b/code/__HELPERS/yelling.dm @@ -19,6 +19,7 @@ source = get_turf(source) var/list/edges = list() edges[source] = (NORTH|SOUTH|EAST|WEST) + collected += typecache_filter_list(source.contents, GLOB.typecache_living) var/list/powers = list() powers[source] = dist var/list/processed_last = list() @@ -28,22 +29,23 @@ var/dir var/returned #define RUN_YELL(_T, _P, _D) \ - returned = max(_P - _T.get_yelling_resistance() - 1, 0); \ - _T.maptext = "[returned]"; + returned = max(_P - max(_T.get_yelling_resistance(_P), 0) - 1, 0); + // _T.maptext = "[returned]"; - var/list/turf/edges_next = list() - var/list/turf/powers_next = list() - var/list/turf/powers_returned = list() - var/list/turf/diagonals = list() - var/list/turf/diagonal_powers = list() - var/list/turf/diagonal_powers_max = list() + var/list/turf/edges_next + var/list/turf/powers_next + var/list/turf/powers_returned + var/list/turf/diagonals + var/list/turf/diagonal_powers + var/list/turf/diagonal_powers_max + var/safety = 1000 #define CALCULATE_DIAGONAL_POWER(existing, adding, maximum) min(maximum, existing + adding) #define CALCULATE_DIAGONAL_CROSS_POWER(existing, adding) max(existing, adding) #define CARDINAL_MARK(ndir, cdir, edir) \ if(edir & cdir) { \ expanding = get_step(T,ndir); \ - if(expanding && !processed_last[expanding] && !edges[expanding]) { \ + if(expanding && isnull(processed_last[expanding]) && isnull(edges[expanding])) { \ powers_next[expanding] = max(powers_next[expanding], returned); \ edges_next[expanding] = (cdir | edges_next[expanding]); \ }; \ @@ -51,7 +53,7 @@ #define DIAGONAL_SUBSTEP(ndir, cdir, edir) \ expanding = get_step(T,ndir); \ - if(expanding && !processed_last[expanding] && !edges[expanding]) { \ + if(expanding && isnull(processed_last[expanding]) && isnull(edges[expanding])) { \ if(!edges_next[expanding]) { \ diagonal_powers_max[expanding] = max(diagonal_powers_max[expanding], returned, powers[T]); \ diagonal_powers[expanding] = CALCULATE_DIAGONAL_POWER(diagonal_powers[expanding], returned, diagonal_powers_max[expanding]); \ @@ -69,6 +71,12 @@ }; while(edges.len) + edges_next = list() + powers_next = list() + powers_returned = list() + diagonals = list() + diagonal_powers = list() + diagonal_powers_max = list() // to_chat(world, "DEBUG: cycle start edges [english_list_assoc(edges)]") // process cardinals @@ -78,8 +86,8 @@ dir = edges[T] RUN_YELL(T, power, dir) powers_returned[T] = returned - if(returned) - // get hearing atoms + if(returned >= 1) + collected |= typecache_filter_list(T.contents, GLOB.typecache_living) else continue @@ -87,7 +95,6 @@ CARDINAL_MARK(SOUTH, SOUTH, dir) CARDINAL_MARK(EAST, EAST, dir) CARDINAL_MARK(WEST, WEST, dir) - CHECK_TICK // to_chat(world, "DEBUG: cycle mid edges_next [english_list_assoc(edges_next)]") @@ -101,7 +108,6 @@ DIAGONAL_MARK(SOUTH, SOUTH, dir) DIAGONAL_MARK(EAST, EAST, dir) DIAGONAL_MARK(WEST, WEST, dir) - CHECK_TICK // to_chat(world, "DEBUG: cycle mid diagonals [english_list_assoc(diagonals)]") @@ -111,13 +117,12 @@ power = diagonal_powers[T] dir = diagonals[T] RUN_YELL(T, power, dir) - if(!returned) + if(returned < 1) continue CARDINAL_MARK(NORTH, NORTH, dir) CARDINAL_MARK(SOUTH, SOUTH, dir) CARDINAL_MARK(EAST, EAST, dir) CARDINAL_MARK(WEST, WEST, dir) - CHECK_TICK // to_chat(world, "DEBUG: cycle end edges_next [english_list_assoc(edges_next)]") @@ -126,6 +131,10 @@ edges = edges_next powers = powers_next + // sleep(2.5) + if(!--safety) + CRASH("Yelling ran out of safety.") + #undef RUN_YELL #undef DIAGONAL_SUBSTEP #undef CALCULATE_DIAGONAL_POWER @@ -137,4 +146,3 @@ var/datum/yelling_wavefill/Y = new Y.run_wavefill(source, dist) return Y.collected || list() - diff --git a/code/datums/explosion2.dm b/code/datums/explosion2.dm index 9a9f2b40cf..d3429bdebe 100644 --- a/code/datums/explosion2.dm +++ b/code/datums/explosion2.dm @@ -283,14 +283,11 @@ // insanity define to mark the next set of cardinals. #define CARDINAL_MARK(ndir, cdir, edir) \ if(edir & cdir) { \ - CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ - }; - -#define CARDINAL_MARK_NOCHECK(ndir, cdir, edir) \ - expanding = get_step(T,ndir); \ - if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ - powers_next[expanding] = max(powers_next[expanding], returned); \ - edges_next[expanding] = (cdir | edges_next[expanding]); \ + expanding = get_step(T,ndir); \ + if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ + powers_next[expanding] = max(powers_next[expanding], returned); \ + edges_next[expanding] = (cdir | edges_next[expanding]); \ + }; \ }; // insanity define to do diagonal marking as 2 substeps @@ -308,24 +305,15 @@ }; // insanity define to mark the diagonals that would otherwise be missed -#define DIAGONAL_MARK(ndir, cdir, edir) \ - if(edir & cdir) { \ - DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ - }; - // this only works because right now, WEX_DIR_X is the same as a byond dir // and we know we're only passing in one dir at a time. // if this ever stops being the case, and explosions break when you touch this, now you know why. -#define DIAGONAL_MARK_NOCHECK(ndir, cdir, edir) \ - DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ - DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); - - // mark -#define MARK(ndir, cdir, edir) \ +#define DIAGONAL_MARK(ndir, cdir, edir) \ if(edir & cdir) { \ - CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ - DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ + DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ + DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); \ }; + CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir) CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) CARDINAL_MARK(EAST, WEX_DIR_EAST, dir) @@ -379,4 +367,3 @@ #undef DIAGONAL_SUBSTEP #undef DIAGONAL_MARK #undef CARDINAL_MARK -#undef MARK diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 098f1a2ea0..bcae3059e0 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -57,6 +57,8 @@ /// Should we use tooltips, if the thing does not have the code implemented `get_tooltip_data()`, it will default to examine(src) var/tooltips = FALSE + /// How loudly we yell + var/yell_power = 35 /atom/movable/Initialize(mapload) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 46d0bd9486..7af6c6780e 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -9,7 +9,9 @@ wave_explosion_block = 10 wave_explosion_multiply = 0.75 /// How much we block yelling - var/yelling_resistance = 40 + var/yelling_resistance = 15 + /// how much of inbound yelling to dampen + var/yelling_dampen = 0.5 /turf/closed/Initialize() . = ..() @@ -217,5 +219,5 @@ icon_state = "ice" canSmoothWith = list(/turf/closed/indestructible/rock/glacierrock/blue) -/turf/closed/get_yelling_resistance() - return yelling_resistance +/turf/closed/get_yelling_resistance(power) + return yelling_resistance + (power * yelling_dampen) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 29b2db20ba..f8e2a2e18f 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -613,7 +613,7 @@ GLOBAL_LIST_EMPTY(station_turfs) if(. != BULLET_ACT_FORCE_PIERCE) . = BULLET_ACT_TURF -/turf/proc/get_yelling_resistance() +/turf/proc/get_yelling_resistance(power) . = 0 // don't bother checking fulltile, we don't need accuracy var/obj/structure/window/W = locate() in src diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm index 3a828e0c81..d69b40be16 100644 --- a/code/modules/mob/living/living_blocking_parrying.dm +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -114,7 +114,7 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Attack types we can block var/parry_attack_types = ALL /// Parry flags - var/parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING + var/parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK /// Parry windup duration in deciseconds. 0 to this is windup, afterwards is main stage. var/parry_time_windup = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 949a47e50c..9f39fe492b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /atom/movable/proc/process_yelling(list/already_heard, rendered, atom/movable/speaker, datum/language/message_language, message, list/spans, message_mode, obj/source) var/list/overhearing = list() - overhearing = yelling_wavefill(src, 35) + overhearing = yelling_wavefill(src, yell_power) // overhearing = get_hearers_in_view(35, src) | get_hearers_in_range(5, src) overhearing -= already_heard for(var/_AM in overhearing)