Movespeed Modification System (#39181)

In preparation of pixel movement, I want to refactor our slowdown system to something more modular, and something that doesn't require /quite/ as many proccalls/calculations a tick. The way this works is intended to only have things recalculate when it's necessary, rather than calling it every move.
However, I've left movement_delay() in, as without completely redoing a lot of code it's not /quite/ ready at this point to tear it out completely, but I'm hoping everything can be transitioned over to this system later.
This commit is contained in:
kevinz000
2018-08-09 13:55:15 -07:00
committed by yogstation13-bot
parent cd7f8628d8
commit b5e2daa978
50 changed files with 543 additions and 333 deletions

View File

@@ -0,0 +1,31 @@
#define MOVESPEED_DATA_INDEX_PRIORITY 1
#define MOVESPEED_DATA_INDEX_FLAGS 2
#define MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN 3
#define MOVESPEED_DATA_INDEX_MAX 3
//flags
#define IGNORE_NOSLOW (1 << 0)
//ids
#define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN"
#define MOVESPEED_ID_CONFIG_SPEEDMOD "MOB_CONFIG_MODIFIER"
#define MOVESPEED_ID_SLIME_REAGENTMOD "SLIME_REAGENT_MODIFIER"
#define MOVESPEED_ID_SLIME_HEALTHMOD "SLIME_HEALTH_MODIFIER"
#define MOVESPEED_ID_SLIME_TEMPMOD "SLIME_TEMPERATURE_MODIFIER"
#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
#define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED"
#define MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD "MONKEY_REAGENT_SPEEDMOD"
#define MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD "MONKEY_TEMPERATURE_SPEEDMOD"
#define MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD "MONKEY_HEALTH_SPEEDMOD"
#define MOVESPEED_ID_SIMPLEMOB_VARSPEED "SIMPLEMOB_VARSPEED_MODIFIER"
#define MOVESPEED_ID_ADMIN_VAREDIT "ADMIN_VAREDIT_MODIFIER"
#define MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD "PAI_SPACEWALK_MODIFIER"

View File

@@ -194,7 +194,7 @@
send2irc("Server", "Round just ended.") send2irc("Server", "Round just ended.")
if(length(CONFIG_GET(keyed_string_list/cross_server))) if(length(CONFIG_GET(keyed_list/cross_server)))
send_news_report() send_news_report()
CHECK_TICK CHECK_TICK

View File

@@ -34,3 +34,23 @@ GLOBAL_LIST_EMPTY(all_languages)
GLOBAL_LIST_EMPTY(sentient_disease_instances) GLOBAL_LIST_EMPTY(sentient_disease_instances)
GLOBAL_LIST_EMPTY(latejoin_ai_cores) GLOBAL_LIST_EMPTY(latejoin_ai_cores)
GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup)
/proc/update_config_movespeed_type_lookup(update_mobs = TRUE)
var/list/mob_types = list()
var/list/entry_value = CONFIG_GET(keyed_list/multiplicative_movespeed)
for(var/path in entry_value)
var/value = entry_value[path]
if(!value)
continue
for(var/subpath in typesof(path))
mob_types[subpath] = value
GLOB.mob_config_movespeed_type_lookup = mob_types
if(update_mobs)
update_mob_config_movespeeds()
/proc/update_mob_config_movespeeds()
for(var/i in GLOB.mob_list)
var/mob/M = i
M.update_config_movespeed()

View File

@@ -310,17 +310,21 @@
/obj/screen/mov_intent/Click() /obj/screen/mov_intent/Click()
toggle(usr) toggle(usr)
/obj/screen/mov_intent/update_icon(mob/user)
if(!user && hud)
user = hud.mymob
if(!user)
return
switch(user.m_intent)
if(MOVE_INTENT_WALK)
icon_state = "walking"
if(MOVE_INTENT_RUN)
icon_state = "running"
/obj/screen/mov_intent/proc/toggle(mob/user) /obj/screen/mov_intent/proc/toggle(mob/user)
if(isobserver(user)) if(isobserver(user))
return return
switch(user.m_intent) user.toggle_move_intent(user)
if("run")
user.m_intent = MOVE_INTENT_WALK
icon_state = "walking"
if("walk")
user.m_intent = MOVE_INTENT_RUN
icon_state = "running"
user.update_icons()
/obj/screen/pull /obj/screen/pull
name = "stop pulling" name = "stop pulling"

View File

@@ -1,6 +1,9 @@
#define LIST_MODE_NUM 0 #define VALUE_MODE_NUM 0
#define LIST_MODE_TEXT 1 #define VALUE_MODE_TEXT 1
#define LIST_MODE_FLAG 2 #define VALUE_MODE_FLAG 2
#define KEY_MODE_TEXT 0
#define KEY_MODE_TYPE 1
/datum/config_entry /datum/config_entry
var/name //read-only, this is determined by the last portion of the derived entry type var/name //read-only, this is determined by the last portion of the derived entry type
@@ -58,32 +61,6 @@
VASProcCallGuard(str_val) VASProcCallGuard(str_val)
CRASH("Invalid config entry type!") CRASH("Invalid config entry type!")
/datum/config_entry/proc/ValidateKeyedList(str_val, list_mode, splitter)
str_val = trim(str_val)
var/key_pos = findtext(str_val, splitter)
var/key_name = null
var/key_value = null
if(key_pos || list_mode == LIST_MODE_FLAG)
key_name = lowertext(copytext(str_val, 1, key_pos))
key_value = copytext(str_val, key_pos + 1)
var/temp
var/continue_check
switch(list_mode)
if(LIST_MODE_FLAG)
temp = TRUE
continue_check = TRUE
if(LIST_MODE_NUM)
temp = text2num(key_value)
continue_check = !isnull(temp)
if(LIST_MODE_TEXT)
temp = key_value
continue_check = temp
if(continue_check && ValidateListEntry(key_name, temp))
config_entry_value[key_name] = temp
return TRUE
return FALSE
/datum/config_entry/proc/ValidateListEntry(key_name, key_value) /datum/config_entry/proc/ValidateListEntry(key_name, key_value)
return TRUE return TRUE
@@ -156,44 +133,58 @@
config_entry_value = new_list config_entry_value = new_list
return TRUE return TRUE
/datum/config_entry/keyed_flag_list /datum/config_entry/keyed_list
abstract_type = /datum/config_entry/keyed_flag_list abstract_type = /datum/config_entry/keyed_list
config_entry_value = list()
dupes_allowed = TRUE
/datum/config_entry/keyed_flag_list/ValidateAndSet(str_val)
if(!VASProcCallGuard(str_val))
return FALSE
return ValidateKeyedList(str_val, LIST_MODE_FLAG, " ")
/datum/config_entry/keyed_number_list
abstract_type = /datum/config_entry/keyed_number_list
config_entry_value = list() config_entry_value = list()
dupes_allowed = TRUE dupes_allowed = TRUE
var/key_mode
var/value_mode
var/splitter = " " var/splitter = " "
/datum/config_entry/keyed_number_list/vv_edit_var(var_name, var_value) /datum/config_entry/keyed_list/New()
return var_name != "splitter" && ..() . = ..()
if(isnull(key_mode) || isnull(value_mode))
CRASH("Keyed list of type [type] created with null key or value mode!")
/datum/config_entry/keyed_number_list/ValidateAndSet(str_val) /datum/config_entry/keyed_list/ValidateAndSet(str_val)
if(!VASProcCallGuard(str_val)) if(!VASProcCallGuard(str_val))
return FALSE return FALSE
return ValidateKeyedList(str_val, LIST_MODE_NUM, splitter)
/datum/config_entry/keyed_string_list str_val = trim(str_val)
abstract_type = /datum/config_entry/keyed_string_list var/key_pos = findtext(str_val, splitter)
config_entry_value = list() var/key_name = null
dupes_allowed = TRUE var/key_value = null
var/splitter = " "
/datum/config_entry/keyed_string_list/vv_edit_var(var_name, var_value) if(key_pos || value_mode == VALUE_MODE_FLAG)
return var_name != "splitter" && ..() key_name = lowertext(copytext(str_val, 1, key_pos))
key_value = copytext(str_val, key_pos + 1)
/datum/config_entry/keyed_string_list/ValidateAndSet(str_val) var/new_key
if(!VASProcCallGuard(str_val)) var/new_value
var/continue_check_value
var/continue_check_key
switch(key_mode)
if(KEY_MODE_TEXT)
new_key = key_name
continue_check_key = new_key
if(KEY_MODE_TYPE)
new_key = key_name
if(!ispath(new_key))
new_key = text2path(new_key)
continue_check_key = ispath(new_key)
switch(value_mode)
if(VALUE_MODE_FLAG)
new_value = TRUE
continue_check_value = TRUE
if(VALUE_MODE_NUM)
new_value = text2num(key_value)
continue_check_value = !isnull(new_value)
if(VALUE_MODE_TEXT)
new_value = key_value
continue_check_value = new_value
if(continue_check_value && continue_check_key && ValidateListEntry(new_key, new_value))
config_entry_value[new_key] = new_value
return TRUE
return FALSE return FALSE
return ValidateKeyedList(str_val, LIST_MODE_TEXT, splitter)
#undef LIST_MODE_NUM /datum/config_entry/keyed_list/vv_edit_var(var_name, var_value)
#undef LIST_MODE_TEXT return var_name != "splitter" && ..()
#undef LIST_MODE_FLAG

