Files
Bubberstation/code/controllers/subsystem/processing/quirks.dm
SkyratBot 9745444632 [MIRROR] quirks taken are now recorded by the blackbox. (#7345)
* quirks taken are now recorded by the blackbox. (#60581)

* quirks taken are now recorded by the blackbox.

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2021-08-03 20:05:53 +01:00

152 lines
5.5 KiB
Plaintext

#define EXP_ASSIGN_WAYFINDER 1200
#define RANDOM_QUIRK_BONUS 3
#define MINIMUM_RANDOM_QUIRKS 3
//Used to process and handle roundstart quirks
// - Quirk strings are used for faster checking in code
// - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string
PROCESSING_SUBSYSTEM_DEF(quirks)
name = "Quirks"
init_order = INIT_ORDER_QUIRKS
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME
wait = 1 SECONDS
var/list/quirks = list() //Assoc. list of all roundstart quirk datum types; "name" = /path/
var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad
var/list/quirk_blacklist = list() //A list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4)
///An assoc list of quirks that can be obtained as a hardcore character, and their hardcore value.
var/list/hardcore_quirks = list()
/datum/controller/subsystem/processing/quirks/Initialize(timeofday)
if(!quirks.len)
SetupQuirks()
quirk_blacklist = list(list("Blind","Nearsighted"), \
list("Jolly","Depression","Apathetic","Hypersensitive"), \
list("Ageusia","Vegetarian","Deviant Tastes"), \
list("Ananas Affinity","Ananas Aversion"), \
list("Alcohol Tolerance","Light Drinker"), \
list("Clown Fan","Mime Fan"), \
list("Bad Touch", "Friendly"), \
list("Extrovert", "Introvert"))
return ..()
/datum/controller/subsystem/processing/quirks/proc/SetupQuirks()
// Sort by Positive, Negative, Neutral; and then by name
var/list/quirk_list = sortList(subtypesof(/datum/quirk), /proc/cmp_quirk_asc)
for(var/type in quirk_list)
var/datum/quirk/quirk_type = type
if(initial(quirk_type.abstract_parent_type) == type)
continue
quirks[initial(quirk_type.name)] = quirk_type
quirk_points[initial(quirk_type.name)] = initial(quirk_type.value)
var/hardcore_value = initial(quirk_type.hardcore_value)
if(!hardcore_value)
continue
hardcore_quirks[quirk_type] += hardcore_value
/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli)
var/badquirk = FALSE
for(var/quirk_name in cli.prefs.all_quirks)
var/datum/quirk/Q = quirks[quirk_name]
if(Q)
if(user.add_quirk(Q))
SSblackbox.record_feedback("nested tally", "quirks_taken", 1, list("[quirk_name]"))
else
stack_trace("Invalid quirk \"[quirk_name]\" in client [cli.ckey] preferences")
cli.prefs.all_quirks -= quirk_name
badquirk = TRUE
if(badquirk)
cli.prefs.save_character()
// Assign wayfinding pinpointer granting quirk if they're new
if(cli.get_exp_living(TRUE) < EXP_ASSIGN_WAYFINDER && !user.has_quirk(/datum/quirk/item_quirk/needswayfinder))
var/datum/quirk/wayfinder = /datum/quirk/item_quirk/needswayfinder
if(user.add_quirk(wayfinder))
SSblackbox.record_feedback("nested tally", "quirks_taken", 1, list(initial(wayfinder.name)))
// SKYRAT EDIT ADDITION START - Customization (food prefs)
// This was done in this proc on old skyrat and i cba to find a better way
var/mob/living/carbon/human/H = user
if(istype(H))
if(cli.prefs.foodlikes.len)
H.dna.species.liked_food = 0
for(var/V in cli.prefs.foodlikes)
H.dna.species.liked_food |= cli.prefs.foodlikes[V]
if(cli.prefs.fooddislikes.len)
H.dna.species.disliked_food = 0
for(var/V in cli.prefs.fooddislikes)
H.dna.species.disliked_food |= cli.prefs.fooddislikes[V]
// SKYRAT EDIT ADDITION END
/*
*Randomises the quirks for a specified mob
*/
/datum/controller/subsystem/processing/quirks/proc/randomise_quirks(mob/living/user)
var/bonus_quirks = max((length(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS)
var/added_quirk_count = 0 //How many we've added
var/list/quirks_to_add = list() //Quirks we're adding
var/good_count = 0 //Maximum of 6 good perks
var/score //What point score we're at
///Cached list of possible quirks
var/list/possible_quirks = quirks.Copy()
//Create a random list of stuff to start with
while(bonus_quirks > added_quirk_count)
var/quirk = pick(possible_quirks) //quirk is a string
if(quirk in quirk_blacklist) //prevent blacklisted
possible_quirks -= quirk
continue
if(quirk_points[quirk] > 0)
good_count++
score += quirk_points[quirk]
quirks_to_add += quirk
possible_quirks -= quirk
added_quirk_count++
//But lets make sure we're balanced
while(score > 0)
if(!length(possible_quirks))//Lets not get stuck
break
var/quirk = pick(quirks)
if(quirk in quirk_blacklist) //prevent blacklisted
possible_quirks -= quirk
continue
if(!quirk_points[quirk] < 0)//negative only
possible_quirks -= quirk
continue
good_count++
score += quirk_points[quirk]
quirks_to_add += quirk
//And have benefits too
while(score < 0 && good_count <= MAX_QUIRKS)
if(!length(possible_quirks))//Lets not get stuck
break
var/quirk = pick(quirks)
if(quirk in quirk_blacklist) //prevent blacklisted
possible_quirks -= quirk
continue
if(!quirk_points[quirk] > 0) //positive only
possible_quirks -= quirk
continue
good_count++
score += quirk_points[quirk]
quirks_to_add += quirk
for(var/datum/quirk/quirk as anything in user.quirks)
if(quirk.name in quirks_to_add) //Don't delete ones we keep
quirks_to_add -= quirk.name //Already there, no need to add.
continue
user.remove_quirk(quirk.type) //these quirks are objects
for(var/datum/quirk/quirk as anything in quirks_to_add)
user.add_quirk(quirks[quirk]) //these are typepaths converted from string
#undef RANDOM_QUIRK_BONUS
#undef MINIMUM_RANDOM_QUIRKS