Yelling works
This commit is contained in:
+25
-17
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user