View File

@@ -200,7 +200,7 @@
mode_reports = list() mode_reports = list()
mode_false_report_weight = list() mode_false_report_weight = list()
votable_modes = list() votable_modes = list()
var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) var/list/probabilities = Get(/datum/config_entry/keyed_list/probability)
for(var/T in gamemode_cache) for(var/T in gamemode_cache)
// I wish I didn't have to instance the game modes in order to look up // I wish I didn't have to instance the game modes in order to look up
// their information, but it is the only way (at least that I know of). // their information, but it is the only way (at least that I know of).
@@ -296,9 +296,9 @@
/datum/controller/configuration/proc/get_runnable_modes() /datum/controller/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new var/list/datum/game_mode/runnable_modes = new
var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) var/list/probabilities = Get(/datum/config_entry/keyed_list/probability)
var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) var/list/min_pop = Get(/datum/config_entry/keyed_list/min_pop)
var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) var/list/max_pop = Get(/datum/config_entry/keyed_list/max_pop)
var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust)
for(var/T in gamemode_cache) for(var/T in gamemode_cache)
var/datum/game_mode/M = new T() var/datum/game_mode/M = new T()
@@ -326,9 +326,9 @@
/datum/controller/configuration/proc/get_runnable_midround_modes(crew) /datum/controller/configuration/proc/get_runnable_midround_modes(crew)
var/list/datum/game_mode/runnable_modes = new var/list/datum/game_mode/runnable_modes = new
var/list/probabilities = Get(/datum/config_entry/keyed_number_list/probability) var/list/probabilities = Get(/datum/config_entry/keyed_list/probability)
var/list/min_pop = Get(/datum/config_entry/keyed_number_list/min_pop) var/list/min_pop = Get(/datum/config_entry/keyed_list/min_pop)
var/list/max_pop = Get(/datum/config_entry/keyed_number_list/max_pop) var/list/max_pop = Get(/datum/config_entry/keyed_list/max_pop)
for(var/T in (gamemode_cache - SSticker.mode.type)) for(var/T in (gamemode_cache - SSticker.mode.type))
var/datum/game_mode/M = new T() var/datum/game_mode/M = new T()
if(!(M.config_tag in modes)) if(!(M.config_tag in modes))

View File

@@ -4,10 +4,12 @@
/datum/config_entry/string/comms_key/ValidateAndSet(str_val) /datum/config_entry/string/comms_key/ValidateAndSet(str_val)
return str_val != "default_pwd" && length(str_val) > 6 && ..() return str_val != "default_pwd" && length(str_val) > 6 && ..()
/datum/config_entry/keyed_string_list/cross_server /datum/config_entry/keyed_list/cross_server
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_TEXT
protection = CONFIG_ENTRY_LOCKED protection = CONFIG_ENTRY_LOCKED
/datum/config_entry/keyed_string_list/cross_server/ValidateAndSet(str_val) /datum/config_entry/keyed_list/cross_server/ValidateAndSet(str_val)
. = ..() . = ..()
if(.) if(.)
var/list/newv = list() var/list/newv = list()
@@ -15,7 +17,7 @@
newv[replacetext(I, "+", " ")] = config_entry_value[I] newv[replacetext(I, "+", " ")] = config_entry_value[I]
config_entry_value = newv config_entry_value = newv
/datum/config_entry/keyed_string_list/cross_server/ValidateListEntry(key_name, key_value) /datum/config_entry/keyed_list/cross_server/ValidateListEntry(key_name, key_value)
return key_value != "byond:\\address:port" && ..() return key_value != "byond:\\address:port" && ..()
/datum/config_entry/string/cross_comms_name /datum/config_entry/string/cross_comms_name

View File

@@ -1,31 +1,43 @@
/datum/config_entry/number_list/repeated_mode_adjust /datum/config_entry/number_list/repeated_mode_adjust
/datum/config_entry/keyed_number_list/probability /datum/config_entry/keyed_list/probability
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
/datum/config_entry/keyed_number_list/probability/ValidateListEntry(key_name) /datum/config_entry/keyed_list/probability/ValidateListEntry(key_name)
return key_name in config.modes return key_name in config.modes
/datum/config_entry/keyed_number_list/max_pop /datum/config_entry/keyed_list/max_pop
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
/datum/config_entry/keyed_number_list/max_pop/ValidateListEntry(key_name) /datum/config_entry/keyed_list/max_pop/ValidateListEntry(key_name)
return key_name in config.modes return key_name in config.modes
/datum/config_entry/keyed_number_list/min_pop /datum/config_entry/keyed_list/min_pop
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
/datum/config_entry/keyed_number_list/min_pop/ValidateListEntry(key_name, key_value) /datum/config_entry/keyed_list/min_pop/ValidateListEntry(key_name, key_value)
return key_name in config.modes return key_name in config.modes
/datum/config_entry/keyed_flag_list/continuous // which roundtypes continue if all antagonists die /datum/config_entry/keyed_list/continuous // which roundtypes continue if all antagonists die
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
/datum/config_entry/keyed_flag_list/continuous/ValidateListEntry(key_name, key_value) /datum/config_entry/keyed_list/continuous/ValidateListEntry(key_name, key_value)
return key_name in config.modes return key_name in config.modes
/datum/config_entry/keyed_flag_list/midround_antag // which roundtypes use the midround antagonist system /datum/config_entry/keyed_list/midround_antag // which roundtypes use the midround antagonist system
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
/datum/config_entry/keyed_flag_list/midround_antag/ValidateListEntry(key_name, key_value) /datum/config_entry/keyed_list/midround_antag/ValidateListEntry(key_name, key_value)
return key_name in config.modes return key_name in config.modes
/datum/config_entry/keyed_string_list/policy /datum/config_entry/keyed_list/policy
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_TEXT
/datum/config_entry/number/damage_multiplier /datum/config_entry/number/damage_multiplier
config_entry_value = 1 config_entry_value = 1
@@ -124,7 +136,9 @@
/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen /datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen
/datum/config_entry/keyed_flag_list/roundstart_races //races you can play as from the get go. /datum/config_entry/keyed_list/roundstart_races //races you can play as from the get go.
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game /datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game
@@ -174,28 +188,67 @@
/datum/config_entry/flag/emojis /datum/config_entry/flag/emojis
/datum/config_entry/number/run_delay //Used for modifying movement speed for mobs. /datum/config_entry/keyed_list/multiplicative_movespeed
var/static/value_cache = 0 key_mode = KEY_MODE_TYPE
value_mode = VALUE_MODE_NUM
config_entry_value = list( //DEFAULTS
/mob/living/simple_animal = 1,
/mob/living/silicon/pai = 1,
/mob/living/carbon/alien/humanoid/hunter = -1,
/mob/living/carbon/alien/humanoid/royal/praetorian = 1,
/mob/living/carbon/alien/humanoid/royal/queen = 3
)
/datum/config_entry/number/run_delay/ValidateAndSet() /datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet()
. = ..() . = ..()
if(.) if(.)
value_cache = config_entry_value update_config_movespeed_type_lookup(TRUE)
/datum/config_entry/number/walk_delay /datum/config_entry/keyed_list/multiplicative_movespeed/vv_edit_var(var_name, var_value)
var/static/value_cache = 0 . = ..()
if(. && (var_name == NAMEOF(src, config_entry_value)))
update_config_movespeed_type_lookup(TRUE)
/datum/config_entry/number/walk_delay/ValidateAndSet() /datum/config_entry/number/movedelay //Used for modifying movement speed for mobs.
abstract_type = /datum/config_entry/number/movedelay
/datum/config_entry/number/movedelay/ValidateAndSet()
. = ..() . = ..()
if(.) if(.)
value_cache = config_entry_value update_mob_config_movespeeds()
/datum/config_entry/number/human_delay //Mob specific modifiers. NOTE: These will affect different mob types in different ways /datum/config_entry/number/movedelay/vv_edit_var(var_name, var_value)
/datum/config_entry/number/robot_delay . = ..()
/datum/config_entry/number/monkey_delay if(. && (var_name == NAMEOF(src, config_entry_value)))
/datum/config_entry/number/alien_delay update_mob_config_movespeeds()
/datum/config_entry/number/slime_delay
/datum/config_entry/number/animal_delay /datum/config_entry/number/movedelay/run_delay
/datum/config_entry/number/movedelay/walk_delay
/////////////////////////////////////////////////Outdated move delay
/datum/config_entry/number/outdated_movedelay
deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed
abstract_type = /datum/config_entry/number/outdated_movedelay
var/movedelay_type
/datum/config_entry/number/outdated_movedelay/DeprecationUpdate(value)
return "[movedelay_type] [value]"
/datum/config_entry/number/outdated_movedelay/human_delay
movedelay_type = /mob/living/carbon/human
/datum/config_entry/number/outdated_movedelay/robot_delay
movedelay_type = /mob/living/silicon/robot
/datum/config_entry/number/outdated_movedelay/monkey_delay
movedelay_type = /mob/living/carbon/monkey
/datum/config_entry/number/outdated_movedelay/alien_delay
movedelay_type = /mob/living/carbon/alien
/datum/config_entry/number/outdated_movedelay/slime_delay
movedelay_type = /mob/living/simple_animal/slime
/datum/config_entry/number/outdated_movedelay/animal_delay
movedelay_type = /mob/living/simple_animal
/////////////////////////////////////////////////
/datum/config_entry/flag/roundstart_away //Will random away mission be loaded. /datum/config_entry/flag/roundstart_away //Will random away mission be loaded.
@@ -219,9 +272,13 @@
config_entry_value = 12 config_entry_value = 12
min_val = 0 min_val = 0
/datum/config_entry/keyed_flag_list/random_laws /datum/config_entry/keyed_list/random_laws
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_FLAG
/datum/config_entry/keyed_number_list/law_weight /datum/config_entry/keyed_list/law_weight
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
splitter = "," splitter = ","
/datum/config_entry/number/overflow_cap /datum/config_entry/number/overflow_cap
@@ -286,7 +343,9 @@
/datum/config_entry/flag/shift_time_realtime /datum/config_entry/flag/shift_time_realtime
/datum/config_entry/keyed_number_list/antag_rep /datum/config_entry/keyed_list/antag_rep
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
/datum/config_entry/number/monkeycap /datum/config_entry/number/monkeycap
config_entry_value = 64 config_entry_value = 64

