diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 1b92c35488c3..7bc37e5180bb 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -6,8 +6,6 @@ // Organ signals /// Called on the organ when it is implanted into someone (mob/living/carbon/receiver) #define COMSIG_ORGAN_IMPLANTED "comsig_organ_implanted" -/// Called when using the *wag emote -#define COMSIG_ORGAN_WAG_TAIL "comsig_wag_tail" /// Called on the organ when it is removed from someone (mob/living/carbon/old_owner) #define COMSIG_ORGAN_REMOVED "comsig_organ_removed" diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index b71353c789ae..7dbcd2710555 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -77,7 +77,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iszombie(A) (is_species(A, /datum/species/zombie)) #define isskeleton(A) (is_species(A, /datum/species/skeleton)) #define ismoth(A) (is_species(A, /datum/species/moth)) -#define isfelinid(A) (is_species(A, /datum/species/human/felinid)) #define isethereal(A) (is_species(A, /datum/species/ethereal)) #define isvampire(A) (is_species(A,/datum/species/vampire)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index bd6d2fac7213..c32f58377dd0 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -139,7 +139,6 @@ #define VV_HK_MOD_MUTATIONS "quirkmut" #define VV_HK_MOD_QUIRKS "quirkmod" #define VV_HK_SET_SPECIES "setspecies" -#define VV_HK_PURRBATION "purrbation" // misc #define VV_HK_SPACEVINE_PURGE "spacevine_purge" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 96a64aaee618..9bca5de30993 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -60,9 +60,9 @@ /proc/random_features() if(!GLOB.tails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/, GLOB.tails_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, GLOB.tails_list, add_blank = TRUE) if(!GLOB.tails_list_human.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) if(!GLOB.tails_list_lizard.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE) if(!GLOB.snouts_list.len) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 8507abfa375e..217acddc294e 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -487,7 +487,6 @@ GLOBAL_LIST_INIT(phobia_species, list( /datum/species/pod, /datum/species/shadow, )), - "anime" = typecacheof(list(/datum/species/human/felinid)), "conspiracies" = typecacheof(list( /datum/species/abductor, /datum/species/lizard, diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index d21460e24b80..0f8cc26528a9 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -107,7 +107,7 @@ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(checkObstacle)) playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1) - var/leap_word = isfelinid(user) ? "pounce" : "leap" //If cat, "pounce" instead of "leap". + var/leap_word = "leap" if(can_see(user, A, 7)) user.visible_message(span_warning("[user] [leap_word]s at [A]!"), span_danger("You [leap_word] at [A]!")) else @@ -157,7 +157,7 @@ var/mob/living/carbon/target = hit var/mob/living/carbon/human/T = target var/mob/living/carbon/human/S = user - var/tackle_word = isfelinid(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". + var/tackle_word = "tackle" //If cat, "pounce" instead of "tackle". var/roll = rollTackle(target) tackling = FALSE diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 050ff5ca1692..5884baecc74a 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -91,13 +91,6 @@ mood_change = -2 timeout = 2 MINUTES -/datum/mood_event/table/add_effects() - if(isfelinid(owner)) //Holy snowflake batman! - var/mob/living/carbon/human/H = owner - SEND_SIGNAL(H, COMSIG_ORGAN_WAG_TAIL, TRUE, 3 SECONDS) - description = "They want to play on the table!" - mood_change = 2 - /datum/mood_event/table_limbsmash description = "That fucking table, man that hurts..." mood_change = -3 diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm index 83644b7f9287..187ed6b610a2 100644 --- a/code/game/machinery/scan_gate.dm +++ b/code/game/machinery/scan_gate.dm @@ -8,7 +8,6 @@ #define SCANGATE_HUMAN "human" #define SCANGATE_LIZARD "lizard" -#define SCANGATE_FELINID "felinid" #define SCANGATE_FLY "fly" #define SCANGATE_PLASMAMAN "plasma" #define SCANGATE_MOTH "moth" @@ -146,8 +145,6 @@ scan_species = /datum/species/lizard if(SCANGATE_FLY) scan_species = /datum/species/fly - if(SCANGATE_FELINID) - scan_species = /datum/species/human/felinid if(SCANGATE_PLASMAMAN) scan_species = /datum/species/plasmaman if(SCANGATE_MOTH) @@ -278,7 +275,6 @@ #undef SCANGATE_HUMAN #undef SCANGATE_LIZARD -#undef SCANGATE_FELINID #undef SCANGATE_FLY #undef SCANGATE_PLASMAMAN #undef SCANGATE_MOTH diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 9cc01dbc0e2e..410cbc102fc9 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -135,21 +135,6 @@ else outmsg = span_warning("You miss the lens of [C] with [src]!") - //catpeople - for(var/mob/living/carbon/human/H in view(1,targloc)) - if(!isfelinid(H) || H.incapacitated() || H.is_blind()) - continue - if(user.body_position == STANDING_UP) - H.setDir(get_dir(H,targloc)) // kitty always looks at the light - if(prob(effectchance * diode.rating)) - H.visible_message(span_warning("[H] makes a grab for the light!"),span_userdanger("LIGHT!")) - H.Move(targloc) - log_combat(user, H, "moved with a laser pointer",src) - else - H.visible_message(span_notice("[H] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) - else - H.visible_message(span_notice("[H] stares at the light."), span_warning("You stare at the light...")) - //cats! for(var/mob/living/simple_animal/pet/cat/C in view(1,targloc)) if(prob(effectchance * diode.rating)) diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index a3fd73e6ecf6..48c436e61df7 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -210,9 +210,6 @@ /obj/item/hand_item/slapper/attack(mob/living/slapped, mob/living/carbon/human/user) SEND_SIGNAL(user, COMSIG_LIVING_SLAP_MOB, slapped) - if(ishuman(slapped)) - var/mob/living/carbon/human/human_slapped = slapped - SEND_SIGNAL(human_slapped, COMSIG_ORGAN_WAG_TAIL, FALSE) user.do_attack_animation(slapped) var/slap_volume = 50 diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 59091623424e..76fe9651c008 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -171,7 +171,6 @@ if(!istype(H)) return FALSE H.set_species(/datum/species/human, 1)//lizards go home - purrbation_remove(H)//remove cats H.dna.remove_all_mutations()//hulks out return TRUE diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 9bff493cf3d2..b6971ca8a3c0 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -88,19 +88,18 @@ if(!open) to_chat(user, span_warning("You need to open [src]'s door!")) return + if(target.mob_size > max_occupant_weight) if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(isfelinid(H)) - to_chat(user, span_warning("You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")) - else - to_chat(user, span_warning("Humans, generally, do not fit into pet carriers.")) + to_chat(user, span_warning("Humans, generally, do not fit into pet carriers.")) else to_chat(user, span_warning("You get the feeling [target] isn't meant for a [name].")) return + if(user == target) to_chat(user, span_warning("Why would you ever do that?")) return + load_occupant(user, target) /obj/item/pet_carrier/relaymove(mob/living/user, direction) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 74f75a92d586..25be415625fa 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -533,20 +533,6 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT) else to_chat(H, span_warning("You're not kawaii enough for this!"), confidential = TRUE) - if("masspurrbation") - if(!is_funmin) - return - mass_purrbation() - message_admins("[key_name_admin(holder)] has put everyone on \ - purrbation!") - log_admin("[key_name(holder)] has put everyone on purrbation.") - if("massremovepurrbation") - if(!is_funmin) - return - mass_remove_purrbation() - message_admins("[key_name_admin(holder)] has removed everyone from \ - purrbation.") - log_admin("[key_name(holder)] has removed everyone from purrbation.") if("massimmerse") if(!is_funmin) return diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index b553dd1dceb7..cf62ce4b2adf 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -302,6 +302,8 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /// Returns TRUE for a successful preference application. /// Returns FALSE if it is invalid. /datum/preferences/proc/write_preference(datum/preference/preference, preference_value) + if(ispath(preference)) + preference = GLOB.preference_entries[preference] var/savefile = get_savefile_for_savefile_identifier(preference.savefile_identifier) var/new_value = preference.deserialize(preference_value, src) var/success = preference.write(savefile, new_value) diff --git a/code/modules/client/preferences/augments/augments.dm b/code/modules/client/preferences/augments/augments.dm index a277c4d2a2ba..ff0224a9af85 100644 --- a/code/modules/client/preferences/augments/augments.dm +++ b/code/modules/client/preferences/augments/augments.dm @@ -22,10 +22,14 @@ for(var/slot in value - AUGMENT_SLOT_IMPLANTS) var/path = value[slot] var/datum/augment_item/A = GLOB.augment_items[path] + if(!A.can_apply_to_species(S.type)) + continue A.apply_to_human(target, S) for(var/datum/augment_item/A as anything in value[AUGMENT_SLOT_IMPLANTS]) A = GLOB.augment_items[A] + if(!A.can_apply_to_species(S)) + continue A.apply_to_human(target, S, value[AUGMENT_SLOT_IMPLANTS][A.type]) /datum/preference/blob/augments/create_default_value() diff --git a/code/modules/client/preferences/augments/implants/implant.dm b/code/modules/client/preferences/augments/implants/implant.dm index 5d166d4ce02c..7e34eff3a1a3 100644 --- a/code/modules/client/preferences/augments/implants/implant.dm +++ b/code/modules/client/preferences/augments/implants/implant.dm @@ -32,3 +32,12 @@ /datum/augment_item/implant/cat_ears/get_choices() return GLOB.ears_list +/datum/augment_item/implant/cat_tail + name = "Feline Tail" + path = /obj/item/organ/tail/cat + allowed_species = list( + SPECIES_HUMAN + ) + +/datum/augment_item/implant/cat_tail/get_choices() + return GLOB.tails_list_human diff --git a/code/modules/client/preferences/migrations/body_type_migration.dm b/code/modules/client/preferences/migrations/body_type_migration.dm deleted file mode 100644 index df599fd9aea6..000000000000 --- a/code/modules/client/preferences/migrations/body_type_migration.dm +++ /dev/null @@ -1,10 +0,0 @@ -/// Previously, body types could only be used on non-binary characters. -/// PR #62733 changed this to allow all characters to use body type. -/// This migration moves binary-gendered characters over to the "use gender" body type -/// so that old characters are preserved. -/datum/preferences/proc/migrate_body_types(savefile/savefile) - var/current_gender - - READ_FILE(savefile["gender"], current_gender) - if (current_gender == MALE || current_gender == FEMALE) - WRITE_FILE(savefile["body_type"], "Use gender") diff --git a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm b/code/modules/client/preferences/migrations/tgui_prefs_migration.dm deleted file mode 100644 index bc3c81a0d6be..000000000000 --- a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm +++ /dev/null @@ -1,26 +0,0 @@ -/// Handle the migrations necessary from pre-tgui prefs to post-tgui prefs -/datum/preferences/proc/migrate_preferences_to_tgui_prefs_menu() - migrate_key_bindings() - -// Key bindings used to be "key" -> list("action"), -// such as "X" -> list("swap_hands"). -// This made it impossible to determine any order, meaning placing a new -// hotkey would produce non-deterministic order. -// tgui prefs menu moves this over to "swap_hands" -> list("X"). -/datum/preferences/proc/migrate_key_bindings() - var/new_key_bindings = list() - - for (var/unbound_hotkey in key_bindings["Unbound"]) - new_key_bindings[unbound_hotkey] = list() - - for (var/hotkey in key_bindings) - if (hotkey == "Unbound") - continue - - for (var/keybind in key_bindings[hotkey]) - if (keybind in new_key_bindings) - new_key_bindings[keybind] |= hotkey - else - new_key_bindings[keybind] = list(hotkey) - - key_bindings = new_key_bindings diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 57b6ce955380..ac76dcac6d30 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,11 +1,11 @@ //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. -#define SAVEFILE_VERSION_MIN 32 +#define SAVEFILE_VERSION_MIN 42 //This is the current version, anything below this will attempt to update (if it's not obsolete) // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 42 +#define SAVEFILE_VERSION_MAX 43 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -42,63 +42,28 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //if your savefile is 3 months out of date, then 'tough shit'. /datum/preferences/proc/update_preferences(current_version, savefile/S) - if(current_version < 33) - toggles |= SOUND_ENDOFROUND - - if(current_version < 34) - write_preference(/datum/preference/toggle/auto_fit_viewport, TRUE) - - if(current_version < 35) //makes old keybinds compatible with #52040, sets the new default - var/newkey = FALSE - for(var/list/key in key_bindings) - for(var/bind in key) - if(bind == "quick_equipbelt") - key -= "quick_equipbelt" - key |= "quick_equip_belt" - - if(bind == "bag_equip") - key -= "bag_equip" - key |= "quick_equip_bag" - - if(bind == "quick_equip_suit_storage") - newkey = TRUE - if(!newkey && !key_bindings["ShiftQ"]) - key_bindings["ShiftQ"] = list("quick_equip_suit_storage") - - if(current_version < 36) - if(key_bindings["ShiftQ"] == "quick_equip_suit_storage") - key_bindings["ShiftQ"] = list("quick_equip_suit_storage") - - if(current_version < 37) - if(read_preference(/datum/preference/numeric/fps) == 0) - write_preference(GLOB.preference_entries[/datum/preference/numeric/fps], -1) - - if (current_version < 38) - var/found_block_movement = FALSE - - for (var/list/key in key_bindings) - for (var/bind in key) - if (bind == "block_movement") - found_block_movement = TRUE - break - if (found_block_movement) - break - - if (!found_block_movement) - LAZYADD(key_bindings["Ctrl"], "block_movement") - - if (current_version < 39) - LAZYADD(key_bindings["F"], "toggle_combat_mode") - LAZYADD(key_bindings["4"], "toggle_combat_mode") - if (current_version < 40) - LAZYADD(key_bindings["Space"], "hold_throw_mode") - - if (current_version < 41) - migrate_preferences_to_tgui_prefs_menu() + return /datum/preferences/proc/update_character(current_version, savefile/savefile) - if (current_version < 42) - migrate_body_types(savefile) + return + +/// Called when reading preferences if a savefile update is detected. This proc is for +/// overriding preference datum values before they are sanitized by deserialize() +/datum/preferences/proc/early_update_character(current_version, savefile/savefile) + if(current_version < 43) + var/species + READ_FILE(savefile["species"], species) + if(species == "felinid") + write_preference(/datum/preference/choiced/species, SPECIES_HUMAN) + + var/list/augs = read_preference(/datum/preference/blob/augments) + var/datum/augment_item/implant/ears = GLOB.augment_items[/datum/augment_item/implant/cat_ears] + var/datum/augment_item/implant/tail = GLOB.augment_items[/datum/augment_item/implant/cat_tail] + augs[AUGMENT_SLOT_IMPLANTS] = list( + ears.type = ears.get_choices()[1], + tail.type = tail.get_choices()[1] + ) + write_preference(/datum/preference/blob/augments, augs) /// checks through keybindings for outdated unbound keys and updates them /datum/preferences/proc/check_keybindings() @@ -288,6 +253,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(needs_update == -2) //fatal, can't load any data return FALSE + if(needs_update >= 0) + early_update_character(needs_update, S) + // Read everything into cache for (var/preference_type in GLOB.preference_entries) var/datum/preference/preference = GLOB.preference_entries[preference_type] @@ -337,12 +305,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) - // This is the version when the random security department was removed. - // When the minimum is higher than that version, it's impossible for someone to have the "Random" department. - #if SAVEFILE_VERSION_MIN > 40 - #warn The prefered_security_department check in code/modules/client/preferences/security_department.dm is no longer necessary. - #endif - //Write prefs WRITE_FILE(S["alt_job_titles"], alt_job_titles) diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 747d4f732cec..5cf57a264e0b 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -317,16 +317,14 @@ Key procs /datum/language/draconic = list(LANGUAGE_ATOM), /datum/language/moffic = list(LANGUAGE_ATOM), /datum/language/calcic = list(LANGUAGE_ATOM), - /datum/language/voltaic = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) + /datum/language/voltaic = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/uncommon = list(LANGUAGE_ATOM), /datum/language/machine = list(LANGUAGE_ATOM), /datum/language/draconic = list(LANGUAGE_ATOM), /datum/language/moffic = list(LANGUAGE_ATOM), /datum/language/calcic = list(LANGUAGE_ATOM), - /datum/language/voltaic = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) + /datum/language/voltaic = list(LANGUAGE_ATOM)) /datum/language_holder/moth understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), @@ -380,12 +378,6 @@ Key procs spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM)) -/datum/language_holder/felinid - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) - /datum/language_holder/shadowpeople understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/shadowtongue = list(LANGUAGE_ATOM)) diff --git a/code/modules/language/language_manuals.dm b/code/modules/language/language_manuals.dm index d174550e190b..b33c8c6d9ffa 100644 --- a/code/modules/language/language_manuals.dm +++ b/code/modules/language/language_manuals.dm @@ -64,7 +64,6 @@ . = ..() language = pick( \ /datum/language/voltaic, - /datum/language/nekomimetic, /datum/language/draconic, /datum/language/moffic, /datum/language/calcic, diff --git a/code/modules/language/nekomimetic.dm b/code/modules/language/nekomimetic.dm deleted file mode 100644 index 82edc2afcb57..000000000000 --- a/code/modules/language/nekomimetic.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/language/nekomimetic - name = "Nekomimetic" - desc = "To the casual observer, this langauge is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible." - key = "f" - space_chance = 70 - syllables = list( - "neko", "nyan", "mimi", "moe", "mofu", "fuwa", "kyaa", "kawaii", "poka", "munya", - "puni", "munyu", "ufufu", "uhuhu", "icha", "doki", "kyun", "kusu", "nya", "nyaa", - "desu", "kis", "ama", "chuu", "baka", "hewo", "boop", "gato", "kit", "sune", "yori", - "sou", "baka", "chan", "san", "kun", "mahou", "yatta", "suki", "usagi", "domo", "ori", - "uwa", "zaazaa", "shiku", "puru", "ira", "heto", "etto" - ) - icon_state = "neko" - default_priority = 90 diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index c33544864332..29691bf2681f 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -28,6 +28,7 @@ // Set up the dummy for its photoshoot mannequin.dna.species.replace_missing_bodyparts(mannequin) // Augments modify bodyparts, so we need to reset them incase augs were removed. + //mannequin.dna.species.regenerate_organs(mannequin, visual_only = TRUE) apply_prefs_to(mannequin, TRUE) switch(preview_pref) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index d9d96e6c465d..2ee9ca808a1c 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -24,6 +24,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) ///Let's extract our dummies organs and limbs for storage, to reduce the cache missed that spamming a dummy cause /mob/living/carbon/human/dummy/proc/harvest_organs() + // Poolable organs for(var/slot in list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_APPENDIX, \ ORGAN_SLOT_EYES, ORGAN_SLOT_EARS, ORGAN_SLOT_TONGUE, ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH)) var/obj/item/organ/current_organ = getorganslot(slot) //Time to cache it lads @@ -31,6 +32,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy SSwardrobe.stash_object(current_organ) + // Remaining poolable organs var/datum/species/current_species = dna.species for(var/organ_path in current_species.mutant_organs) var/obj/item/organ/current_organ = getorgan(organ_path) @@ -38,6 +40,10 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy SSwardrobe.stash_object(current_organ) + for(var/obj/item/organ/O as anything in organs) + O.Remove(src, special = TRUE) + qdel(O) + //Instead of just deleting our equipment, we save what we can and reinsert it into SSwardrobe's store //Hopefully this makes preference reloading not the worst thing ever /mob/living/carbon/human/dummy/delete_equipment() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 6bfbd75ea1b9..e8d0436be4cc 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -194,25 +194,6 @@ sound = 'sound/emotes/mothchitter.ogg' species_type_whitelist_typecache = list(/datum/species/moth) -//Felinid emotes -/datum/emote/living/meow - key = "meow" - key_third_person = "meows" - message = "meows!" - emote_type = EMOTE_AUDIBLE - vary = TRUE - sound = 'sound/emotes/meow.ogg' - species_type_whitelist_typecache = list(/datum/species/human/felinid) - -/datum/emote/living/purr //Ported from CitRP originally by buffyuwu. - key = "purr" - key_third_person = "purrs!" - message = "purrs!" - emote_type = EMOTE_AUDIBLE - vary = TRUE - sound = 'sound/voice/feline_purr.ogg' - species_type_whitelist_typecache = list(/datum/species/human/felinid) - //Shared custody between felinids and lizards /datum/emote/living/hiss key = "hiss" @@ -222,7 +203,7 @@ vary = TRUE sound = 'sound/emotes/hiss.ogg' mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) - species_type_whitelist_typecache = list(/datum/species/lizard, /datum/species/human/felinid) + species_type_whitelist_typecache = list(/datum/species/lizard) //Lizard emotes /datum/emote/living/rpurr diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index fb4cf7cef0a3..2ae60e90976d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -806,7 +806,6 @@ VV_DROPDOWN_OPTION(VV_HK_MOD_MUTATIONS, "Add/Remove Mutation") VV_DROPDOWN_OPTION(VV_HK_MOD_QUIRKS, "Add/Remove Quirks") VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species") - VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation") /mob/living/carbon/human/vv_do_topic(list/href_list) . = ..() @@ -867,26 +866,6 @@ var/newtype = GLOB.species_list[result] admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src] to [result]") set_species(newtype) - if(href_list[VV_HK_PURRBATION]) - if(!check_rights(R_SPAWN)) - return - if(!ishumanbasic(src)) - to_chat(usr, "This can only be done to the basic human species at the moment.") - return - var/success = purrbation_toggle(src) - if(success) - to_chat(usr, "Put [src] on purrbation.") - log_admin("[key_name(usr)] has put [key_name(src)] on purrbation.") - var/msg = span_notice("[key_name_admin(usr)] has put [key_name(src)] on purrbation.") - message_admins(msg) - admin_ticket_log(src, msg) - - else - to_chat(usr, "Removed [src] from purrbation.") - log_admin("[key_name(usr)] has removed [key_name(src)] from purrbation.") - var/msg = span_notice("[key_name_admin(usr)] has removed [key_name(src)] from purrbation.") - message_admins(msg) - admin_ticket_log(src, msg) /mob/living/carbon/human/limb_attack_self() var/obj/item/bodypart/arm = hand_bodyparts[active_hand_index] @@ -1045,9 +1024,6 @@ /mob/living/carbon/human/species/dullahan race = /datum/species/dullahan -/mob/living/carbon/human/species/felinid - race = /datum/species/human/felinid - /mob/living/carbon/human/species/fly race = /datum/species/fly diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm deleted file mode 100644 index 3e17807115b1..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ /dev/null @@ -1,158 +0,0 @@ -//Subtype of human -/datum/species/human/felinid - name = "\improper Felinid" - id = SPECIES_FELINE - say_mod = "meows" - - mutant_bodyparts = list("ears" = "Cat", "wings" = "None") - - mutantears = /obj/item/organ/ears/cat - cosmetic_organs = list( - /obj/item/organ/tail/cat = "Cat", - ) - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - species_language_holder = /datum/language_holder/felinid - disliked_food = GROSS | CLOTH | RAW - liked_food = SEAFOOD | ORANGES - var/original_felinid = TRUE //set to false for felinids created by mass-purrbation - payday_modifier = 0.75 - ass_image = 'icons/ass/asscat.png' - family_heirlooms = list(/obj/item/toy/cattoy) - examine_limb_id = SPECIES_HUMAN - -// Prevents felinids from taking toxin damage from carpotoxin -/datum/species/human/felinid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(istype(chem, /datum/reagent/toxin/carpotoxin)) - var/datum/reagent/toxin/carpotoxin/fish = chem - fish.toxpwr = 0 - - -/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! - H.dna.features["tail_cat"] = "Cat" - if(H.dna.features["ears"] == "None") - H.dna.features["ears"] = "Cat" - if(H.dna.features["ears"] == "Cat") - var/obj/item/organ/ears/cat/ears = new - ears.Insert(H, drop_if_replaced = FALSE) - else - mutantears = /obj/item/organ/ears - return ..() - -/proc/mass_purrbation() - for(var/M in GLOB.mob_list) - if(ishuman(M)) - purrbation_apply(M) - CHECK_TICK - -/proc/mass_remove_purrbation() - for(var/M in GLOB.mob_list) - if(ishuman(M)) - purrbation_remove(M) - CHECK_TICK - -/proc/purrbation_toggle(mob/living/carbon/human/H, silent = FALSE) - if(!ishumanbasic(H)) - return - if(!isfelinid(H)) - purrbation_apply(H, silent) - . = TRUE - else - purrbation_remove(H, silent) - . = FALSE - -/proc/purrbation_apply(mob/living/carbon/human/H, silent = FALSE) - if(!ishuman(H) || isfelinid(H)) - return - if(ishumanbasic(H)) - H.set_species(/datum/species/human/felinid) - var/datum/species/human/felinid/cat_species = H.dna.species - cat_species.original_felinid = FALSE - else - var/obj/item/organ/ears/cat/kitty_ears = new - var/obj/item/organ/tail/cat/kitty_tail = new - kitty_ears.Insert(H, TRUE, FALSE) //Gives nonhumans cat tail and ears - kitty_tail.Insert(H, TRUE, FALSE) - if(!silent) - to_chat(H, span_boldnotice("Something is nya~t right.")) - playsound(get_turf(H), 'sound/effects/meow1.ogg', 50, TRUE, -1) - -/proc/purrbation_remove(mob/living/carbon/human/H, silent = FALSE) - if(isfelinid(H)) - var/datum/species/human/felinid/cat_species = H.dna.species - if(!cat_species.original_felinid) - H.set_species(/datum/species/human) - else if(ishuman(H) && !ishumanbasic(H)) - var/datum/species/target_species = H.dna.species - for(var/obj/item/organ/current_organ as anything in H.cosmetic_organs) - if(istype(current_organ, /obj/item/organ/tail/cat)) - current_organ.Remove(H, TRUE) - var/obj/item/organ/tail/new_tail = locate(/obj/item/organ/tail) in target_species.cosmetic_organs - if(new_tail) - new_tail = new new_tail() - new_tail.Insert(H, TRUE, FALSE) - if(istype(current_organ, /obj/item/organ/ears/cat)) - var/obj/item/organ/new_ears = new target_species.mutantears - new_ears.Insert(H, TRUE, FALSE) - if(!silent) - to_chat(H, span_boldnotice("You are no longer a cat.")) - -/datum/species/human/felinid/prepare_human_for_preview(mob/living/carbon/human/human_for_preview) - human_for_preview.hairstyle = "Hime Cut" - human_for_preview.hair_color = "#ffcccc" // pink - human_for_preview.update_body_parts() - - var/obj/item/organ/ears/cat/cat_ears = human_for_preview.getorgan(/obj/item/organ/ears/cat) - if (cat_ears) - cat_ears.color = human_for_preview.hair_color - human_for_preview.update_body() - -/datum/species/human/felinid/get_species_description() - return "Felinids are one of the many types of bespoke genetic \ - modifications to come of humanity's mastery of genetic science, and are \ - also one of the most common. Meow?" - -/datum/species/human/felinid/get_species_lore() - return list( - "Bio-engineering at its felinest, Felinids are the peak example of humanity's mastery of genetic code. \ - One of many \"Animalid\" variants, Felinids are the most popular and common, as well as one of the \ - biggest points of contention in genetic-modification.", - - "Body modders were eager to splice human and feline DNA in search of the holy trifecta: ears, eyes, and tail. \ - These traits were in high demand, with the corresponding side effects of vocal and neurochemical changes being seen as a minor inconvenience.", - - "Sadly for the Felinids, they were not minor inconveniences. Shunned as subhuman and monstrous by many, Felinids (and other Animalids) \ - sought their greener pastures out in the colonies, cloistering in communities of their own kind. \ - As a result, outer Human space has a high Animalid population.", - ) - -// Felinids are subtypes of humans. -// This shouldn't call parent or we'll get a buncha human related perks (though it doesn't have a reason to). -/datum/species/human/felinid/create_pref_unique_perks() - var/list/to_add = list() - - to_add += list( - list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "grin-tongue", - SPECIES_PERK_NAME = "Grooming", - SPECIES_PERK_DESC = "Felinids can lick wounds to reduce bleeding.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "assistive-listening-systems", - SPECIES_PERK_NAME = "Sensitive Hearing", - SPECIES_PERK_DESC = "Felinids are more sensitive to loud sounds, such as flashbangs.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "shower", - SPECIES_PERK_NAME = "Hydrophobia", - SPECIES_PERK_DESC = "Felinids don't like getting soaked with water.", - ), - ) - - return to_add diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 6bc137a10a20..53cd10fc0925 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -229,10 +229,6 @@ if(methods & VAPOR) exposed_mob.adjust_wet_stacks(reac_volume * WATER_TO_WET_STACKS_FACTOR_VAPOR) // Spraying someone with water with the hope to put them out is just simply too funny to me not to add it. - if(!isfelinid(exposed_mob)) - return - exposed_mob.incapacitate(1) // startles the felinid, canceling any do_after - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "watersprayed", /datum/mood_event/watersprayed) #undef WATER_TO_WET_STACKS_FACTOR_TOUCH #undef WATER_TO_WET_STACKS_FACTOR_VAPOR @@ -592,13 +588,6 @@ race = /datum/species/jelly/slime chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/mutationtoxin/felinid - name = "Felinid Mutation Toxin" - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/human/felinid - taste_description = "something nyat good" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - /datum/reagent/mutationtoxin/lizard name = "Unathi Mutation Toxin" description = "A lizarding toxin." diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 33fd6d693bed..23573a113a03 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -263,16 +263,6 @@ category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL -/obj/item/disk/data/limbs/felinid - name = "Felinid Organ Design Disk" - limb_designs = list(/datum/design/cat_tail, /datum/design/cat_ears) - -/datum/design/limb_disk/felinid - name = "Felinid Organ Design Disk" - desc = "Contains designs for felinid organs for the limbgrower - Felinid ears and tail." - id = "limbdesign_felinid" - build_path = /obj/item/disk/data/limbs/felinid - /obj/item/disk/data/limbs/lizard name = "Unathi Organ Design Disk" limb_designs = list(/datum/design/lizard_tail, /datum/design/lizard_tongue) diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 4f7a0fac0b88..4ef548e84b07 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -17,7 +17,7 @@ dna_block = DNA_TAIL_BLOCK ///The original owner of this tail - var/original_owner //Yay, snowflake code! + var/datum/weakref/original_owner //Yay, snowflake code! /obj/item/organ/tail/Destroy() original_owner = null @@ -31,12 +31,12 @@ /obj/item/organ/tail/Insert(mob/living/carbon/reciever, special, drop_if_replaced) . = ..() if(.) - original_owner ||= reciever //One and done + original_owner ||= WEAKREF(reciever) //One and done SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "tail_lost") SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "tail_balance_lost") - if(original_owner == reciever) + if(original_owner?.resolve() == reciever) SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "wrong_tail_regained") else if(type in reciever.dna.species.cosmetic_organs) SEND_SIGNAL(reciever, COMSIG_ADD_MOOD_EVENT, "wrong_tail_regained", /datum/mood_event/tail_regained_wrong) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index e5a21dc5348d..bc67a9009b7d 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -30,7 +30,6 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, /datum/language/schechi, /datum/language/vox, )) @@ -208,7 +207,6 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, /datum/language/buzzwords )) @@ -349,7 +347,6 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, /datum/language/calcic )) @@ -428,7 +425,6 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, /datum/language/voltaic )) diff --git a/config/game_options.txt b/config/game_options.txt index 34b4a3701aa1..7e05e49829ab 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -313,7 +313,6 @@ SILICON_MAX_LAW_AMOUNT 12 ROUNDSTART_RACES human ## Races that are strictly worse than humans that could probably be turned on without balance concerns -ROUNDSTART_RACES felinid ROUNDSTART_RACES lizard #ROUNDSTART_RACES fly ROUNDSTART_RACES moth diff --git a/daedalus.dme b/daedalus.dme index bb4e8c07bbf0..70b2a4c87d58 100644 --- a/daedalus.dme +++ b/daedalus.dme @@ -2671,8 +2671,6 @@ #include "code\modules\client\preferences\middleware\_middleware.dm" #include "code\modules\client\preferences\middleware\keybindings.dm" #include "code\modules\client\preferences\middleware\legacy_toggles.dm" -#include "code\modules\client\preferences\migrations\body_type_migration.dm" -#include "code\modules\client\preferences\migrations\tgui_prefs_migration.dm" #include "code\modules\client\preferences\species_features\basic.dm" #include "code\modules\client\preferences\species_features\ethereal.dm" #include "code\modules\client\preferences\species_features\felinid.dm" @@ -3204,7 +3202,6 @@ #include "code\modules\language\monkey.dm" #include "code\modules\language\mushroom.dm" #include "code\modules\language\narsian.dm" -#include "code\modules\language\nekomimetic.dm" #include "code\modules\language\piratespeak.dm" #include "code\modules\language\schechi.dm" #include "code\modules\language\shadowtongue.dm" @@ -3514,7 +3511,6 @@ #include "code\modules\mob\living\carbon\human\species_types\android.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" #include "code\modules\mob\living\carbon\human\species_types\ethereal.dm" -#include "code\modules\mob\living\carbon\human\species_types\felinid.dm" #include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\golems.dm" #include "code\modules\mob\living\carbon\human\species_types\humans.dm"