mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-28 02:52:01 +00:00
The system used to be of complexity O(n^2). Essentially two for loops running per every argument. Which ended up being surprisingly slow (there were instances where I saw the argument parser as using quite a lot of CPU time).
This replaces it with a more linear algorithm. It's somewhere near O(n) where n is the length of the unparsed query. Which is more stable and faaaster. This comes with two changes, however:
Parameters inside the query now have to be delimited from both sides with : (colons). The alternative to this would be to use something like $n or just assume that space marks the end of a marker. Only the former is workable, the latter would break a few queries already.
Arguments in the argument array no longer have to be prefixed by : (colons). So, while in the query you would write :thing:, you'd initialize the array of args as: list("thing" = somevar). It could be made to work without it, but eh, I think this is fine.
Argument validation is slightly weaker. What I mean by this is that with the old system, unused keys would result in an error. This is no longer a thing. Missing keys will still result in an error, however.
One more improvement: double delimiting removes an edge case where if key A partially covers key B, depending on the order, key A would mangle key B.
Updated and tested all queries that I could find. So this should be good.
87 lines
4.2 KiB
Plaintext
87 lines
4.2 KiB
Plaintext
/datum/category_item/player_setup_item/general/equipment
|
|
name = "Equipment"
|
|
sort_order = 4
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S)
|
|
S["underwear"] >> pref.underwear
|
|
S["undershirt"] >> pref.undershirt
|
|
S["socks"] >> pref.socks
|
|
S["backbag"] >> pref.backbag
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
|
|
S["underwear"] << pref.underwear
|
|
S["undershirt"] << pref.undershirt
|
|
S["socks"] << pref.socks
|
|
S["backbag"] << pref.backbag
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/gather_load_query()
|
|
return list("ss13_characters" = list("vars" = list("underwear", "undershirt", "socks", "backbag"), "args" = list("id")))
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/gather_load_parameters()
|
|
return list("id" = pref.current_character)
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/gather_save_query()
|
|
return list("ss13_characters" = list("underwear", "undershirt", "socks", "backbag", "id" = 1, "ckey" = 1))
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/gather_save_parameters()
|
|
return list("underwear" = pref.underwear, "undershirt" = pref.undershirt, "socks" = pref.socks, "backbag" = pref.backbag, "id" = pref.current_character, "ckey" = pref.client.ckey)
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/sanitize_character(var/sql_load = 0)
|
|
if (sql_load)
|
|
pref.backbag = text2num(pref.backbag)
|
|
|
|
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
|
|
|
|
var/undies = get_undies()
|
|
var/gender_socks = get_gender_socks()
|
|
if(!get_key_by_value(undies, pref.underwear))
|
|
pref.underwear = undies[undies[1]]
|
|
if(!get_key_by_value(undershirt_t, pref.undershirt))
|
|
pref.undershirt = undershirt_t[undershirt_t[1]]
|
|
if(!get_key_by_value(gender_socks, pref.socks))
|
|
pref.socks = gender_socks[gender_socks[1]]
|
|
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/content()
|
|
. += "<b>Equipment:</b><br>"
|
|
. += "Underwear: <a href='?src=\ref[src];change_underwear=1'><b>[get_key_by_value(get_undies(),pref.underwear)]</b></a><br>"
|
|
. += "Undershirt: <a href='?src=\ref[src];change_undershirt=1'><b>[get_key_by_value(undershirt_t,pref.undershirt)]</b></a><br>"
|
|
. += "Socks: <a href='?src=\ref[src];change_socks=1'><b>[get_key_by_value(get_gender_socks(),pref.socks)]</b></a><br>"
|
|
. += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>"
|
|
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/proc/get_undies()
|
|
return pref.gender == MALE ? underwear_m : underwear_f
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/proc/get_gender_socks()
|
|
return pref.gender == MALE ? socks_m : socks_f
|
|
|
|
/datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user)
|
|
if(href_list["change_underwear"])
|
|
var/underwear_options = get_undies()
|
|
var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference", get_key_by_value(get_undies(),pref.underwear)) as null|anything in underwear_options
|
|
if(!isnull(new_underwear) && CanUseTopic(user))
|
|
pref.underwear = underwear_options[new_underwear]
|
|
return TOPIC_REFRESH
|
|
|
|
else if(href_list["change_undershirt"])
|
|
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference", get_key_by_value(undershirt_t,pref.undershirt)) as null|anything in undershirt_t
|
|
if(!isnull(new_undershirt) && CanUseTopic(user))
|
|
pref.undershirt = undershirt_t[new_undershirt]
|
|
return TOPIC_REFRESH
|
|
|
|
else if(href_list["change_socks"])
|
|
var/socks_options = get_gender_socks()
|
|
var/new_socks = input(user, "Choose your character's socks:", "Character Preference", get_key_by_value(get_gender_socks(),pref.socks)) as null|anything in socks_options
|
|
if(!isnull(new_socks) && CanUseTopic(user))
|
|
pref.socks = socks_options[new_socks]
|
|
return TOPIC_REFRESH
|
|
|
|
else if(href_list["change_backpack"])
|
|
var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference", backbaglist[pref.backbag]) as null|anything in backbaglist
|
|
if(!isnull(new_backbag) && CanUseTopic(user))
|
|
pref.backbag = backbaglist.Find(new_backbag)
|
|
return TOPIC_REFRESH
|
|
|
|
return ..()
|