View File

@@ -218,7 +218,7 @@
/* General ai_law functions */ /* General ai_law functions */
/datum/ai_laws/proc/set_laws_config() /datum/ai_laws/proc/set_laws_config()
var/list/law_ids = CONFIG_GET(keyed_flag_list/random_laws) var/list/law_ids = CONFIG_GET(keyed_list/random_laws)
switch(CONFIG_GET(number/default_laws)) switch(CONFIG_GET(number/default_laws))
if(0) if(0)
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.") add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
@@ -247,7 +247,7 @@
/datum/ai_laws/proc/pick_weighted_lawset() /datum/ai_laws/proc/pick_weighted_lawset()
var/datum/ai_laws/lawtype var/datum/ai_laws/lawtype
var/list/law_weights = CONFIG_GET(keyed_number_list/law_weight) var/list/law_weights = CONFIG_GET(keyed_list/law_weight)
while(!lawtype && law_weights.len) while(!lawtype && law_weights.len)
var/possible_id = pickweightAllowZero(law_weights) var/possible_id = pickweightAllowZero(law_weights)
lawtype = lawid_to_type(possible_id) lawtype = lawid_to_type(possible_id)

View File

@@ -9,6 +9,7 @@
return FALSE return FALSE
vars[var_name] = var_value vars[var_name] = var_value
datum_flags |= DF_VAR_EDITED datum_flags |= DF_VAR_EDITED
return TRUE
/datum/proc/vv_get_var(var_name) /datum/proc/vv_get_var(var_name)
switch(var_name) switch(var_name)

View File

@@ -72,17 +72,17 @@
to_chat(src, "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]") to_chat(src, "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]")
to_chat(src, "Enforce Human Authority: [CONFIG_GET(flag/enforce_human_authority)]") to_chat(src, "Enforce Human Authority: [CONFIG_GET(flag/enforce_human_authority)]")
to_chat(src, "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists)]") to_chat(src, "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists)]")
to_chat(src, "Enforce Continuous Rounds: [length(CONFIG_GET(keyed_flag_list/continuous))] of [config.modes.len] roundtypes") to_chat(src, "Enforce Continuous Rounds: [length(CONFIG_GET(keyed_list/continuous))] of [config.modes.len] roundtypes")
to_chat(src, "Allow Midround Antagonists: [length(CONFIG_GET(keyed_flag_list/midround_antag))] of [config.modes.len] roundtypes") to_chat(src, "Allow Midround Antagonists: [length(CONFIG_GET(keyed_list/midround_antag))] of [config.modes.len] roundtypes")
if(CONFIG_GET(flag/show_game_type_odds)) if(CONFIG_GET(flag/show_game_type_odds))
var/list/probabilities = CONFIG_GET(keyed_number_list/probability) var/list/probabilities = CONFIG_GET(keyed_list/probability)
if(SSticker.IsRoundInProgress()) if(SSticker.IsRoundInProgress())
var/prob_sum = 0 var/prob_sum = 0
var/current_odds_differ = FALSE var/current_odds_differ = FALSE
var/list/probs = list() var/list/probs = list()
var/list/modes = config.gamemode_cache var/list/modes = config.gamemode_cache
var/list/min_pop = CONFIG_GET(keyed_number_list/min_pop) var/list/min_pop = CONFIG_GET(keyed_list/min_pop)
var/list/max_pop = CONFIG_GET(keyed_number_list/max_pop) var/list/max_pop = CONFIG_GET(keyed_list/max_pop)
for(var/mode in modes) for(var/mode in modes)
var/datum/game_mode/M = mode var/datum/game_mode/M = mode
var/ctag = initial(M.config_tag) var/ctag = initial(M.config_tag)

View File

@@ -1,6 +1,7 @@
/atom/movable /atom/movable
layer = OBJ_LAYER layer = OBJ_LAYER
var/last_move = null var/last_move = null
var/last_move_time = 0
var/anchored = FALSE var/anchored = FALSE
var/datum/thrownthing/throwing = null var/datum/thrownthing/throwing = null
var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported

View File

@@ -176,7 +176,7 @@
round_converted = 0 round_converted = 0
return return
//somewhere between 1 and 3 minutes from now //somewhere between 1 and 3 minutes from now
if(!CONFIG_GET(keyed_flag_list/midround_antag)[SSticker.mode.config_tag]) if(!CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag])
round_converted = 0 round_converted = 0
return 1 return 1
for(var/mob/living/carbon/human/H in antag_candidates) for(var/mob/living/carbon/human/H in antag_candidates)
@@ -205,8 +205,8 @@
return TRUE return TRUE
if(station_was_nuked) if(station_was_nuked)
return TRUE return TRUE
var/list/continuous = CONFIG_GET(keyed_flag_list/continuous) var/list/continuous = CONFIG_GET(keyed_list/continuous)
var/list/midround_antag = CONFIG_GET(keyed_flag_list/midround_antag) var/list/midround_antag = CONFIG_GET(keyed_list/midround_antag)
if(!round_converted && (!continuous[config_tag] || (continuous[config_tag] && midround_antag[config_tag]))) //Non-continuous or continous with replacement antags if(!round_converted && (!continuous[config_tag] || (continuous[config_tag] && midround_antag[config_tag]))) //Non-continuous or continous with replacement antags
if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place if(!continuous_sanity_checked) //make sure we have antags to be checking in the first place
for(var/mob/Player in GLOB.mob_list) for(var/mob/Player in GLOB.mob_list)

View File

@@ -133,7 +133,7 @@
//Checks if the round is over// //Checks if the round is over//
/////////////////////////////// ///////////////////////////////
/datum/game_mode/revolution/check_finished() /datum/game_mode/revolution/check_finished()
if(CONFIG_GET(keyed_flag_list/continuous)["revolution"]) if(CONFIG_GET(keyed_list/continuous)["revolution"])
if(finished) if(finished)
SSshuttle.clearHostileEnvironment(src) SSshuttle.clearHostileEnvironment(src)
return ..() return ..()

View File

