Yelling works

This commit is contained in:
silicons
2021-06-13 00:50:00 -07:00
parent 2f9492945d
commit b6bb20842f
7 changed files with 44 additions and 45 deletions
+25 -17
View File
@@ -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()
+9 -22
View File
@@ -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
+2
View File
@@ -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)
+5 -3
View File
@@ -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)
+1 -1
View File
@@ -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
@@ -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
+1 -1
View File
@@ -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)