Character Setup Rework (#17576)

* Character Setup Rework

Little tweaks

Species selection done~

Merk randomize body button

Body color and eye color

Merk more replaced code

Convert robolimbs to tgui

Add a warning if flavor text/ooc notes are too short

Custom preview icons for species selector!

A sidequest that only took 8
hours. Also add digitigrade and blood type.

Remove unused body_descriptor system completely

Finish the general tab~

Reorganization to prepare for loadout page creation

* Start of work on the loadout screen

* Only send the data that's actually selected

* Get rid of these ugly ../../../..

* Retype this to avoid conflicts

* Holy shit why did this work this way

* Finish loadout screen

* Add copy loadout function

* Finish occupation page

* Move Special Roles into general tab

* Fix path conflict

* Move size prefs to general tab

* Convert jukebox and volume settings to datum/preference

* Fix a little mergery fuckery in loadout

* Migrate jukebox to new range

* Fix TabbedMenu tabs

* Fix wordwrap for loadout screen

* Kill the vore tab, just traits left to convert

* Convert custom messages

* Convert custom species name

* Convert blood color and reagents

* Move icobase to tgui

* Finished

* This can fuck off too

* Fix a few bugs

* Update index.tsx

* initial for emote sound mode switch

* Make show_roles actually work, hide fluff items

* Fix not being able to select species

* Add emote_sound_mode to body tab

* Fix runtime when no active gear list is present

* Add a save notification to character setup

* Switch to floating

* Add more search bars

* Whoops forgot to add this

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
ShadowLarkens
2025-05-25 03:20:51 +02:00
committed by GitHub
co-authored by Kashargul
parent 44d1ce470e
commit 31e8e009db
106 changed files with 8770 additions and 4739 deletions
@@ -70,9 +70,6 @@ var/datum/antagonist/deathsquad/deathsquad
var/syndicate_commando_name = pick(last_names)
var/datum/preferences/A = new() //Randomize appearance for the commando.
A.randomize_appearance_and_body_for(player.current)
player.name = "[syndicate_commando_rank] [syndicate_commando_name]"
player.current.name = player.name
player.current.real_name = player.current.name
-3
View File
@@ -79,7 +79,6 @@ GLOBAL_LIST_EMPTY_TYPED(dna_genes_bad, /datum/gene/trait)
var/species = SPECIES_HUMAN
var/list/body_markings = list()
var/list/body_markings_genetic = list()
var/list/body_descriptors = null
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
// Make a copy of this strand.
@@ -191,12 +190,10 @@ GLOBAL_LIST_EMPTY_TYPED(dna_genes_bad, /datum/gene/trait)
src.offset_override = character.offset_override
src.synth_markings = character.synth_markings
src.custom_speech_bubble = character.custom_speech_bubble
/* Currently not implemented on virgo
src.species_sounds = character.species.species_sounds
src.gender_specific_species_sounds = character.species.gender_specific_species_sounds
src.species_sounds_male = character.species.species_sounds_male
src.species_sounds_female = character.species.species_sounds_female
*/
src.grad_style = character.grad_style
src.r_grad = character.r_grad
src.g_grad = character.g_grad
-2
View File
@@ -284,12 +284,10 @@
H.dna.blood_color = dna.blood_color
H.species.blood_reagents = H.dna.blood_reagents
H.species.blood_color = H.dna.blood_color
/*//TODO: Get these to work as well.
H.species.species_sounds = dna.species_sounds
H.species.gender_specific_species_sounds = dna.gender_specific_species_sounds
H.species.species_sounds_male = dna.species_sounds_male
H.species.species_sounds_female = dna.species_sounds_female
*///TODO End
H.force_update_organs() //VOREStation Add - Gotta do this too
H.force_update_limbs()
-4
View File
@@ -18,7 +18,6 @@
var/languages=null
var/list/flavor=null
var/gender = null
var/list/body_descriptors = null // Guess we'll keep null.
var/list/genetic_modifiers = list() // Modifiers with the MODIFIER_GENETIC flag are saved. Note that only the type is saved, not an instance.
/datum/dna2/record/proc/GetData()
@@ -48,8 +47,6 @@
newrecord.implant = implant
newrecord.flavor = flavor
newrecord.gender = gender
if(body_descriptors)
newrecord.body_descriptors = body_descriptors.Copy()
newrecord.genetic_modifiers = genetic_modifiers.Copy()
return newrecord
@@ -617,7 +614,6 @@
var/mob/living/carbon/human/H = WC
databuf.mydna.dna.real_name = H.dna.real_name
databuf.mydna.gender = H.gender
databuf.mydna.body_descriptors = H.descriptors
buffers[bufferId] = databuf
return TRUE
if("clear")
-11
View File
@@ -201,17 +201,6 @@
return ideal_character_age // VOREStation Edit - Minimum character age by rules is 18, return default which is standard for all species
//return (brain_type && LAZYACCESS(ideal_age_by_species, brain_type)) || LAZYACCESS(ideal_age_by_species, brain_type) || ideal_character_age //VOREStation Removal
/datum/job/proc/is_species_banned(species_name, brain_type)
return FALSE // VOREStation Edit - Any species can be any job.
/* VOREStation Removal
if(banned_job_species == null)
return
if(species_name in banned_job_species)
return TRUE
if(brain_type in banned_job_species)
return TRUE
*/
/datum/job/proc/update_limit(var/comperator)
return
+9 -12
View File
@@ -111,9 +111,6 @@ var/global/datum/controller/occupations/job_master
Debug("FOC is_job_whitelisted failed, Player: [player]")
continue
//VOREStation Code End
if(job.is_species_banned(player.client.prefs.species, player.client.prefs.organ_data[O_BRAIN]) == TRUE)
Debug("FOC character species invalid for job, Player: [player]")
continue
if(flag && !(player.client.prefs.be_special & flag))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
@@ -131,9 +128,6 @@ var/global/datum/controller/occupations/job_master
if((job.minimum_character_age || job.min_age_by_species) && (player.read_preference(/datum/preference/numeric/human/age) < job.get_min_age(player.client.prefs.species, player.client.prefs.organ_data[O_BRAIN])))
continue
if(job.is_species_banned(player.client.prefs.species, player.client.prefs.organ_data[O_BRAIN]) == TRUE)
continue
if(istype(job, GetJob(JOB_ALT_VISITOR))) // We don't want to give him assistant, that's boring! //VOREStation Edit - Visitor not Assistant
continue
@@ -395,8 +389,9 @@ var/global/datum/controller/occupations/job_master
//Equip custom gear loadout.
var/list/custom_equip_slots = list()
var/list/custom_equip_leftovers = list()
if(H.client && H.client.prefs && H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON))
for(var/thing in H.client.prefs.gear)
if(H?.client?.prefs && !(job.mob_type & JOB_SILICON))
var/list/active_gear_list = LAZYACCESS(H.client.prefs.gear_list, "[H.client.prefs.gear_slot]")
for(var/thing in active_gear_list)
var/datum/gear/G = gear_datums[thing]
if(!G) //Not a real gear datum (maybe removed, as this is loaded from their savefile)
continue
@@ -421,14 +416,14 @@ var/global/datum/controller/occupations/job_master
// Implants get special treatment
if(G.slot == "implant")
var/obj/item/implant/I = G.spawn_item(H, H.client.prefs.gear[G.display_name])
var/obj/item/implant/I = G.spawn_item(H, active_gear_list[G.display_name])
I.invisibility = INVISIBILITY_MAXIMUM
I.implant_loadout(H)
continue
// Try desperately (and sorta poorly) to equip the item. Now with increased desperation!
if(G.slot && !(G.slot in custom_equip_slots))
var/metadata = H.client.prefs.gear[G.display_name]
var/metadata = active_gear_list[G.display_name]
//if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
// custom_equip_leftovers += thing
//else
@@ -468,7 +463,8 @@ var/global/datum/controller/occupations/job_master
if(G.slot in custom_equip_slots)
spawn_in_storage += thing
else
var/metadata = H.client.prefs.gear[G.display_name]
var/list/active_gear_list = LAZYACCESS(H.client.prefs.gear_list, "[H.client.prefs.gear_slot]")
var/metadata = active_gear_list[G.display_name]
if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
to_chat(H, span_notice("Equipping you with \the [thing]!"))
custom_equip_slots.Add(G.slot)
@@ -516,11 +512,12 @@ var/global/datum/controller/occupations/job_master
B = S
break
var/list/active_gear_list = LAZYACCESS(H.client.prefs.gear_list, "[H.client.prefs.gear_slot]")
if(!isnull(B))
for(var/thing in spawn_in_storage)
to_chat(H, span_notice("Placing \the [thing] in your [B.name]!"))
var/datum/gear/G = gear_datums[thing]
var/metadata = H.client.prefs.gear[G.display_name]
var/metadata = active_gear_list[G.display_name]
G.spawn_item(B, metadata)
else
to_chat(H, span_danger("Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug."))
-1
View File
@@ -109,7 +109,6 @@
R.dna.real_name = "clone ([rand(0,999)])"
H.real_name = R.dna.real_name
H.gender = R.gender
H.descriptors = R.body_descriptors
//Get the clone body ready
H.adjustCloneLoss(150) // New damage var so you can't eject a clone early then stab them to abuse the current damage system --NeoFite
-1
View File
@@ -422,7 +422,6 @@
R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
R.languages = subject.languages
R.gender = subject.gender
R.body_descriptors = subject.descriptors
R.flavor = subject.flavor_texts.Copy()
for(var/datum/modifier/mod in subject.modifiers)
if(mod.flags & MODIFIER_GENETIC)