@@ -474,7 +474,7 @@
if (authenticated==2) if (authenticated==2)
dat += "<BR><BR><B>Captain Functions</B>" dat += "<BR><BR><B>Captain Functions</B>"
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=announce'>Make a Captain's Announcement</A> \]" dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=announce'>Make a Captain's Announcement</A> \]"
var/cross_servers_count = length(CONFIG_GET(keyed_string_list/cross_server)) var/cross_servers_count = length(CONFIG_GET(keyed_list/cross_server))
if(cross_servers_count) if(cross_servers_count)
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""]</A> \]" dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""]</A> \]"
if(SSmapping.config.allow_custom_shuttles) if(SSmapping.config.allow_custom_shuttles)

View File

@@ -22,7 +22,14 @@
return return
step(src, direction) //yogs start step(src, direction) //yogs start
move_delay = TRUE move_delay = TRUE
<<<<<<< HEAD
addtimer(CALLBACK(src, .proc/ResetMoveDelay), CONFIG_GET(number/walk_delay) * move_speed_multiplier) //yogs end addtimer(CALLBACK(src, .proc/ResetMoveDelay), CONFIG_GET(number/walk_delay) * move_speed_multiplier) //yogs end
=======
if(step(src, direction))
addtimer(CALLBACK(src, .proc/ResetMoveDelay), CONFIG_GET(number/movedelay/walk_delay) * move_speed_multiplier)
else
ResetMoveDelay()
>>>>>>> 5f4b418eaa... Movespeed Modification System (#39181)
/obj/structure/closet/cardboard/proc/ResetMoveDelay() /obj/structure/closet/cardboard/proc/ResetMoveDelay()
move_delay = FALSE move_delay = FALSE

View File

@@ -154,12 +154,12 @@
else else
dat += "ETA: <a href='?_src_=holder;[HrefToken()];edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>" dat += "ETA: <a href='?_src_=holder;[HrefToken()];edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>"
dat += "<B>Continuous Round Status</B><BR>" dat += "<B>Continuous Round Status</B><BR>"
dat += "<a href='?_src_=holder;[HrefToken()];toggle_continuous=1'>[CONFIG_GET(keyed_flag_list/continuous)[SSticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]</a>" dat += "<a href='?_src_=holder;[HrefToken()];toggle_continuous=1'>[CONFIG_GET(keyed_list/continuous)[SSticker.mode.config_tag] ? "Continue if antagonists die" : "End on antagonist death"]</a>"
if(CONFIG_GET(keyed_flag_list/continuous)[SSticker.mode.config_tag]) if(CONFIG_GET(keyed_list/continuous)[SSticker.mode.config_tag])
dat += ", <a href='?_src_=holder;[HrefToken()];toggle_midround_antag=1'>[CONFIG_GET(keyed_flag_list/midround_antag)[SSticker.mode.config_tag] ? "creating replacement antagonists" : "not creating new antagonists"]</a><BR>" dat += ", <a href='?_src_=holder;[HrefToken()];toggle_midround_antag=1'>[CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag] ? "creating replacement antagonists" : "not creating new antagonists"]</a><BR>"
else else
dat += "<BR>" dat += "<BR>"
if(CONFIG_GET(keyed_flag_list/midround_antag)[SSticker.mode.config_tag]) if(CONFIG_GET(keyed_list/midround_antag)[SSticker.mode.config_tag])
dat += "Time limit: <a href='?_src_=holder;[HrefToken()];alter_midround_time_limit=1'>[CONFIG_GET(number/midround_antag_time_check)] minutes into round</a><BR>" dat += "Time limit: <a href='?_src_=holder;[HrefToken()];alter_midround_time_limit=1'>[CONFIG_GET(number/midround_antag_time_check)] minutes into round</a><BR>"
dat += "Living crew limit: <a href='?_src_=holder;[HrefToken()];alter_midround_life_limit=1'>[CONFIG_GET(number/midround_antag_life_check) * 100]% of crew alive</a><BR>" dat += "Living crew limit: <a href='?_src_=holder;[HrefToken()];alter_midround_life_limit=1'>[CONFIG_GET(number/midround_antag_life_check) * 100]% of crew alive</a><BR>"
dat += "If limits past: <a href='?_src_=holder;[HrefToken()];toggle_noncontinuous_behavior=1'>[SSticker.mode.round_ends_with_antag_death ? "End The Round" : "Continue As Extended"]</a><BR>" dat += "If limits past: <a href='?_src_=holder;[HrefToken()];toggle_noncontinuous_behavior=1'>[SSticker.mode.round_ends_with_antag_death ? "End The Round" : "Continue As Extended"]</a><BR>"

View File

@@ -339,7 +339,7 @@
else if(href_list["toggle_continuous"]) else if(href_list["toggle_continuous"])
if(!check_rights(R_ADMIN)) if(!check_rights(R_ADMIN))
return return
var/list/continuous = CONFIG_GET(keyed_flag_list/continuous) var/list/continuous = CONFIG_GET(keyed_list/continuous)
if(!continuous[SSticker.mode.config_tag]) if(!continuous[SSticker.mode.config_tag])
continuous[SSticker.mode.config_tag] = TRUE continuous[SSticker.mode.config_tag] = TRUE
else else
@@ -352,7 +352,7 @@
if(!check_rights(R_ADMIN)) if(!check_rights(R_ADMIN))
return return
var/list/midround_antag = CONFIG_GET(keyed_flag_list/midround_antag) var/list/midround_antag = CONFIG_GET(keyed_list/midround_antag)
if(!midround_antag[SSticker.mode.config_tag]) if(!midround_antag[SSticker.mode.config_tag])
midround_antag[SSticker.mode.config_tag] = TRUE midround_antag[SSticker.mode.config_tag] = TRUE
else else

View File

@@ -589,7 +589,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
message["key"] = comms_key message["key"] = comms_key
message += type message += type
var/list/servers = CONFIG_GET(keyed_string_list/cross_server) var/list/servers = CONFIG_GET(keyed_list/cross_server)
for(var/I in servers) for(var/I in servers)
world.Export("[servers[I]]?[list2params(message)]") world.Export("[servers[I]]?[list2params(message)]")

View File

@@ -20,8 +20,8 @@
//OTHER// //OTHER//
///////// /////////
var/datum/preferences/prefs = null var/datum/preferences/prefs = null
var/move_delay = 1 var/last_turn = 0
var/move_delay = 0
var/area = null var/area = null
/////////////// ///////////////

View File

@@ -69,7 +69,7 @@
return TRUE return TRUE
/datum/job/proc/GetAntagRep() /datum/job/proc/GetAntagRep()
. = CONFIG_GET(keyed_number_list/antag_rep)[lowertext(title)] . = CONFIG_GET(keyed_list/antag_rep)[lowertext(title)]
if(. == null) if(. == null)
return antag_rep return antag_rep

View File

@@ -14,7 +14,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
prepare_huds() prepare_huds()
if(length(CONFIG_GET(keyed_string_list/cross_server))) if(length(CONFIG_GET(keyed_list/cross_server)))
verbs += /mob/dead/proc/server_hop verbs += /mob/dead/proc/server_hop
set_focus(src) set_focus(src)
return INITIALIZE_HINT_NORMAL return INITIALIZE_HINT_NORMAL
@@ -59,7 +59,7 @@ INITIALIZE_IMMEDIATE(/mob/dead)
set desc= "Jump to the other server" set desc= "Jump to the other server"
if(notransform) if(notransform)
return return
var/list/csa = CONFIG_GET(keyed_string_list/cross_server) var/list/csa = CONFIG_GET(keyed_list/cross_server)
var/pick var/pick
switch(csa.len) switch(csa.len)
if(0) if(0)

View File

@@ -5,21 +5,16 @@
health = 125 health = 125
icon_state = "aliend" icon_state = "aliend"
/mob/living/carbon/alien/humanoid/drone/Initialize() /mob/living/carbon/alien/humanoid/drone/Initialize()
AddAbility(new/obj/effect/proc_holder/alien/evolve(null)) AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
. = ..() . = ..()
/mob/living/carbon/alien/humanoid/drone/create_internal_organs() /mob/living/carbon/alien/humanoid/drone/create_internal_organs()
internal_organs += new /obj/item/organ/alien/plasmavessel/large internal_organs += new /obj/item/organ/alien/plasmavessel/large
internal_organs += new /obj/item/organ/alien/resinspinner internal_organs += new /obj/item/organ/alien/resinspinner
internal_organs += new /obj/item/organ/alien/acid internal_organs += new /obj/item/organ/alien/acid
..() ..()
/mob/living/carbon/alien/humanoid/drone/movement_delay()
. = ..()
/obj/effect/proc_holder/alien/evolve /obj/effect/proc_holder/alien/evolve
name = "Evolve to Praetorian" name = "Evolve to Praetorian"
desc = "Praetorian" desc = "Praetorian"

View File

@@ -10,11 +10,6 @@
internal_organs += new /obj/item/organ/alien/plasmavessel/small internal_organs += new /obj/item/organ/alien/plasmavessel/small
..() ..()
/mob/living/carbon/alien/humanoid/hunter/movement_delay()
. = -1 //hunters are sanic
. += ..() //but they still need to slow down on stun
//Hunter verbs //Hunter verbs
/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1) /mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(message = 1)
@@ -26,7 +21,6 @@
else else
return return
/mob/living/carbon/alien/humanoid/hunter/ClickOn(atom/A, params) /mob/living/carbon/alien/humanoid/hunter/ClickOn(atom/A, params)
face_atom(A) face_atom(A)
if(leap_on_click) if(leap_on_click)
@@ -34,7 +28,6 @@
else else
..() ..()
#define MAX_ALIEN_LEAP_DIST 7 #define MAX_ALIEN_LEAP_DIST 7
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A) /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)

