Bubber Edits for mutant bodypart PR #2903

This is all the edits done squashed together.
This commit is contained in:
Mosley
2025-01-21 00:32:56 -07:00
committed by The Sharkening
parent 6df77ad80d
commit 9c7cf5ebaf
56 changed files with 169 additions and 96 deletions
-5
View File
@@ -36,11 +36,6 @@
/// Scarring on the left eye
#define LEFT_EYE_SCAR (1<<1)
/// Scarring on the right eye
#define RIGHT_EYE_SCAR (1<<0)
/// Scarring on the left eye
#define LEFT_EYE_SCAR (1<<1)
/// Helper to figure out if a limb is organic
#define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC)
/// Helper to figure out if a limb is robotic
+1
View File
@@ -1,3 +1,4 @@
// Additional message types for TGUI chat panel filtering
#define MESSAGE_TYPE_LOOC "looc"
#define MESSAGE_TYPE_REMOTE_LOOC "rlooc"
#define MESSAGE_TYPE_SUBTLE "subtle"
+2
View File
@@ -1,4 +1,6 @@
#define span_subtle(str) ("<span class='subtle'>" + str + "</span>")
#define span_subtlepda(str) ("<span class='subtlepda'>" + str + "</span>")
#define span_subtler(str) ("<span class='subtler'>" + str + "</span>")
#define span_velvet(str) ("<span class='velvet>" + str + "</span>")
#define span_velvet_notice(str) ("<span class='velvet_notice'>" + str + "</span>")
#define vote_font(str) ("<span class='vote'>" + str + "</span>")
+1
View File
@@ -89,6 +89,7 @@ GLOBAL_LIST_INIT(icemoon_ambience,list(
'sound/ambience/icemoon/ambiicesting3.ogg',
'sound/ambience/icemoon/ambiicesting4.ogg',
'sound/ambience/icemoon/ambiicesting5.ogg',
'modular_zubbers/sound/ambiance/bangle-freezer.ogg', // Bubber Edit - Credit: Bangle
))
GLOBAL_LIST_INIT(medical_ambience,list(
+6 -6
View File
@@ -52,18 +52,18 @@ SUBSYSTEM_DEF(pai)
return FALSE
switch(action)
if("submit")
candidate.comments = trim(params["comments"], MAX_BROADCAST_LEN)
candidate.description = trim(params["description"], MAX_BROADCAST_LEN)
candidate.name = trim(params["name"], MAX_NAME_LEN)
candidate.comments = reject_bad_name(params["comments"], allow_numbers = TRUE, max_length = MAX_BROADCAST_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
candidate.description = reject_bad_name(params["description"], allow_numbers = TRUE, max_length = MAX_BROADCAST_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
candidate.name = reject_bad_name(params["name"], allow_numbers = TRUE, max_length = MAX_NAME_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
candidate.ckey = user.ckey
candidate.ready = TRUE
ui.close()
submit_alert(user)
return TRUE
if("save")
candidate.comments = params["comments"]
candidate.description = params["description"]
candidate.name = params["name"]
candidate.comments = reject_bad_name(params["comments"], allow_numbers = TRUE, max_length = MAX_BROADCAST_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
candidate.description = reject_bad_name(params["description"], allow_numbers = TRUE, max_length = MAX_BROADCAST_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
candidate.name = reject_bad_name(params["name"], allow_numbers = TRUE, max_length = MAX_NAME_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
candidate.savefile_save(user)
return TRUE
if("load")
@@ -27,16 +27,16 @@
if(imprint_on_next_insertion) //We only want this set *once*
var/feature_name = receiver.dna.features[feature_key]
if (isnull(feature_name))
/* NOVA EDIT - Customization - ORIGINAL:
/* SKYRAT EDIT - Customization - ORIGINAL:
feature_name = receiver.dna.species.mutant_organs[parent.type]
*/ // NOVA EDIT START
*/ // SKYRAT EDIT START
if(!set_appearance_from_dna(receiver.dna))
set_appearance_from_name(receiver.dna.species.mutant_organs[parent.type])
// NOVA EDIT END
// NOVA EDIT START - Puts the following line in an else block
set_appearance_from_name(receiver.dna.species.mutant_organs[parent.type] || pick(get_global_feature_list()))
// SKYRAT EDIT END
// SKYRAT EDIT START - Puts the following line in an else block
else
set_appearance_from_name(feature_name)
// NOVA EDIT END
// SKYRAT EDIT END
imprint_on_next_insertion = FALSE
/datum/bodypart_overlay/mutant/get_overlay(layer, obj/item/bodypart/limb)
@@ -33,9 +33,9 @@
// Save the old DNA
transforming.dna.copy_dna(old_dna)
// Makes them into the new DNA
transforming.visual_only_organs = TRUE // NOVA EDIT ADDITION - Customization
transforming.visual_only_organs = TRUE // SKYRAT EDIT ADDITION - Customization
new_dna.transfer_identity(transforming)
transforming.visual_only_organs = FALSE // NOVA EDIT ADDITION - Customization
transforming.visual_only_organs = FALSE // SKYRAT EDIT ADDITION - Customization
transforming.real_name = new_dna.real_name
transforming.name = transforming.get_visible_name()
transforming.updateappearance(mutcolor_update = TRUE)
@@ -46,9 +46,9 @@
var/mob/living/carbon/transforming = owner
if(!QDELING(owner)) // Don't really need to do appearance stuff if we're being deleted
transforming.visual_only_organs = TRUE // NOVA EDIT ADDITION - Customization
transforming.visual_only_organs = TRUE // SKYRAT EDIT ADDITION - Customization
old_dna.transfer_identity(transforming)
transforming.visual_only_organs = FALSE // NOVA EDIT ADDITION - Customization
transforming.visual_only_organs = FALSE // SKYRAT EDIT ADDITION - Customization
transforming.updateappearance(mutcolor_update = TRUE)
transforming.domutcheck()
@@ -101,7 +101,9 @@
if("add_note")
if(!params["content"])
return FALSE
var/content = trim(params["content"], MAX_MESSAGE_LEN)
var/content = reject_bad_name(params["content"], allow_numbers = TRUE, max_length = MAX_MESSAGE_LEN, strict = TRUE, cap_after_symbols = FALSE)
if(!content)
return FALSE
var/datum/medical_note/new_note = new(usr.name, content)
while(length(target.medical_notes) > 2)
@@ -41,9 +41,9 @@
if(!field || !(field in target?.vars))
return FALSE
var/value = trim(params["value"], MAX_BROADCAST_LEN)
investigate_log("[key_name(user)] changed the field: \"[field]\" with value: \"[target.vars[field]]\" to new value: \"[value || "Unknown"]\"", INVESTIGATE_RECORDS)
target.vars[field] = value || "Unknown"
var/value = reject_bad_name(params["value"], allow_numbers = TRUE, max_length = MAX_BROADCAST_LEN, strict = TRUE, cap_after_symbols = FALSE) || "Unknown"
investigate_log("[key_name(user)] changed the field: \"[field]\" with value: \"[target.vars[field]]\" to new value: \"[value]\"", INVESTIGATE_RECORDS)
target.vars[field] = value
return TRUE
@@ -953,10 +953,10 @@
user.regenerate_icons()
user.name = user.get_visible_name()
current_profile = chosen_profile
// NOVA EDIT START
user.visual_only_organs = TRUE // NOVA EDIT ADDITION - Customization
// SKYRAT EDIT START
user.visual_only_organs = TRUE // SKYRAT EDIT ADDITION - Customization
chosen_dna.transfer_identity(user, TRUE)
user.visual_only_organs = FALSE // NOVA EDIT ADDITION - Customization
user.visual_only_organs = FALSE // SKYRAT EDIT ADDITION - Customization
user.updateappearance(mutcolor_update = TRUE, eyeorgancolor_update = TRUE)
user.regenerate_icons()
user.name = user.get_visible_name()
+1 -1
View File
@@ -276,7 +276,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (istype(requested_preference, /datum/preference/name))
tainted_character_profiles = TRUE
//SKYRAT EDIT
update_mutant_bodyparts(requested_preference)
update_body_parts(requested_preference)
for (var/datum/preference_middleware/preference_middleware as anything in middleware)
if (preference_middleware.post_set_preference(usr, requested_preference_key, value))
return TRUE
@@ -333,7 +333,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
if ( \
!isnull(relevant_inherent_trait) \
|| !isnull(relevant_mutant_bodypart) /* NOVA EDIT ADDITION - Since we still use relevant_mutant_bodypart, we need it here. */ \
|| !isnull(relevant_mutant_bodypart) /* SKYRAT EDIT ADDITION - Since we still use relevant_mutant_bodypart, we need it here. */ \
|| !isnull(relevant_external_organ) \
|| !isnull(relevant_head_flag) \
|| !isnull(relevant_body_markings) \
+1 -1
View File
@@ -34,7 +34,7 @@
//SKYRAT EDIT ADDITION
var/soft_player_cap = CONFIG_GET(number/player_soft_cap)
if(soft_player_cap >= TGS_CLIENT_COUNT)
if(soft_player_cap && TGS_CLIENT_COUNT >= soft_player_cap)
INVOKE_ASYNC(src, PROC_REF(connect_to_second_server))
//SKYRAT EDIT END
@@ -311,7 +311,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
qdel(existing_organ)
continue
if(existing_organ && !disallow_customizable_dna_features) // NOVA EDIT CHANGE - Though sometimes we might want to do that. - ORIGINAL: if(existing_organ)
if(existing_organ) // SKYRAT EDIT CHANGE - Though sometimes we might want to do that. - ORIGINAL: if(existing_organ)
// we dont want to remove organs that were not from the old species (such as from freak surgery or prosthetics)
if(existing_organ.type != old_organ_type && !replace_current)
continue
@@ -387,7 +387,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(old_species.type != type)
replace_body(human_who_gained_species, src)
regenerate_organs(human_who_gained_species, old_species, replace_current = human_who_gained_species.visual_only_organs, visual_only = human_who_gained_species.visual_only_organs) // NOVA EDIT - Allows existing organs to be properly removed when regenerating organs - ORIGINAL: regenerate_organs(human_who_gained_species, old_species, replace_current = FALSE, visual_only = human_who_gained_species.visual_only_organs)
regenerate_organs(human_who_gained_species, old_species, replace_current = human_who_gained_species.visual_only_organs, visual_only = human_who_gained_species.visual_only_organs) // SKYRAT EDIT - Allows existing organs to be properly removed when regenerating organs - ORIGINAL: regenerate_organs(human_who_gained_species, old_species, replace_current = FALSE, visual_only = human_who_gained_species.visual_only_organs)
// Update locked slots AFTER all organ and body stuff is handled
human_who_gained_species.hud_used?.update_locked_slots()
// Drop the items the new species can't wear
@@ -404,7 +404,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
//Resets blood if it is excessively high so they don't gib
normalize_blood(human_who_gained_species)
//add_body_markings(human_who_gained_species) // NOVA EDIT REMOVAL - We do this differently
//add_body_markings(human_who_gained_species) // SKYRAT EDIT REMOVAL - We do this differently
if(length(inherent_traits))
human_who_gained_species.add_traits(inherent_traits, SPECIES_TRAIT)
@@ -532,7 +532,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
species_human.apply_overlay(BODY_LAYER)
update_body_markings(species_human)
*/
//NOVA EDIT REMOVAL END
//SKYRAT EDIT REMOVAL END
//This exists so sprite accessories can still be per-layer without having to include that layer's
//number in their sprite name, which causes issues when those numbers change.
@@ -7,7 +7,7 @@
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
mutant_bodyparts = list("body_markings" = "None", "legs" = "Normal Legs") // NOVA EDIT CHANGE - ORIGINAL: body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "None")
mutant_bodyparts = list("body_markings" = "None", "legs" = "Normal Legs") // SKYRAT EDIT CHANGE - ORIGINAL: body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "None")
mutant_organs = list(
/obj/item/organ/external/horns = "None",
/obj/item/organ/external/frills = "None",
@@ -3,8 +3,8 @@
plural_form = "Mothmen"
id = SPECIES_MOTH
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
mutant_bodyparts = list("moth_markings" = "None") // NOVA EDIT CHANGE - ORIGINAL: body_markings = list(/datum/bodypart_overlay/simple/body_marking/moth = "None")
//mutant_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain") // NOVA EDIT REMOVAL - Fixing moths
mutant_bodyparts = list("moth_markings" = "None") // SKYRAT EDIT CHANGE - ORIGINAL: body_markings = list(/datum/bodypart_overlay/simple/body_marking/moth = "None")
//mutant_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain") // SKYRAT EDIT REMOVAL - Fixing moths
meat = /obj/item/food/meat/slab/human/mutant/moth
mutanttongue = /obj/item/organ/internal/tongue/moth
mutanteyes = /obj/item/organ/internal/eyes/moth
@@ -8,7 +8,7 @@
TRAIT_PLANT_SAFE,
)
mutant_organs = list(
// /obj/item/organ/external/pod_hair = "None", // NOVA EDIT REMOVAL - Customization (it messes up unit tests.)
// /obj/item/organ/external/pod_hair = "None", // SKYRAT EDIT REMOVAL - Customization (it messes up unit tests.)
)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
inherent_factions = list(FACTION_PLANTS, FACTION_VINES)
@@ -254,7 +254,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
QDEL_NULL(radio)
QDEL_NULL(countdown)
if(is_main_engine && GLOB.main_supermatter_engine == src)
SSpersistence.reset_delam_counter() // NOVA EDIT ADDITION BEGIN - DELAM SCRAM
SSpersistence.reset_delam_counter() // SKYRAT EDIT ADDITION BEGIN - DELAM SCRAM
GLOB.main_supermatter_engine = null
QDEL_NULL(soundloop)
return ..()
+1 -1
View File
@@ -994,7 +994,7 @@
markings_alpha = owner_species.markings_alpha
else
markings = list()
// NOVA EDIT END
// SKYRAT EDIT END
recolor_bodypart_overlays()
return TRUE
+3 -3
View File
@@ -67,9 +67,9 @@
// SKYRAT EDIT ADDITION START
if(!bodypart.owner.dna.mutant_bodyparts["spines"])
bodypart.owner.dna.mutant_bodyparts["spines"] = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_COLOR_LIST = list("#886600", "#886600", "#886600"))
// NOVA EDIT ADDITION END
var/feature_name = bodypart.owner.dna.mutant_bodyparts["spines"][MUTANT_INDEX_NAME] // NOVA EDIT CHANGE - ORIGINAL: var/feature_name = bodypart.owner.dna.features["spines"] //tail spines don't live in DNA, but share feature names with regular spines
tail_spines_overlay.set_appearance_from_dna(bodypart.owner.dna, feature_name, feature_key = "spines") // NOVA EDIT CHANGE - ORIGINAL: tail_spines_overlay.set_appearance_from_name(feature_name)
// SKYRAT EDIT ADDITION END
var/feature_name = bodypart.owner.dna.mutant_bodyparts["spines"][MUTANT_INDEX_NAME] // SKYRAT EDIT CHANGE - ORIGINAL: var/feature_name = bodypart.owner.dna.features["spines"] //tail spines don't live in DNA, but share feature names with regular spines
tail_spines_overlay.set_appearance_from_dna(bodypart.owner.dna, feature_name, feature_key = "spines") // SKYRAT EDIT CHANGE - ORIGINAL: tail_spines_overlay.set_appearance_from_name(feature_name)
bodypart.add_bodypart_overlay(tail_spines_overlay)
/// If we have a tail spines overlay, delete it
@@ -155,7 +155,7 @@
preference = "feature_human_ears"
//dna_block = DNA_EARS_BLOCK // NOVA EDIT REMOVAL - Customization - We have our own system to handle DNA.
//dna_block = DNA_EARS_BLOCK // SKYRAT EDIT REMOVAL - Customization - We have our own system to handle DNA.
bodypart_overlay = /datum/bodypart_overlay/mutant/cat_ears
@@ -169,7 +169,7 @@
var/inner_layer = EXTERNAL_FRONT
/datum/bodypart_overlay/mutant/cat_ears/get_global_feature_list()
return SSaccessories.sprite_accessories["ears"] // NOVA EDIT - Customization - ORIGINAL: return SSaccessories.ears_list
return SSaccessories.sprite_accessories["ears"] // SKYRAT EDIT - Customization - ORIGINAL: return SSaccessories.ears_list
/datum/bodypart_overlay/mutant/cat_ears/can_draw_on_bodypart(mob/living/carbon/human/human)
if((human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR))
@@ -50,7 +50,7 @@
/// indication that the eyes are undergoing some negative effect
var/damaged = FALSE
/// Native FOV that will be applied if a config is enabled
var/native_fov = NONE //NOVA EDIT CHANGE - ORIGINAL: var/native_fov = FOV_90_DEGREES
var/native_fov = NONE //SKYRAT EDIT CHANGE - ORIGINAL: var/native_fov = FOV_90_DEGREES
/// Scarring on this organ
var/scarring = NONE
@@ -125,7 +125,7 @@
organ_owner.update_tint()
organ_owner.update_sight()
is_emissive = FALSE // NOVA EDIT ADDITION
is_emissive = FALSE // SKYRAT EDIT ADDITION
UnregisterSignal(organ_owner, COMSIG_ATOM_BULLET_ACT)
/obj/item/organ/internal/eyes/proc/on_bullet_act(datum/source, obj/projectile/proj, def_zone)
+2 -2
View File
@@ -38,13 +38,13 @@
for(var/datum/infuser_entry/infuser_entry as anything in flatten_list(GLOB.infuser_entries))
var/output_organs = infuser_entry.output_organs
var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent)
// NOVA EDIT ADDITION START - Customization
// SKYRAT EDIT ADDITION START - Customization
lab_rat.dna.mutant_bodyparts["moth_antennae"] = list(MUTANT_INDEX_NAME = "Plain", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF"), MUTANT_INDEX_EMISSIVE_LIST = list(FALSE))
lab_rat.dna.mutant_bodyparts["tail"] = list(MUTANT_INDEX_NAME = "Light Tiger", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"))
lab_rat.dna.mutant_bodyparts["snout"] = list(MUTANT_INDEX_NAME = "Sharp + Light", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"))
lab_rat.dna.mutant_bodyparts["horns"] = list(MUTANT_INDEX_NAME = "Simple", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"))
lab_rat.dna.mutant_bodyparts["frills"] = list(MUTANT_INDEX_NAME = "Aquatic", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"))
// NOVA EDIT END
// SKYRAT EDIT END
var/list/obj/item/organ/inserted_organs = list()
// Attempt to insert entire list of mutant organs for the given infusion_entry.
@@ -1,4 +0,0 @@
author: "LT3"
delete-after: True
changes:
- rscdel: "Pun Pun's suit sensors are off by default"
@@ -1,4 +0,0 @@
author: "StrangeWeirdKitten"
delete-after: True
changes:
- bugfix: "Subtler will now filter out clientless mobs"
@@ -0,0 +1,4 @@
author: "StrangeWeirdKitten, Bangle"
delete-after: True
changes:
- rscadd: "Adds another ambiance track to Icebox called Freezer, by Bangle."
@@ -0,0 +1,4 @@
author: "MosleyTheMalO"
delete-after: True
changes:
- bugfix: "makes the softcap config disableable again"
+16
View File
@@ -143,3 +143,19 @@
- rscadd: 911 responder budget increased; they now have PDAs, holoprojectors, an
inducer, and... the marshal and SWAT teams no longer go in literally bare-handed
(the government finally paid for their gloves).
2025-01-13:
Cephalopod222:
- rscadd: Congratulations Homosexuals, Pride Scarves are now available to all crew!
LT3:
- rscdel: Pun Pun's suit sensors are off by default
- sound: Subtle now has a sound notification alongside subtler
- qol: Subtle/subtler now has a TG chat filter
- qol: Subtle and subtler messages are brighter when using dark mode
MosleyTheMalO:
- bugfix: Makes condoms work
- bugfix: fixes some lewd checks using the sex toy preference instead of the preference
they should
- bugfix: fixes all erp toggles resetting arousal.
- bugfix: makes toggling off sex toys actually remove the sex toys from your inventory.
StrangeWeirdKitten:
- bugfix: Subtler will now filter out clientless mobs
@@ -56,7 +56,7 @@
/datum/preference/toggle/erp/apply_to_client_updated(client/client, value)
. = ..()
var/mob/living/carbon/human/target = client?.mob
if(!value && istype(target))
if(!value && istype(target) && (src.type == /datum/preference/toggle/erp))
target.arousal = 0
target.pain = 0
target.pleasure = 0
@@ -74,13 +74,17 @@
if(ishuman(client.mob))
var/mob/living/carbon/human/target = client.mob
if(target.vagina != null)
target.dropItemToGround(target.vagina, TRUE, target.loc, TRUE, FALSE, TRUE)
target.dropItemToGround(target.vagina, TRUE, TRUE, FALSE)
target.vagina = null
if(target.anus != null)
target.dropItemToGround(target.anus, TRUE, target.loc, TRUE, FALSE, TRUE)
target.dropItemToGround(target.anus, TRUE, TRUE, FALSE)
target.anus = null
if(target.nipples != null)
target.dropItemToGround(target.nipples, TRUE, target.loc, TRUE, FALSE, TRUE)
target.dropItemToGround(target.nipples, TRUE, TRUE, FALSE)
target.nipples = null
if(target.penis != null)
target.dropItemToGround(target.penis, TRUE, target.loc, TRUE, FALSE, TRUE)
target.dropItemToGround(target.penis, TRUE, TRUE, FALSE)
target.penis = null
client.mob.hud_used.hidden_inventory_update(client.mob)
@@ -239,7 +239,7 @@
savefile_key = "feature_ears"
relevant_mutant_bodypart = "ears"
type_to_check = /datum/preference/toggle/mutant_toggle/ears
default_accessory_type = /datum/sprite_accessory/ears
default_accessory_type = /datum/sprite_accessory/ears/none
/datum/preference/tri_color/ears
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
@@ -288,7 +288,7 @@
save_data["modular_version"] = MODULAR_SAVEFILE_VERSION_MAX
/datum/preferences/proc/update_mutant_bodyparts(datum/preference/preference)
/datum/preferences/proc/update_body_parts(datum/preference/preference)
if (!preference.relevant_mutant_bodypart)
return
var/part = preference.relevant_mutant_bodypart
@@ -41,7 +41,7 @@
has_inner = TRUE
/datum/sprite_accessory/ears/mutant
icon = 'modular_nova/master_files/icons/mob/sprite_accessory/ears.dmi'
icon = 'modular_skyrat/master_files/icons/mob/sprite_accessory/ears.dmi'
organ_type = /obj/item/organ/internal/ears/mutant
color_src = USE_MATRIXED_COLORS
recommended_species = list(SPECIES_MAMMAL, SPECIES_HUMAN, SPECIES_SYNTH, SPECIES_FELINE, SPECIES_HUMANOID, SPECIES_GHOUL)
@@ -328,7 +328,7 @@
alter_parts(alterer)
alterer.mutant_renderkey = "" //Just in case
alterer.update_mutant_bodyparts()
alterer.update_body_parts()
/**
* Alter parts lets you adjust mutant bodyparts
@@ -401,7 +401,7 @@
alterer.dna.species.mutant_bodyparts[chosen_key] = new_acc_list
alterer.dna.mutant_bodyparts[chosen_key] = new_acc_list.Copy()
alterer.dna.update_uf_block(SSaccessories.dna_mutant_bodypart_blocks[chosen_key])
alterer.update_mutant_bodyparts()
alterer.update_body_parts()
alterer.update_clothing(ALL) // for any clothing that has alternate versions (e.g. muzzled masks)
/**
@@ -17,10 +17,10 @@
color = mutantpart_info[MUTANT_INDEX_COLOR_LIST][1]
/obj/item/organ/external/Remove(mob/living/carbon/organ_owner, special, movement_flags)
// NOVA EDIT ADDITION START
// SKYRAT EDIT ADDITION START
if(mutantpart_key)
transfer_mutantpart_info(organ_owner, special)
// NOVA EDIT ADDITION END
// SKYRAT EDIT ADDITION END
return ..()
/// Copies the organ's mutantpart_info to the owner's mutant_bodyparts
@@ -30,7 +30,7 @@
to_chat(user, span_warning("You need to aggressively grab someone to hypnotize them."))
return FALSE
if(!target_human.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
if(!target_human.client?.prefs?.read_preference(/datum/preference/toggle/erp/hypnosis))
to_chat(user, span_warning("[target_human] doesn't want to be hypnotized."))
return FALSE
@@ -18,7 +18,7 @@
if(refractory_period > REALTIMEOFDAY)
return
refractory_period = REALTIMEOFDAY + 30 SECONDS
if(has_status_effect(/datum/status_effect/climax_cooldown) || !client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
if(has_status_effect(/datum/status_effect/climax_cooldown) || !client?.prefs?.read_preference(/datum/preference/toggle/erp))
return
if(HAS_TRAIT(src, TRAIT_NEVERBONER) || has_status_effect(/datum/status_effect/climax_cooldown) || (!has_vagina() && !has_penis()))
@@ -60,7 +60,7 @@
span_userlove("You orgasm, it feels great, but nothing comes out of your penis!"))
else if(is_wearing_condom())
var/obj/item/clothing/sextoy/condom/condom = get_item_by_slot(LEWD_SLOT_PENIS)
var/obj/item/clothing/sextoy/condom/condom = src.penis // bruh 💀⚰️💀⚰️💀⚰️💀⚰️💀
condom.condom_use()
visible_message(span_userlove("[src] shoots [self_their] load into the [condom], filling it up!"), \
span_userlove("You shoot your thick load into the [condom] and it catches it all!"))
@@ -11,7 +11,7 @@
alert_type = null
/datum/status_effect/climax/tick(seconds_between_ticks)
if(!owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
if(!owner.client?.prefs?.read_preference(/datum/preference/toggle/erp))
return
var/mob/living/carbon/human/affected_mob = owner
@@ -30,7 +30,7 @@
// This one should not leave decals on the floor. Used in case if character cumming in beaker.
/datum/status_effect/masturbation_climax/tick(seconds_between_ticks)
if(!owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
if(!owner.client?.prefs?.read_preference(/datum/preference/toggle/erp))
return
var/mob/living/carbon/human/affected_mob = owner
@@ -20,7 +20,7 @@
/datum/status_effect/body_fluid_regen/vagina/tick(seconds_between_ticks)
var/mob/living/carbon/human/affected_human = owner
if(owner.stat >= DEAD || !owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy) || !istype(affected_human))
if(owner.stat >= DEAD || !owner.client?.prefs?.read_preference(/datum/preference/toggle/erp) || !istype(affected_human))
return FALSE
var/obj/item/organ/external/genital/vagina/vagina = owner.get_organ_slot(ORGAN_SLOT_VAGINA)
@@ -38,7 +38,7 @@
/datum/status_effect/body_fluid_regen/testes/tick(seconds_between_ticks)
var/mob/living/carbon/human/affected_human = owner
if(owner.stat >= DEAD || !owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy) || !istype(affected_human))
if(owner.stat >= DEAD || !owner.client?.prefs?.read_preference(/datum/preference/toggle/erp) || !istype(affected_human))
return FALSE
var/obj/item/organ/external/genital/testicles/testes = owner.get_organ_slot(ORGAN_SLOT_TESTICLES)
@@ -53,7 +53,7 @@
/datum/status_effect/body_fluid_regen/breasts/tick(seconds_between_ticks)
var/mob/living/carbon/human/affected_human = owner
if(owner.stat >= DEAD || !owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy) || !istype(affected_human))
if(owner.stat >= DEAD || !owner.client?.prefs?.read_preference(/datum/preference/toggle/erp) || !istype(affected_human))
return FALSE
var/obj/item/organ/external/genital/breasts/breasts = owner.get_organ_slot(ORGAN_SLOT_BREASTS)
@@ -24,7 +24,7 @@
victim = user
if(!(slot & ITEM_SLOT_EYES))
return
if(!(iscarbon(victim) && victim.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy)))
if(!(iscarbon(victim) && victim.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy) && victim.client?.prefs?.read_preference(/datum/preference/toggle/erp/hypnosis)))
return
if(codephrase != "")
victim.gain_trauma(new /datum/brain_trauma/very_special/induced_hypnosis(codephrase), TRAUMA_RESILIENCE_MAGIC)
@@ -371,7 +371,7 @@
return FALSE
var/obj/item/clothing/sextoy/condom/condom = penis
return condom.condom_state == TRAIT_CONDOM_BROKEN
return condom.condom_state != TRAIT_CONDOM_BROKEN
// For handling things that don't already have handcuff handlers.
/mob/living/carbon/human/set_handcuffed(new_value)
@@ -1,6 +1,6 @@
/obj/item/organ/internal/brain/on_life(seconds_per_tick, times_fired) //All your horny is here *points to the head*
. = ..()
var/mob/living/carbon/human/brain_owner = owner
if(istype(brain_owner, /mob/living/carbon/human) && brain_owner.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
if(istype(brain_owner, /mob/living/carbon/human) && brain_owner.client?.prefs?.read_preference(/datum/preference/toggle/erp))
if(!(organ_flags & ORGAN_FAILING))
brain_owner.dna.species.handle_arousal(brain_owner, seconds_per_tick, times_fired)
@@ -28,7 +28,7 @@
/// Handles throwing the arousal alerts to screen.
/datum/species/proc/handle_arousal(mob/living/carbon/human/target_human, atom/movable/screen/alert/aroused)
if(!target_human.client?.prefs?.read_preference(/datum/preference/toggle/erp/sex_toy))
if(!target_human.client?.prefs?.read_preference(/datum/preference/toggle/erp))
return
var/atom/movable/screen/alert/aroused/arousal_alert = target_human.alerts[AROUSED_ALERT]
@@ -89,7 +89,7 @@
//When condom equipped we doing stuff
/obj/item/clothing/sextoy/condom/lewd_equipped(mob/user, slot, initial)
. = ..()
if((slot == LEWD_SLOT_PENIS) && condom_state == "unused")
if((slot == ORGAN_SLOT_PENIS) && condom_state == "unused")
condom_state = "used"
update_icon_state()
update_icon()
@@ -45,6 +45,7 @@
/obj/item/clothing/glasses/thin = 5,
/obj/item/clothing/glasses/hud/ar/projector = 5,
/obj/item/clothing/neck/face_scarf = 5,
/obj/item/clothing/neck/scarf/pride = 5, //BUBBER EDIT: ADDS PRIDE SCARVES
/obj/item/clothing/gloves/bracer/wraps,
),
),
@@ -23,7 +23,6 @@
reagent_flags = PROCESS_SYNTHETIC
payday_modifier = 1.0 // Matches the rest of the pay penalties the non-human crew have
species_language_holder = /datum/language_holder/machine
mutant_organs = list(/obj/item/organ/internal/cyberimp/arm/power_cord/left_arm)
mutantbrain = /obj/item/organ/internal/brain/synth
mutantstomach = /obj/item/organ/internal/stomach/synth
mutantears = /obj/item/organ/internal/ears/synth
+11 -6
View File
@@ -41,7 +41,7 @@
var/space = should_have_space_before_emote(html_decode(subtle_emote)[1]) ? " " : ""
subtle_message = span_emote("<b>[user]</b>[space]<i>[user.say_emphasis(subtle_message)]</i>")
subtle_message = span_subtle("<b>[user]</b>[space]<i>[user.say_emphasis(subtle_message)]</i>")
var/list/viewers = get_hearers_in_view(SUBTLE_ONE_TILE, user)
@@ -55,10 +55,15 @@
for(var/mob/ghost as anything in GLOB.dead_mob_list)
if((ghost.client?.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(ghost in viewers))
ghost.show_message(subtle_message)
to_chat(ghost, "[FOLLOW_LINK(ghost, user)] [subtle_message]")
for(var/mob/receiver in viewers)
receiver.show_message(subtle_message, alt_msg = subtle_message)
// Optional sound notification
if(!isobserver(receiver))
var/datum/preferences/prefs = receiver.client?.prefs
if(prefs && prefs.read_preference(/datum/preference/toggle/subtler_sound))
receiver.playsound_local(get_turf(receiver), 'sound/effects/achievement/glockenspiel_ping.ogg', 50)
return TRUE
@@ -132,7 +137,7 @@
var/space = should_have_space_before_emote(html_decode(subtler_emote)[1]) ? " " : ""
subtler_message = span_emote("<b>[user]</b>[space]<i>[user.say_emphasis(subtler_message)]</i>")
subtler_message = span_subtler("<b>[user]</b>[space]<i>[user.say_emphasis(subtler_message)]</i>")
if(istype(target, /mob))
var/mob/target_mob = target
@@ -140,7 +145,7 @@
var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user]
if((get_dist(user.loc, target_mob.loc) <= subtler_range) || (hologram && get_dist(hologram.loc, target_mob.loc) <= subtler_range))
target_mob.show_message(subtler_message, alt_msg = subtler_message)
// Subtler sounds
// Optional sound notification
var/datum/preferences/prefs = target_mob.client?.prefs
if(prefs && prefs.read_preference(/datum/preference/toggle/subtler_sound))
target_mob.playsound_local(get_turf(target_mob), 'sound/effects/achievement/glockenspiel_ping.ogg', 50)
@@ -150,7 +155,7 @@
var/obj/effect/overlay/holo_pad_hologram/hologram = target
if(hologram.Impersonation?.client)
hologram.Impersonation.show_message(subtler_message, alt_msg = subtler_message)
// Subtler sounds
// Optional sound notification
var/datum/preferences/prefs = hologram.Impersonation.client?.prefs
if(prefs && prefs.read_preference(/datum/preference/toggle/subtler_sound))
hologram.Impersonation.playsound_local(get_turf(hologram.Impersonation), 'sound/effects/achievement/glockenspiel_ping.ogg', 50)
@@ -167,7 +172,7 @@
for(var/mob/receiver in ghostless)
receiver.show_message(subtler_message, alt_msg = subtler_message)
// Subtler sounds
// Optional sound notification
var/datum/preferences/prefs = receiver.client?.prefs
if(prefs && prefs.read_preference(/datum/preference/toggle/subtler_sound))
receiver.playsound_local(get_turf(receiver), 'sound/effects/achievement/glockenspiel_ping.ogg', 50)
@@ -96,7 +96,7 @@
// Apply Appearance
user.regenerate_organs() // Actually regenerates the mutant_bodyparts.
user.update_body(TRUE) // Outfit and underware, also body.
user.update_mutant_bodyparts(TRUE) // Lizard tails etc
user.update_body_parts(TRUE) // Lizard tails etc
RegisterSignal(user, COMSIG_HUMAN_GET_VISIBLE_NAME, PROC_REF(return_disguise_name))
@@ -559,3 +559,26 @@
greyscale_colors = null
is_tied = TRUE
clip_on = TRUE
//PRIDE SCARVES, SPRITES BY Cephalopod222 OF BUBBERSTATION
/obj/item/clothing/neck/scarf/pride
name = "pride scarf"
desc = "A Nanotrasen made nano-weave scarf to show off your favourite flavour of gay and keep you nice and warm! Congratulations!"
icon = 'modular_zubbers/icons/obj/clothing/neck/neck.dmi'
icon_preview = 'modular_zubbers/icons/obj/clothing/neck/neck.dmi'
worn_icon = 'modular_zubbers/icons/mob/clothing/neck/neck.dmi'
icon_state = "scarf_rainbow"
icon_state_preview = "scarf_rainbow"
greyscale_colors = null
greyscale_config = null
greyscale_config_worn = null
obj_flags = UNIQUE_RENAME | INFINITE_RESKIN
unique_reskin = list(
"Rainbow Scarf" = "scarf_rainbow",
"Bisexual Scarf" = "scarf_bi",
"Pansexual Scarf" = "scarf_pan",
"Asexual Scarf" = "scarf_ace",
"Gay Scarf" = "scarf_gay",
"Transgender Scarf" = "scarf_trans",
"Lesbian Scarf" = "scarf_lesbian",
)
@@ -18,3 +18,8 @@
/datum/loadout_item/neck/bunnypendant
name = "Rabbit Pendant"
item_path = /obj/item/clothing/neck/bunny_pendant
/datum/loadout_item/neck/scarf/pride
name = "Pride Scarf"
item_path = /obj/item/clothing/neck/scarf/pride
can_be_reskinned = TRUE
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.
@@ -42,6 +42,7 @@ export const MESSAGE_TYPE_DEBUG = 'debug';
export const MESSAGE_TYPE_MENTOR = 'mentor';
export const MESSAGE_TYPE_LOOC = 'looc';
export const MESSAGE_TYPE_REMOTE_LOOC = 'rlooc';
export const MESSAGE_TYPE_SUBTLE = 'subtle';
// BUBBER EDIT ADDITION END
// Metadata for each message type
@@ -107,6 +108,12 @@ export const MESSAGE_TYPES = [
description: 'Local OOC messages.',
selector: '.looc',
},
{
type: MESSAGE_TYPE_SUBTLE,
name: 'Subtle',
description: 'Subtle and Subtler actions.',
selector: '.subtle, .subtler',
},
{
type: MESSAGE_TYPE_MENTOR,
name: 'Mentor Log',
@@ -1315,7 +1315,7 @@ $border-width-px: $border-width * 1px;
background-color: darken(map.get($alert-stripe-colors, $color-name), 5);
}
}
/* SKYRAT EDIT ADDITION START - DARK MODE CLASSES */
/* BUBBER EDIT ADDITION START - DARK MODE CLASSES */
.mentor {
color: #8a2be2;
@@ -1413,9 +1413,13 @@ $border-width-px: $border-width * 1px;
font-style: italic;
}
// SKYRAT EDIT ADDITION END
.subtle {
color: #abc6ec;
}
/* BUBBER EDIT ADDITION BEGIN - DARK MODE CLASSES */
.subtler {
color: #e2c1ff;
}
.subtlepda {
color: #eb6bff;
@@ -1332,6 +1332,14 @@ $border-width-px: $border-width * 1px;
}
}
.subtle {
color: #000099;
}
.subtler {
color: #4a00b3;
}
.subtlepda {
color: #9e008c;
}
@@ -1,8 +1,8 @@
import { CheckboxInput, FeatureToggle } from '../../base';
export const subtler_sound: FeatureToggle = {
name: 'Toggle Subtler Sound',
name: 'Toggle Subtle/r Sound',
category: 'SOUND',
description: 'Toggles whether you hear subtler emote sound effects',
description: 'Toggles whether you hear subtle/r emote sound effects',
component: CheckboxInput,
};