mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 20:48:56 +01:00
murfing (#1930)
This commit is contained in:
@@ -62,9 +62,15 @@
|
||||
#define BODY_SIZE_MAX 1.5
|
||||
#define BODY_SIZE_MIN 0.8
|
||||
|
||||
//In inches
|
||||
#define PENIS_MAX_GIRTH 15
|
||||
#define PENIS_MIN_LENGTH 1
|
||||
#define PENIS_MAX_LENGTH 20
|
||||
|
||||
#define SHEATH_NONE "None"
|
||||
#define SHEATH_NORMAL "Sheath"
|
||||
#define SHEATH_SLIT "Slit"
|
||||
#define SHEATH_MODES list(SHEATH_NONE, SHEATH_NORMAL, SHEATH_SLIT)
|
||||
|
||||
#define MANDATORY_FEATURE_LIST list("mcolor" = "FFB","mcolor2" = "FFB","mcolor3" = "FFB","ethcolor" = "FCC","skin_color" = "FED","flavor_text" = "","breasts_size" = 1,"breasts_lactation" = FALSE,"penis_size" = 13,"penis_girth" = 9,"penis_taur_mode" = TRUE,"penis_sheath" = SHEATH_NONE ,"balls_size" = 1, "body_size" = BODY_SIZE_NORMAL, "custom_species" = null, "uses_skintones" = FALSE)
|
||||
|
||||
|
||||
+7
-1
@@ -48,7 +48,8 @@
|
||||
destination.dna.unique_enzymes = unique_enzymes
|
||||
destination.dna.uni_identity = uni_identity
|
||||
destination.dna.blood_type = blood_type
|
||||
destination.set_species(species.type, icon_update=0)
|
||||
//destination.set_species(species.type, icon_update=0) //ORIGINAL
|
||||
destination.set_species(species.type, TRUE, null, features.Copy(), mutant_bodyparts.Copy(), body_markings.Copy()) //SKYRAT EDIT CHANGE - CUSTOMIZATION
|
||||
destination.dna.features = features.Copy()
|
||||
destination.dna.real_name = real_name
|
||||
destination.dna.temporary_mutations = temporary_mutations.Copy()
|
||||
@@ -63,6 +64,11 @@
|
||||
new_dna.uni_identity = uni_identity
|
||||
new_dna.blood_type = blood_type
|
||||
new_dna.features = features.Copy()
|
||||
//SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION
|
||||
new_dna.mutant_bodyparts = mutant_bodyparts.Copy()
|
||||
new_dna.body_markings = body_markings.Copy()
|
||||
new_dna.update_body_size()
|
||||
//SKYRAT EDIT ADDITION END
|
||||
new_dna.species = new species.type
|
||||
new_dna.real_name = real_name
|
||||
new_dna.mutations = mutations.Copy()
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
exotic_blood = /datum/reagent/toxin/slimejelly
|
||||
damage_overlay_type = ""
|
||||
var/datum/action/innate/regenerate_limbs/regenerate_limbs
|
||||
var/datum/action/innate/slime_change/slime_change //SKYRAT EDIT ADDITION - CUSTOMIZATION
|
||||
liked_food = MEAT
|
||||
coldmod = 6 // = 3x cold damage
|
||||
heatmod = 0.5 // = 1/4x heat damage
|
||||
@@ -24,6 +25,10 @@
|
||||
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
|
||||
if(regenerate_limbs)
|
||||
regenerate_limbs.Remove(C)
|
||||
//SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION
|
||||
if(slime_change)
|
||||
slime_change.Remove(C)
|
||||
//SKYRAT EDIT ADDITION END
|
||||
..()
|
||||
|
||||
/datum/species/jelly/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
@@ -31,6 +36,10 @@
|
||||
if(ishuman(C))
|
||||
regenerate_limbs = new
|
||||
regenerate_limbs.Grant(C)
|
||||
//SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION
|
||||
slime_change = new
|
||||
slime_change.Grant(C)
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
/datum/species/jelly/spec_life(mob/living/carbon/human/H)
|
||||
if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely
|
||||
|
||||
@@ -534,7 +534,8 @@
|
||||
|
||||
if(current_cycle >= cycles_to_turn)
|
||||
var/datum/species/species_type = race
|
||||
H.set_species(species_type)
|
||||
//H.set_species(species_type) //ORIGINAL
|
||||
H.set_species(species_type, TRUE, null, null, null, null, TRUE) //SKYRAT EDIT CHANGE - CUSTOMIZATION
|
||||
holder.del_reagent(type)
|
||||
to_chat(H, "<span class='warning'>You've become \a [lowertext(initial(species_type.name))]!</span>")
|
||||
return
|
||||
@@ -596,7 +597,8 @@
|
||||
return TRUE
|
||||
if(current_cycle >= cycles_to_turn) //overwrite since we want subtypes of jelly
|
||||
var/datum/species/species_type = pick(subtypesof(race))
|
||||
H.set_species(species_type)
|
||||
//H.set_species(species_type) //ORIGINAL
|
||||
H.set_species(species_type, TRUE, null, null, null, null, TRUE) //SKYRAT EDIT CHANGE - CUSTOMIZATION
|
||||
holder.del_reagent(type)
|
||||
to_chat(H, "<span class='warning'>You've become \a [initial(species_type.name)]!</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
H.real_name = clonename
|
||||
|
||||
H.hardset_dna(ui, mutation_index, H.dna.default_mutation_genes, H.real_name, blood_type, mrace, features, H.dna.mutations, FALSE)
|
||||
H.set_species(mrace, TRUE, null, features, mutantparts, markings)
|
||||
H.set_species(mrace, TRUE, null, features.Copy(), mutantparts.Copy(), markings.Copy())
|
||||
|
||||
if(!HAS_TRAIT(H, TRAIT_RADIMMUNE))//dont apply mutations if the species is Mutation proof.
|
||||
if(efficiency > 2)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
holder.transform = holder.transform.Translate(0, translate)
|
||||
current_body_size = features["body_size"]
|
||||
|
||||
/mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, var/datum/preferences/pref_load, var/list/override_features, var/list/override_mutantparts, var/list/override_markings)
|
||||
/mob/living/carbon/set_species(datum/species/mrace, icon_update = TRUE, var/datum/preferences/pref_load, var/list/override_features, var/list/override_mutantparts, var/list/override_markings, retain_features = FALSE)
|
||||
if(mrace && has_dna())
|
||||
var/datum/species/new_race
|
||||
if(ispath(mrace))
|
||||
@@ -48,7 +48,8 @@
|
||||
dna.body_markings = pref_load.body_markings.Copy()
|
||||
dna.species.body_markings = pref_load.body_markings.Copy()
|
||||
else
|
||||
dna.features = override_features || new_race.get_random_features()
|
||||
if(!retain_features)
|
||||
dna.features = override_features || new_race.get_random_features()
|
||||
dna.mutant_bodyparts = override_mutantparts || new_race.get_random_mutant_bodyparts(dna.features)
|
||||
dna.body_markings = override_markings || new_race.get_random_body_markings(dna.features)
|
||||
dna.species.body_markings = dna.body_markings.Copy()
|
||||
@@ -63,6 +64,8 @@
|
||||
|
||||
dna.species.mutant_bodyparts = bodyparts_to_add.Copy()
|
||||
|
||||
dna.update_body_size()
|
||||
|
||||
dna.species.on_species_gain(src, old_species, pref_load)
|
||||
//END OF BODYPARTS AND FEATURES
|
||||
if(ishuman(src))
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 664 B |
@@ -1702,18 +1702,17 @@
|
||||
if("penis_taur_mode")
|
||||
features["penis_taur_mode"] = !features["penis_taur_mode"]
|
||||
if("penis_size")
|
||||
var/new_length = input(user, "Choose your penis length:\n(2-20 in inches)", "Character Preference") as num|null
|
||||
var/new_length = input(user, "Choose your penis length:\n([PENIS_MIN_LENGTH]-[PENIS_MAX_LENGTH] in inches)", "Character Preference") as num|null
|
||||
if(new_length)
|
||||
features["penis_size"] = clamp(round(new_length, 1), 2, 20)
|
||||
features["penis_size"] = clamp(round(new_length, 1), PENIS_MIN_LENGTH, PENIS_MAX_LENGTH)
|
||||
if(features["penis_girth"] >= new_length)
|
||||
features["penis_girth"] = new_length - 1
|
||||
if("penis_sheath")
|
||||
var/list/sheath_choice_list = list(SHEATH_NONE, SHEATH_NORMAL, SHEATH_SLIT)
|
||||
var/new_sheath = input(user, "Choose your penis sheath", "Character Preference") as null|anything in sheath_choice_list
|
||||
var/new_sheath = input(user, "Choose your penis sheath", "Character Preference") as null|anything in SHEATH_MODES
|
||||
if(new_sheath)
|
||||
features["penis_sheath"] = new_sheath
|
||||
if("penis_girth")
|
||||
var/max_girth = 15
|
||||
var/max_girth = PENIS_MAX_GIRTH
|
||||
if(features["penis_size"] >= max_girth)
|
||||
max_girth = features["penis_size"]
|
||||
var/new_girth = input(user, "Choose your penis girth:\n(1-[max_girth] (based on length) in inches)", "Character Preference") as num|null
|
||||
|
||||
+201
@@ -12,3 +12,204 @@
|
||||
coldmod = 3
|
||||
heatmod = 1
|
||||
burnmod = 1
|
||||
|
||||
/datum/action/innate/slime_change
|
||||
name = "Alter Form"
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "alter_form"
|
||||
icon_icon = 'modular_skyrat/modules/customization/icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
var/slime_restricted = TRUE
|
||||
|
||||
/datum/action/innate/slime_change/admin
|
||||
slime_restricted = FALSE
|
||||
|
||||
/datum/action/innate/slime_change/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(slime_restricted && !isjellyperson(H))
|
||||
return
|
||||
if(slime_restricted)
|
||||
H.visible_message("<span class='notice'>[owner] gains a look of \
|
||||
concentration while standing perfectly still.\
|
||||
Their body seems to shift and starts getting more goo-like.</span>",
|
||||
"<span class='notice'>You focus intently on altering your body while \
|
||||
standing perfectly still...</span>")
|
||||
change_form()
|
||||
|
||||
/datum/action/innate/slime_change/proc/change_form()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/select_alteration = input(H, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Colors","Hair Style", "Facial Hair Style", "Mutant Body Parts", "Markings", "DNA Specifics", "Cancel")
|
||||
if(!select_alteration || select_alteration == "Cancel" || QDELETED(H))
|
||||
return
|
||||
var/datum/dna/DNA = H.dna
|
||||
switch(select_alteration)
|
||||
if("Body Colors")
|
||||
var/color_choice = input(H, "What color would you like to change?", "Form Alteration", "cancel") in list("Primary", "Secondary", "Tertiary", "All", "Cancel")
|
||||
if(!color_choice || color_choice == "Cancel" || QDELETED(H))
|
||||
return
|
||||
var/color_target
|
||||
switch(color_choice)
|
||||
if("Primary", "All")
|
||||
color_target = "mcolor"
|
||||
if("Secondary")
|
||||
color_target = "mcolor2"
|
||||
if("Tertiary")
|
||||
color_target = "mcolor3"
|
||||
var/new_mutantcolor = input(H, "Choose your character's new [lowertext(color_choice)] color:", "Form Alteration","#"+DNA.features[color_target]) as color|null
|
||||
if(!new_mutantcolor)
|
||||
return
|
||||
var/marking_reset = alert(H, "Would you like to reset your markings to match your new colors?", "", "Yes", "No")
|
||||
var/mutantpart_reset = alert(H, "Would you like to reset your mutant body parts(not limbs) to match your new colors?", "", "Yes", "No")
|
||||
if(color_choice == "All")
|
||||
DNA.features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
|
||||
DNA.features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
|
||||
DNA.features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
|
||||
else
|
||||
DNA.features[color_target] = sanitize_hexcolor(new_mutantcolor)
|
||||
if(marking_reset && marking_reset == "Yes")
|
||||
for(var/zone in DNA.body_markings)
|
||||
for(var/key in DNA.body_markings[zone])
|
||||
var/datum/body_marking/BD = GLOB.body_markings[key]
|
||||
if(BD.always_color_customizable)
|
||||
continue
|
||||
DNA.body_markings[zone][key] = BD.get_default_color(DNA.features, DNA.species)
|
||||
H.icon_render_key = "" //Currently the render key doesnt recognize the markings colors
|
||||
if(mutantpart_reset && mutantpart_reset == "Yes")
|
||||
H.mutant_renderkey = "" //Just in case
|
||||
for(var/mutant_key in DNA.species.mutant_bodyparts)
|
||||
var/mutant_list = DNA.species.mutant_bodyparts[mutant_key]
|
||||
var/datum/sprite_accessory/SP = GLOB.sprite_accessories[mutant_key][mutant_list[MUTANT_INDEX_NAME]]
|
||||
mutant_list[MUTANT_INDEX_COLOR_LIST] = SP.get_default_color(DNA.features, DNA.species)
|
||||
|
||||
H.update_body()
|
||||
H.update_hair()
|
||||
if("Hair Style")
|
||||
var/new_style = input(owner, "Select a hair style", "Hair Alterations") as null|anything in GLOB.hairstyles_list
|
||||
if(new_style)
|
||||
H.hairstyle = new_style
|
||||
H.update_hair()
|
||||
if("Facial Hair Style")
|
||||
var/new_style = input(H, "Select a facial hair style", "Hair Alterations") as null|anything in GLOB.facial_hairstyles_list
|
||||
if(new_style)
|
||||
H.facial_hairstyle = new_style
|
||||
H.update_hair()
|
||||
if("Mutant Body Parts")
|
||||
var/list/key_list = DNA.mutant_bodyparts
|
||||
var/chosen_key = input(H, "Select the part you want to alter", "Body Part Alterations") as null|anything in key_list + "Cancel"
|
||||
if(!chosen_key || chosen_key == "Cancel")
|
||||
return
|
||||
var/choice_list = GLOB.sprite_accessories[chosen_key]
|
||||
var/chosen_name_key = input(H, "What do you want the part to become?", "Body Part Alterations") as null|anything in choice_list + "Cancel"
|
||||
if(!chosen_name_key || chosen_name_key == "Cancel")
|
||||
return
|
||||
var/datum/sprite_accessory/SA = GLOB.sprite_accessories[chosen_key][chosen_name_key]
|
||||
H.mutant_renderkey = "" //Just in case
|
||||
if(!SA.factual)
|
||||
if(SA.organ_type)
|
||||
var/obj/item/organ/path = SA.organ_type
|
||||
var/slot = initial(path.slot)
|
||||
var/obj/item/organ/got_organ = H.getorganslot(slot)
|
||||
if(got_organ)
|
||||
got_organ.Remove(H)
|
||||
qdel(got_organ)
|
||||
else
|
||||
DNA.species.mutant_bodyparts -= chosen_key
|
||||
else
|
||||
if(SA.organ_type)
|
||||
var/obj/item/organ/path = SA.organ_type
|
||||
var/slot = initial(path.slot)
|
||||
var/obj/item/organ/got_organ = H.getorganslot(slot)
|
||||
if(got_organ)
|
||||
got_organ.Remove(H)
|
||||
qdel(got_organ)
|
||||
path = new SA.organ_type
|
||||
var/list/new_acc_list = list()
|
||||
new_acc_list[MUTANT_INDEX_NAME] = SA.name
|
||||
new_acc_list[MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(DNA.features, DNA.species)
|
||||
DNA.mutant_bodyparts[chosen_key] = new_acc_list.Copy()
|
||||
if(ROBOTIC_DNA_ORGANS in DNA.species.species_traits)
|
||||
path.status = ORGAN_ROBOTIC
|
||||
path.organ_flags |= ORGAN_SYNTHETIC
|
||||
path.build_from_dna(DNA, chosen_key)
|
||||
path.Insert(H, 0, FALSE)
|
||||
|
||||
else
|
||||
var/list/new_acc_list = list()
|
||||
new_acc_list[MUTANT_INDEX_NAME] = SA.name
|
||||
new_acc_list[MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(DNA.features, DNA.species)
|
||||
DNA.species.mutant_bodyparts[chosen_key] = new_acc_list
|
||||
DNA.mutant_bodyparts[chosen_key] = new_acc_list.Copy()
|
||||
H.update_mutant_bodyparts()
|
||||
if("Markings")
|
||||
var/list/candidates = GLOB.body_marking_sets
|
||||
var/chosen_name = input(H, "Select which set of markings would you like to change into", "Marking Alterations") as null|anything in candidates + "Cancel"
|
||||
if(!chosen_name || chosen_name == "Cancel")
|
||||
return
|
||||
var/datum/body_marking_set/BMS = GLOB.body_marking_sets[chosen_name]
|
||||
DNA.species.body_markings = assemble_body_markings_from_set(BMS, DNA.features, DNA.species)
|
||||
H.icon_render_key = "" //Just in case
|
||||
H.update_body()
|
||||
if("DNA Specifics")
|
||||
var/dna_alteration = input(H, "Select what part of your DNA you'd like to alter", "DNA Alteration", "cancel") in list("Penis Size","Penis Girth", "Penis Sheath", "Penis Taur Mode", "Balls Size", "Breasts Size", "Breasts Lactation", "Body Size", "Cancel")
|
||||
if(!dna_alteration || dna_alteration == "Cancel")
|
||||
return
|
||||
switch(dna_alteration)
|
||||
if("Breasts Size")
|
||||
var/new_size = input(H, "Choose your character's breasts size:", "DNA Alteration") as null|anything in GLOB.preference_breast_sizes
|
||||
if(new_size)
|
||||
DNA.features["breasts_size"] = breasts_cup_to_size(new_size)
|
||||
var/obj/item/organ/genital/breasts/melons = H.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
if(melons)
|
||||
melons.set_size(DNA.features["breasts_size"])
|
||||
if("Breasts Lactation")
|
||||
DNA.features["breasts_lactation"] = !DNA.features["breasts_lactation"]
|
||||
var/obj/item/organ/genital/breasts/melons = H.getorganslot(ORGAN_SLOT_BREASTS)
|
||||
if(melons)
|
||||
melons.lactates = DNA.features["breasts_lactation"]
|
||||
to_chat(H, "<span class='notice'>Your breasts [DNA.features["breasts_lactation"] ? "will now lactate" : "will not lactate anymore"].</span>")
|
||||
if("Penis Taur Mode")
|
||||
DNA.features["penis_taur_mode"] = !DNA.features["penis_taur_mode"]
|
||||
to_chat(H, "<span class='notice'>Your penis [DNA.features["penis_taur_mode"] ? "will be at your taur part" : "will not be at your taur part anymore"].</span>")
|
||||
if("Penis Size")
|
||||
var/new_length = input(H, "Choose your penis length:\n([PENIS_MIN_LENGTH]-[PENIS_MAX_LENGTH] in inches)", "DNA Alteration") as num|null
|
||||
if(new_length)
|
||||
DNA.features["penis_size"] = clamp(round(new_length, 1), PENIS_MIN_LENGTH, PENIS_MAX_LENGTH)
|
||||
var/obj/item/organ/genital/penis/PP = H.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(DNA.features["penis_girth"] >= new_length)
|
||||
DNA.features["penis_girth"] = new_length - 1
|
||||
if(PP)
|
||||
PP.girth = DNA.features["penis_girth"]
|
||||
if(PP)
|
||||
PP.set_size(DNA.features["penis_size"])
|
||||
if("Penis Sheath")
|
||||
var/new_sheath = input(H, "Choose your penis sheath", "DNA Alteration") as null|anything in SHEATH_MODES
|
||||
if(new_sheath)
|
||||
DNA.features["penis_sheath"] = new_sheath
|
||||
var/obj/item/organ/genital/penis/PP = H.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(PP)
|
||||
PP.sheath = new_sheath
|
||||
if("Penis Girth")
|
||||
var/max_girth = PENIS_MAX_GIRTH
|
||||
if(DNA.features["penis_size"] >= max_girth)
|
||||
max_girth = DNA.features["penis_size"]
|
||||
var/new_girth = input(H, "Choose your penis girth:\n(1-[max_girth] (based on length) in inches)", "Character Preference") as num|null
|
||||
if(new_girth)
|
||||
DNA.features["penis_girth"] = clamp(round(new_girth, 1), 1, max_girth)
|
||||
var/obj/item/organ/genital/penis/PP = H.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(PP)
|
||||
PP.girth = DNA.features["penis_girth"]
|
||||
if("Balls Size")
|
||||
var/new_size = input(H, "Choose your character's balls size:", "Character Preference") as null|anything in GLOB.preference_balls_sizes
|
||||
if(new_size)
|
||||
DNA.features["balls_size"] = balls_description_to_size(new_size)
|
||||
var/obj/item/organ/genital/testicles/avocados = H.getorganslot(ORGAN_SLOT_TESTICLES)
|
||||
if(avocados)
|
||||
avocados.set_size(DNA.features["balls_size"])
|
||||
if("Body Size")
|
||||
var/new_body_size = input(H, "Choose your desired sprite size:\n([BODY_SIZE_MIN*100]%-[BODY_SIZE_MAX*100]%), Warning: May make your character look distorted", "Character Preference", DNA.features["body_size"]*100) as num|null
|
||||
if(new_body_size)
|
||||
new_body_size = clamp(new_body_size * 0.01, BODY_SIZE_MIN, BODY_SIZE_MAX)
|
||||
DNA.features["body_size"] = new_body_size
|
||||
DNA.update_body_size()
|
||||
H.mutant_renderkey = "" //Just in case
|
||||
H.update_mutant_bodyparts()
|
||||
|
||||
Reference in New Issue
Block a user