View File

@@ -5,12 +5,8 @@
health = 250 health = 250
icon_state = "alienp" icon_state = "alienp"
/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize() /mob/living/carbon/alien/humanoid/royal/praetorian/Initialize()
real_name = name real_name = name
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve()) AddAbility(new /obj/effect/proc_holder/alien/royal/praetorian/evolve())
. = ..() . = ..()
@@ -22,11 +18,6 @@
internal_organs += new /obj/item/organ/alien/neurotoxin internal_organs += new /obj/item/organ/alien/neurotoxin
..() ..()
/mob/living/carbon/alien/humanoid/royal/praetorian/movement_delay()
. = ..()
. += 1
/obj/effect/proc_holder/alien/royal/praetorian/evolve /obj/effect/proc_holder/alien/royal/praetorian/evolve
name = "Evolve" name = "Evolve"
desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time." desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time."

View File

@@ -5,7 +5,6 @@
health = 150 health = 150
icon_state = "aliens" icon_state = "aliens"
/mob/living/carbon/alien/humanoid/sentinel/Initialize() /mob/living/carbon/alien/humanoid/sentinel/Initialize()
AddAbility(new /obj/effect/proc_holder/alien/sneak) AddAbility(new /obj/effect/proc_holder/alien/sneak)
. = ..() . = ..()
@@ -15,7 +14,3 @@
internal_organs += new /obj/item/organ/alien/acid internal_organs += new /obj/item/organ/alien/acid
internal_organs += new /obj/item/organ/alien/neurotoxin internal_organs += new /obj/item/organ/alien/neurotoxin
..() ..()
/mob/living/carbon/alien/humanoid/sentinel/movement_delay()
. = ..()

View File

@@ -26,16 +26,8 @@
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null)) AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
. = ..() . = ..()
/mob/living/carbon/alien/humanoid/movement_delay()
. = ..()
var/static/config_alien_delay
if(isnull(config_alien_delay))
config_alien_delay = CONFIG_GET(number/alien_delay)
. += move_delay_add + config_alien_delay + sneaking //move_delay_add is used to slow aliens with stun
/mob/living/carbon/alien/humanoid/restrained(ignore_grab) /mob/living/carbon/alien/humanoid/restrained(ignore_grab)
. = handcuffed return handcuffed
/mob/living/carbon/alien/humanoid/show_inv(mob/user) /mob/living/carbon/alien/humanoid/show_inv(mob/user)
user.set_machine(src) user.set_machine(src)

View File

@@ -40,7 +40,7 @@
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src)) AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse/xeno(src))
AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote()) AddAbility(new/obj/effect/proc_holder/alien/royal/queen/promote())
smallsprite.Grant(src) smallsprite.Grant(src)
..() return ..()
/mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs() /mob/living/carbon/alien/humanoid/royal/queen/create_internal_organs()
internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen internal_organs += new /obj/item/organ/alien/plasmavessel/large/queen
@@ -50,10 +50,6 @@
internal_organs += new /obj/item/organ/alien/eggsac internal_organs += new /obj/item/organ/alien/eggsac
..() ..()
/mob/living/carbon/alien/humanoid/royal/queen/movement_delay()
. = ..()
. += 3
//Queen verbs //Queen verbs
/obj/effect/proc_holder/alien/lay_egg /obj/effect/proc_holder/alien/lay_egg
name = "Lay Egg" name = "Lay Egg"

View File

@@ -515,6 +515,10 @@
if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD )
become_husk("burn") become_husk("burn")
med_hud_set_health() med_hud_set_health()
if(stat == SOFT_CRIT)
add_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE, multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN)
else
remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE)
/mob/living/carbon/update_sight() /mob/living/carbon/update_sight()
if(!client) if(!client)

View File

@@ -10,9 +10,6 @@
if(legcuffed) if(legcuffed)
. += legcuffed.slowdown . += legcuffed.slowdown
if(stat == SOFT_CRIT)
. += SOFTCRIT_ADD_SLOWDOWN
/mob/living/carbon/slip(knockdown_amount, obj/O, lube) /mob/living/carbon/slip(knockdown_amount, obj/O, lube)
if(movement_type & FLYING) if(movement_type & FLYING)
return 0 return 0

View File

@@ -1,9 +1,16 @@
/mob/living/carbon/human/get_movespeed_modifiers()
var/list/considering = ..()
. = considering
if(has_trait(TRAIT_IGNORESLOWDOWN))
for(var/id in .)
var/list/data = .[id]
if(data[MOVESPEED_DATA_INDEX_FLAGS] & IGNORE_NOSLOW)
.[id] = data
/mob/living/carbon/human/movement_delay() /mob/living/carbon/human/movement_delay()
. = 0 . = ..()
var/static/config_human_delay if(dna && dna.species)
if(isnull(config_human_delay)) . += dna.species.movement_delay(src)
config_human_delay = CONFIG_GET(number/human_delay)
. += ..() + config_human_delay + dna.species.movement_delay(src)
/mob/living/carbon/human/slip(knockdown_amount, obj/O, lube) /mob/living/carbon/human/slip(knockdown_amount, obj/O, lube)
if(has_trait(TRAIT_NOSLIPALL)) if(has_trait(TRAIT_NOSLIPALL))

View File

@@ -95,7 +95,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
GLOB.roundstart_races += "human" GLOB.roundstart_races += "human"
/datum/species/proc/check_roundstart_eligible() /datum/species/proc/check_roundstart_eligible()
if(id in (CONFIG_GET(keyed_flag_list/roundstart_races))) if(id in (CONFIG_GET(keyed_list/roundstart_races)))
return TRUE return TRUE
return FALSE return FALSE

View File

@@ -16,8 +16,6 @@
/obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey) /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
hud_type = /datum/hud/monkey hud_type = /datum/hud/monkey
/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner) /mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
verbs += /mob/living/proc/mob_sleep verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down verbs += /mob/living/proc/lay_down
@@ -28,7 +26,6 @@
//initialize limbs //initialize limbs
create_bodyparts() create_bodyparts()
create_internal_organs() create_internal_organs()
. = ..() . = ..()
@@ -60,26 +57,31 @@
internal_organs += new /obj/item/organ/stomach internal_organs += new /obj/item/organ/stomach
..() ..()
/mob/living/carbon/monkey/movement_delay() /mob/living/carbon/monkey/on_reagent_change()
if(reagents)
if(reagents.has_reagent("morphine"))
return -1
if(reagents.has_reagent("nuka_cola"))
return -1
. = ..() . = ..()
remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE)
var/amount
if(reagents.has_reagent("morphine"))
amount = -1
if(reagents.has_reagent("nuka_cola"))
amount = -1
if(amount)
add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
/mob/living/carbon/monkey/updatehealth()
. = ..()
var/slow = 0
var/health_deficiency = (100 - health) var/health_deficiency = (100 - health)
if(health_deficiency >= 45) if(health_deficiency >= 45)
. += (health_deficiency / 25) slow += (health_deficiency / 25)
add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
/mob/living/carbon/monkey/adjust_bodytemperature(amount)
. = ..()
var/slow = 0
if (bodytemperature < 283.222) if (bodytemperature < 283.222)
. += (283.222 - bodytemperature) / 10 * 1.75 slow += (283.222 - bodytemperature) / 10 * 1.75
add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
var/static/config_monkey_delay
if(isnull(config_monkey_delay))
config_monkey_delay = CONFIG_GET(number/monkey_delay)
. += config_monkey_delay
/mob/living/carbon/monkey/Stat() /mob/living/carbon/monkey/Stat()
..() ..()

