mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-11 07:04:01 +01:00
Convert species, organ_data, and rlimb_data to TG (#19277)
* First test batch bulk change * remove desync'd old file * Small change
This commit is contained in:
@@ -31,11 +31,12 @@
|
||||
var/char_real_name = pref.read_preference(/datum/preference/name/real_name)
|
||||
var/char_bio_gender = pref.read_preference(/datum/preference/choiced/gender/biological)
|
||||
var/char_id_gender = pref.read_preference(/datum/preference/choiced/gender/identifying)
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
// Re-sanitize name on join.
|
||||
// Fixes being able to swap from FBP to organic before round join to be organic with numbers in name.
|
||||
char_real_name = sanitize_name(char_real_name, pref.species, is_FBP())
|
||||
char_real_name = sanitize_name(char_real_name, pref_species, is_FBP())
|
||||
if(!char_real_name)
|
||||
char_real_name = random_name(char_id_gender, pref.species)
|
||||
char_real_name = random_name(char_id_gender, pref_species)
|
||||
if(CONFIG_GET(flag/humans_need_surnames))
|
||||
var/firstspace = findtext(char_real_name, " ")
|
||||
var/name_length = length(char_real_name)
|
||||
@@ -91,10 +92,12 @@
|
||||
var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(pref.client_ckey)
|
||||
if(mannequin)
|
||||
species = mannequin.species
|
||||
else if(pref.species)
|
||||
species = GLOB.all_species[pref.species]
|
||||
else
|
||||
species = GLOB.all_species[SPECIES_HUMAN]
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
if(pref_species)
|
||||
species = GLOB.all_species[pref_species]
|
||||
else
|
||||
species = GLOB.all_species[SPECIES_HUMAN]
|
||||
|
||||
var/list/species_stats = list(
|
||||
"total_health" = species.total_health,
|
||||
@@ -193,9 +196,10 @@
|
||||
switch(action)
|
||||
if("rename")
|
||||
var/current_name = pref.read_preference(/datum/preference/name/real_name)
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
var/raw_name = tgui_input_text(user, "Choose your character's name:", "Character Name", current_name, encode = FALSE)
|
||||
if(!isnull(raw_name))
|
||||
var/new_name = sanitize_name(raw_name, pref.species, is_FBP())
|
||||
var/new_name = sanitize_name(raw_name, pref_species, is_FBP())
|
||||
if(new_name)
|
||||
pref.update_preference_by_type(/datum/preference/name/real_name, new_name)
|
||||
return TOPIC_REFRESH
|
||||
@@ -204,7 +208,7 @@
|
||||
return TOPIC_NOACTION
|
||||
|
||||
if("random_name")
|
||||
pref.update_preference_by_type(/datum/preference/name/real_name, random_name(pref.read_preference(/datum/preference/choiced/gender/identifying), pref.species))
|
||||
pref.update_preference_by_type(/datum/preference/name/real_name, random_name(pref.read_preference(/datum/preference/choiced/gender/identifying), pref.read_preference(/datum/preference/choiced/species)))
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if("always_random_name")
|
||||
@@ -213,9 +217,10 @@
|
||||
|
||||
if("nickname")
|
||||
var/current_nickname = pref.read_preference(/datum/preference/name/nickname)
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
var/raw_nickname = tgui_input_text(user, "Choose your character's nickname:", "Character Nickname", current_nickname, encode = FALSE)
|
||||
if(!isnull(raw_nickname))
|
||||
var/new_nickname = sanitize_name(raw_nickname, pref.species, is_FBP())
|
||||
var/new_nickname = sanitize_name(raw_nickname, pref_species, is_FBP())
|
||||
if(new_nickname)
|
||||
pref.update_preference_by_type(/datum/preference/name/nickname, new_nickname)
|
||||
return TOPIC_REFRESH
|
||||
@@ -376,12 +381,14 @@
|
||||
|
||||
/datum/category_item/player_setup_item/general/basic/proc/get_genders()
|
||||
var/datum/species/S
|
||||
if(pref.species)
|
||||
S = GLOB.all_species[pref.species]
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
if(pref_species)
|
||||
S = GLOB.all_species[pref_species]
|
||||
else
|
||||
S = GLOB.all_species[SPECIES_HUMAN]
|
||||
var/list/possible_genders = S.genders
|
||||
if(!pref.organ_data || pref.organ_data[BP_TORSO] != "cyborg")
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
if(!organ_data || organ_data[BP_TORSO] != "cyborg")
|
||||
return possible_genders
|
||||
possible_genders = possible_genders.Copy()
|
||||
possible_genders |= NEUTER
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
pref.alternate_languages = check_list_copy(save_data["language"])
|
||||
pref.extra_languages = save_data["extra_languages"]
|
||||
pref.language_prefixes = save_data["language_prefixes"]
|
||||
pref.species = save_data["species"]
|
||||
pref.preferred_language = save_data["preflang"]
|
||||
pref.language_custom_keys = check_list_copy(save_data["language_custom_keys"])
|
||||
pref.runechat_color = save_data["runechat_color"]
|
||||
@@ -32,10 +31,11 @@
|
||||
if(!islist(pref.alternate_languages))
|
||||
testing("LANGSANI: Sanitizing languages on [pref.client]'s character [char_name] because their character has no languages list")
|
||||
pref.alternate_languages = list()
|
||||
if(pref.species)
|
||||
var/datum/species/S = GLOB.all_species[pref.species]
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
if(pref_species)
|
||||
var/datum/species/S = GLOB.all_species[pref_species]
|
||||
if(!istype(S))
|
||||
testing("LANGSANI: Failed sani on [pref.client]'s character [char_name] because their species ([pref.species]) isn't in the global list")
|
||||
testing("LANGSANI: Failed sani on [pref.client]'s character [char_name] because their species ([pref_species]) isn't in the global list")
|
||||
return
|
||||
|
||||
if(pref.alternate_languages.len > (S.num_alternate_languages + pref.extra_languages))
|
||||
@@ -62,7 +62,7 @@
|
||||
pref.language_prefixes -= prefix
|
||||
if(isnull(pref.language_custom_keys))
|
||||
pref.language_custom_keys = list()
|
||||
var/datum/species/S = GLOB.all_species[pref.species]
|
||||
var/datum/species/S = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
for(var/key in pref.language_custom_keys)
|
||||
if(!pref.language_custom_keys[key])
|
||||
pref.language_custom_keys.Remove(key)
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
var/list/languages_list = list()
|
||||
|
||||
var/datum/species/S = GLOB.all_species[pref.species]
|
||||
var/datum/species/S = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
if(S.language)
|
||||
UNTYPED_LIST_ADD(languages_list, list(
|
||||
"name" = S.language,
|
||||
@@ -108,7 +108,7 @@
|
||||
return
|
||||
|
||||
var/mob/user = ui.user
|
||||
var/datum/species/S = GLOB.all_species[pref.species]
|
||||
var/datum/species/S = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
|
||||
switch(action)
|
||||
if("remove_language")
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
|
||||
/datum/preferences/proc/get_available_styles(var/style_list)
|
||||
. = list("Normal" = null)
|
||||
var/pref_species = read_preference(/datum/preference/choiced/species)
|
||||
for(var/path in style_list)
|
||||
var/datum/sprite_accessory/instance = style_list[path]
|
||||
if(!istype(instance))
|
||||
@@ -58,7 +59,7 @@
|
||||
continue
|
||||
if(instance.ckeys_allowed && (!client || !(client.ckey in instance.ckeys_allowed)))
|
||||
continue
|
||||
if(instance.species_allowed && (!species || !(species in instance.species_allowed)) && (!client || !check_rights_for(client, R_ADMIN | R_EVENT | R_FUN)) && (!custom_base || !(custom_base in instance.species_allowed)))
|
||||
if(instance.species_allowed && (!pref_species || !(pref_species in instance.species_allowed)) && (!client || !check_rights_for(client, R_ADMIN | R_EVENT | R_FUN)) && (!custom_base || !(custom_base in instance.species_allowed)))
|
||||
continue
|
||||
if(!instance.can_be_selected && (!client || !check_rights_for(client, R_HOLDER)))
|
||||
continue
|
||||
@@ -79,14 +80,11 @@
|
||||
sort_order = 3
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/load_character(list/save_data)
|
||||
pref.species = save_data["species"]
|
||||
pref.s_tone = save_data["skin_tone"]
|
||||
pref.h_style = save_data["hair_style_name"]
|
||||
pref.f_style = save_data["facial_style_name"]
|
||||
pref.grad_style = save_data["grad_style_name"]
|
||||
pref.b_type = save_data["b_type"]
|
||||
pref.organ_data = check_list_copy(save_data["organ_data"])
|
||||
pref.rlimb_data = check_list_copy(save_data["rlimb_data"])
|
||||
pref.body_markings = check_list_copy(save_data["body_markings"])
|
||||
for(var/i in pref.body_markings)
|
||||
pref.body_markings[i] = check_list_copy(pref.body_markings[i])
|
||||
@@ -103,14 +101,11 @@
|
||||
pref.digitigrade = save_data["digitigrade"]
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/save_character(list/save_data)
|
||||
save_data["species"] = pref.species
|
||||
save_data["skin_tone"] = pref.s_tone
|
||||
save_data["hair_style_name"] = pref.h_style
|
||||
save_data["facial_style_name"] = pref.f_style
|
||||
save_data["grad_style_name"] = pref.grad_style
|
||||
save_data["b_type"] = pref.b_type
|
||||
save_data["organ_data"] = check_list_copy(pref.organ_data)
|
||||
save_data["rlimb_data"] = check_list_copy(pref.rlimb_data)
|
||||
var/list/body_markings = check_list_copy(pref.body_markings)
|
||||
for(var/i in pref.body_markings)
|
||||
body_markings[i] = check_list_copy(body_markings[i])
|
||||
@@ -128,28 +123,18 @@
|
||||
save_data["digitigrade"] = pref.digitigrade
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/sanitize_character()
|
||||
if(!pref.species || !(pref.species in GLOB.playable_species))
|
||||
pref.species = SPECIES_HUMAN
|
||||
pref.s_tone = sanitize_integer(pref.s_tone, -185, 34, initial(pref.s_tone))
|
||||
pref.h_style = sanitize_inlist(pref.h_style, GLOB.hair_styles_list, initial(pref.h_style))
|
||||
pref.f_style = sanitize_inlist(pref.f_style, GLOB.facial_hair_styles_list, initial(pref.f_style))
|
||||
pref.grad_style = sanitize_inlist(pref.grad_style, GLOB.hair_gradients, initial(pref.grad_style))
|
||||
pref.b_type = sanitize_text(pref.b_type, initial(pref.b_type))
|
||||
|
||||
if(!pref.organ_data) pref.organ_data = list()
|
||||
if(!pref.rlimb_data || !islist(pref.rlimb_data)) pref.rlimb_data = list()
|
||||
if(!pref.body_markings) pref.body_markings = list()
|
||||
else pref.body_markings &= GLOB.body_marking_styles_list
|
||||
for (var/M in pref.body_markings)
|
||||
if (!islist(pref.body_markings[M]))
|
||||
var/col = istext(pref.body_markings[M]) ? pref.body_markings[M] : "#000000"
|
||||
pref.body_markings[M] = pref.mass_edit_marking_list(M,color=col)
|
||||
for(var/limb in pref.rlimb_data)
|
||||
var/key = pref.rlimb_data[limb]
|
||||
if(!istext(key))
|
||||
pref.rlimb_data -= limb
|
||||
if(!LAZYACCESS(GLOB.all_robolimbs, key))
|
||||
pref.rlimb_data -= limb
|
||||
if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options))
|
||||
pref.bgstate = "000"
|
||||
|
||||
@@ -198,7 +183,9 @@
|
||||
|
||||
character.set_gender(pref.read_preference(/datum/preference/choiced/gender/biological))
|
||||
|
||||
character.synthetic = pref.species == "Protean" ? GLOB.all_robolimbs["protean"] : null //Clear the existing var. (unless protean, then switch it to the normal protean limb)
|
||||
character.synthetic = pref.read_preference(/datum/preference/choiced/species) == "Protean" ? GLOB.all_robolimbs["protean"] : null //Clear the existing var. (unless protean, then switch it to the normal protean limb)
|
||||
var/list/pref_organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
var/list/pref_rlimb_data = pref.read_preference(/datum/preference/rlimb_data)
|
||||
var/list/organs_to_edit = list()
|
||||
for (var/name in list(BP_TORSO, BP_HEAD, BP_GROIN, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
|
||||
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||
@@ -209,19 +196,19 @@
|
||||
else
|
||||
organs_to_edit.Insert(x+(O.robotic == ORGAN_NANOFORM ? 1 : 0), name)
|
||||
for(var/name in organs_to_edit)
|
||||
var/status = pref.organ_data[name]
|
||||
var/status = pref_organ_data[name]
|
||||
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||
if(O)
|
||||
if(status == "amputated")
|
||||
O.remove_rejuv()
|
||||
else if(status == "cyborg")
|
||||
if(pref.rlimb_data[name])
|
||||
O.robotize(pref.rlimb_data[name])
|
||||
if(pref_rlimb_data[name])
|
||||
O.robotize(pref_rlimb_data[name])
|
||||
else
|
||||
O.robotize()
|
||||
|
||||
for(var/name in list(O_HEART,O_EYES,O_VOICE,O_LUNGS,O_LIVER,O_KIDNEYS,O_SPLEEN,O_STOMACH,O_INTESTINE,O_BRAIN))
|
||||
var/status = pref.organ_data[name]
|
||||
var/status = pref_organ_data[name]
|
||||
if(!status)
|
||||
continue
|
||||
var/obj/item/organ/I = character.internal_organs_by_name[name]
|
||||
@@ -256,31 +243,26 @@
|
||||
return mob_species && (mob_species.appearance_flags & flag)
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
|
||||
for(var/organ in pref.organ_data)
|
||||
pref.organ_data[organ] = null
|
||||
while(null in pref.organ_data)
|
||||
pref.organ_data -= null
|
||||
|
||||
for(var/organ in pref.rlimb_data)
|
||||
pref.rlimb_data[organ] = null
|
||||
while(null in pref.rlimb_data)
|
||||
pref.rlimb_data -= null
|
||||
// Reset organ and robolimb data
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/organ_data], list())
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/rlimb_data], list())
|
||||
|
||||
// Sanitize the name so that there aren't any numbers sticking around.
|
||||
// Is this still necessary with TG conversation?
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
var/current_name = pref.read_preference(/datum/preference/name/real_name)
|
||||
current_name = sanitize_name(current_name, pref.species)
|
||||
current_name = sanitize_name(current_name, pref_species)
|
||||
if(!current_name)
|
||||
current_name = random_name(pref.read_preference(/datum/preference/choiced/gender/identifying), pref.species)
|
||||
current_name = random_name(pref.read_preference(/datum/preference/choiced/gender/identifying), pref_species)
|
||||
pref.update_preference_by_type(/datum/preference/name/real_name, current_name)
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
|
||||
|
||||
data["species"] = pref.species
|
||||
data["organ_data"] = pref.organ_data
|
||||
data["rlimb_data"] = pref.rlimb_data
|
||||
data["species"] = pref.read_preference(/datum/preference/choiced/species)
|
||||
data["organ_data"] = pref.read_preference(/datum/preference/organ_data)
|
||||
data["rlimb_data"] = pref.read_preference(/datum/preference/rlimb_data)
|
||||
|
||||
data["s_tone"] = -pref.s_tone + 35
|
||||
data["eyes_color"] = pref.read_preference(/datum/preference/color/human/eyes_color)
|
||||
@@ -495,7 +477,7 @@
|
||||
if(.)
|
||||
return
|
||||
|
||||
var/datum/species/mob_species = GLOB.all_species[pref.species]
|
||||
var/datum/species/mob_species = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
var/mob/user = ui.user
|
||||
|
||||
switch(action)
|
||||
@@ -753,9 +735,9 @@
|
||||
if(((!(setting_species.spawn_flags & SPECIES_CAN_JOIN)) || (!is_alien_whitelisted(user.client,setting_species))) && !check_rights(R_ADMIN|R_EVENT, 0) && !(setting_species.spawn_flags & SPECIES_WHITELIST_SELECTABLE))
|
||||
return TOPIC_NOACTION
|
||||
|
||||
var/prev_species = pref.species
|
||||
pref.species = params["species"]
|
||||
if(prev_species != pref.species)
|
||||
var/prev_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
pref.update_preference_by_type(/datum/preference/choiced/species, params["species"])
|
||||
if(prev_species != pref.read_preference(/datum/preference/choiced/species))
|
||||
if(!(pref.read_preference(/datum/preference/choiced/gender/biological) in mob_species.genders))
|
||||
pref.set_biological_gender(mob_species.genders[1])
|
||||
pref.custom_species = null
|
||||
@@ -879,27 +861,35 @@
|
||||
|
||||
switch(new_state)
|
||||
if("Normal")
|
||||
pref.organ_data[limb] = null
|
||||
pref.rlimb_data[limb] = null
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
var/list/rlimb_data = pref.read_preference(/datum/preference/rlimb_data)
|
||||
organ_data[limb] = null
|
||||
rlimb_data[limb] = null
|
||||
if(limb == BP_TORSO) // depends on standardization
|
||||
for(var/other_limb in BP_ALL - BP_TORSO)
|
||||
pref.organ_data[other_limb] = null
|
||||
pref.rlimb_data[other_limb] = null
|
||||
organ_data[other_limb] = null
|
||||
rlimb_data[other_limb] = null
|
||||
for(var/internal in O_STANDARD)
|
||||
pref.organ_data[internal] = null
|
||||
pref.rlimb_data[internal] = null
|
||||
organ_data[internal] = null
|
||||
rlimb_data[internal] = null
|
||||
if(third_limb)
|
||||
pref.organ_data[third_limb] = null
|
||||
pref.rlimb_data[third_limb] = null
|
||||
organ_data[third_limb] = null
|
||||
rlimb_data[third_limb] = null
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/organ_data], organ_data)
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/rlimb_data], rlimb_data)
|
||||
|
||||
if("Amputated")
|
||||
if(limb == BP_TORSO) // depends on standardization
|
||||
return
|
||||
pref.organ_data[limb] = "amputated"
|
||||
pref.rlimb_data[limb] = null
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
var/list/rlimb_data = pref.read_preference(/datum/preference/rlimb_data)
|
||||
organ_data[limb] = "amputated"
|
||||
rlimb_data[limb] = null
|
||||
if(second_limb)
|
||||
pref.organ_data[second_limb] = "amputated"
|
||||
pref.rlimb_data[second_limb] = null
|
||||
organ_data[second_limb] = "amputated"
|
||||
rlimb_data[second_limb] = null
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/organ_data], organ_data)
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/rlimb_data], rlimb_data)
|
||||
|
||||
if("Prosthesis")
|
||||
var/list/usable_manufacturers = list()
|
||||
@@ -907,7 +897,7 @@
|
||||
var/datum/robolimb/M = GLOB.chargen_robolimbs[company]
|
||||
if(!(limb in M.parts))
|
||||
continue
|
||||
if(pref.species in M.species_cannot_use)
|
||||
if(pref.read_preference(/datum/preference/choiced/species) in M.species_cannot_use)
|
||||
continue
|
||||
if(M.whitelisted_to && !(user.ckey in M.whitelisted_to))
|
||||
continue
|
||||
@@ -918,25 +908,29 @@
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
pref.rlimb_data[limb] = choice
|
||||
pref.organ_data[limb] = "cyborg"
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
var/list/rlimb_data = pref.read_preference(/datum/preference/rlimb_data)
|
||||
rlimb_data[limb] = choice
|
||||
organ_data[limb] = "cyborg"
|
||||
|
||||
if(second_limb)
|
||||
pref.rlimb_data[second_limb] = choice
|
||||
pref.organ_data[second_limb] = "cyborg"
|
||||
if(third_limb && pref.organ_data[third_limb] == "amputated")
|
||||
pref.organ_data[third_limb] = null
|
||||
rlimb_data[second_limb] = choice
|
||||
organ_data[second_limb] = "cyborg"
|
||||
if(third_limb && organ_data[third_limb] == "amputated")
|
||||
organ_data[third_limb] = null
|
||||
|
||||
if(limb == BP_TORSO)
|
||||
for(var/other_limb in BP_ALL - BP_TORSO)
|
||||
if(pref.organ_data[other_limb])
|
||||
if(organ_data[other_limb])
|
||||
continue
|
||||
pref.organ_data[other_limb] = "cyborg"
|
||||
pref.rlimb_data[other_limb] = choice
|
||||
if(!pref.organ_data[O_BRAIN])
|
||||
pref.organ_data[O_BRAIN] = FBP_ASSISTED
|
||||
organ_data[other_limb] = "cyborg"
|
||||
rlimb_data[other_limb] = choice
|
||||
if(!organ_data[O_BRAIN])
|
||||
organ_data[O_BRAIN] = FBP_ASSISTED
|
||||
for(var/internal_organ in list(O_HEART,O_EYES))
|
||||
pref.organ_data[internal_organ] = FBP_MECHANICAL
|
||||
organ_data[internal_organ] = FBP_MECHANICAL
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/organ_data], organ_data)
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/rlimb_data], rlimb_data)
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
@@ -945,7 +939,8 @@
|
||||
if(!(zone in O_STANDARD))
|
||||
return
|
||||
|
||||
if(zone == O_BRAIN && pref.organ_data[BP_HEAD] != "cyborg")
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
if(zone == O_BRAIN && organ_data[BP_HEAD] != "cyborg")
|
||||
to_chat(user, span_warning("You may only select a cybernetic or synthetic brain if you have a full prosthetic body."))
|
||||
return
|
||||
|
||||
@@ -971,17 +966,18 @@
|
||||
|
||||
switch(new_state)
|
||||
if("Normal")
|
||||
pref.organ_data[zone] = null
|
||||
organ_data[zone] = null
|
||||
if("Assisted")
|
||||
pref.organ_data[zone] = FBP_ASSISTED
|
||||
organ_data[zone] = FBP_ASSISTED
|
||||
if("Cybernetic")
|
||||
pref.organ_data[zone] = FBP_ASSISTED
|
||||
organ_data[zone] = FBP_ASSISTED
|
||||
if("Mechanical")
|
||||
pref.organ_data[zone] = FBP_MECHANICAL
|
||||
organ_data[zone] = FBP_MECHANICAL
|
||||
if("Drone")
|
||||
pref.organ_data[zone] = FBP_DIGITAL
|
||||
organ_data[zone] = FBP_DIGITAL
|
||||
if("Positronic")
|
||||
pref.organ_data[zone] = FBP_MECHANICAL
|
||||
organ_data[zone] = FBP_MECHANICAL
|
||||
pref.write_preference(GLOB.preference_entries[/datum/preference/organ_data], organ_data)
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
/datum/preferences/proc/get_custom_bases_for_species(var/new_species)
|
||||
if (!new_species)
|
||||
new_species = species
|
||||
new_species = read_preference(/datum/preference/choiced/species)
|
||||
var/list/choices
|
||||
var/datum/species/spec = GLOB.all_species[new_species]
|
||||
if (spec.selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER)
|
||||
@@ -108,14 +108,15 @@
|
||||
pref.blood_reagents = sanitize_text(pref.blood_reagents, initial(pref.blood_reagents))
|
||||
|
||||
if(!pref.traits_cheating)
|
||||
var/datum/species/S = GLOB.all_species[pref.species]
|
||||
var/datum/species/S = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
if(S)
|
||||
pref.starting_trait_points = S.trait_points
|
||||
else
|
||||
pref.starting_trait_points = 0
|
||||
pref.max_traits = MAX_SPECIES_TRAITS
|
||||
|
||||
if(pref.organ_data[O_BRAIN]) //Checking if we have a synth on our hands, boys.
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
if(organ_data && organ_data[O_BRAIN]) //Checking if we have a synth on our hands, boys.
|
||||
pref.dirty_synth = 1
|
||||
pref.gross_meatbag = 0
|
||||
else
|
||||
@@ -123,11 +124,12 @@
|
||||
pref.dirty_synth = 0
|
||||
|
||||
// Clean up positive traits
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species)
|
||||
for(var/datum/trait/path as anything in pref.pos_traits)
|
||||
if(!(path in GLOB.positive_traits))
|
||||
pref.pos_traits -= path
|
||||
continue
|
||||
if(!(pref.species == SPECIES_CUSTOM) && !(path in GLOB.everyone_traits_positive))
|
||||
if(!(pref_species == SPECIES_CUSTOM) && !(path in GLOB.everyone_traits_positive))
|
||||
pref.pos_traits -= path
|
||||
continue
|
||||
var/take_flags = initial(path.can_take)
|
||||
@@ -139,7 +141,7 @@
|
||||
log_world("removing [path] for not being in neutral_traits")
|
||||
pref.neu_traits -= path
|
||||
continue
|
||||
if(!(pref.species == SPECIES_CUSTOM) && !(path in GLOB.everyone_traits_neutral))
|
||||
if(!(pref_species == SPECIES_CUSTOM) && !(path in GLOB.everyone_traits_neutral))
|
||||
log_world("removing [path] for not being a custom species")
|
||||
pref.neu_traits -= path
|
||||
continue
|
||||
@@ -152,14 +154,14 @@
|
||||
if(!(path in GLOB.negative_traits))
|
||||
pref.neg_traits -= path
|
||||
continue
|
||||
if(!(pref.species == SPECIES_CUSTOM) && !(path in GLOB.everyone_traits_negative))
|
||||
if(!(pref_species == SPECIES_CUSTOM) && !(path in GLOB.everyone_traits_negative))
|
||||
pref.neg_traits -= path
|
||||
continue
|
||||
var/take_flags = initial(path.can_take)
|
||||
if((pref.dirty_synth && !(take_flags & SYNTHETICS)) || (pref.gross_meatbag && !(take_flags & ORGANICS)))
|
||||
pref.neg_traits -= path
|
||||
|
||||
var/datum/species/selected_species = GLOB.all_species[pref.species]
|
||||
var/datum/species/selected_species = GLOB.all_species[pref_species]
|
||||
if(selected_species.selects_bodytype)
|
||||
if (!(pref.custom_base in pref.get_custom_bases_for_species()))
|
||||
pref.custom_base = selected_species.default_custom_base
|
||||
@@ -193,7 +195,7 @@
|
||||
|
||||
new_S.species_sounds = species_sounds_to_copy // Now we send our sounds over to the mob
|
||||
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
if(pref.read_preference(/datum/preference/choiced/species) == SPECIES_CUSTOM)
|
||||
//Statistics for this would be nice
|
||||
var/english_traits = english_list(new_S.traits, and_text = ";", comma_text = ";")
|
||||
log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet
|
||||
@@ -201,7 +203,7 @@
|
||||
/datum/category_item/player_setup_item/general/traits/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
|
||||
var/list/data = ..()
|
||||
|
||||
var/datum/species/selected_species = GLOB.all_species[pref.species]
|
||||
var/datum/species/selected_species = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
data["selects_bodytype"] = selected_species.selects_bodytype
|
||||
data["custom_base"] = pref.custom_base
|
||||
data["blood_color"] = pref.blood_color
|
||||
@@ -252,7 +254,7 @@
|
||||
pref.blood_color = sanitize_hexcolor(color_choice, default="#A10808")
|
||||
return TOPIC_REFRESH
|
||||
if("blood_reset")
|
||||
var/datum/species/spec = GLOB.all_species[pref.species]
|
||||
var/datum/species/spec = GLOB.all_species[pref.read_preference(/datum/preference/choiced/species)]
|
||||
var/new_blood = spec.blood_color ? spec.blood_color : "#A10808"
|
||||
var/choice = tgui_alert(user, "Reset blood color to species default ([new_blood])?","Reset Blood Color",list("Reset","Cancel"))
|
||||
if(choice == "Reset")
|
||||
@@ -295,23 +297,24 @@
|
||||
var/mode = text2num(params["add_trait"])
|
||||
var/list/picklist
|
||||
var/list/mylist
|
||||
var/pref_species_for_traits = pref.read_preference(/datum/preference/choiced/species)
|
||||
switch(mode)
|
||||
if(POSITIVE_MODE)
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
if(pref_species_for_traits == SPECIES_CUSTOM)
|
||||
picklist = GLOB.positive_traits.Copy() - pref.pos_traits
|
||||
mylist = pref.pos_traits
|
||||
else
|
||||
picklist = GLOB.everyone_traits_positive.Copy() - pref.pos_traits
|
||||
mylist = pref.pos_traits
|
||||
if(NEUTRAL_MODE)
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
if(pref_species_for_traits == SPECIES_CUSTOM)
|
||||
picklist = GLOB.neutral_traits.Copy() - pref.neu_traits
|
||||
mylist = pref.neu_traits
|
||||
else
|
||||
picklist = GLOB.everyone_traits_neutral.Copy() - pref.neu_traits
|
||||
mylist = pref.neu_traits
|
||||
if(NEGATIVE_MODE)
|
||||
if(pref.species == SPECIES_CUSTOM)
|
||||
if(pref_species_for_traits == SPECIES_CUSTOM)
|
||||
picklist = GLOB.negative_traits.Copy() - pref.neg_traits
|
||||
mylist = pref.neg_traits
|
||||
else
|
||||
@@ -375,11 +378,11 @@
|
||||
tgui_alert_async(user, "The trait you've selected can only be taken by synthetic characters!", "Error")
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if(pref.species in instance.banned_species)
|
||||
if(pref_species_for_traits in instance.banned_species)
|
||||
tgui_alert_async(user, "The trait you've selected cannot be taken by the species you've chosen!", "Error")
|
||||
return TOPIC_REFRESH
|
||||
|
||||
if( LAZYLEN(instance.allowed_species) && !(pref.species in instance.allowed_species))
|
||||
if( LAZYLEN(instance.allowed_species) && !(pref_species_for_traits in instance.allowed_species))
|
||||
tgui_alert_async(user, "The trait you've selected cannot be taken by the species you've chosen!", "Error")
|
||||
return TOPIC_REFRESH
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
pref.nif_path = null //Kill!
|
||||
WARNING("Loaded a NIF but it was an invalid path, [char_name]")
|
||||
|
||||
if (ispath(pref.nif_path, /obj/item/nif/protean) && pref.species != SPECIES_PROTEAN) //no free nifs
|
||||
if (ispath(pref.nif_path, /obj/item/nif/protean) && pref.read_preference(/datum/preference/choiced/species) != SPECIES_PROTEAN) //no free nifs
|
||||
pref.nif_path = null
|
||||
|
||||
if(ispath(pref.nif_path) && isnull(pref.nif_durability)) //How'd you lose this?
|
||||
|
||||
@@ -66,7 +66,7 @@ GLOBAL_LIST_EMPTY_TYPED(gear_datums, /datum/gear)
|
||||
|
||||
/datum/category_item/player_setup_item/loadout/loadout/proc/is_valid_gear(datum/gear/G, max_cost)
|
||||
if(G.whitelisted && CONFIG_GET(flag/loadout_whitelist) != LOADOUT_WHITELIST_OFF && pref.client)
|
||||
if(CONFIG_GET(flag/loadout_whitelist) == LOADOUT_WHITELIST_STRICT && (G.whitelisted != pref.species && G.whitelisted != pref.custom_base))
|
||||
if(CONFIG_GET(flag/loadout_whitelist) == LOADOUT_WHITELIST_STRICT && (G.whitelisted != pref.read_preference(/datum/preference/choiced/species) && G.whitelisted != pref.custom_base))
|
||||
return FALSE
|
||||
if(CONFIG_GET(flag/loadout_whitelist) == LOADOUT_WHITELIST_LAX && !is_alien_whitelisted(pref.client, GLOB.all_species[G.whitelisted]))
|
||||
return FALSE
|
||||
|
||||
@@ -98,14 +98,14 @@
|
||||
"denylist_whitelist" = !is_job_whitelisted(user, job.title),
|
||||
// tigercat2000 - these shouldn't exist >:(
|
||||
"denylist_character_age" = FALSE,
|
||||
"min_age" = job.get_min_age(pref.species, pref.organ_data[O_BRAIN]),
|
||||
"min_age" = job.get_min_age(pref.read_preference(/datum/preference/choiced/species), pref.read_preference(/datum/preference/organ_data)?[O_BRAIN]),
|
||||
"special_color" = "",
|
||||
"selected" = 0,
|
||||
"selected_title" = "",
|
||||
"alt_titles" = list(),
|
||||
)
|
||||
|
||||
if((job.minimum_character_age || job.min_age_by_species) && user.client && (user.read_preference(/datum/preference/numeric/human/age) < job.get_min_age(user.client.prefs.species, user.client.prefs.organ_data[O_BRAIN])))
|
||||
if((job.minimum_character_age || job.min_age_by_species) && user.client && (user.read_preference(/datum/preference/numeric/human/age) < job.get_min_age(user.client.prefs.read_preference(/datum/preference/choiced/species), user.client.prefs.read_preference(/datum/preference/organ_data)?[O_BRAIN])))
|
||||
job_data["denylist_character_age"] = TRUE
|
||||
|
||||
if((pref.job_civilian_low & ASSISTANT) && job.type != /datum/job/assistant)
|
||||
|
||||
@@ -233,7 +233,8 @@
|
||||
|
||||
// Checks in a really hacky way if a character's preferences say they are an FBP or not.
|
||||
/datum/category_item/player_setup_item/proc/is_FBP()
|
||||
if(pref.organ_data && pref.organ_data[BP_TORSO] != "cyborg")
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
if(organ_data && organ_data[BP_TORSO] != "cyborg")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
@@ -241,8 +242,9 @@
|
||||
/datum/category_item/player_setup_item/proc/get_FBP_type()
|
||||
if(!is_FBP())
|
||||
return 0 // Not a robot.
|
||||
if(O_BRAIN in pref.organ_data)
|
||||
switch(pref.organ_data[O_BRAIN])
|
||||
var/list/organ_data = pref.read_preference(/datum/preference/organ_data)
|
||||
if(organ_data && (O_BRAIN in organ_data))
|
||||
switch(organ_data[O_BRAIN])
|
||||
if(FBP_ASSISTED)
|
||||
return PREF_FBP_CYBORG
|
||||
if(FBP_MECHANICAL)
|
||||
@@ -252,7 +254,8 @@
|
||||
return 0 //Something went wrong!
|
||||
|
||||
/datum/category_item/player_setup_item/proc/get_min_age()
|
||||
var/datum/species/S = GLOB.all_species[pref.species ? pref.species : "Human"]
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species) || "Human"
|
||||
var/datum/species/S = GLOB.all_species[pref_species]
|
||||
if(!is_FBP())
|
||||
return S.min_age // If they're not a robot, we can just use the species var.
|
||||
var/FBP_type = get_FBP_type()
|
||||
@@ -266,7 +269,8 @@
|
||||
return S.min_age // welp
|
||||
|
||||
/datum/category_item/player_setup_item/proc/get_max_age()
|
||||
var/datum/species/S = GLOB.all_species[pref.species ? pref.species : "Human"]
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species) || "Human"
|
||||
var/datum/species/S = GLOB.all_species[pref_species]
|
||||
if(!is_FBP())
|
||||
return S.max_age // If they're not a robot, we can just use the species var.
|
||||
var/FBP_type = get_FBP_type()
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
//Minimum limit is 18
|
||||
/datum/category_item/player_setup_item/get_min_age()
|
||||
var/min_age = 18
|
||||
var/datum/species/S = GLOB.all_species[pref.species ? pref.species : "Human"]
|
||||
var/pref_species = pref.read_preference(/datum/preference/choiced/species) || "Human"
|
||||
var/datum/species/S = GLOB.all_species[pref_species]
|
||||
if(!is_FBP() && S.min_age > 18)
|
||||
min_age = S.min_age
|
||||
return min_age
|
||||
|
||||
@@ -30,7 +30,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/grad_style = "none" //Gradient style
|
||||
var/f_style = "Shaved" //Face hair type
|
||||
var/s_tone = -75 //Skin tone
|
||||
var/species = SPECIES_HUMAN //Species datum to use.
|
||||
var/species_preview //Used for the species selection window.
|
||||
var/list/alternate_languages = list() //Secondary language(s)
|
||||
var/list/language_prefixes = list() //Language prefix keys
|
||||
@@ -86,8 +85,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
// maps each organ to either null(intact), "cyborg" or "amputated"
|
||||
// will probably not be able to do this for head and torso ;)
|
||||
var/list/organ_data = list()
|
||||
var/list/rlimb_data = list()
|
||||
var/list/player_alt_titles = new() // the default name of a job like JOB_MEDICAL_DOCTOR
|
||||
|
||||
var/list/body_markings = list() // "name" = "#rgbcolor" //VOREStation Edit: "name" = list(BP_HEAD = list("on" = <enabled>, "color" = "#rgbcolor"), BP_TORSO = ...)
|
||||
@@ -158,7 +155,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
// Didn't load a character, so let's randomize
|
||||
set_biological_gender(pick(MALE, FEMALE))
|
||||
update_preference_by_type(/datum/preference/name/real_name, random_name(read_preference(/datum/preference/choiced/gender/identifying), species))
|
||||
update_preference_by_type(/datum/preference/name/real_name, random_name(read_preference(/datum/preference/choiced/gender/identifying), read_preference(/datum/preference/choiced/species)))
|
||||
b_type = RANDOM_BLOOD_TYPE
|
||||
|
||||
if(client)
|
||||
@@ -297,10 +294,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
player_setup.sanitize_setup()
|
||||
|
||||
// This needs to happen before anything else becuase it sets some variables.
|
||||
character.set_species(species)
|
||||
character.set_species(read_preference(/datum/preference/choiced/species))
|
||||
// Special Case: This references variables owned by two different datums, so do it here.
|
||||
if(read_preference(/datum/preference/toggle/human/name_is_always_random))
|
||||
update_preference_by_type(/datum/preference/name/real_name, random_name(read_preference(/datum/preference/choiced/gender/identifying), species))
|
||||
update_preference_by_type(/datum/preference/name/real_name, random_name(read_preference(/datum/preference/choiced/gender/identifying), read_preference(/datum/preference/choiced/species)))
|
||||
|
||||
// Ask the preferences datums to apply their own settings to the new mob
|
||||
player_setup.copy_to_mob(character)
|
||||
@@ -514,6 +511,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
// Destroy/cyborgize organs and limbs.
|
||||
if (convert_to_prosthetics) //should only really be run for proteans
|
||||
var/list/pref_organ_data = read_preference(/datum/preference/organ_data)
|
||||
var/list/pref_rlimb_data = read_preference(/datum/preference/rlimb_data)
|
||||
var/list/organs_to_edit = list()
|
||||
for (var/name in list(BP_TORSO, BP_HEAD, BP_GROIN, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
|
||||
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||
@@ -524,16 +523,16 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
else
|
||||
organs_to_edit.Insert(x+(O.robotic == ORGAN_NANOFORM ? 1 : 0), name)
|
||||
for(var/name in organs_to_edit)
|
||||
var/status = organ_data[name]
|
||||
var/status = pref_organ_data[name]
|
||||
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||
if(O)
|
||||
if(status == "amputated")
|
||||
continue
|
||||
else if(status == "cyborg")
|
||||
O.robotize(rlimb_data[name])
|
||||
O.robotize(pref_rlimb_data[name])
|
||||
else
|
||||
var/bodytype
|
||||
var/datum/species/selected_species = GLOB.all_species[species]
|
||||
var/datum/species/selected_species = GLOB.all_species[read_preference(/datum/preference/choiced/species)]
|
||||
if(selected_species.selects_bodytype && custom_base) //Everyone technically has custom_base set to HUMAN, but only some species actually select it.
|
||||
bodytype = custom_base
|
||||
else
|
||||
@@ -620,7 +619,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
character.species?.blood_color = blood_color
|
||||
|
||||
var/datum/species/selected_species = GLOB.all_species[species]
|
||||
var/datum/species/selected_species = GLOB.all_species[read_preference(/datum/preference/choiced/species)]
|
||||
var/bodytype_selected
|
||||
if(selected_species.selects_bodytype && custom_base)
|
||||
bodytype_selected = custom_base
|
||||
|
||||
@@ -11,15 +11,17 @@
|
||||
|
||||
/// FBP check
|
||||
/datum/preference/choiced/gender/proc/is_fbp(datum/preferences/preferences)
|
||||
if(!preferences?.organ_data)
|
||||
var/list/organ_data = preferences?.read_preference(/datum/preference/organ_data)
|
||||
if(!organ_data)
|
||||
return FALSE
|
||||
return preferences.organ_data[BP_TORSO] == "cyborg"
|
||||
return organ_data[BP_TORSO] == "cyborg"
|
||||
|
||||
/// Get the list of valid bio genders for the species
|
||||
/datum/preference/choiced/gender/proc/get_valid_biological_genders(datum/preferences/preferences)
|
||||
var/datum/species/S
|
||||
if(preferences?.species)
|
||||
S = GLOB.all_species[preferences.species]
|
||||
var/species_name = preferences?.read_preference(/datum/preference/choiced/species)
|
||||
if(species_name)
|
||||
S = GLOB.all_species[species_name]
|
||||
if(!S)
|
||||
S = GLOB.all_species[SPECIES_HUMAN]
|
||||
var/list/possible_genders = S.genders
|
||||
|
||||
@@ -11,9 +11,10 @@
|
||||
|
||||
/// Check if the character is a Full Body Prosthetic (allows numbers in name)
|
||||
/datum/preference/name/proc/is_fbp(datum/preferences/preferences)
|
||||
if(!preferences?.organ_data)
|
||||
var/list/organ_data = preferences?.read_preference(/datum/preference/organ_data)
|
||||
if(!organ_data)
|
||||
return FALSE
|
||||
return preferences.organ_data[BP_TORSO] == "cyborg"
|
||||
return organ_data[BP_TORSO] == "cyborg"
|
||||
|
||||
/datum/preference/name/is_valid(value)
|
||||
if(!istext(value))
|
||||
@@ -26,8 +27,8 @@
|
||||
if(!istext(input))
|
||||
return create_default_value()
|
||||
var/species = default_species
|
||||
if(preferences?.species)
|
||||
species = preferences.species
|
||||
if(preferences)
|
||||
species = preferences.read_preference(/datum/preference/choiced/species)
|
||||
var/allow_numbers = is_fbp(preferences)
|
||||
var/sanitized = sanitize_name(input, species, allow_numbers)
|
||||
if(!sanitized)
|
||||
@@ -63,7 +64,7 @@
|
||||
|
||||
/datum/preference/name/real_name/create_informed_default_value(datum/preferences/preferences)
|
||||
var/gender = preferences?.read_preference(/datum/preference/choiced/gender/identifying) || MALE
|
||||
var/species = preferences?.species || SPECIES_HUMAN
|
||||
var/species = preferences?.read_preference(/datum/preference/choiced/species) || SPECIES_HUMAN
|
||||
return random_name(gender, species)
|
||||
|
||||
/datum/preference/name/real_name/create_random_value(datum/preferences/preferences, datum/species/current_species)
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// Organ data preference for character creation
|
||||
// Stores an assoc list mapping organ tags to their prosthetic/modified status.
|
||||
// Values can be: null (normal), "cyborg", "amputated", FBP_ASSISTED, FBP_MECHANICAL, or FBP_DIGITAL.
|
||||
|
||||
/datum/preference/organ_data
|
||||
savefile_key = "organ_data"
|
||||
savefile_identifier = PREFERENCE_CHARACTER
|
||||
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
|
||||
can_randomize = FALSE
|
||||
|
||||
/datum/preference/organ_data/create_default_value()
|
||||
return list()
|
||||
|
||||
/datum/preference/organ_data/pref_deserialize(input, datum/preferences/preferences)
|
||||
if(!islist(input))
|
||||
return list()
|
||||
// Return the list directly (same reference) so in-place mutations update the cache.
|
||||
return input
|
||||
|
||||
/datum/preference/organ_data/pref_serialize(input)
|
||||
if(!islist(input))
|
||||
return list()
|
||||
return check_list_copy(input)
|
||||
|
||||
/datum/preference/organ_data/is_valid(value)
|
||||
return islist(value)
|
||||
|
||||
/datum/preference/organ_data/apply_to_human(mob/living/carbon/human/target, value)
|
||||
return // Organ application is handled by copy_to_mob in 03_body.dm
|
||||
|
||||
/datum/preference/organ_data/apply_to_living(mob/living/target, value)
|
||||
return
|
||||
|
||||
/datum/preference/organ_data/apply_to_silicon(mob/living/silicon/target, value)
|
||||
return
|
||||
|
||||
/datum/preference/organ_data/apply_to_animal(mob/living/simple_mob/target, value)
|
||||
return
|
||||
@@ -0,0 +1,42 @@
|
||||
// Robolimb data preference for character creation
|
||||
// Stores an assoc list mapping organ tags to robolimb manufacturer model names.
|
||||
// Values are strings corresponding to keys in GLOB.all_robolimbs.
|
||||
|
||||
/datum/preference/rlimb_data
|
||||
savefile_key = "rlimb_data"
|
||||
savefile_identifier = PREFERENCE_CHARACTER
|
||||
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
|
||||
can_randomize = FALSE
|
||||
|
||||
/datum/preference/rlimb_data/create_default_value()
|
||||
return list()
|
||||
|
||||
/datum/preference/rlimb_data/pref_deserialize(input, datum/preferences/preferences)
|
||||
if(!islist(input))
|
||||
return list()
|
||||
// Sanitize: remove entries with invalid robolimb keys
|
||||
for(var/limb in input)
|
||||
var/key = input[limb]
|
||||
if(!istext(key) || !LAZYACCESS(GLOB.all_robolimbs, key))
|
||||
input -= limb
|
||||
return input
|
||||
|
||||
/datum/preference/rlimb_data/pref_serialize(input)
|
||||
if(!islist(input))
|
||||
return list()
|
||||
return check_list_copy(input)
|
||||
|
||||
/datum/preference/rlimb_data/is_valid(value)
|
||||
return islist(value)
|
||||
|
||||
/datum/preference/rlimb_data/apply_to_human(mob/living/carbon/human/target, value)
|
||||
return // Robolimb application is handled by copy_to_mob in 03_body.dm
|
||||
|
||||
/datum/preference/rlimb_data/apply_to_living(mob/living/target, value)
|
||||
return
|
||||
|
||||
/datum/preference/rlimb_data/apply_to_silicon(mob/living/silicon/target, value)
|
||||
return
|
||||
|
||||
/datum/preference/rlimb_data/apply_to_animal(mob/living/simple_mob/target, value)
|
||||
return
|
||||
@@ -0,0 +1,38 @@
|
||||
// Species preference for character creation
|
||||
// Handles the player's selected species, validated against GLOB.playable_species.
|
||||
|
||||
/datum/preference/choiced/species
|
||||
savefile_key = "species"
|
||||
savefile_identifier = PREFERENCE_CHARACTER
|
||||
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
|
||||
can_randomize = FALSE
|
||||
priority = PREFERENCE_PRIORITY_SPECIES
|
||||
|
||||
/datum/preference/choiced/species/init_possible_values()
|
||||
// GLOB.playable_species is populated at world init and contains all joinable species names.
|
||||
return GLOB.playable_species
|
||||
|
||||
/datum/preference/choiced/species/create_default_value()
|
||||
return SPECIES_HUMAN
|
||||
|
||||
/datum/preference/choiced/species/pref_deserialize(input, datum/preferences/preferences)
|
||||
if(!input || !istext(input) || !(input in GLOB.playable_species))
|
||||
return SPECIES_HUMAN
|
||||
return input
|
||||
|
||||
/datum/preference/choiced/species/is_valid(value)
|
||||
if(!istext(value))
|
||||
return FALSE
|
||||
return value in GLOB.playable_species
|
||||
|
||||
/datum/preference/choiced/species/apply_to_human(mob/living/carbon/human/target, value)
|
||||
return // Species application is handled by copy_to via character.set_species()
|
||||
|
||||
/datum/preference/choiced/species/apply_to_living(mob/living/target, value)
|
||||
return
|
||||
|
||||
/datum/preference/choiced/species/apply_to_silicon(mob/living/silicon/target, value)
|
||||
return
|
||||
|
||||
/datum/preference/choiced/species/apply_to_animal(mob/living/simple_mob/target, value)
|
||||
return
|
||||
@@ -381,8 +381,9 @@
|
||||
|
||||
var/use_species_name
|
||||
var/datum/species/chosen_species
|
||||
if(client.prefs.species)
|
||||
chosen_species = GLOB.all_species[client.prefs.species]
|
||||
var/pref_species = client.prefs.read_preference(/datum/preference/choiced/species)
|
||||
if(pref_species)
|
||||
chosen_species = GLOB.all_species[pref_species]
|
||||
use_species_name = chosen_species.get_station_variant() //Only used by pariahs atm.
|
||||
|
||||
if(chosen_species && use_species_name)
|
||||
@@ -464,8 +465,9 @@
|
||||
|
||||
/mob/new_player/get_species()
|
||||
var/datum/species/chosen_species
|
||||
if(client.prefs.species)
|
||||
chosen_species = GLOB.all_species[client.prefs.species]
|
||||
var/pref_species = client.prefs.read_preference(/datum/preference/choiced/species)
|
||||
if(pref_species)
|
||||
chosen_species = GLOB.all_species[pref_species]
|
||||
|
||||
if(!chosen_species)
|
||||
return SPECIES_HUMAN
|
||||
|
||||
@@ -27,12 +27,12 @@
|
||||
to_chat(src,span_warning("You have not set your scale yet. Do this on the VORE tab in character setup."))
|
||||
|
||||
//Can they play?
|
||||
if(!is_alien_whitelisted(src.client,GLOB.all_species[client?.prefs?.species]) && !check_rights(R_ADMIN, 0))
|
||||
if(!is_alien_whitelisted(src.client,GLOB.all_species[client?.prefs?.read_preference(/datum/preference/choiced/species)]) && !check_rights(R_ADMIN, 0))
|
||||
pass = FALSE
|
||||
to_chat(src,span_warning("You are not allowed to spawn in as this species."))
|
||||
|
||||
//Custom species checks
|
||||
if (client?.prefs?.species == "Custom Species")
|
||||
if (client?.prefs?.read_preference(/datum/preference/choiced/species) == SPECIES_CUSTOM)
|
||||
|
||||
//Didn't name it
|
||||
if(!client?.prefs?.custom_species)
|
||||
|
||||
@@ -276,11 +276,12 @@
|
||||
|
||||
/datum/preferences/proc/get_valid_hairstyles(mob/user)
|
||||
var/list/valid_hairstyles = list()
|
||||
var/pref_species = read_preference(/datum/preference/choiced/species)
|
||||
for(var/hairstyle in GLOB.hair_styles_list)
|
||||
var/datum/sprite_accessory/S = GLOB.hair_styles_list[hairstyle]
|
||||
if(S.name == DEVELOPER_WARNING_NAME)
|
||||
continue
|
||||
if(!(species in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed)))
|
||||
if(!(pref_species in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed)))
|
||||
continue
|
||||
if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER)))
|
||||
continue
|
||||
@@ -293,6 +294,7 @@
|
||||
/datum/preferences/proc/get_valid_facialhairstyles()
|
||||
var/list/valid_facialhairstyles = list()
|
||||
var/bio_gender = read_preference(/datum/preference/choiced/gender/biological)
|
||||
var/pref_species = read_preference(/datum/preference/choiced/species)
|
||||
for(var/facialhairstyle in GLOB.facial_hair_styles_list)
|
||||
var/datum/sprite_accessory/S = GLOB.facial_hair_styles_list[facialhairstyle]
|
||||
if(S.name == DEVELOPER_WARNING_NAME)
|
||||
@@ -301,7 +303,7 @@
|
||||
continue
|
||||
if(bio_gender == FEMALE && S.gender == MALE)
|
||||
continue
|
||||
if(!(species in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed)))
|
||||
if(!(pref_species in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed)))
|
||||
continue
|
||||
if(!S.can_be_selected && (!client || !check_rights_for(client, R_HOLDER)))
|
||||
continue
|
||||
|
||||
@@ -332,7 +332,8 @@
|
||||
if(owner)
|
||||
handle_organ_mod_special()
|
||||
if(!ignore_prosthetic_prefs && owner && owner.client && owner.client.prefs && owner.client.prefs.read_preference(/datum/preference/name/real_name) == owner.real_name)
|
||||
var/status = owner.client.prefs.organ_data[organ_tag]
|
||||
var/list/organ_data = owner.client.prefs.read_preference(/datum/preference/organ_data)
|
||||
var/status = organ_data?[organ_tag]
|
||||
if(status == FBP_ASSISTED)
|
||||
mechassist()
|
||||
else if(status == FBP_MECHANICAL)
|
||||
|
||||
@@ -666,11 +666,13 @@ This function completely restores a damaged organ to perfect condition.
|
||||
|
||||
if(owner && !ignore_prosthetic_prefs)
|
||||
if(owner.client && owner.client.prefs && owner.client.prefs.read_preference(/datum/preference/name/real_name) == owner.real_name)
|
||||
var/status = owner.client.prefs.organ_data[organ_tag]
|
||||
var/list/organ_data = owner.client.prefs.read_preference(/datum/preference/organ_data)
|
||||
var/status = organ_data?[organ_tag]
|
||||
if(status == "amputated")
|
||||
remove_rejuv()
|
||||
else if(status == "cyborg")
|
||||
var/robodata = owner.client.prefs.rlimb_data[organ_tag]
|
||||
var/list/rlimb_data = owner.client.prefs.read_preference(/datum/preference/rlimb_data)
|
||||
var/robodata = rlimb_data?[organ_tag]
|
||||
if(robodata)
|
||||
robotize(robodata)
|
||||
else
|
||||
|
||||
@@ -85,14 +85,15 @@ GLOBAL_LIST_EMPTY(active_autoresleevers)
|
||||
|
||||
var/client/ghost_client = ghost.client
|
||||
|
||||
if(!is_alien_whitelisted(ghost.client, GLOB.all_species[ghost_client?.prefs?.species]) && !check_rights(R_ADMIN, 0)) // Prevents a ghost ghosting in on a slot and spawning via a resleever with race they're not whitelisted for, getting around normal join restrictions.
|
||||
if(!is_alien_whitelisted(ghost.client, GLOB.all_species[ghost_client?.prefs?.read_preference(/datum/preference/choiced/species)]) && !check_rights(R_ADMIN, 0)) // Prevents a ghost ghosting in on a slot and spawning via a resleever with race they're not whitelisted for, getting around normal join restrictions.
|
||||
to_chat(ghost, span_warning("You are not whitelisted to spawn as this species!"))
|
||||
return
|
||||
|
||||
/* // Comments out NO_SLEEVE restriction, as per headmin/maintainer request.
|
||||
var/datum/species/chosen_species
|
||||
if(ghost.client.prefs.species) // In case we somehow don't have a species set here.
|
||||
chosen_species = GLOB.all_species[ghost_client.prefs.species]
|
||||
var/pref_species = ghost.client.prefs.read_preference(/datum/preference/choiced/species)
|
||||
if(pref_species) // In case we somehow don't have a species set here.
|
||||
chosen_species = GLOB.all_species[pref_species]
|
||||
|
||||
if(chosen_species.flags & NO_SLEEVE) // Sanity. Prevents species like Xenochimera, Proteans, etc from rejoining the round via resleeve, as they should have their own methods of doing so already, as agreed to when you whitelist as them.
|
||||
to_chat(ghost, span_warning("This species cannot be resleeved!"))
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
if(!job.minimum_character_age && !job.min_age_by_species)
|
||||
return TRUE
|
||||
|
||||
var/min_age = job.get_min_age(prefs.species, prefs.organ_data[O_BRAIN])
|
||||
var/min_age = job.get_min_age(prefs.read_preference(/datum/preference/choiced/species), prefs.read_preference(/datum/preference/organ_data)?[O_BRAIN])
|
||||
if(prefs.read_preference(/datum/preference/numeric/human/age) >= min_age)
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -125,13 +125,14 @@
|
||||
to_chat(new_user, span_danger("The station is currently exploding. Joining would go poorly."))
|
||||
return
|
||||
|
||||
var/datum/species/S = GLOB.all_species[new_user.client.prefs.species]
|
||||
var/pref_species = new_user.client.prefs.read_preference(/datum/preference/choiced/species)
|
||||
var/datum/species/S = GLOB.all_species[pref_species]
|
||||
if(!is_alien_whitelisted(new_user.client, S))
|
||||
tgui_alert(new_user, "You are currently not whitelisted to play [new_user.client.prefs.species].")
|
||||
tgui_alert(new_user, "You are currently not whitelisted to play [pref_species].")
|
||||
return 0
|
||||
|
||||
if(!(S.spawn_flags & SPECIES_CAN_JOIN))
|
||||
tgui_alert_async(new_user,"Your current species, [new_user.client.prefs.species], is not available for play on the station.")
|
||||
tgui_alert_async(new_user,"Your current species, [pref_species], is not available for play on the station.")
|
||||
return 0
|
||||
|
||||
new_user.AttemptLateSpawn(job)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
if(confirmation_prey == "Yes" && potential_prey && src && belly_choice)
|
||||
//Now we finally spawn them in!
|
||||
if(!is_alien_whitelisted(potential_prey, GLOB.all_species[potential_prey.prefs.species]))
|
||||
if(!is_alien_whitelisted(potential_prey, GLOB.all_species[potential_prey.prefs.read_preference(/datum/preference/choiced/species)]))
|
||||
to_chat(potential_prey, span_notice("You are not whitelisted to play as currently selected character."))
|
||||
to_chat(src, span_notice("Prey accepted the confirmation, but something went wrong with spawning their character."))
|
||||
return
|
||||
|
||||
@@ -163,35 +163,39 @@
|
||||
// This basically needs to be the reverse of /datum/category_item/player_setup_item/general/body/copy_to_mob() ~Leshana
|
||||
/proc/apply_organs_to_prefs(var/mob/living/carbon/human/character, var/datum/preferences/prefs)
|
||||
if(!istype(character) || !character.species) return
|
||||
var/list/organ_data = prefs.read_preference(/datum/preference/organ_data) || list()
|
||||
var/list/rlimb_data = prefs.read_preference(/datum/preference/rlimb_data) || list()
|
||||
// Checkify the limbs!
|
||||
for(var/name in character.species.has_limbs)
|
||||
var/obj/item/organ/external/O = character.organs_by_name[name]
|
||||
if(!O)
|
||||
var/obj/item/organ/external/external_organ = character.organs_by_name[name]
|
||||
if(!external_organ)
|
||||
if(name in GLOB.storable_amputated_organs)
|
||||
prefs.organ_data[name] = "amputated"
|
||||
organ_data[name] = "amputated"
|
||||
else
|
||||
prefs.rlimb_data.Remove(name) // Missing limb and not in the global list means default model
|
||||
else if(O.robotic >= ORGAN_ROBOT)
|
||||
prefs.organ_data[name] = "cyborg"
|
||||
if(O.model)
|
||||
prefs.rlimb_data[name] = O.model
|
||||
rlimb_data.Remove(name) // Missing limb and not in the global list means default model
|
||||
else if(external_organ.robotic >= ORGAN_ROBOT)
|
||||
organ_data[name] = "cyborg"
|
||||
if(external_organ.model)
|
||||
rlimb_data[name] = external_organ.model
|
||||
else
|
||||
prefs.rlimb_data.Remove(name) // Missing rlimb_data entry means default model
|
||||
rlimb_data.Remove(name) // Missing rlimb_data entry means default model
|
||||
else
|
||||
prefs.organ_data.Remove(name) // Misisng organ_data entry means normal
|
||||
organ_data.Remove(name) // Misisng organ_data entry means normal
|
||||
|
||||
// Internal organs also
|
||||
for(var/name in character.species.has_organ)
|
||||
var/obj/item/organ/I = character.internal_organs_by_name[name]
|
||||
if(I)
|
||||
if(istype(I, /obj/item/organ/internal/mmi_holder/robot))
|
||||
prefs.organ_data[name] = FBP_DIGITAL // Need a better way to detect this special type
|
||||
else if(I.robotic == ORGAN_ASSISTED)
|
||||
prefs.organ_data[name] = FBP_ASSISTED
|
||||
else if(I.robotic >= ORGAN_ROBOT)
|
||||
prefs.organ_data[name] = FBP_MECHANICAL
|
||||
var/obj/item/organ/internal_organ = character.internal_organs_by_name[name]
|
||||
if(internal_organ)
|
||||
if(istype(internal_organ, /obj/item/organ/internal/mmi_holder/robot))
|
||||
organ_data[name] = FBP_DIGITAL // Need a better way to detect this special type
|
||||
else if(internal_organ.robotic == ORGAN_ASSISTED)
|
||||
organ_data[name] = FBP_ASSISTED
|
||||
else if(internal_organ.robotic >= ORGAN_ROBOT)
|
||||
organ_data[name] = FBP_MECHANICAL
|
||||
else
|
||||
prefs.organ_data.Remove(name) // Missing organ_data entry means normal
|
||||
organ_data.Remove(name) // Missing organ_data entry means normal
|
||||
prefs.write_preference(GLOB.preference_entries[/datum/preference/organ_data], organ_data)
|
||||
prefs.write_preference(GLOB.preference_entries[/datum/preference/rlimb_data], rlimb_data)
|
||||
|
||||
// Saves mob's current body markings state to prefs.
|
||||
// This basically needs to be the reverse of /datum/category_item/player_setup_item/general/body/copy_to_mob() ~Leshana
|
||||
|
||||
Reference in New Issue
Block a user