Files
CHOMPStation2/code/modules/client/preference_setup/preference_setup.dm
Neerti 6e281def77 Allows FBPs to potentially have different age limits.
Cyborgs have their minimum be equal to their species' minimum, and maximum be their species maximum plus twenty years.
Posibrains have a minimum of 1, and a maximum of 220, as discussed by EmperorJon.
Digital brains (drones) have a minimum of 1 and maximum of 150, as discussed by Spookerton.
2016-07-13 18:25:07 -04:00

305 lines
9.8 KiB
Plaintext

#define TOPIC_NOACTION 0
#define TOPIC_HANDLED 1
#define TOPIC_REFRESH 2
#define TOPIC_UPDATE_PREVIEW 4
#define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_REFRESH|TOPIC_UPDATE_PREVIEW)
#define PREF_FBP_CYBORG "cyborg"
#define PREF_FBP_POSI "posi"
#define PREF_FBP_SOFTWARE "software"
/datum/category_group/player_setup_category/general_preferences
name = "General"
sort_order = 1
category_item_type = /datum/category_item/player_setup_item/general
/datum/category_group/player_setup_category/skill_preferences
name = "Skills"
sort_order = 2
category_item_type = /datum/category_item/player_setup_item/skills
/datum/category_group/player_setup_category/occupation_preferences
name = "Occupation"
sort_order = 3
category_item_type = /datum/category_item/player_setup_item/occupation
/datum/category_group/player_setup_category/appearance_preferences
name = "Antagonism"
sort_order = 4
category_item_type = /datum/category_item/player_setup_item/antagonism
/datum/category_group/player_setup_category/loadout_preferences
name = "Loadout"
sort_order = 5
category_item_type = /datum/category_item/player_setup_item/loadout
/datum/category_group/player_setup_category/global_preferences
name = "Global"
sort_order = 6
category_item_type = /datum/category_item/player_setup_item/player_global
/****************************
* Category Collection Setup *
****************************/
/datum/category_collection/player_setup_collection
category_group_type = /datum/category_group/player_setup_category
var/datum/preferences/preferences
var/datum/category_group/player_setup_category/selected_category = null
/datum/category_collection/player_setup_collection/New(var/datum/preferences/preferences)
src.preferences = preferences
..()
selected_category = categories[1]
/datum/category_collection/player_setup_collection/Destroy()
preferences = null
selected_category = null
return ..()
/datum/category_collection/player_setup_collection/proc/sanitize_setup()
for(var/datum/category_group/player_setup_category/PS in categories)
PS.sanitize_setup()
/datum/category_collection/player_setup_collection/proc/load_character(var/savefile/S)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.load_character(S)
/datum/category_collection/player_setup_collection/proc/save_character(var/savefile/S)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.save_character(S)
/datum/category_collection/player_setup_collection/proc/load_preferences(var/savefile/S)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.load_preferences(S)
/datum/category_collection/player_setup_collection/proc/save_preferences(var/savefile/S)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.save_preferences(S)
/datum/category_collection/player_setup_collection/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_group/player_setup_category/PS in categories)
PS.copy_to_mob(C)
/datum/category_collection/player_setup_collection/proc/header()
var/dat = ""
for(var/datum/category_group/player_setup_category/PS in categories)
if(PS == selected_category)
dat += "[PS.name] " // TODO: Check how to properly mark a href/button selected in a classic browser window
else
dat += "<a href='?src=\ref[src];category=\ref[PS]'>[PS.name]</a> "
return dat
/datum/category_collection/player_setup_collection/proc/content(var/mob/user)
if(selected_category)
return selected_category.content(user)
/datum/category_collection/player_setup_collection/Topic(var/href,var/list/href_list)
if(..())
return 1
var/mob/user = usr
if(!user.client)
return 1
if(href_list["category"])
var/category = locate(href_list["category"])
if(category && category in categories)
selected_category = category
. = 1
if(.)
user.client.prefs.ShowChoices(user)
/**************************
* Category Category Setup *
**************************/
/datum/category_group/player_setup_category
var/sort_order = 0
/datum/category_group/player_setup_category/dd_SortValue()
return sort_order
/datum/category_group/player_setup_category/proc/sanitize_setup()
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_preferences()
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_character()
/datum/category_group/player_setup_category/proc/load_character(var/savefile/S)
// Load all data, then sanitize it.
// Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body.
for(var/datum/category_item/player_setup_item/PI in items)
PI.load_character(S)
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_character()
/datum/category_group/player_setup_category/proc/save_character(var/savefile/S)
// Sanitize all data, then save it
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_character()
for(var/datum/category_item/player_setup_item/PI in items)
PI.save_character(S)
/datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S)
for(var/datum/category_item/player_setup_item/PI in items)
PI.load_preferences(S)
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_preferences()
/datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S)
for(var/datum/category_item/player_setup_item/PI in items)
PI.sanitize_preferences()
for(var/datum/category_item/player_setup_item/PI in items)
PI.save_preferences(S)
/datum/category_group/player_setup_category/proc/copy_to_mob(var/mob/living/carbon/human/C)
for(var/datum/category_item/player_setup_item/PI in items)
PI.copy_to_mob(C)
/datum/category_group/player_setup_category/proc/content(var/mob/user)
. = "<table style='width:100%'><tr style='vertical-align:top'><td style='width:50%'>"
var/current = 0
var/halfway = items.len / 2
for(var/datum/category_item/player_setup_item/PI in items)
if(halfway && current++ >= halfway)
halfway = 0
. += "</td><td></td><td style='width:50%'>"
. += "[PI.content(user)]<br>"
. += "</td></tr></table>"
/datum/category_group/player_setup_category/occupation_preferences/content(var/mob/user)
for(var/datum/category_item/player_setup_item/PI in items)
. += "[PI.content(user)]<br>"
/**********************
* Category Item Setup *
**********************/
/datum/category_item/player_setup_item
var/sort_order = 0
var/datum/preferences/pref
/datum/category_item/player_setup_item/New()
..()
var/datum/category_collection/player_setup_collection/psc = category.collection
pref = psc.preferences
/datum/category_item/player_setup_item/Destroy()
pref = null
return ..()
/datum/category_item/player_setup_item/dd_SortValue()
return sort_order
/*
* Called when the item is asked to load per character settings
*/
/datum/category_item/player_setup_item/proc/load_character(var/savefile/S)
return
/*
* Called when the item is asked to save per character settings
*/
/datum/category_item/player_setup_item/proc/save_character(var/savefile/S)
return
/*
* Called when the item is asked to load user/global settings
*/
/datum/category_item/player_setup_item/proc/load_preferences(var/savefile/S)
return
/*
* Called when the item is asked to save user/global settings
*/
/datum/category_item/player_setup_item/proc/save_preferences(var/savefile/S)
return
/*
* Called when the item is asked to apply its per character settings to a new mob.
*/
/datum/category_item/player_setup_item/proc/copy_to_mob(var/mob/living/carbon/human/C)
return
/datum/category_item/player_setup_item/proc/content()
return
/datum/category_item/player_setup_item/proc/sanitize_character()
return
/datum/category_item/player_setup_item/proc/sanitize_preferences()
return
/datum/category_item/player_setup_item/Topic(var/href,var/list/href_list)
if(..())
return 1
var/mob/pref_mob = preference_mob()
if(!pref_mob || !pref_mob.client)
return 1
. = OnTopic(href, href_list, usr)
if(. & TOPIC_UPDATE_PREVIEW)
pref_mob.client.prefs.preview_icon = null
if(. & TOPIC_REFRESH)
pref_mob.client.prefs.ShowChoices(usr)
/datum/category_item/player_setup_item/CanUseTopic(var/mob/user)
return 1
/datum/category_item/player_setup_item/proc/OnTopic(var/href,var/list/href_list, var/mob/user)
return TOPIC_NOACTION
/datum/category_item/player_setup_item/proc/preference_mob()
if(!pref.client)
for(var/client/C)
if(C.ckey == pref.client_ckey)
pref.client = C
break
if(pref.client)
return pref.client.mob
// 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")
return 0
return 1
// Returns what kind of FBP the player's prefs are. Returns 0 if they're not an FBP.
/datum/category_item/player_setup_item/proc/get_FBP_type()
if(!is_FBP())
return 0 // Not a robot.
switch(pref.organ_data["brain"])
if("assisted")
return PREF_FBP_CYBORG
if("mechanical")
return PREF_FBP_POSI
if("digital")
return PREF_FBP_SOFTWARE
return 0 //Something went wrong!
/datum/category_item/player_setup_item/proc/get_min_age()
var/datum/species/S = all_species[pref.species ? pref.species : "Human"]
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()
switch(FBP_type)
if(PREF_FBP_CYBORG)
return S.min_age
if(PREF_FBP_POSI)
return 1
if(PREF_FBP_SOFTWARE)
return 1
return S.min_age // welp
/datum/category_item/player_setup_item/proc/get_max_age()
var/datum/species/S = all_species[pref.species ? pref.species : "Human"]
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()
switch(FBP_type)
if(PREF_FBP_CYBORG)
return S.max_age + 20
if(PREF_FBP_POSI)
return 220
if(PREF_FBP_SOFTWARE)
return 150
return S.max_age // welp