View File

@@ -492,27 +492,6 @@
if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) if(lying && !buckled && prob(getBruteLoss()*200/maxHealth))
makeTrail(newloc, T, old_direction) makeTrail(newloc, T, old_direction)
/mob/living/movement_delay(ignorewalk = 0)
. = 0
if(isopenturf(loc) && !is_flying())
var/turf/open/T = loc
. += T.slowdown
var/static/datum/config_entry/number/run_delay/config_run_delay
var/static/datum/config_entry/number/walk_delay/config_walk_delay
if(isnull(config_run_delay))
config_run_delay = CONFIG_GET(number/run_delay)
config_walk_delay = CONFIG_GET(number/walk_delay)
if(ignorewalk)
. += config_run_delay.value_cache
else
switch(m_intent)
if(MOVE_INTENT_RUN)
if(drowsyness > 0)
. += 6
. += config_run_delay.value_cache
if(MOVE_INTENT_WALK)
. += config_walk_delay.value_cache
/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) /mob/living/proc/makeTrail(turf/target_turf, turf/start, direction)
if(!has_gravity()) if(!has_gravity())
return return

View File

@@ -0,0 +1,27 @@
/mob/living/Moved()
. = ..()
update_turf_movespeed(loc)
/mob/living/toggle_move_intent()
. = ..()
update_move_intent_slowdown()
/mob/living/update_config_movespeed()
update_move_intent_slowdown()
return ..()
/mob/living/proc/update_move_intent_slowdown()
var/mod = 0
if(m_intent == MOVE_INTENT_WALK)
mod = CONFIG_GET(number/movedelay/walk_delay)
else
mod = CONFIG_GET(number/movedelay/run_delay)
if(!isnum(mod))
mod = 1
add_movespeed_modifier(MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
/mob/living/proc/update_turf_movespeed(turf/open/T)
if(isopenturf(T) && !is_flying())
add_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = T.slowdown)
else
remove_movespeed_modifier(MOVESPEED_ID_LIVING_TURF_SPEEDMOD)

View File

@@ -75,13 +75,7 @@
var/overload_maxhealth = 0 var/overload_maxhealth = 0
canmove = FALSE canmove = FALSE
var/silent = FALSE var/silent = FALSE
var/hit_slowdown = 0
var/brightness_power = 5 var/brightness_power = 5
var/slowdown = 0
/mob/living/silicon/pai/movement_delay()
. = ..()
. += slowdown
/mob/living/silicon/pai/can_unbuckle() /mob/living/silicon/pai/can_unbuckle()
return FALSE return FALSE
@@ -266,9 +260,9 @@
/mob/living/silicon/pai/Process_Spacemove(movement_dir = 0) /mob/living/silicon/pai/Process_Spacemove(movement_dir = 0)
. = ..() . = ..()
if(!.) if(!.)
slowdown = 2 add_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE, 100, multiplicative_slowdown = 2)
return TRUE return TRUE
slowdown = initial(slowdown) remove_movespeed_modifier(MOVESPEED_ID_PAI_SPACEWALK_SPEEDMOD, TRUE)
return TRUE return TRUE
/mob/living/silicon/pai/examine(mob/user) /mob/living/silicon/pai/examine(mob/user)
@@ -293,7 +287,5 @@
health = maxHealth - getBruteLoss() - getFireLoss() health = maxHealth - getBruteLoss() - getFireLoss()
update_stat() update_stat()
/mob/living/silicon/pai/process() /mob/living/silicon/pai/process()
emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth) emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth)
hit_slowdown = CLAMP((hit_slowdown - 1), 0, 100)

View File

@@ -64,7 +64,6 @@
if(emitterhealth < 0) if(emitterhealth < 0)
fold_in(force = TRUE) fold_in(force = TRUE)
to_chat(src, "<span class='userdanger'>The impact degrades your holochassis!</span>") to_chat(src, "<span class='userdanger'>The impact degrades your holochassis!</span>")
hit_slowdown += amount
return amount return amount
/mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) /mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)

View File

@@ -103,10 +103,6 @@
set_light(0) set_light(0)
to_chat(src, "<span class='notice'>You disable your integrated light.</span>") to_chat(src, "<span class='notice'>You disable your integrated light.</span>")
/mob/living/silicon/pai/movement_delay()
. = ..()
. += 1 //A bit slower than humans, so they're easier to smash
/mob/living/silicon/pai/mob_pickup(mob/living/L) /mob/living/silicon/pai/mob_pickup(mob/living/L)
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, chassis, item_head_icon, item_lh_icon, item_rh_icon) var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, chassis, item_head_icon, item_lh_icon, item_rh_icon)
if(!L.put_in_hands(holder)) if(!L.put_in_hands(holder))

View File

@@ -3,13 +3,6 @@
return 1 return 1
return ..() return ..()
/mob/living/silicon/robot/movement_delay()
. = ..()
var/static/config_robot_delay
if(isnull(config_robot_delay))
config_robot_delay = CONFIG_GET(number/robot_delay)
. += speed + config_robot_delay
/mob/living/silicon/robot/mob_negates_gravity() /mob/living/silicon/robot/mob_negates_gravity()
return magpulse return magpulse

View File

@@ -394,6 +394,9 @@
if(!isturf(src.loc) || !canmove || buckled) if(!isturf(src.loc) || !canmove || buckled)
return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove)
if(client && stat == CONSCIOUS && parrot_state != icon_living)
icon_state = icon_living
//Because the most appropriate place to set icon_state is movement_delay(), clearly
//-----SLEEPING //-----SLEEPING
if(parrot_state == PARROT_PERCH) if(parrot_state == PARROT_PERCH)
@@ -604,12 +607,6 @@
* Procs * Procs
*/ */
/mob/living/simple_animal/parrot/movement_delay()
if(client && stat == CONSCIOUS && parrot_state != icon_living)
icon_state = icon_living
//Because the most appropriate place to set icon_state is movement_delay(), clearly
return ..()
/mob/living/simple_animal/parrot/proc/isStuck() /mob/living/simple_animal/parrot/proc/isStuck()
//Check to see if the parrot is stuck due to things like windows or doors or windowdoors //Check to see if the parrot is stuck due to things like windows or doors or windowdoors
if(parrot_lastmove) if(parrot_lastmove)

View File

@@ -101,6 +101,7 @@
real_name = name real_name = name
if(!loc) if(!loc)
stack_trace("Simple animal being instantiated in nullspace") stack_trace("Simple animal being instantiated in nullspace")
update_simplemob_varspeed()
/mob/living/simple_animal/Destroy() /mob/living/simple_animal/Destroy()
GLOB.simple_animals[AIStatus] -= src GLOB.simple_animals[AIStatus] -= src
@@ -278,14 +279,14 @@
act = "me" act = "me"
..(act, m_type, message) ..(act, m_type, message)
/mob/living/simple_animal/proc/set_varspeed(var_value)
speed = var_value
update_simplemob_varspeed()
/mob/living/simple_animal/proc/update_simplemob_varspeed()
/mob/living/simple_animal/movement_delay() if(speed == 0)
var/static/config_animal_delay remove_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE)
if(isnull(config_animal_delay)) add_movespeed_modifier(MOVESPEED_ID_SIMPLEMOB_VARSPEED, TRUE, 100, multiplicative_slowdown = speed, override = TRUE)
config_animal_delay = CONFIG_GET(number/animal_delay)
. += config_animal_delay
return ..() + speed + config_animal_delay
/mob/living/simple_animal/Stat() /mob/living/simple_animal/Stat()
..() ..()

View File

@@ -134,33 +134,37 @@
icon_state = icon_dead icon_state = icon_dead
..() ..()
/mob/living/simple_animal/slime/movement_delay() /mob/living/simple_animal/slime/on_reagent_change()
if(bodytemperature >= 330.23) // 135 F or 57.08 C
return -1 // slimes become supercharged at high temperatures
. = ..() . = ..()
remove_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE)
var/health_deficiency = (100 - health) var/amount = 0
if(health_deficiency >= 45)
. += (health_deficiency / 25)
if(bodytemperature < 183.222)
. += (283.222 - bodytemperature) / 10 * 1.75
if(reagents)
if(reagents.has_reagent("morphine")) // morphine slows slimes down if(reagents.has_reagent("morphine")) // morphine slows slimes down
. *= 2 amount = 2
if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
. *= 5 amount = 5
if(amount)
add_movespeed_modifier(MOVESPEED_ID_SLIME_REAGENTMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
if(health <= 0) // if damaged, the slime moves twice as slow /mob/living/simple_animal/slime/updatehealth()
. *= 2 . = ..()
remove_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, FALSE)
var/health_deficiency = (100 - health)
var/mod = 0
if(health_deficiency >= 45)
mod += (health_deficiency / 25)
if(health <= 0)
mod += 2
add_movespeed_modifier(MOVESPEED_ID_SLIME_HEALTHMOD, TRUE, 100, multiplicative_slowdown = mod)
var/static/config_slime_delay /mob/living/simple_animal/slime/adjust_bodytemperature()
if(isnull(config_slime_delay)) . = ..()
config_slime_delay = CONFIG_GET(number/slime_delay) var/mod = 0
. += config_slime_delay if(bodytemperature >= 330.23) // 135 F or 57.08 C
mod = -1 // slimes become supercharged at high temperatures
else if(bodytemperature < 183.222)
mod = (283.222 - bodytemperature) / 10 * 1.75
if(mod)
add_movespeed_modifier(MOVESPEED_ID_SLIME_TEMPMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
/mob/living/simple_animal/slime/ObjBump(obj/O) /mob/living/simple_animal/slime/ObjBump(obj/O)
if(!client && powerlevel > 0) if(!client && powerlevel > 0)

View File

@@ -143,9 +143,14 @@
/mob/living/proc/add_trait(trait, source) /mob/living/proc/add_trait(trait, source)
if(!status_traits[trait]) if(!status_traits[trait])
status_traits[trait] = list(source) status_traits[trait] = list(source)
on_add_trait(trait, source)
else else
status_traits[trait] |= list(source) status_traits[trait] |= list(source)
/mob/living/proc/on_add_trait(trait, source)
if(trait == TRAIT_IGNORESLOWDOWN)
update_movespeed(FALSE)
/mob/living/proc/add_quirk(quirk, spawn_effects) //separate proc due to the way these ones are handled /mob/living/proc/add_quirk(quirk, spawn_effects) //separate proc due to the way these ones are handled
if(has_trait(quirk)) if(has_trait(quirk))
return return
@@ -156,7 +161,6 @@
return TRUE return TRUE
/mob/living/proc/remove_trait(trait, list/sources, force) /mob/living/proc/remove_trait(trait, list/sources, force)
if(!status_traits[trait]) if(!status_traits[trait])
return return
@@ -165,6 +169,7 @@
if(!sources) // No defined source cures the trait entirely. if(!sources) // No defined source cures the trait entirely.
status_traits -= trait status_traits -= trait
on_remove_trait(trait, sources, force)
return return
if(!islist(sources)) if(!islist(sources))
@@ -179,6 +184,11 @@
if(!LAZYLEN(status_traits[trait])) if(!LAZYLEN(status_traits[trait]))
status_traits -= trait status_traits -= trait
on_remove_trait(trait, sources, force)
/mob/living/proc/on_remove_trait(trait, list/sources, force)
if(trait == TRAIT_IGNORESLOWDOWN)
update_movespeed(FALSE)
/mob/living/proc/remove_quirk(quirk) /mob/living/proc/remove_quirk(quirk)
var/datum/quirk/T = roundstart_quirks[quirk] var/datum/quirk/T = roundstart_quirks[quirk]

View File

@@ -35,6 +35,8 @@
AA.onNewMob(src) AA.onNewMob(src)
nutrition = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX) nutrition = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)
. = ..() . = ..()
update_config_movespeed()
update_movespeed(TRUE)
/mob/GenerateTag() /mob/GenerateTag()
tag = "mob_[next_mob_id++]" tag = "mob_[next_mob_id++]"
@@ -173,9 +175,6 @@
for(var/mob/M in get_hearers_in_view(range, src)) for(var/mob/M in get_hearers_in_view(range, src))
M.show_message( message, 2, deaf_message, 1) M.show_message( message, 2, deaf_message, 1)
/mob/proc/movement_delay() //update /living/movement_delay() if you change this
return 0
/mob/proc/Life() /mob/proc/Life()
set waitfor = FALSE set waitfor = FALSE
@@ -317,13 +316,13 @@
set category = "Object" set category = "Object"
if(!src || !isturf(src.loc) || !(A in view(src.loc))) if(!src || !isturf(src.loc) || !(A in view(src.loc)))
return 0 return FALSE
if(istype(A, /obj/effect/temp_visual/point)) if(istype(A, /obj/effect/temp_visual/point))
return 0 return FALSE
var/tile = get_turf(A) var/tile = get_turf(A)
if (!tile) if (!tile)
return 0 return FALSE
new /obj/effect/temp_visual/point(A,invisibility) new /obj/effect/temp_visual/point(A,invisibility)
@@ -332,7 +331,7 @@
on_tile.pointed_at(src) on_tile.pointed_at(src)
// yogs end // yogs end
return 1 return TRUE
/mob/proc/can_resist() /mob/proc/can_resist()
return FALSE //overridden in living.dm return FALSE //overridden in living.dm
@@ -607,59 +606,61 @@
if(S.chemical_cost >=0 && S.can_be_used_by(src)) if(S.chemical_cost >=0 && S.can_be_used_by(src))
statpanel("[S.panel]",((S.chemical_cost > 0) ? "[S.chemical_cost]" : ""),S) statpanel("[S.panel]",((S.chemical_cost > 0) ? "[S.chemical_cost]" : ""),S)
#define MOB_FACE_DIRECTION_DELAY 1
// facing verbs // facing verbs
/mob/proc/canface() /mob/proc/canface()
if(!canmove) if(!canmove)
return 0 return FALSE
if(world.time < client.move_delay) if(world.time < client.last_turn)
return 0 return FALSE
if(stat==2) if(stat == DEAD || stat == UNCONSCIOUS)
return 0 return FALSE
if(anchored) if(anchored)
return 0 return FALSE
if(notransform) if(notransform)
return 0 return FALSE
if(restrained()) if(restrained())
return 0 return FALSE
return 1 return TRUE
/mob/proc/fall(forced) /mob/proc/fall(forced)
drop_all_held_items() drop_all_held_items()
/mob/verb/eastface() /mob/verb/eastface()
set hidden = 1 set hidden = TRUE
if(!canface()) if(!canface())
return 0 return FALSE
setDir(EAST) setDir(EAST)
client.move_delay += movement_delay() client.last_turn = world.time + MOB_FACE_DIRECTION_DELAY
return 1 return TRUE
/mob/verb/westface() /mob/verb/westface()
set hidden = 1 set hidden = TRUE
if(!canface()) if(!canface())
return 0 return FALSE
setDir(WEST) setDir(WEST)
client.move_delay += movement_delay() client.last_turn = world.time + MOB_FACE_DIRECTION_DELAY
return 1 return TRUE
/mob/verb/northface() /mob/verb/northface()
set hidden = 1 set hidden = TRUE
if(!canface()) if(!canface())
return 0 return FALSE
setDir(NORTH) setDir(NORTH)
client.move_delay += movement_delay() client.last_turn = world.time + MOB_FACE_DIRECTION_DELAY
return 1 return TRUE
/mob/verb/southface() /mob/verb/southface()
set hidden = 1 set hidden = TRUE
if(!canface()) if(!canface())
return 0 return FALSE
setDir(SOUTH) setDir(SOUTH)
client.move_delay += movement_delay() client.last_turn = world.time + MOB_FACE_DIRECTION_DELAY
return 1 return TRUE
/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check /mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
return 0 return FALSE
/mob/proc/swap_hand() /mob/proc/swap_hand()
return return

View File

@@ -14,8 +14,7 @@
var/list/datum/action/chameleon_item_actions var/list/datum/action/chameleon_item_actions
var/static/next_mob_id = 0 var/static/next_mob_id = 0
var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak var/stat = CONSCIOUS //Whether a mob is alive or dead. TODO: Move this to living - Nodrak
/*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob.
A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such.
@@ -40,6 +39,11 @@
var/lying_prev = 0 var/lying_prev = 0
var/canmove = 1 var/canmove = 1
//MOVEMENT SPEED
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
var/cached_multiplicative_slowdown
/////////////////
var/name_archive //For admin things like possession var/name_archive //For admin things like possession
var/bodytemperature = BODYTEMP_NORMAL //310.15K / 98.6F var/bodytemperature = BODYTEMP_NORMAL //310.15K / 98.6F

View File

@@ -10,6 +10,10 @@
return TRUE return TRUE
return (!mover.density || !density || lying) return (!mover.density || !density || lying)
//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM.
//See mob_movespeed.dm
/mob/proc/movement_delay() //update /living/movement_delay() if you change this
return cached_multiplicative_slowdown
/client/verb/drop_item() /client/verb/drop_item()
set hidden = 1 set hidden = 1
@@ -26,7 +30,6 @@
mob.control_object.setDir(direct) mob.control_object.setDir(direct)
else else
mob.control_object.forceMove(get_step(mob.control_object,direct)) mob.control_object.forceMove(get_step(mob.control_object,direct))
return
#define MOVEMENT_DELAY_BUFFER 0.75 #define MOVEMENT_DELAY_BUFFER 0.75
#define MOVEMENT_DELAY_BUFFER_DELTA 1.25 #define MOVEMENT_DELAY_BUFFER_DELTA 1.25
@@ -38,7 +41,7 @@
next_move_dir_add = 0 next_move_dir_add = 0
next_move_dir_sub = 0 next_move_dir_sub = 0
var/old_move_delay = move_delay var/old_move_delay = move_delay
move_delay = world.time+world.tick_lag //this is here because Move() can now be called mutiple times per tick move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick
if(!mob || !mob.loc) if(!mob || !mob.loc)
return FALSE return FALSE
if(!n || !direct) if(!n || !direct)
@@ -357,9 +360,13 @@
set hidden = TRUE set hidden = TRUE
set instant = TRUE set instant = TRUE
if(mob) if(mob)
mob.toggle_move_intent() mob.toggle_move_intent(usr)
/mob/proc/toggle_move_intent() /mob/proc/toggle_move_intent(mob/user)
if(m_intent == MOVE_INTENT_RUN)
m_intent = MOVE_INTENT_WALK
else
m_intent = MOVE_INTENT_RUN
if(hud_used && hud_used.static_inventory) if(hud_used && hud_used.static_inventory)
for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) for(var/obj/screen/mov_intent/selector in hud_used.static_inventory)
selector.toggle(src) selector.update_icon(src)

View File

@@ -0,0 +1,106 @@
/*Current movespeed modification list format: list(id = list(
priority,
legacy slowdown/speedup amount,
))
*/
//ANY ADD/REMOVE DONE IN UPDATE_MOVESPEED MUST HAVE THE UPDATE ARGUMENT SET AS FALSE!
/mob/proc/add_movespeed_modifier(id, update = TRUE, priority = 0, flags = NONE, override = FALSE, multiplicative_slowdown = 0)
var/list/temp = list(priority, flags, multiplicative_slowdown) //build the modification list
if(LAZYACCESS(movespeed_modification, id))
if(movespeed_modifier_identical_check(movespeed_modification[id], temp))
return FALSE
if(!override)
return FALSE
else
remove_movespeed_modifier(id, update)
LAZYSET(movespeed_modification, id, list(priority, flags, multiplicative_slowdown))
if(update)
update_movespeed(TRUE)
return TRUE
/mob/proc/remove_movespeed_modifier(id, update = TRUE)
if(!LAZYACCESS(movespeed_modification, id))
return FALSE
LAZYREMOVE(movespeed_modification, id)
UNSETEMPTY(movespeed_modification)
if(update)
update_movespeed(FALSE)
return TRUE
/mob/vv_edit_var(var_name, var_value)
var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown))
var/diff
if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value))
remove_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT)
diff = var_value - cached_multiplicative_slowdown
. = ..()
if(. && slowdown_edit && isnum(diff))
add_movespeed_modifier(MOVESPEED_ID_ADMIN_VAREDIT, TRUE, 100, override = TRUE, multiplicative_slowdown = diff)
/mob/proc/has_movespeed_modifier(id)
return LAZYACCESS(movespeed_modification, id)
/mob/proc/update_config_movespeed()
add_movespeed_modifier(MOVESPEED_ID_CONFIG_SPEEDMOD, FALSE, 100, override = TRUE, multiplicative_slowdown = get_config_multiplicative_speed())
/mob/proc/get_config_multiplicative_speed()
if(!islist(GLOB.mob_config_movespeed_type_lookup) || !GLOB.mob_config_movespeed_type_lookup[type])
return 0
else
return GLOB.mob_config_movespeed_type_lookup[type]
/mob/proc/update_movespeed(resort = TRUE)
if(resort)
sort_movespeed_modlist()
. = 0
for(var/id in get_movespeed_modifiers())
var/list/data = movespeed_modification[id]
. += data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
cached_multiplicative_slowdown = .
/mob/proc/get_movespeed_modifiers()
return movespeed_modification
/mob/proc/movespeed_modifier_identical_check(list/mod1, list/mod2)
if(!islist(mod1) || !islist(mod2) || mod1.len < MOVESPEED_DATA_INDEX_MAX || mod2.len < MOVESPEED_DATA_INDEX_MAX)
return FALSE
for(var/i in 1 to MOVESPEED_DATA_INDEX_MAX)
if(mod1[i] != mod2[i])
return FALSE
return TRUE
/mob/proc/total_multiplicative_slowdown()
. = 0
for(var/id in get_movespeed_modifiers())
var/list/data = movespeed_modification[id]
. += data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN]
/proc/movespeed_data_null_check(list/data) //Determines if a data list is not meaningful and should be discarded.
. = TRUE
if(data[MOVESPEED_DATA_INDEX_MULTIPLICATIVE_SLOWDOWN])
. = FALSE
/mob/proc/sort_movespeed_modlist() //Verifies it too. Sorts highest priority (first applied) to lowest priority (last applied)
if(!movespeed_modification)
return
var/list/assembled = list()
for(var/our_id in movespeed_modification)
var/list/our_data = movespeed_modification[our_id]
if(!islist(our_data) || (our_data.len < MOVESPEED_DATA_INDEX_PRIORITY) || movespeed_data_null_check(our_data))
movespeed_modification -= our_id
continue
var/our_priority = our_data[MOVESPEED_DATA_INDEX_PRIORITY]
var/resolved = FALSE
for(var/their_id in assembled)
var/list/their_data = assembled[their_id]
if(their_data[MOVESPEED_DATA_INDEX_PRIORITY] < our_priority)
assembled.Insert(assembled.Find(their_id), our_id)
assembled[our_id] = our_data
resolved = TRUE
break
if(!resolved)
assembled[our_id] = our_data
movespeed_modification = assembled
UNSETEMPTY(movespeed_modification)

View File

@@ -244,7 +244,7 @@
to_chat(new_mob, "<span class='warning'>Your form morphs into that of a [randomize].</span>") to_chat(new_mob, "<span class='warning'>Your form morphs into that of a [randomize].</span>")
var/poly_msg = CONFIG_GET(keyed_string_list/policy)["polymorph"] var/poly_msg = CONFIG_GET(keyed_list/policy)["polymorph"]
if(poly_msg) if(poly_msg)
to_chat(new_mob, poly_msg) to_chat(new_mob, poly_msg)

View File

@@ -37,13 +37,16 @@ EMOJIS
RUN_DELAY 1 RUN_DELAY 1
WALK_DELAY 4 WALK_DELAY 4
## The variables below affect the movement of specific mob types. ## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE!
HUMAN_DELAY 0 ## Entries completely override all subtypes. Later entries have precedence over earlier entries.
ROBOT_DELAY 0 ## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and
MONKEY_DELAY 0 ## /mob/living/carbon/human on the last entry, the last entry will override the first.
ALIEN_DELAY 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0
SLIME_DELAY 0 ##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0
ANIMAL_DELAY 1 ##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0
##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0
##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0
MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1
## NAMES ### ## NAMES ###

View File

@@ -62,6 +62,7 @@
#include "code\__DEFINES\misc.dm" #include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\mobs.dm"
#include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\monkeys.dm"
#include "code\__DEFINES\movespeed_modification.dm"
#include "code\__DEFINES\networks.dm" #include "code\__DEFINES\networks.dm"
#include "code\__DEFINES\obj_flags.dm" #include "code\__DEFINES\obj_flags.dm"
#include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pinpointers.dm"
@@ -1791,6 +1792,7 @@
#include "code\modules\mob\mob_defines.dm" #include "code\modules\mob\mob_defines.dm"
#include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_helpers.dm"
#include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_movespeed.dm"
#include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\mob_transformation_simple.dm"
#include "code\modules\mob\say.dm" #include "code\modules\mob\say.dm"
#include "code\modules\mob\status_procs.dm" #include "code\modules\mob\status_procs.dm"
@@ -1819,6 +1821,7 @@
#include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_defines.dm"
#include "code\modules\mob\living\living_movement.dm"
#include "code\modules\mob\living\login.dm" #include "code\modules\mob\living\login.dm"
#include "code\modules\mob\living\logout.dm" #include "code\modules\mob\living\logout.dm"
#include "code\modules\mob\living\say.dm" #include "code\modules\mob\living\say.dm"