From ebf275c2bc5bf8f9cd07e786b251b530f1a6cfe9 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 01:14:11 +0300 Subject: [PATCH 01/14] [MODULAR] Down By The River: Telepathy improvements & telepathic quirk (#1930) * Refactor telepathy power to point-target, add reply functionality & telepathic quirk * Fix CI issues * Let silicons pick telepathic quirk as well * Handle the fact that silicons don't have DNA (or mutations) in telepathic quirk * Apply suggestions from code review * Use proper procs for runechat creation * Apply suggestions from code review * Remove blocked return (unneeded) * Apply suggestions from code review * Reorder last-target checks to actually occur only on secondary * Improve autoformatting and improve ghost observer output * Minor formatting improvements to telepathy observer line * Allow telepaths to discern who's sending them telepathic messages * Attempt logging fix --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../telepathy_quirk/code/telepathy_action.dm | 125 ++++++++++++++++++ .../telepathy_quirk/code/telepathy_quirk.dm | 34 +++++ .../code/telepathy_reply_emote.dm | 17 +++ tgstation.dme | 3 + 4 files changed, 179 insertions(+) create mode 100644 modular_nova/modules/telepathy_quirk/code/telepathy_action.dm create mode 100644 modular_nova/modules/telepathy_quirk/code/telepathy_quirk.dm create mode 100644 modular_nova/modules/telepathy_quirk/code/telepathy_reply_emote.dm diff --git a/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm b/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm new file mode 100644 index 00000000000..e2ab3ef5e32 --- /dev/null +++ b/modular_nova/modules/telepathy_quirk/code/telepathy_action.dm @@ -0,0 +1,125 @@ +/datum/mutation/human/telepathy + power_path = /datum/action/cooldown/spell/pointed/telepathy + +/datum/action/cooldown/spell/pointed/telepathy + name = "Telepathic Communication" + desc = "Left click: point target to project a thought to them. Right click: project to your last thought target, if in range." + button_icon = 'icons/mob/actions/actions_revenant.dmi' + button_icon_state = "r_transmit" + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC + antimagic_flags = MAGIC_RESISTANCE_MIND + cooldown_time = 1 SECONDS + cast_range = 7 + /// What's the last mob we point-targeted with this ability? + var/datum/weakref/last_target_ref + /// The message we send + var/message + /// Are we blocking casts? + var/blocked = FALSE + +/datum/action/cooldown/spell/pointed/telepathy/is_valid_target(atom/cast_on) + . = ..() + if (!.) + return FALSE + + if (!isliving(cast_on)) + to_chat(owner, span_warning("Inanimate objects can't hear your thoughts.")) + owner.balloon_alert(owner, "not a thing with thoughts!") + return FALSE + + var/mob/living/living_target = cast_on + if (living_target.stat == DEAD) + to_chat(owner, span_warning("The disruptive noise of departed resonance inhibits your ability to communicate with the dead.")) + owner.balloon_alert(owner, "can't transmit to the dead!") + return FALSE + + if (get_dist(living_target, owner) > cast_range) + owner.balloon_alert(owner, "too far away!") + return FALSE + + return TRUE + +/datum/action/cooldown/spell/pointed/telepathy/before_cast(atom/cast_on) + . = ..() + if(. & SPELL_CANCEL_CAST || blocked) + return + + message = autopunct_bare(capitalize(tgui_input_text(owner, "What do you wish to whisper to [cast_on]?", "[src]"))) + if(QDELETED(src) || QDELETED(owner) || QDELETED(cast_on) || !can_cast_spell()) + return . | SPELL_CANCEL_CAST + + if(get_dist(cast_on, owner) > cast_range) + owner.balloon_alert(owner, "they're too far!") + return . | SPELL_CANCEL_CAST + + if(!message) + reset_spell_cooldown() + return . | SPELL_CANCEL_CAST + +/datum/action/cooldown/spell/pointed/telepathy/Trigger(trigger_flags, atom/target) + if (trigger_flags & TRIGGER_SECONDARY_ACTION) + var/mob/living/last_target = last_target_ref?.resolve() + + if(isnull(last_target)) + last_target_ref = null + owner.balloon_alert(owner, "last target is not available!") + return + else if(get_dist(last_target, owner) > cast_range) + owner.balloon_alert(owner, "[last_target] is too far away!") + return + + blocked = TRUE + + message = autopunct_bare(capitalize(tgui_input_text(owner, "What do you wish to whisper to [last_target]?", "[src]"))) + if(QDELETED(src) || QDELETED(owner) || QDELETED(last_target) || !can_cast_spell()) + blocked = FALSE + return + send_thought(owner, last_target, message) + src.StartCooldown() + blocked = FALSE + return + + . = ..() + +/datum/action/cooldown/spell/pointed/telepathy/cast(mob/living/cast_on) + . = ..() + send_thought(owner, cast_on, message) + +/datum/action/cooldown/spell/pointed/telepathy/proc/send_thought(mob/living/caster, mob/living/target, message) + log_directed_talk(caster, target, message, LOG_SAY, tag = "telepathy") + + last_target_ref = WEAKREF(target) + + to_chat(owner, span_boldnotice("You reach out and convey to [target]: \"[span_purple(message)]\"")) + // flub a runechat chat message, do something with the language later + if(owner.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) + owner.create_chat_message(owner, owner.get_selected_language(), message, list("italics")) + if(!target.can_block_magic(antimagic_flags, charge_cost = 0) && target.client) //make sure we've got a client before we bother sending anything + //different messaging if the target has the telepathy mutation themselves themselves + if (ishuman(target)) + var/mob/living/carbon/human/human_target = target + var/datum/mutation/human/telepathy/tele_mut = human_target.dna.get_mutation(/datum/mutation/human/telepathy) + + if (tele_mut) + to_chat(target, span_boldnotice("[caster]'s psychic presence resounds in your mind: \"[span_purple(message)]\"")) + else + to_chat(target, span_boldnotice("A voice echoes in your head: \"[span_purple(message)]\"")) + + if(target.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) + target.create_chat_message(target, target.get_selected_language(), message, list("italics")) // it appears over them since they hear it in their head + else + owner.balloon_alert(owner, "something blocks your thoughts!") + to_chat(owner, span_warning("Your mind encounters impassable resistance: the thought was blocked!")) + return + + // send to ghosts as well i guess + for(var/mob/dead/ghost as anything in GLOB.dead_mob_list) + if(!isobserver(ghost)) + continue + + var/from_link = FOLLOW_LINK(ghost, owner) + var/from_mob_name = span_boldnotice("[owner]") + var/to_link = FOLLOW_LINK(ghost, target) + var/to_mob_name = span_name("[target]") + + to_chat(ghost, "[from_link] " + span_purple("\[Telepathy\] [from_mob_name] transmits, \"[message]\"") + " to [to_mob_name] [to_link]") diff --git a/modular_nova/modules/telepathy_quirk/code/telepathy_quirk.dm b/modular_nova/modules/telepathy_quirk/code/telepathy_quirk.dm new file mode 100644 index 00000000000..5cbcfb275f6 --- /dev/null +++ b/modular_nova/modules/telepathy_quirk/code/telepathy_quirk.dm @@ -0,0 +1,34 @@ +/datum/quirk/telepathic + name = "Telepathic" + desc = "You are able to transmit your thoughts to other living creatures." + gain_text = span_purple("Your mind roils with psychic energy.") + lose_text = span_notice("Mundanity encroaches upon your thoughts once again.") + medical_record_text = "Patient has an unusually enlarged Broca's area visible in cerebral biology, and appears to be able to communicate via extrasensory means." + value = 0 + icon = FA_ICON_HEAD_SIDE_COUGH + /// Ref used to easily retrieve the action used when removing the quirk from silicons + var/datum/weakref/tele_action_ref + +/datum/quirk/telepathic/add(client/client_source) + if (iscarbon(quirk_holder)) + var/mob/living/carbon/human/human_holder = quirk_holder + + if (!human_holder.dna.activate_mutation(/datum/mutation/human/telepathy)) + human_holder.dna.add_mutation(/datum/mutation/human/telepathy, MUT_OTHER) + else if (issilicon(quirk_holder)) + var/mob/living/silicon/robot_holder = quirk_holder + var/datum/action/cooldown/spell/pointed/telepathy/tele_action = new + + tele_action.Grant(robot_holder) + tele_action_ref = WEAKREF(tele_action) + +/datum/quirk/telepathic/remove() + var/datum/action/cooldown/spell/pointed/telepathy/tele_action = tele_action_ref?.resolve() + if (isnull(tele_action)) + tele_action_ref = null + if (iscarbon(quirk_holder)) + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.dna.remove_mutation(/datum/mutation/human/telepathy) + else if (issilicon(quirk_holder) && !isnull(tele_action)) + QDEL_NULL(tele_action) + tele_action_ref = null diff --git a/modular_nova/modules/telepathy_quirk/code/telepathy_reply_emote.dm b/modular_nova/modules/telepathy_quirk/code/telepathy_reply_emote.dm new file mode 100644 index 00000000000..adf5e672599 --- /dev/null +++ b/modular_nova/modules/telepathy_quirk/code/telepathy_reply_emote.dm @@ -0,0 +1,17 @@ +/datum/emote/living/telepathy_reply + key = "treply" + key_third_person = "treply" + cooldown = 4 SECONDS + +/datum/emote/living/telepathy_reply/run_emote(mob/living/user, params, type_override, intentional) + if (ishuman(user) && intentional) + var/mob/living/carbon/human/human_user = user + var/datum/mutation/human/telepathy/mutation = human_user.dna.get_mutation(/datum/mutation/human/telepathy) + if (mutation) + var/datum/action/cooldown/spell/pointed/telepathy/tele_action = locate() in user.actions + // just straight up call the right-click action as is + if (tele_action) + tele_action.Trigger(TRIGGER_SECONDARY_ACTION) + tele_action.blocked = FALSE + + return ..() diff --git a/tgstation.dme b/tgstation.dme index 3c46f9f6b60..fca09db7cbf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8069,6 +8069,9 @@ #include "modular_nova\modules\tarkon\code\misc_fluff\research.dm" #include "modular_nova\modules\tarkon\code\misc_fluff\spawner.dm" #include "modular_nova\modules\tarkon\code\misc_fluff\tools.dm" +#include "modular_nova\modules\telepathy_quirk\code\telepathy_action.dm" +#include "modular_nova\modules\telepathy_quirk\code\telepathy_quirk.dm" +#include "modular_nova\modules\telepathy_quirk\code\telepathy_reply_emote.dm" #include "modular_nova\modules\tesh_augments\code\all_nodes.dm" #include "modular_nova\modules\tesh_augments\code\limbs.dm" #include "modular_nova\modules\tesh_augments\code\mechfabricator_designs.dm" From bb14249879f00dc2b2d575abef42cf6ef4670440 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 01:29:53 +0300 Subject: [PATCH 02/14] [MODULAR] Crime DLC #1: Underworld Connections quirk for exploitables access & roundstart black market uplink (customizable) (#2185) * Initial commit of Crime DLC 1 * Change keys to satisfy CI? * Use short text input for description * CI fix attempt 2 * Remove unused import * Fix duplicated price min * Policy request: make sure users know they're not antags for taking the UC quirk * Don't remove security notes upon quirk removal * Code review suggestions * Apply suggestions from code review * Replace CIN mention * Fix defunct replacetext and also clarify weapons permit difficulties in quirk description * Prevent jobrole prisoners from using Underworld Connections quirk (by popular request) * Remove broken uplink customization icon * Make black market uplinks small items --------- Co-authored-by: Ephemeralis Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/~nova_defines/jobs.dm | 6 +- .../customization/modules/jobs/_job.dm | 3 +- .../code/black_market_uplink.dm | 2 + .../code/markets/base_black_market.dm | 222 ++++++++++++++++++ .../code/underworld_connections_quirk.dm | 147 ++++++++++++ tgstation.dme | 3 + .../nova/underworld_connections.tsx | 22 ++ 7 files changed, 402 insertions(+), 3 deletions(-) create mode 100644 modular_nova/modules/underworld_connections/code/black_market_uplink.dm create mode 100644 modular_nova/modules/underworld_connections/code/markets/base_black_market.dm create mode 100644 modular_nova/modules/underworld_connections/code/underworld_connections_quirk.dm create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/underworld_connections.tsx diff --git a/code/__DEFINES/~nova_defines/jobs.dm b/code/__DEFINES/~nova_defines/jobs.dm index 7aa6486c9d5..a8cc61a9cf7 100644 --- a/code/__DEFINES/~nova_defines/jobs.dm +++ b/code/__DEFINES/~nova_defines/jobs.dm @@ -6,9 +6,11 @@ #define JOB_UNAVAILABLE_FLAVOUR (JOB_UNAVAILABLE_LANGUAGE + 1) #define JOB_UNAVAILABLE_AUGMENT (JOB_UNAVAILABLE_FLAVOUR + 1) -#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Hemiplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "No Guns" = TRUE, "Illiterate" = TRUE, "Nerve Stapled" = TRUE -#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE +#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Hemiplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "No Guns" = TRUE, "Illiterate" = TRUE, "Nerve Stapled" = TRUE, "Underworld Connections" = TRUE +#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE, "Underworld Connections" = TRUE +#define HEAD_RESTRICTED_QUIRKS_QM "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE #define GUARD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "Nerve Stapled" = TRUE +#define PRISONER_RESTRICTED_QUIRKS "Underworld Connections" = TRUE #define RESTRICTED_QUIRKS_EXCEPTIONS list("Mute" = "Signer") diff --git a/modular_nova/modules/customization/modules/jobs/_job.dm b/modular_nova/modules/customization/modules/jobs/_job.dm index 189e643e2ff..f053abc3390 100644 --- a/modular_nova/modules/customization/modules/jobs/_job.dm +++ b/modular_nova/modules/customization/modules/jobs/_job.dm @@ -117,7 +117,7 @@ banned_augments = list(HEAD_RESTRICTED_AUGMENTS) /datum/job/quartermaster - banned_quirks = list(HEAD_RESTRICTED_QUIRKS) + banned_quirks = list(HEAD_RESTRICTED_QUIRKS_QM) banned_augments = list(HEAD_RESTRICTED_AUGMENTS) //Silicon @@ -142,6 +142,7 @@ /datum/job/prisoner required_languages = null + banned_quirks = list(PRISONER_RESTRICTED_QUIRKS) /datum/job/orderly banned_quirks = list(GUARD_RESTRICTED_QUIRKS) diff --git a/modular_nova/modules/underworld_connections/code/black_market_uplink.dm b/modular_nova/modules/underworld_connections/code/black_market_uplink.dm new file mode 100644 index 00000000000..42a060cca60 --- /dev/null +++ b/modular_nova/modules/underworld_connections/code/black_market_uplink.dm @@ -0,0 +1,2 @@ +/obj/item/market_uplink + w_class = WEIGHT_CLASS_SMALL diff --git a/modular_nova/modules/underworld_connections/code/markets/base_black_market.dm b/modular_nova/modules/underworld_connections/code/markets/base_black_market.dm new file mode 100644 index 00000000000..9b13c31b9bf --- /dev/null +++ b/modular_nova/modules/underworld_connections/code/markets/base_black_market.dm @@ -0,0 +1,222 @@ +// This file contains a WHOLE BUNCH of cost defuckulations to bring the ancient black market stuff back into line with our current cargo pricing. +// I've also taken the liberty of redoing a few descs because man they kinda suck. +// Some availability_probs have been upped considerably for items that I think should be core to the "dodgy" character archetype, like switchblades, science goggles and the various maintenance pills. + +// CLOTHING + +/datum/market_item/clothing/ninja_mask + price_min = PAYCHECK_CREW + price_max = PAYCHECK_CREW * 3 + +/datum/market_item/clothing/durathread_vest + desc = "Concerns about high asbestos content are completely unfounded. Note: may contain asbestos." + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 1.5 + +/datum/market_item/clothing/durathread_helmet + desc = "Smells faintly like an icewalker. Weird. Goes on your head and is vaguely armoured. Note: may contain asbestos." + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 1.5 + +/datum/market_item/clothing/full_spacesuit_set + desc = "Decommissioned thirty years ago, boxes of these ancient spaceproof relics keep showing up in warehouses somewhere. They're \"old style\"." + price_min = PAYCHECK_CREW * 6 + price_max = PAYCHECK_CREW * 12 + +/datum/market_item/clothing/chameleon_hat + desc = "Emulate the appearance of any hat in the sector! Warning: device not quality tested. \[REDACTED\] assumes no risk for malfunction or mortal injury." + price_min = PAYCHECK_CREW + price_max = PAYCHECK_CREW * 3 + +/datum/market_item/clothing/rocket_boots + price_min = PAYCHECK_CREW * 6 + price_max = PAYCHECK_CREW * 12 + +/datum/market_item/clothing/anti_sec_pin + price_min = PAYCHECK_CREW + price_max = PAYCHECK_CREW * 3 + availability_prob = 100 //it's funny so why not + +// CONSUMABLES +/datum/market_item/consumable/clown_tears + desc = "Wrung by force from ethically-sourced clowns by your local jester. 100% guaranteed baton free." + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 1.5 + +/datum/market_item/consumable/donk_pocket_box + price_min = PAYCHECK_CREW * 0.3 + price_max = PAYCHECK_CREW * 1 + availability_prob = 100 //you can always afford some (illegal) donkpockets. Donk Co loves you. + +/datum/market_item/consumable/suspicious_pills + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 1.5 + +/datum/market_item/consumable/floor_pill + desc = "Harvested daily by responsibly-paid assistants, this pill is guaranteed to a) have been on the floor, and b) is a pill. Good luck!" + price_min = PAYCHECK_CREW * 0.1 + price_max = PAYCHECK_CREW * 0.3 + availability_prob = 100 // no shortage of unmarked pills babyyyy + +/datum/market_item/consumable/pumpup + desc = "Clean-up crews sell off these things by the dozen after every shift - get your hands on some today! What could possibly go wrong with maintenance drugs?" + price_min = PAYCHECK_CREW * 0.2 + price_max = PAYCHECK_CREW * 0.4 + +// MISCELLANEOUS + +/datum/market_item/misc/Clear_PDA + desc = "Clearly show your appreciation for style with this limited edition clear PDA!" + price_min = PAYCHECK_CREW + price_max = PAYCHECK_CREW * 2 + +/datum/market_item/misc/jade_Lantern + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW + +/datum/market_item/misc/cap_gun + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW + +/datum/market_item/misc/shoulder_holster + name = "Shoulder Holster" + //why in great googly moogly were these so expensive? what the fuck? + price_min = PAYCHECK_CREW * 0.2 + price_max = PAYCHECK_CREW * 0.6 + +/datum/market_item/misc/donk_recycler + price_min = PAYCHECK_CREW * 2 + price_max = PAYCHECK_CREW * 4 + +/datum/market_item/misc/shove_blocker + // ok this is a seriously fucking good module so we'll make it cost a bit + price_min = PAYCHECK_CREW * 8 + price_max = PAYCHECK_CREW * 14 + +/datum/market_item/misc/holywater + desc = "The Spinward Independent Magicians assume no responsibility for the holy (or unholiness) of this magical reagent." + price_min = PAYCHECK_CREW + price_max = PAYCHECK_CREW * 3 + +/datum/market_item/misc/strange_seed + desc = "Exotic varieties of seed outlawed in most sectors, including this one. What's the worst that could happen?" + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW + +/datum/market_item/misc/smugglers_satchel + //inventory gamers... + price_min = PAYCHECK_CREW * 3 + price_max = PAYCHECK_CREW * 6 + +/datum/market_item/misc/roulette + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 6 // it's how the chips fall babyyy + +/datum/market_item/misc/jawed_hook + desc = "If you're struggling with the fishes, give 'em the jaws, see?" + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 1.5 + +/datum/market_item/misc/v8_engine + name = "Genuine V8 Engine (Preserved)" + price_min = PAYCHECK_CREW * 6 + price_max = PAYCHECK_CREW * 12 + +/datum/market_item/misc/fish + name = "Case of Smuggled Fish" + desc = "What makes these fish such hot products? We'd have to kill you if we told you." + +/datum/market_item/misc/giant_wrench_parts + name = "Comically-Large Wrench Parts" + desc = "They're searching every broadband transmission for the name of this wrench, alright? You're mad if you assemble this thing. Mad, we tell you." + price_min = PAYCHECK_CREW * 4 + price_max = PAYCHECK_CREW * 8 + +// TOOLS +/datum/market_item/tool/caravan_wrench + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + availability_prob = 100 // let's have all the experimental tools be always available, because why not? + +/datum/market_item/tool/caravan_wirecutters + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + availability_prob = 100 + +/datum/market_item/tool/caravan_screwdriver + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + availability_prob = 100 + +/datum/market_item/tool/caravan_crowbar + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + availability_prob = 100 + +/datum/market_item/tool/binoculars + //we can roundstart with these so let's tone them way down + desc = "Offworld military surplus. They'll never see you coming." + price_min = PAYCHECK_CREW * 0.2 + price_max = PAYCHECK_CREW * 0.5 + +/datum/market_item/tool/riot_shield + desc = "Bloodstains not included." + price_min = PAYCHECK_CREW * 4 + price_max = PAYCHECK_CREW * 8 + +/datum/market_item/tool/thermite_bottle + desc = "Thirty galactic units of an incendiary compound that will burn through just about anything." + price_min = PAYCHECK_CREW * 2 + price_max = PAYCHECK_CREW * 6 + +/datum/market_item/tool/science_goggles + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + availability_prob = 100 // for people who want to make illicit drugs in maint + +/datum/market_item/tool/fake_scanner + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + +/datum/market_item/tool/program_disk + name = "Bootleg PDA Data Disk" + desc = "Contains a random selection of limited PDA programs purloined by bitrunners from the FTU. Wait, we're not supposed to tell you that." + price_min = PAYCHECK_CREW * 1.5 + price_max = PAYCHECK_CREW * 3 + availability_prob = 100 // not every program is useful but some of these are and they're fun and hackery, so why not? + +// WEAPONS + +/datum/market_item/weapon/bear_trap + price_min = PAYCHECK_CREW * 2 + price_max = PAYCHECK_CREW * 4 + +/datum/market_item/weapon/shotgun_dart + price_min = PAYCHECK_CREW * 0.1 + price_max = PAYCHECK_CREW * 0.3 + +/datum/market_item/weapon/bone_spear + price_min = PAYCHECK_CREW * 0.5 + price_max = PAYCHECK_CREW * 2 + +/datum/market_item/weapon/chainsaw + desc = "Once used to fell trees on Gaia worlds, the humble chainsaw has come into its own as the premiere anti-mold device of the sector. And you can have one right now for one easy payment!" + price_min = PAYCHECK_CREW * 2 + price_max = PAYCHECK_CREW * 4 + availability_prob = 75 // USE CHAINSAWS FOR MOLDS MORE OH MY GOD + +/datum/market_item/weapon/switchblade + // This is force 20 like the sabre/shamshir so price it similarly. Also, make it always available so you can shank people in maints. + desc = "Standard-issue hardware for shifty goons sector-wide. Pointy and sharp." + price_min = PAYCHECK_CREW * 4.25 + price_max = PAYCHECK_CREW * 8 + availability_prob = 100 + +/datum/market_item/weapon/emp_grenade + desc = "The bane of synthetics and station-engineers everywhere." + price_min = PAYCHECK_CREW * 1.5 + price_max = PAYCHECK_CREW * 5 + +/datum/market_item/weapon/fisher + price_min = PAYCHECK_CREW * 4 + price_max = PAYCHECK_CREW * 8 diff --git a/modular_nova/modules/underworld_connections/code/underworld_connections_quirk.dm b/modular_nova/modules/underworld_connections/code/underworld_connections_quirk.dm new file mode 100644 index 00000000000..f3d78d7df45 --- /dev/null +++ b/modular_nova/modules/underworld_connections/code/underworld_connections_quirk.dm @@ -0,0 +1,147 @@ +/datum/quirk/item_quirk/underworld_connections + name = "Underworld Connections" + desc = "You're in with the seedier elements of the galactic underworld, and can start with a customizable black market uplink, and access to information brokers with exploitable information about the crew. Security has suspicions about you, and you may struggle to obtain a weapons permit." + icon = FA_ICON_SUITCASE + value = 0 + gain_text = span_notice("Your contacts to the underworld are close at hand.") + lose_text = span_notice("Your contacts to the underworld have gone quiet.") + medical_record_text = "Patient records may have been tampered with in the past." + quirk_flags = QUIRK_HIDE_FROM_SCAN + mail_goodies = list(/obj/item/storage/briefcase/secure) + +/datum/quirk/item_quirk/underworld_connections/add_unique(client/client_source) + if (ishuman(quirk_holder)) + var/obj/item/market_uplink/blackmarket/roundstart_uplink = new + + //customize the goddamn uplink + var/uplink_skin = client_source?.prefs.read_preference(/datum/preference/choiced/uplink_skin) + var/list/uplink_skin_val = GLOB.possible_uplink_skins[uplink_skin] + if (uplink_skin_val) + roundstart_uplink.icon = uplink_skin_val[1] + roundstart_uplink.icon_state = uplink_skin_val[2] + + var/uplink_name = client_source?.prefs.read_preference(/datum/preference/text/uplink_name) + if (uplink_name) + roundstart_uplink.name = uplink_name + + var/uplink_desc = client_source?.prefs.read_preference(/datum/preference/text/uplink_desc) + if (uplink_desc) + roundstart_uplink.desc = uplink_desc + + give_item_to_holder( + roundstart_uplink, + list( + LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, + LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, + LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, + LOCATION_HANDS = ITEM_SLOT_HANDS, + ) + ) + +/datum/quirk/item_quirk/underworld_connections/post_add() + . = ..() + + // Make sure we've got a client/mind first (hence, post_add), then give us exploitables access + quirk_holder.mind.has_exploitables_override = TRUE + quirk_holder.mind.handle_exploitables() + + // Also let the user know that they need to OPFOR if they want to do heavy antagonism. Policy request. + to_chat(quirk_holder, span_boldwarning("REMEMBER: The Underworld Connections quirk does NOT make you an antagonist. Please make an OPFOR request if you intend to do serious criminal activity.")) + + // Set us as 'suspected' on HUDs at roundstart and leave a note about our dark and mysterious past. No permits for us! If we're human. + if (ishuman(quirk_holder)) + var/mob/living/carbon/human/human_holder = quirk_holder + var/datum/record/crew/our_record = find_record(human_holder.name) + if (our_record) + our_record.wanted_status = WANTED_SUSPECT + our_record.security_note += "DO NOT ISSUE WEAPON PERMITS. Subject has suspected links to covert criminal elements." + +/datum/quirk/item_quirk/underworld_connections/remove() + if (ishuman(quirk_holder)) + var/mob/living/carbon/human/human_holder = quirk_holder + var/datum/record/crew/our_record = find_record(human_holder.name) + if (our_record.security_note) + our_record.security_note = replacetext(our_record.security_note, "DO NOT ISSUE WEAPON PERMITS. Subject has suspected links to covert criminal elements.", "") + if (!length(our_record.security_note)) // that was the only thing in the notes + our_record.security_note = null + if (isnull(our_record.security_note) && our_record.wanted_status == WANTED_SUSPECT) // only clear this if the security notes contain nothing but the quirk-generated note, just to be certain we are not accidentally resetting the wanted status for an unrelated crime + our_record.wanted_status = WANTED_NONE + + quirk_holder.mind.has_exploitables_override = FALSE + quirk_holder.mind.handle_exploitables() + +/datum/quirk_constant_data/underworld_connections + associated_typepath = /datum/quirk/item_quirk/underworld_connections + customization_options = list(/datum/preference/choiced/uplink_skin, /datum/preference/text/uplink_name, /datum/preference/text/uplink_desc) + +/datum/preference/choiced/uplink_skin + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "underworld_uplink_skin" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE + +/// List of uplink skins, associated list where the value is a list containing icon dmi and then icon_state +GLOBAL_LIST_INIT(possible_uplink_skins, list( + "Brick Phone" = list('icons/obj/antags/gang/cell_phone.dmi', "phone_off"), + "Default Black Market Uplink" = list('icons/obj/blackmarket.dmi', "uplink"), + "Generic Radio" = list('icons/obj/devices/voice.dmi', "radio"), + "Green Walkie Talkie" = list('icons/obj/devices/voice.dmi', "walkietalkie"), + "Inconspicious PDA" = list('icons/obj/modular_pda.dmi', "pda"), + "Mining Radio" = list('icons/obj/miningradio.dmi', "miningradio"), + "Red Analogue Phone" = list('icons/obj/devices/voice.dmi', "red_phone"), + "Red Walkie Talkie" = list('icons/obj/devices/voice.dmi', "nukietalkie"), + "Syndicate Suspicious Phone" = list('icons/obj/antags/syndicate_tools.dmi', "suspiciousphone"), + "Syndicate Tablet (Silicon)" = list('icons/obj/modular_pda.dmi', "tablet-silicon-syndicate"), +)) + +/datum/preference/choiced/uplink_skin/init_possible_values() + return assoc_to_keys(GLOB.possible_uplink_skins) + +/datum/preference/choiced/uplink_skin/create_default_value() + return "Default Black Market Uplink" + +/datum/preference/choiced/uplink_skin/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + + return "Underworld Connections" in preferences.all_quirks + +/datum/preference/choiced/uplink_skin/apply_to_human(mob/living/carbon/human/target, value) + return + +/datum/preference/text/uplink_name + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "underworld_uplink_name" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE + maximum_value_length = 32 + +/datum/preference/text/uplink_name/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + + return "Underworld Connections" in preferences.all_quirks + +/datum/preference/text/uplink_name/serialize(input) + return htmlrendertext(input) + +/datum/preference/text/uplink_name/apply_to_human(mob/living/carbon/human/target, value) + return + +/datum/preference/text/uplink_desc + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "underworld_uplink_desc" + savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE + +/datum/preference/text/uplink_desc/is_accessible(datum/preferences/preferences) + if (!..()) + return FALSE + + return "Underworld Connections" in preferences.all_quirks + +/datum/preference/text/uplink_desc/serialize(input) + return htmlrendertext(input) + +/datum/preference/text/uplink_desc/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/tgstation.dme b/tgstation.dme index fca09db7cbf..8e80cbb8e44 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8109,6 +8109,9 @@ #include "modular_nova\modules\trim_tokens\code\cards_ids.dm" #include "modular_nova\modules\trim_tokens\code\trim_tokens.dm" #include "modular_nova\modules\turretid\code\turret_id_system.dm" +#include "modular_nova\modules\underworld_connections\code\black_market_uplink.dm" +#include "modular_nova\modules\underworld_connections\code\underworld_connections_quirk.dm" +#include "modular_nova\modules\underworld_connections\code\markets\base_black_market.dm" #include "modular_nova\modules\verbs\code\looc.dm" #include "modular_nova\modules\verbs\code\say.dm" #include "modular_nova\modules\verbs\code\subtle.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/underworld_connections.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/underworld_connections.tsx new file mode 100644 index 00000000000..ce2d7763ffe --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/underworld_connections.tsx @@ -0,0 +1,22 @@ +// THIS IS A NOVA SECTOR UI FILE +import { + Feature, + FeatureChoiced, + FeatureDropdownInput, + FeatureShortTextInput, +} from '../../base'; + +export const underworld_uplink_skin: FeatureChoiced = { + name: 'Uplink Skin', + component: FeatureDropdownInput, +}; + +export const underworld_uplink_name: Feature = { + name: 'Uplink Name', + component: FeatureShortTextInput, +}; + +export const underworld_uplink_desc: Feature = { + name: 'Uplink Description', + component: FeatureShortTextInput, +}; From 5739e400966aa7a85a337c8549ba4980339b6feb Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 1 Mar 2024 02:42:54 +0300 Subject: [PATCH 03/14] Automatic changelog for PR #1930 [ci skip] --- html/changelogs/AutoChangeLog-pr-1930.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1930.yml diff --git a/html/changelogs/AutoChangeLog-pr-1930.yml b/html/changelogs/AutoChangeLog-pr-1930.yml new file mode 100644 index 00000000000..30188409d75 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1930.yml @@ -0,0 +1,5 @@ +author: "yooriss" +delete-after: True +changes: + - qol: "The telepathy genetics mutation has had significant usability improvements: it is now point-targeting based, and right-clicking the power allows for quick resending to the same target, a feature mirrored by the new *treply emote. Telepathy now also shows runechat messages." + - rscadd: "The Telepathic quirk has been added, allowing characters to start with an unremovable (or activated) telepathy mutation." \ No newline at end of file From 4b7a0e89992bdd63a466893edc4de578e8343812 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 1 Mar 2024 02:43:21 +0300 Subject: [PATCH 04/14] Automatic changelog for PR #2185 [ci skip] --- html/changelogs/AutoChangeLog-pr-2185.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2185.yml diff --git a/html/changelogs/AutoChangeLog-pr-2185.yml b/html/changelogs/AutoChangeLog-pr-2185.yml new file mode 100644 index 00000000000..cd7cb5a5f6d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2185.yml @@ -0,0 +1,5 @@ +author: "yooriss" +delete-after: True +changes: + - rscadd: "The Underworld Connections quirk has been added, allowing dodgy characters (including silicons!) to gain access to exploitable information at roundstart. Non-silicons also receive a fully customizable black market uplink, too." + - qol: "Prices at the galactic Black Market have now fallen drastically to be more in line with general cargo costs, give or take, and should now be vastly more affordable for most people. Pick up one and order some spuriously legal things for you and your friends today!" \ No newline at end of file From ce94a603b74f5b8cadae8d5736d84e2200d831ad Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 1 Mar 2024 01:37:37 +0000 Subject: [PATCH 05/14] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-1930.yml | 5 - html/changelogs/AutoChangeLog-pr-2137.yml | 4 - html/changelogs/AutoChangeLog-pr-2138.yml | 4 - html/changelogs/AutoChangeLog-pr-2144.yml | 4 - html/changelogs/AutoChangeLog-pr-2145.yml | 4 - html/changelogs/AutoChangeLog-pr-2146.yml | 4 - html/changelogs/AutoChangeLog-pr-2147.yml | 7 -- html/changelogs/AutoChangeLog-pr-2148.yml | 7 -- html/changelogs/AutoChangeLog-pr-2149.yml | 4 - html/changelogs/AutoChangeLog-pr-2150.yml | 4 - html/changelogs/AutoChangeLog-pr-2151.yml | 5 - html/changelogs/AutoChangeLog-pr-2152.yml | 4 - html/changelogs/AutoChangeLog-pr-2157.yml | 4 - html/changelogs/AutoChangeLog-pr-2158.yml | 4 - html/changelogs/AutoChangeLog-pr-2163.yml | 4 - html/changelogs/AutoChangeLog-pr-2164.yml | 4 - html/changelogs/AutoChangeLog-pr-2165.yml | 4 - html/changelogs/AutoChangeLog-pr-2166.yml | 5 - html/changelogs/AutoChangeLog-pr-2167.yml | 7 -- html/changelogs/AutoChangeLog-pr-2170.yml | 4 - html/changelogs/AutoChangeLog-pr-2171.yml | 5 - html/changelogs/AutoChangeLog-pr-2173.yml | 4 - html/changelogs/AutoChangeLog-pr-2174.yml | 4 - html/changelogs/AutoChangeLog-pr-2177.yml | 4 - html/changelogs/AutoChangeLog-pr-2180.yml | 4 - html/changelogs/AutoChangeLog-pr-2182.yml | 4 - html/changelogs/AutoChangeLog-pr-2183.yml | 4 - html/changelogs/AutoChangeLog-pr-2184.yml | 7 -- html/changelogs/AutoChangeLog-pr-2185.yml | 5 - html/changelogs/AutoChangeLog-pr-2186.yml | 4 - html/changelogs/AutoChangeLog-pr-2189.yml | 4 - html/changelogs/AutoChangeLog-pr-2191.yml | 4 - html/changelogs/AutoChangeLog-pr-2195.yml | 4 - html/changelogs/archive/2024-03.yml | 112 ++++++++++++++++++++++ 34 files changed, 112 insertions(+), 149 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-1930.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2137.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2138.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2144.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2145.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2146.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2147.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2148.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2149.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2150.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2151.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2152.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2157.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2158.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2163.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2164.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2165.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2166.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2167.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2170.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2171.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2173.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2174.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2177.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2180.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2182.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2183.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2184.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2185.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2186.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2189.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2191.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2195.yml create mode 100644 html/changelogs/archive/2024-03.yml diff --git a/html/changelogs/AutoChangeLog-pr-1930.yml b/html/changelogs/AutoChangeLog-pr-1930.yml deleted file mode 100644 index 30188409d75..00000000000 --- a/html/changelogs/AutoChangeLog-pr-1930.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "yooriss" -delete-after: True -changes: - - qol: "The telepathy genetics mutation has had significant usability improvements: it is now point-targeting based, and right-clicking the power allows for quick resending to the same target, a feature mirrored by the new *treply emote. Telepathy now also shows runechat messages." - - rscadd: "The Telepathic quirk has been added, allowing characters to start with an unremovable (or activated) telepathy mutation." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2137.yml b/html/changelogs/AutoChangeLog-pr-2137.yml deleted file mode 100644 index ab75566b57e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2137.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "13spacemen" -delete-after: True -changes: - - bugfix: "Blood overlays on items no longer leak onto other objects" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2138.yml b/html/changelogs/AutoChangeLog-pr-2138.yml deleted file mode 100644 index 853a56fb32e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2138.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ben10Omintrix" -delete-after: True -changes: - - bugfix: "fixes pokemon ai still being active when inside the pokeball" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2144.yml b/html/changelogs/AutoChangeLog-pr-2144.yml deleted file mode 100644 index fdd83662978..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2144.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "The Paddy's Claw should be properly unusable in situations which it should be properly unusable." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2145.yml b/html/changelogs/AutoChangeLog-pr-2145.yml deleted file mode 100644 index 9ed33509a78..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2145.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "yooriss" -delete-after: True -changes: - - rscadd: "The Entombed quirk has been added, allowing characters to start off with a permanently unremovable low-end MODsuit stuck to their back slot. Letting the suit's charge run low will eventually kill you, and the quirk has special interactions with both Ethereals and Plasmamen!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2146.yml b/html/changelogs/AutoChangeLog-pr-2146.yml deleted file mode 100644 index 80cd9c987c3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2146.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - qol: "Constructs now reuse the victim's mind instead of just moving their client" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2147.yml b/html/changelogs/AutoChangeLog-pr-2147.yml deleted file mode 100644 index a12ae26b8d3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2147.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - qol: "adds examines & screentips for building & deconstructing both machine & computer frames." - - qol: "Adding a circuitboard from a rped to n computer frame will automatically screw it in place like before." - - code_imp: "merged procs for computer & machine frames. autodocs them where possible." - - code_imp: "moved code for machine frame into its own file." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2148.yml b/html/changelogs/AutoChangeLog-pr-2148.yml deleted file mode 100644 index 5157e6ceeb2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2148.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "IndieanaJones" -delete-after: True -changes: - - balance: "Gorillas are faster, stronger, but not bigger too. Note while holding an item, they are the same speed as they were prior." - - balance: "Gorillas now have the understanding of languages as monkeys do." - - balance: "The Gorilla Cube Box for traitors has been replaced with a singular gorilla cube. Due to the aforementioned changes, this singular gorilla should be as scary if not scarier than 3 gorillas were prior." - - balance: " Magillitis Serum Autoinjector now grants the resulting gorilla a slow passive regeneration effect which kicks in after not taking damage for 12 seconds." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2149.yml b/html/changelogs/AutoChangeLog-pr-2149.yml deleted file mode 100644 index 84bf337648e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2149.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TJatPBnJ" -delete-after: True -changes: - - balance: "Power crepes are now finger food" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2150.yml b/html/changelogs/AutoChangeLog-pr-2150.yml deleted file mode 100644 index f8a4bc7cfea..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2150.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "RCD converts miscellaneous turfs like basalt, sand, beach etc to plating first & not put a wall directly on top of them" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2151.yml b/html/changelogs/AutoChangeLog-pr-2151.yml deleted file mode 100644 index d7c9aa58f9c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2151.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "mc-oofert" -delete-after: True -changes: - - rscadd: "Added an option to deathmatch loadout dropdown that allows you to pick a random loadout" - - bugfix: "In deathmatch, plasmamen are made humans and the UI supports more players" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2152.yml b/html/changelogs/AutoChangeLog-pr-2152.yml deleted file mode 100644 index c6d7b9e4633..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2152.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - bugfix: "Newscasters no longer say \"No wanted issue posted. Have a secure day.\" when there is, in fact, an active wanted issue currently posted." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2157.yml b/html/changelogs/AutoChangeLog-pr-2157.yml deleted file mode 100644 index d88f979677a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2157.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Knouli" -delete-after: True -changes: - - balance: "DeForest brand Civil Defense Medical Kits may now be repurposed to carry a limited selection of field-portable cheese rations." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2158.yml b/html/changelogs/AutoChangeLog-pr-2158.yml deleted file mode 100644 index 1e735fde359..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2158.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - bugfix: "Medical/security records now show an icon based on the registered trim, rather than showing a question mark for records with customized titles." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2163.yml b/html/changelogs/AutoChangeLog-pr-2163.yml deleted file mode 100644 index ab0c85d5fd7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2163.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "softcerv" -delete-after: True -changes: - - code_imp: "TRAIT_DEAF now works on non-carbon mobs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2164.yml b/html/changelogs/AutoChangeLog-pr-2164.yml deleted file mode 100644 index 89d09d1d7bc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2164.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "PapaMichael" -delete-after: True -changes: - - balance: "Fugitive hunters will spawn early if the emergency shuttle is called." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2165.yml b/html/changelogs/AutoChangeLog-pr-2165.yml deleted file mode 100644 index 0acb3c6a1bb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - qol: "Intelligent monkeys now punch people instead of biting them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2166.yml b/html/changelogs/AutoChangeLog-pr-2166.yml deleted file mode 100644 index a100278dc54..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2166.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - balance: "xenomorph stomachs will no longer destroy items directly, refactored it to use acid_act()" - - bugfix: "fixes xenomorph vore accidentally destroying mobs it wasn't supposed to destroy, im thinking this was modified list in place shenanigans" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2167.yml b/html/changelogs/AutoChangeLog-pr-2167.yml deleted file mode 100644 index fb9957e2adb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2167.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - code_imp: "Tram throwing now breaks grilles consistently" - - code_imp: "Tram malfunction lethality/throw chance are now a multiplier instead of flat value" - - code_imp: "Tram throw chance can be adjusted" - - code_imp: "Unlucky trait is now used in tram throw calculation" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2170.yml b/html/changelogs/AutoChangeLog-pr-2170.yml deleted file mode 100644 index cced53083f0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2170.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArcaneMusic" -delete-after: True -changes: - - image: "New sprites for plant grafts!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2171.yml b/html/changelogs/AutoChangeLog-pr-2171.yml deleted file mode 100644 index 60612d931ef..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2171.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "KingkumaArt" -delete-after: True -changes: - - rscadd: "a list of items called vendor_nocrush that vendors dont deal integrity damage to upon hitting them." - - bugfix: "Makes vending machines no longer crush chairs and conveyors." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2173.yml b/html/changelogs/AutoChangeLog-pr-2173.yml deleted file mode 100644 index 3e42a3e26b6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2173.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "\"Freshness Jars full of Natural Bait\" is now a goodie and costs 200 credits instead of 2000" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2174.yml b/html/changelogs/AutoChangeLog-pr-2174.yml deleted file mode 100644 index 086180971c5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2174.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "A.C.M.O." -delete-after: True -changes: - - bugfix: "Fixed the AI hologram's ability to copy the appearance of crew members." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2177.yml b/html/changelogs/AutoChangeLog-pr-2177.yml deleted file mode 100644 index bf9c3e68fa1..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2177.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mc-oofert" -delete-after: True -changes: - - bugfix: "Grilles dont break by just walking into them under any circumstances" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2180.yml b/html/changelogs/AutoChangeLog-pr-2180.yml deleted file mode 100644 index bd5f7934fc9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2180.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - bugfix: "Being in a Swat Suit appropriately protects you from collisions with a body, rather than the body thrown at you having these protections protecting YOU, the victim of the collision." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2182.yml b/html/changelogs/AutoChangeLog-pr-2182.yml deleted file mode 100644 index 6814b22e910..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2182.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "Cryostylane reaction now has a moderate & not extreme cooling effect. Helps you achieve more pure amounts of Cryostylane" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2183.yml b/html/changelogs/AutoChangeLog-pr-2183.yml deleted file mode 100644 index 8da2a1db267..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2183.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "13spacemen" -delete-after: True -changes: - - bugfix: "You can build material airlocks again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2184.yml b/html/changelogs/AutoChangeLog-pr-2184.yml deleted file mode 100644 index 797744dae8e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2184.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "LT3" -delete-after: True -changes: - - qol: "Airlocks don't flash constantly on engineering override, override/overlay added for fire alarm" - - bugfix: "Airlock lighting should no longer render on top of player characters" - - bugfix: "Airlock emissives no longer overlap firedoors" - - bugfix: "Fixed missing overlays on various airlock types" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2185.yml b/html/changelogs/AutoChangeLog-pr-2185.yml deleted file mode 100644 index cd7cb5a5f6d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2185.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "yooriss" -delete-after: True -changes: - - rscadd: "The Underworld Connections quirk has been added, allowing dodgy characters (including silicons!) to gain access to exploitable information at roundstart. Non-silicons also receive a fully customizable black market uplink, too." - - qol: "Prices at the galactic Black Market have now fallen drastically to be more in line with general cargo costs, give or take, and should now be vastly more affordable for most people. Pick up one and order some spuriously legal things for you and your friends today!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2186.yml b/html/changelogs/AutoChangeLog-pr-2186.yml deleted file mode 100644 index 85148425f8b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2186.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "yooriss" -delete-after: True -changes: - - rscadd: "A new form of emoting is available called 'Do', accessible via the K and Ctrl-K keybinds by default (as well as the 'Do' verb). Do doesn't put your character name first and instead includes it in brackets at the end, so you can use it to write better prose and even narrate things in the environment around you with less clunkiness! Try it out today." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2189.yml b/html/changelogs/AutoChangeLog-pr-2189.yml deleted file mode 100644 index b0db2178347..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2189.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheVekter" -delete-after: True -changes: - - rscadd: "Added a new law to the Artist lawset in order to encourage Artist AIs to build an audience." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2191.yml b/html/changelogs/AutoChangeLog-pr-2191.yml deleted file mode 100644 index 09158f9debd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2191.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Fixes grabbing yourself when you tackle someone." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-2195.yml b/html/changelogs/AutoChangeLog-pr-2195.yml deleted file mode 100644 index 57316c6d837..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2195.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheSmallBlue" -delete-after: True -changes: - - qol: "added an HUD button to go up and down floors" \ No newline at end of file diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml new file mode 100644 index 00000000000..1a02199135c --- /dev/null +++ b/html/changelogs/archive/2024-03.yml @@ -0,0 +1,112 @@ +2024-03-01: + 00-Steven: + - bugfix: Medical/security records now show an icon based on the registered trim, + rather than showing a question mark for records with customized titles. + - bugfix: Newscasters no longer say "No wanted issue posted. Have a secure day." + when there is, in fact, an active wanted issue currently posted. + 13spacemen: + - bugfix: You can build material airlocks again + - bugfix: Blood overlays on items no longer leak onto other objects + A.C.M.O.: + - bugfix: Fixed the AI hologram's ability to copy the appearance of crew members. + Absolucy: + - qol: Constructs now reuse the victim's mind instead of just moving their client + ArcaneMusic: + - image: New sprites for plant grafts! + Ben10Omintrix: + - bugfix: fixes pokemon ai still being active when inside the pokeball + Ghommie: + - balance: '"Freshness Jars full of Natural Bait" is now a goodie and costs 200 + credits instead of 2000' + Iamgoofball: + - balance: xenomorph stomachs will no longer destroy items directly, refactored + it to use acid_act() + - bugfix: fixes xenomorph vore accidentally destroying mobs it wasn't supposed to + destroy, im thinking this was modified list in place shenanigans + IndieanaJones: + - balance: Gorillas are faster, stronger, but not bigger too. Note while holding + an item, they are the same speed as they were prior. + - balance: Gorillas now have the understanding of languages as monkeys do. + - balance: The Gorilla Cube Box for traitors has been replaced with a singular gorilla + cube. Due to the aforementioned changes, this singular gorilla should be as + scary if not scarier than 3 gorillas were prior. + - balance: ' Magillitis Serum Autoinjector now grants the resulting gorilla a slow + passive regeneration effect which kicks in after not taking damage for 12 seconds.' + JohnFulpWillard: + - qol: Intelligent monkeys now punch people instead of biting them. + KingkumaArt: + - rscadd: a list of items called vendor_nocrush that vendors dont deal integrity + damage to upon hitting them. + - bugfix: Makes vending machines no longer crush chairs and conveyors. + Knouli: + - balance: DeForest brand Civil Defense Medical Kits may now be repurposed to carry + a limited selection of field-portable cheese rations. + LT3: + - code_imp: Tram throwing now breaks grilles consistently + - code_imp: Tram malfunction lethality/throw chance are now a multiplier instead + of flat value + - code_imp: Tram throw chance can be adjusted + - code_imp: Unlucky trait is now used in tram throw calculation + - qol: Airlocks don't flash constantly on engineering override, override/overlay + added for fire alarm + - bugfix: Airlock lighting should no longer render on top of player characters + - bugfix: Airlock emissives no longer overlap firedoors + - bugfix: Fixed missing overlays on various airlock types + Melbert: + - bugfix: The Paddy's Claw should be properly unusable in situations which it should + be properly unusable. + - bugfix: Fixes grabbing yourself when you tackle someone. + PapaMichael: + - balance: Fugitive hunters will spawn early if the emergency shuttle is called. + SyncIt21: + - qol: adds examines & screentips for building & deconstructing both machine & computer + frames. + - qol: Adding a circuitboard from a rped to n computer frame will automatically + screw it in place like before. + - code_imp: merged procs for computer & machine frames. autodocs them where possible. + - code_imp: moved code for machine frame into its own file. + - bugfix: RCD converts miscellaneous turfs like basalt, sand, beach etc to plating + first & not put a wall directly on top of them + - bugfix: Cryostylane reaction now has a moderate & not extreme cooling effect. + Helps you achieve more pure amounts of Cryostylane + TJatPBnJ: + - balance: Power crepes are now finger food + TheSmallBlue: + - qol: added an HUD button to go up and down floors + TheVekter: + - rscadd: Added a new law to the Artist lawset in order to encourage Artist AIs + to build an audience. + mc-oofert: + - rscadd: Added an option to deathmatch loadout dropdown that allows you to pick + a random loadout + - bugfix: In deathmatch, plasmamen are made humans and the UI supports more players + - bugfix: Grilles dont break by just walking into them under any circumstances + necromanceranne: + - bugfix: Being in a Swat Suit appropriately protects you from collisions with a + body, rather than the body thrown at you having these protections protecting + YOU, the victim of the collision. + softcerv: + - code_imp: TRAIT_DEAF now works on non-carbon mobs + yooriss: + - qol: 'The telepathy genetics mutation has had significant usability improvements: + it is now point-targeting based, and right-clicking the power allows for quick + resending to the same target, a feature mirrored by the new *treply emote. Telepathy + now also shows runechat messages.' + - rscadd: The Telepathic quirk has been added, allowing characters to start with + an unremovable (or activated) telepathy mutation. + - rscadd: A new form of emoting is available called 'Do', accessible via the K and + Ctrl-K keybinds by default (as well as the 'Do' verb). Do doesn't put your character + name first and instead includes it in brackets at the end, so you can use it + to write better prose and even narrate things in the environment around you + with less clunkiness! Try it out today. + - rscadd: The Underworld Connections quirk has been added, allowing dodgy characters + (including silicons!) to gain access to exploitable information at roundstart. + Non-silicons also receive a fully customizable black market uplink, too. + - qol: Prices at the galactic Black Market have now fallen drastically to be more + in line with general cargo costs, give or take, and should now be vastly more + affordable for most people. Pick up one and order some spuriously legal things + for you and your friends today! + - rscadd: The Entombed quirk has been added, allowing characters to start off with + a permanently unremovable low-end MODsuit stuck to their back slot. Letting + the suit's charge run low will eventually kill you, and the quirk has special + interactions with both Ethereals and Plasmamen! From 09859ae176a08c7504ff28e1214ab934d58e6bbe Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:36:57 +0300 Subject: [PATCH 06/14] [MIRROR] bodytypes to do with body shape and sprite handling have their own var (#2130) * [MIRROR] bodytypes to do with body shape and sprite handling have their own var (#1125) * bodytypes to do with body shape and sprite handling have their own var * Refactors our modular files, painfully --------- Co-authored-by: 13spacemen <46101244+13spacemen@users.noreply.github.com> Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> * Update nabber_bodyparts.dm --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: 13spacemen <46101244+13spacemen@users.noreply.github.com> Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Iajret --- code/__DEFINES/mobs.dm | 38 ++++++------ code/_globalvars/bitfields.dm | 36 ++++++++---- code/datums/components/creamed.dm | 4 +- code/modules/clothing/under/_under.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 + .../mob/living/carbon/carbon_defines.dm | 5 +- .../mob/living/carbon/human/_species.dm | 6 +- .../living/carbon/human/human_update_icons.dm | 58 +++++++++---------- code/modules/surgery/bodyparts/_bodyparts.dm | 6 +- .../surgery/bodyparts/dismemberment.dm | 2 +- code/modules/surgery/bodyparts/head.dm | 5 +- code/modules/surgery/bodyparts/helpers.dm | 10 ++++ code/modules/surgery/bodyparts/parts.dm | 33 ++++++----- .../surgery/bodyparts/robot_bodyparts.dm | 18 ++++-- .../species_parts/lizard_bodyparts.dm | 4 +- .../organs/external/_external_organ.dm | 7 ++- .../modules/surgery/prosthetic_replacement.dm | 2 +- .../client/preferences/mutant_parts.dm | 4 +- .../code/modules/clothing/base_clothes.dm | 2 +- .../code/modules/clothing/glasses/_glasses.dm | 2 +- .../code/modules/clothing/head/_head.dm | 2 +- .../code/modules/clothing/masks/_masks.dm | 2 +- .../code/modules/mod/modules/_module.dm | 4 +- .../modules/better_vox/code/vox_bodyparts.dm | 12 ++-- .../bodyparts/code/_mutant_bodyparts.dm | 5 +- .../modules/bodyparts/code/akula_bodyparts.dm | 2 +- .../bodyparts/code/aquatic_bodyparts.dm | 2 +- .../bodyparts/code/lizard_bodyparts.dm | 1 - .../modules/bodyparts/code/taur_bodyparts.dm | 8 +-- .../bodyparts/code/teshari_bodyparts.dm | 16 ++--- .../modules/bodyparts/code/vox_bodyparts.dm | 16 ++--- .../new_player/sprite_accessories/snout.dm | 6 +- .../living/carbon/human/custom_bodytype.dm | 2 +- .../mob/living/carbon/human/species.dm | 6 +- .../modules/surgery/organs/taur_body.dm | 10 ++-- .../code/robot_bodyparts.dm | 12 ++-- .../code/additionalemotes/turf_emote.dm | 4 +- .../modules/medical/code/wounds/medical.dm | 2 +- .../lewd_clothing/shibari_worn_uniform.dm | 2 +- .../lewd_items/code/lewd_items/shibari.dm | 8 +-- .../modules/synths/code/bodyparts/limbs.dm | 5 +- .../tesh_augments/code/robot_bodyparts.dm | 44 +++++++------- .../modules/nabbers/code/nabber_bodyparts.dm | 12 ++-- 43 files changed, 238 insertions(+), 191 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index c46a75e4ac8..227256f4956 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -78,38 +78,40 @@ #define ALIEN_BODYPART "alien" #define LARVA_BODYPART "larva" -//Bodytype defines for how things can be worn, surgery, and other misc things. +//Bodytype defines for surgery, and other misc things. ///The limb is organic. #define BODYTYPE_ORGANIC (1<<0) ///The limb is robotic. #define BODYTYPE_ROBOTIC (1<<1) -///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin. -#define BODYTYPE_HUMANOID (1<<2) -///The limb fits the monkey mold. -#define BODYTYPE_MONKEY (1<<3) -///The limb is digitigrade. -#define BODYTYPE_DIGITIGRADE (1<<4) -///The limb is snouted. -#define BODYTYPE_SNOUTED (1<<5) ///A placeholder bodytype for xeno larva, so their limbs cannot be attached to anything. -#define BODYTYPE_LARVA_PLACEHOLDER (1<<6) +#define BODYTYPE_LARVA_PLACEHOLDER (1<<2) ///The limb is from a xenomorph. -#define BODYTYPE_ALIEN (1<<7) +#define BODYTYPE_ALIEN (1<<3) ///The limb is from a golem -#define BODYTYPE_GOLEM (1<<8) +#define BODYTYPE_GOLEM (1<<4) // NOVA EDIT ADDITION ///The limb fits a modular custom shape -#define BODYTYPE_CUSTOM (1<<9) +#define BODYSHAPE_CUSTOM (1<<9) ///The limb fits a taur body -#define BODYTYPE_TAUR (1<<10) +#define BODYSHAPE_TAUR (1<<10) ///The limb causes shoes to no longer be displayed, useful for taurs. -#define BODYTYPE_HIDE_SHOES (1<<11) +#define BODYSHAPE_HIDE_SHOES (1<<11) ///The limb causes glasses and hats to be drawn on layers 5 and 4 respectively. Currently used for snouts with the (Top) suffix, which are drawn on layer 6 and would normally cover facewear -#define BODYTYPE_ALT_FACEWEAR_LAYER (1<<12) +#define BODYSHAPE_ALT_FACEWEAR_LAYER (1<<12) // NOVA EDIT END -#define BODYTYPE_BIOSCRAMBLE_COMPATIBLE (BODYTYPE_HUMANOID | BODYTYPE_MONKEY | BODYTYPE_ALIEN) -#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_ROBOTIC) && (bodytype & BODYTYPE_BIOSCRAMBLE_COMPATIBLE)) +// Bodyshape defines for how things can be worn, i.e., what "shape" the mob sprite is +///The limb fits the human mold. This is not meant to be literal, if the sprite "fits" on a human, it is "humanoid", regardless of origin. +#define BODYSHAPE_HUMANOID (1<<0) +///The limb fits the monkey mold. +#define BODYSHAPE_MONKEY (1<<1) +///The limb is digitigrade. +#define BODYSHAPE_DIGITIGRADE (1<<2) +///The limb is snouted. +#define BODYSHAPE_SNOUTED (1<<3) + +#define BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE (BODYTYPE_ROBOTIC | BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_GOLEM) +#define BODYTYPE_CAN_BE_BIOSCRAMBLED(bodytype) (!(bodytype & BODYTYPE_BIOSCRAMBLE_INCOMPATIBLE)) // Defines for Species IDs. Used to refer to the name of a species, for things like bodypart names or species preferences. #define SPECIES_ABDUCTOR "abductor" diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index a6a888e07b9..83eb942c2ad 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -378,10 +378,6 @@ DEFINE_BITFIELD(reaction_flags, list( DEFINE_BITFIELD(bodytype, list( "BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC, "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, - "BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID, - "BODYTYPE_MONKEY" = BODYTYPE_MONKEY, - "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, - "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, @@ -390,18 +386,34 @@ DEFINE_BITFIELD(bodytype, list( DEFINE_BITFIELD(acceptable_bodytype, list( "BODYTYPE_ORGANIC" = BODYTYPE_ORGANIC, "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, - "BODYTYPE_HUMANOID" = BODYTYPE_HUMANOID, - "BODYTYPE_MONKEY" = BODYTYPE_MONKEY, - "BODYTYPE_DIGITIGRADE" = BODYTYPE_DIGITIGRADE, - "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, "BODYTYPE_LARVA_PLACEHOLDER" = BODYTYPE_LARVA_PLACEHOLDER, "BODYTYPE_ALIEN" = BODYTYPE_ALIEN, "BODYTYPE_GOLEM" = BODYTYPE_GOLEM, +)) + +DEFINE_BITFIELD(bodyshape, list( + "BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID, + "BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY, + "BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE, + "BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED, + // NOVA EDIT ADDITION - customization + "BODYSHAPE__CUSTOM" = BODYSHAPE_CUSTOM, + "BODYSHAPE__TAUR" = BODYSHAPE_TAUR, + "BODYSHAPE__HIDE_SHOES" = BODYSHAPE_HIDE_SHOES, + "BODYSHAPE__ALT_FACEWEAR_LAYER" = BODYSHAPE_ALT_FACEWEAR_LAYER, + // NOVA EDIT END +)) + +DEFINE_BITFIELD(acceptable_bodyshape, list( + "BODYSHAPE_HUMANOID" = BODYSHAPE_HUMANOID, + "BODYSHAPE_MONKEY" = BODYSHAPE_MONKEY, + "BODYSHAPE_DIGITIGRADE" = BODYSHAPE_DIGITIGRADE, + "BODYSHAPE_SNOUTED" = BODYSHAPE_SNOUTED, // NOVA EDIT ADDITION - customization - "BODYTYPE_CUSTOM" = BODYTYPE_CUSTOM, - "BODYTYPE_TAUR" = BODYTYPE_TAUR, - "BODYTYPE_HIDE_SHOES" = BODYTYPE_HIDE_SHOES, - "BODYTYPE_ALT_FACEWEAR_LAYER" = BODYTYPE_ALT_FACEWEAR_LAYER, + "BODYSHAPE__CUSTOM" = BODYSHAPE_CUSTOM, + "BODYSHAPE__TAUR" = BODYSHAPE_TAUR, + "BODYSHAPE__HIDE_SHOES" = BODYSHAPE_HIDE_SHOES, + "BODYSHAPE__ALT_FACEWEAR_LAYER" = BODYSHAPE_ALT_FACEWEAR_LAYER, // NOVA EDIT END )) diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm index d1c76b4759d..be536bb792d 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -39,9 +39,9 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( qdel(src) return bodypart_overlay = new() - if(carbon_parent.bodytype & BODYTYPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb + if(carbon_parent.bodyshape & BODYSHAPE_SNOUTED) //stupid, but external organ bodytypes are not stored on the limb bodypart_overlay.icon_state = "creampie_lizard" - else if(my_head.bodytype & BODYTYPE_MONKEY) + else if(my_head.bodyshape & BODYSHAPE_MONKEY) bodypart_overlay.icon_state = "creampie_monkey" else bodypart_overlay.icon_state = "creampie_human" diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 008c99e9e5f..8d4c948d99a 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -152,7 +152,7 @@ /* NOVA EDIT REMOVAL - This breaks jumpsuit adjustment. Plus, we don't support it. if((supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && ishuman(user)) var/mob/living/carbon/human/wearer = user - if(wearer.bodytype & BODYTYPE_DIGITIGRADE) + if(wearer.bodyshape & BODYSHAPE_DIGITIGRADE) adjusted = DIGITIGRADE_STYLE update_appearance() */ // NOVA EDIT END diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 147419272a5..5fcfeec8d72 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1045,6 +1045,7 @@ set_usable_hands(usable_hands + 1) synchronize_bodytypes() + synchronize_bodyshapes() ///Proc to hook behavior on bodypart removals. Do not directly call. You're looking for [/obj/item/bodypart/proc/drop_limb()]. /mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart, special) @@ -1071,6 +1072,7 @@ set_usable_hands(usable_hands - 1) synchronize_bodytypes() + synchronize_bodyshapes() ///Updates the bodypart speed modifier based on our bodyparts. /mob/living/carbon/proc/update_bodypart_speed_modifier() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 38571bccdb1..2e2168eca9d 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -118,7 +118,10 @@ var/last_top_offset /// A bitfield of "bodytypes", updated by /obj/item/bodypart/proc/synchronize_bodytypes() - var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + var/bodytype = BODYTYPE_ORGANIC + + /// A bitfield of "bodyshapes", updated by /obj/item/bodypart/proc/synchronize_bodyshapes() + var/bodyshape = BODYSHAPE_HUMANOID COOLDOWN_DECLARE(bleeding_message_cd) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 504ceabe915..82ec5a6f311 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -693,7 +693,7 @@ GLOBAL_LIST_EMPTY(features_by_species) working_shirt.pixel_y += height_offset standing += working_shirt - if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodytype & BODYTYPE_DIGITIGRADE)) + if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) var/datum/sprite_accessory/socks/socks = GLOB.socks_list[species_human.socks] if(socks) standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) @@ -936,7 +936,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(H.num_legs < 2) return FALSE /* NOVA EDIT REMOVAL - if((H.bodytype & BODYTYPE_DIGITIGRADE) && !(I.item_flags & IGNORE_DIGITIGRADE)) + if((H.bodyshape & BODYSHAPE_DIGITIGRADE) && !(I.item_flags & IGNORE_DIGITIGRADE)) if(!(I.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) if(!disable_warning) to_chat(H, span_warning("The footwear around here isn't compatible with your feet!")) @@ -968,7 +968,7 @@ GLOBAL_LIST_EMPTY(features_by_species) return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_ICLOTHING) var/obj/item/bodypart/chest = H.get_bodypart(BODY_ZONE_CHEST) - if(chest && (chest.bodytype & BODYTYPE_MONKEY)) + if(chest && (chest.bodyshape & BODYSHAPE_MONKEY)) if(!(I.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) if(!disable_warning) to_chat(H, span_warning("[I] doesn't fit your [chest.name]!")) diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 3ea41f2302b..802146d8435 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -93,29 +93,29 @@ There are several things that need to be remembered: var/mutable_appearance/uniform_overlay //This is how non-humanoid clothing works. You check if the mob has the right bodyflag, and the clothing has the corresponding clothing flag. - //handled_by_bodytype is used to track whether or not we successfully used an alternate sprite. It's set to TRUE to ease up on copy-paste. + //handled_by_bodyshape is used to track whether or not we successfully used an alternate sprite. It's set to TRUE to ease up on copy-paste. //icon_file MUST be set to null by default, or it causes issues. - //handled_by_bodytype MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. - //"override_file = handled_by_bodytype ? icon_file : null" MUST be added to the arguments of build_worn_icon() + //handled_by_bodyshape MUST be set to FALSE under the if(!icon_exists()) statement, or everything breaks. + //"override_file = handled_by_bodyshape ? icon_file : null" MUST be added to the arguments of build_worn_icon() //Friendly reminder that icon_exists(file, state, scream = TRUE) is your friend when debugging this code. - var/handled_by_bodytype = TRUE + var/handled_by_bodyshape = TRUE var/icon_file var/woman var/digi // NOVA EDIT ADDITION - Digi female gender shaping var/female_sprite_flags = uniform.female_sprite_flags // NOVA EDIT ADDITION - Digi female gender shaping var/mutant_styles = NONE // NOVA EDIT ADDITON - mutant styles to pass down to build_worn_icon. //BEGIN SPECIES HANDLING - if((bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) + if((bodyshape & BODYSHAPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform, src) // NOVA EDIT CHANGE - ORIGINAL: icon_file = MONKEY_UNIFORM_FILE - else if((bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + else if((bodyshape & BODYSHAPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) icon_file = uniform.worn_icon_digi || DIGITIGRADE_UNIFORM_FILE // NOVA EDIT CHANGE - ORIGINAL: icon_file = DIGITIGRADE_UNIFORM_FILE digi = TRUE // NOVA EDIT ADDITION - Digi female gender shaping // NOVA EDIT ADDITION - birbs - else if(bodytype & BODYTYPE_CUSTOM) + else if(bodyshape & BODYSHAPE_CUSTOM) icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform, src) // Might have to refactor how this works eventually, maybe. // NOVA EDIT END //Female sprites have lower priority than digitigrade sprites - if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh // NOVA EDIT CHANGE - ORIGINAL: else if(dna.species.sexes && (bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) + if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(female_sprite_flags & NO_FEMALE_UNIFORM)) // NOVA EDIT CHANGE - ORIGINAL: else if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh woman = TRUE // NOVA EDIT ADDITION START - Digi female gender shaping if(digi) @@ -127,10 +127,10 @@ There are several things that need to be remembered: if(!icon_exists(icon_file, RESOLVE_ICON_STATE(uniform))) icon_file = DEFAULT_UNIFORM_FILE - handled_by_bodytype = FALSE + handled_by_bodyshape = FALSE // NOVA EDIT ADDITION START - Taur-friendly suits! - if(bodytype & BODYTYPE_TAUR) + if(bodyshape & BODYSHAPE_TAUR) if(istype(uniform) && uniform.gets_cropped_on_taurs) mutant_styles |= get_taur_mode() // NOVA EDIT END @@ -142,7 +142,7 @@ There are several things that need to be remembered: isinhands = FALSE, female_uniform = woman ? female_sprite_flags : null, // NOVA EDIT CHANGE - Digi female gender shaping - ORIGINAL: female_uniform = woman ? uniform.female_sprite_flags : null, override_state = target_overlay, - override_file = handled_by_bodytype ? icon_file : null, + override_file = handled_by_bodyshape ? icon_file : null, mutant_styles = mutant_styles, // NOVA EDIT ADDITION - Taur-friendly uniforms! ) @@ -209,7 +209,7 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_GLOVES, gloves, src) if(species_icon_file) icon_file = species_icon_file @@ -252,7 +252,7 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_GLASSES, glasses, src) if(species_icon_file) icon_file = species_icon_file @@ -291,7 +291,7 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_EARS, ears, src) if(species_icon_file) icon_file = species_icon_file @@ -325,13 +325,13 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_NECK, wear_neck, src) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE //On the off-chance we have a neck item that has to move around or cover the muzzle, it ALSO gets worn_icon_muzzled compatiability - if((bodytype & BODYTYPE_SNOUTED) && (worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) && worn_item.worn_icon_muzzled) + if((bodyshape & BODYSHAPE_SNOUTED) && (worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) && worn_item.worn_icon_muzzled) var/snout_icon_file = worn_item.worn_icon_muzzled if(snout_icon_file && icon_exists(snout_icon_file, RESOLVE_ICON_STATE(worn_item))) icon_file = snout_icon_file @@ -371,17 +371,17 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION START var/mutant_override = FALSE - if((bodytype & BODYTYPE_DIGITIGRADE) && (worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + if((bodyshape & BODYSHAPE_DIGITIGRADE) && (worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG) - if(leg.limb_id == "digitigrade" || leg.bodytype & BODYTYPE_DIGITIGRADE)//Snowflakey and bad. But it makes it look consistent. + if(leg.limb_id == "digitigrade" || leg.bodyshape & BODYSHAPE_DIGITIGRADE)//Snowflakey and bad. But it makes it look consistent. icon_file = worn_item.worn_icon_digi || DIGITIGRADE_SHOES_FILE // NOVA EDIT CHANGE mutant_override = TRUE // NOVA EDIT ADDITION - if(!mutant_override && bodytype & BODYTYPE_CUSTOM) + if(!mutant_override && bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SHOES, shoes, src) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE - if(bodytype & BODYTYPE_HIDE_SHOES) + if(bodyshape & BODYSHAPE_HIDE_SHOES) return // We just don't want shoes that float if we're not displaying legs (useful for taurs, for now) // NOVA EDIT END @@ -444,12 +444,12 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION - This needs to be refactored. var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_HEAD, head, src) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE - if((icon_file == 'icons/mob/clothing/head/default.dmi') && (bodytype & BODYTYPE_SNOUTED) && (worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) + if((icon_file == 'icons/mob/clothing/head/default.dmi') && (bodyshape & BODYSHAPE_SNOUTED) && (worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) var/snout_icon_file = worn_item.worn_icon_muzzled || SNOUTED_HEAD_FILE if(snout_icon_file && icon_exists(snout_icon_file, RESOLVE_ICON_STATE(worn_item))) icon_file = snout_icon_file @@ -486,7 +486,7 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_BELT, belt, src) if(species_icon_file) icon_file = species_icon_file @@ -521,18 +521,18 @@ There are several things that need to be remembered: var/mutant_styles = NONE //More currently unused digitigrade handling - if(bodytype & BODYTYPE_DIGITIGRADE) + if(bodyshape & BODYSHAPE_DIGITIGRADE) if(worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) icon_file = worn_item.worn_icon_digi || DIGITIGRADE_SUIT_FILE // NOVA EDIT CHANGE mutant_override = TRUE - if(!mutant_override && bodytype & BODYTYPE_CUSTOM) + if(!mutant_override && bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SUIT, wear_suit, src) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE - if(bodytype & BODYTYPE_TAUR) + if(bodyshape & BODYSHAPE_TAUR) var/obj/item/clothing/suit/worn_suit = wear_suit if(istype(worn_suit) && worn_suit.gets_cropped_on_taurs) mutant_styles |= get_taur_mode() @@ -595,12 +595,12 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_MASK, wear_mask, src) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE - if((icon_file == 'icons/mob/clothing/mask.dmi') && (bodytype & BODYTYPE_SNOUTED) && (worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) + if((icon_file == 'icons/mob/clothing/mask.dmi') && (bodyshape & BODYSHAPE_SNOUTED) && (worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) var/snout_icon_file = worn_item.worn_icon_muzzled || SNOUTED_MASK_FILE if(snout_icon_file && icon_exists(snout_icon_file, RESOLVE_ICON_STATE(worn_item))) icon_file = snout_icon_file @@ -633,7 +633,7 @@ There are several things that need to be remembered: // NOVA EDIT ADDITION var/mutant_override = FALSE - if(bodytype & BODYTYPE_CUSTOM) + if(bodyshape & BODYSHAPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_MISC, back, src) if(species_icon_file) icon_file = species_icon_file diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 83d4200bb65..5b66789ad21 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -34,8 +34,10 @@ * Set to BIO_STANDARD_UNJOINTED because most species have both flesh bone and blood in their limbs. */ var/biological_state = BIO_STANDARD_UNJOINTED - ///A bitfield of bodytypes for clothing, surgery, and misc information - var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + ///A bitfield of bodytypes for surgery, and misc information + var/bodytype = BODYTYPE_ORGANIC + ///A bitfield of bodyshapes for clothing and other sprite information + var/bodyshape = BODYSHAPE_HUMANOID ///Defines when a bodypart should not be changed. Example: BP_BLOCK_CHANGE_SPECIES prevents the limb from being overwritten on species gain var/change_exempt_flags = NONE ///Random flags that describe this bodypart diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index dc107e973da..4b9bac87d16 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -274,7 +274,7 @@ return FALSE var/obj/item/bodypart/chest/mob_chest = new_limb_owner.get_bodypart(BODY_ZONE_CHEST) - if(mob_chest && !(mob_chest.acceptable_bodytype & bodytype) && !special) + if(mob_chest && !(mob_chest.acceptable_bodytype & bodytype) && !(mob_chest.acceptable_bodyshape & bodyshape) && !(mob_chest.acceptable_bodyshape & bodyshape) && !special) return FALSE return TRUE diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index eb9a9f56df5..1defeecafe6 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -234,7 +234,7 @@ husk_type = "monkey" icon_state = "default_monkey_head" limb_id = SPECIES_MONKEY - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY should_draw_greyscale = FALSE dmg_overlay_type = SPECIES_MONKEY is_dimorphic = FALSE @@ -251,7 +251,8 @@ px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE max_damage = LIMB_MAX_HP_ALIEN_CORE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID /obj/item/bodypart/head/larva icon = 'icons/mob/human/species/alien/bodyparts.dmi' diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 52671b5fbc1..126bd3db33a 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -179,6 +179,16 @@ bodytype = all_limb_flags +/// Makes sure that the owner's bodyshape flags match the flags of all of it's parts and organs +/mob/living/carbon/proc/synchronize_bodyshapes() + var/all_limb_flags = NONE + for(var/obj/item/bodypart/limb as anything in bodyparts) + for(var/obj/item/organ/external/ext_organ in limb) + all_limb_flags |= ext_organ.external_bodyshapes + all_limb_flags |= limb.bodyshape + + bodyshape = all_limb_flags + /proc/skintone2hex(skin_tone) . = 0 switch(skin_tone) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index e13fef576ec..ead03aa0f70 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -13,8 +13,10 @@ grind_results = null wound_resistance = 10 bodypart_trait_source = CHEST_TRAIT + ///The bodyshape(s) allowed to attach to this chest. + var/acceptable_bodyshape = BODYSHAPE_HUMANOID ///The bodytype(s) allowed to attach to this chest. - var/acceptable_bodytype = BODYTYPE_HUMANOID + var/acceptable_bodytype = ALL var/obj/item/cavity_item @@ -78,8 +80,8 @@ should_draw_greyscale = FALSE is_dimorphic = FALSE wound_resistance = -10 - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC - acceptable_bodytype = BODYTYPE_MONKEY + bodyshape = BODYSHAPE_MONKEY + acceptable_bodyshape = BODYSHAPE_MONKEY dmg_overlay_type = SPECIES_MONKEY /obj/item/bodypart/chest/alien @@ -87,12 +89,13 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_chest" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID is_dimorphic = FALSE should_draw_greyscale = FALSE bodypart_flags = BODYPART_UNREMOVABLE max_damage = LIMB_MAX_HP_ALIEN_CORE - acceptable_bodytype = BODYTYPE_HUMANOID + acceptable_bodyshape = BODYSHAPE_HUMANOID wing_types = NONE /obj/item/bodypart/chest/larva @@ -245,7 +248,7 @@ icon_state = "default_monkey_l_arm" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY wound_resistance = -10 px_x = -5 px_y = -3 @@ -260,7 +263,8 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_l_arm" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE @@ -341,7 +345,7 @@ husk_type = "monkey" icon_state = "default_monkey_r_arm" limb_id = SPECIES_MONKEY - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY should_draw_greyscale = FALSE wound_resistance = -10 px_x = 5 @@ -357,7 +361,8 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_r_arm" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE @@ -457,7 +462,7 @@ icon_state = "default_monkey_l_leg" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY wound_resistance = -10 px_y = 4 dmg_overlay_type = SPECIES_MONKEY @@ -471,7 +476,8 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_l_leg" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE @@ -547,7 +553,7 @@ icon_state = "default_monkey_r_leg" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE - bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_MONKEY wound_resistance = -10 px_y = 4 dmg_overlay_type = SPECIES_MONKEY @@ -561,7 +567,8 @@ icon_static = 'icons/mob/human/species/alien/bodyparts.dmi' icon_state = "alien_r_leg" limb_id = BODYPART_ID_ALIEN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodytype = BODYTYPE_ALIEN | BODYTYPE_ORGANIC + bodyshape = BODYSHAPE_HUMANOID px_x = 0 px_y = 0 bodypart_flags = BODYPART_UNREMOVABLE diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index 33b32778754..cdd92df7b88 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -23,7 +23,8 @@ icon_state = "borg_l_arm" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -56,7 +57,8 @@ icon_state = "borg_r_arm" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -90,7 +92,8 @@ icon_state = "borg_l_leg" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -137,7 +140,8 @@ icon_state = "borg_r_leg" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -183,7 +187,8 @@ icon_state = "borg_chest" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" @@ -361,7 +366,8 @@ icon_state = "borg_head" is_dimorphic = FALSE should_draw_greyscale = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC + bodytype = BODYTYPE_ROBOTIC + bodyshape = BODYSHAPE_HUMANOID change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 6cd42665d45..ec60375c8d1 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -46,7 +46,7 @@ /obj/item/bodypart/leg/left/digitigrade icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + bodyshape = BODYSHAPE_HUMANOID | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() @@ -72,7 +72,7 @@ /obj/item/bodypart/leg/right/digitigrade icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi' limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + bodyshape = BODYSHAPE_HUMANOID | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() diff --git a/code/modules/surgery/organs/external/_external_organ.dm b/code/modules/surgery/organs/external/_external_organ.dm index 23b74ef9b4e..645caa630d7 100644 --- a/code/modules/surgery/organs/external/_external_organ.dm +++ b/code/modules/surgery/organs/external/_external_organ.dm @@ -25,6 +25,8 @@ var/use_mob_sprite_as_obj_sprite = FALSE ///Does this organ have any bodytypes to pass to it's bodypart_owner? var/external_bodytypes = NONE + ///Does this organ have any bodyshapes to pass to it's bodypart_owner? + var/external_bodyshapes = NONE ///Which flags does a 'modification tool' need to have to restyle us, if it all possible (located in code/_DEFINES/mobs) var/restyle_flags = NONE @@ -87,12 +89,15 @@ if(external_bodytypes) receiver.synchronize_bodytypes() + if(external_bodyshapes) + receiver.synchronize_bodyshapes() receiver.update_body_parts() /obj/item/organ/external/mob_remove(mob/living/carbon/organ_owner, special, moving) if(!special) organ_owner.synchronize_bodytypes() + organ_owner.synchronize_bodyshapes() organ_owner.update_body_parts() return ..() @@ -223,7 +228,7 @@ slot = ORGAN_SLOT_EXTERNAL_SNOUT preference = "feature_lizard_snout" - external_bodytypes = BODYTYPE_SNOUTED + external_bodyshapes = BODYSHAPE_SNOUTED //dna_block = DNA_SNOUT_BLOCK // NOVA EDIT REMOVAL - Customization - We have our own system to handle DNA. restyle_flags = EXTERNAL_RESTYLE_FLESH diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 4b285d161bb..818c7a788d9 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -55,7 +55,7 @@ if(ishuman(target)) var/mob/living/carbon/human/human_target = target var/obj/item/bodypart/chest/target_chest = human_target.get_bodypart(BODY_ZONE_CHEST) - if(!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype)) + if((!(bodypart_to_attach.bodyshape & target_chest.acceptable_bodyshape)) && (!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype))) to_chat(user, span_warning("[bodypart_to_attach] doesn't match the patient's morphology.")) return SURGERY_STEP_FAIL if(bodypart_to_attach.check_for_frankenstein(target)) diff --git a/modular_nova/master_files/code/modules/client/preferences/mutant_parts.dm b/modular_nova/master_files/code/modules/client/preferences/mutant_parts.dm index 57c26e4dd37..b7d0f183f41 100644 --- a/modular_nova/master_files/code/modules/client/preferences/mutant_parts.dm +++ b/modular_nova/master_files/code/modules/client/preferences/mutant_parts.dm @@ -168,9 +168,9 @@ return if(.) - our_head.bodytype |= BODYTYPE_SNOUTED + our_head.bodyshape |= BODYSHAPE_SNOUTED else - our_head.bodytype &= ~BODYTYPE_SNOUTED + our_head.bodyshape &= ~BODYSHAPE_SNOUTED target.synchronize_bodytypes() /datum/preference/tri_color/snout diff --git a/modular_nova/master_files/code/modules/clothing/base_clothes.dm b/modular_nova/master_files/code/modules/clothing/base_clothes.dm index fbcdad4e997..f1e1bff17da 100644 --- a/modular_nova/master_files/code/modules/clothing/base_clothes.dm +++ b/modular_nova/master_files/code/modules/clothing/base_clothes.dm @@ -32,7 +32,7 @@ var/greyscale_config_worn_taur_paw var/greyscale_config_worn_taur_hoof - /// Used for BODYTYPE_CUSTOM: Needs to follow this syntax: a list() with the x and y coordinates of the pixel you want to get the color from. Colors are filled in as GAGs values for fallback. + /// Used for BODYSHAPE_CUSTOM: Needs to follow this syntax: a list() with the x and y coordinates of the pixel you want to get the color from. Colors are filled in as GAGs values for fallback. var/list/species_clothing_color_coords[3] /obj/item/clothing/head diff --git a/modular_nova/master_files/code/modules/clothing/glasses/_glasses.dm b/modular_nova/master_files/code/modules/clothing/glasses/_glasses.dm index 4b9ad40e929..b151b366d47 100644 --- a/modular_nova/master_files/code/modules/clothing/glasses/_glasses.dm +++ b/modular_nova/master_files/code/modules/clothing/glasses/_glasses.dm @@ -4,7 +4,7 @@ if(!ishuman(user)) return if(slot & ITEM_SLOT_EYES) - if(!(user.bodytype & BODYTYPE_ALT_FACEWEAR_LAYER)) + if(!(user.bodyshape & BODYSHAPE_ALT_FACEWEAR_LAYER)) return if(!isnull(alternate_worn_layer) && alternate_worn_layer < BODY_FRONT_LAYER) // if the alternate worn layer was already lower than snouts then leave it be return diff --git a/modular_nova/master_files/code/modules/clothing/head/_head.dm b/modular_nova/master_files/code/modules/clothing/head/_head.dm index f022fc99ac8..047abec8cd3 100644 --- a/modular_nova/master_files/code/modules/clothing/head/_head.dm +++ b/modular_nova/master_files/code/modules/clothing/head/_head.dm @@ -9,7 +9,7 @@ if(slot & ITEM_SLOT_HEAD) if(user.ears && (flags_inv & HIDEEARS)) user.update_inv_ears() - if(!(user.bodytype & BODYTYPE_ALT_FACEWEAR_LAYER)) + if(!(user.bodyshape & BODYSHAPE_ALT_FACEWEAR_LAYER)) return if(!isnull(alternate_worn_layer) && alternate_worn_layer < BODY_FRONT_LAYER) // if the alternate worn layer was already lower than snouts then leave it be return diff --git a/modular_nova/master_files/code/modules/clothing/masks/_masks.dm b/modular_nova/master_files/code/modules/clothing/masks/_masks.dm index 46fd2adeeed..8d29816c4fd 100644 --- a/modular_nova/master_files/code/modules/clothing/masks/_masks.dm +++ b/modular_nova/master_files/code/modules/clothing/masks/_masks.dm @@ -4,7 +4,7 @@ if(!ishuman(user)) return if(slot & ITEM_SLOT_MASK) - if(!(user.bodytype & BODYTYPE_ALT_FACEWEAR_LAYER)) + if(!(user.bodyshape & BODYSHAPE_ALT_FACEWEAR_LAYER)) return if(!isnull(alternate_worn_layer) && alternate_worn_layer < BODY_FRONT_LAYER) // if the alternate worn layer was already lower than snouts then leave it be return diff --git a/modular_nova/master_files/code/modules/mod/modules/_module.dm b/modular_nova/master_files/code/modules/mod/modules/_module.dm index 36ad7fb64c4..9997e2975cf 100644 --- a/modular_nova/master_files/code/modules/mod/modules/_module.dm +++ b/modular_nova/master_files/code/modules/mod/modules/_module.dm @@ -47,10 +47,10 @@ if(is_module_hidden()) // retracted modules can hide parts that aren't usable when inactive return - if(mod.chestplate && (mod.chestplate.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && (mod.wearer.bodytype & BODYTYPE_DIGITIGRADE)) + if(mod.chestplate && (mod.chestplate.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && (mod.wearer.bodyshape & BODYSHAPE_DIGITIGRADE)) suit_supports_variations_flags |= CLOTHING_DIGITIGRADE_VARIATION - if(mod.helmet && (mod.helmet.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) && mod.wearer.bodytype & BODYTYPE_SNOUTED) + if(mod.helmet && (mod.helmet.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) && mod.wearer.bodyshape & BODYSHAPE_SNOUTED) suit_supports_variations_flags |= CLOTHING_SNOUTED_VARIATION is_new_vox = isvoxprimalis(mod.wearer) is_old_vox = isvox(mod.wearer) diff --git a/modular_nova/modules/better_vox/code/vox_bodyparts.dm b/modular_nova/modules/better_vox/code/vox_bodyparts.dm index 543443dd087..882784cb01b 100644 --- a/modular_nova/modules/better_vox/code/vox_bodyparts.dm +++ b/modular_nova/modules/better_vox/code/vox_bodyparts.dm @@ -4,7 +4,7 @@ icon_greyscale = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon_state = "vox_primalis_head" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM | BODYTYPE_SNOUTED + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM is_dimorphic = FALSE should_draw_greyscale = FALSE limb_id = SPECIES_VOX_PRIMALIS @@ -14,7 +14,7 @@ icon_greyscale = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon_state = "vox_primalis_chest" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM is_dimorphic = FALSE should_draw_greyscale = FALSE limb_id = SPECIES_VOX_PRIMALIS @@ -24,7 +24,7 @@ icon_greyscale = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon_state = "vox_primalis_l_arm" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM should_draw_greyscale = FALSE limb_id = SPECIES_VOX_PRIMALIS @@ -33,7 +33,7 @@ icon_greyscale = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon_state = "vox_primalis_r_arm" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM should_draw_greyscale = FALSE limb_id = SPECIES_VOX_PRIMALIS @@ -42,7 +42,7 @@ icon_greyscale = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon_state = "vox_primalis_l_leg" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM should_draw_greyscale = FALSE limb_id = SPECIES_VOX_PRIMALIS @@ -51,7 +51,7 @@ icon_greyscale = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon = 'modular_nova/modules/better_vox/icons/bodyparts/vox_bodyparts.dmi' icon_state = "vox_primalis_r_leg" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM should_draw_greyscale = FALSE limb_id = SPECIES_VOX_PRIMALIS diff --git a/modular_nova/modules/bodyparts/code/_mutant_bodyparts.dm b/modular_nova/modules/bodyparts/code/_mutant_bodyparts.dm index aa857535cf4..02a3248ef37 100644 --- a/modular_nova/modules/bodyparts/code/_mutant_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/_mutant_bodyparts.dm @@ -24,7 +24,6 @@ /obj/item/bodypart/head/mutant icon_greyscale = BODYPART_ICON_MAMMAL limb_id = SPECIES_MAMMAL - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC head_flags = HEAD_ALL_FEATURES /obj/item/bodypart/chest/mutant @@ -61,7 +60,7 @@ /obj/item/bodypart/leg/left/digitigrade icon_greyscale = BODYPART_ICON_MAMMAL limb_id = "digitigrade" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE base_limb_id = "digitigrade" /obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) @@ -71,7 +70,7 @@ /obj/item/bodypart/leg/right/digitigrade icon_greyscale = BODYPART_ICON_MAMMAL limb_id = "digitigrade" - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE base_limb_id = "digitigrade" /obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) diff --git a/modular_nova/modules/bodyparts/code/akula_bodyparts.dm b/modular_nova/modules/bodyparts/code/akula_bodyparts.dm index afb1233b783..cd2c611d2e6 100644 --- a/modular_nova/modules/bodyparts/code/akula_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/akula_bodyparts.dm @@ -2,7 +2,7 @@ /obj/item/bodypart/head/mutant/akula icon_greyscale = BODYPART_ICON_AKULA limb_id = SPECIES_AKULA - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED /obj/item/bodypart/chest/mutant/akula icon_greyscale = BODYPART_ICON_AKULA diff --git a/modular_nova/modules/bodyparts/code/aquatic_bodyparts.dm b/modular_nova/modules/bodyparts/code/aquatic_bodyparts.dm index 4cbd97838c9..64c454f543f 100644 --- a/modular_nova/modules/bodyparts/code/aquatic_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/aquatic_bodyparts.dm @@ -2,7 +2,7 @@ /obj/item/bodypart/head/mutant/aquatic icon_greyscale = BODYPART_ICON_AQUATIC limb_id = SPECIES_AQUATIC - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED /obj/item/bodypart/chest/mutant/aquatic icon_greyscale = BODYPART_ICON_AQUATIC diff --git a/modular_nova/modules/bodyparts/code/lizard_bodyparts.dm b/modular_nova/modules/bodyparts/code/lizard_bodyparts.dm index 8ec2ee74414..e6a5cbd5a08 100644 --- a/modular_nova/modules/bodyparts/code/lizard_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/lizard_bodyparts.dm @@ -1,6 +1,5 @@ /obj/item/bodypart/head/lizard icon_greyscale = BODYPART_ICON_LIZARD - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC // You're too slow Kapu, I did it myself ;) head_flags = HEAD_ALL_FEATURES /obj/item/bodypart/chest/lizard diff --git a/modular_nova/modules/bodyparts/code/taur_bodyparts.dm b/modular_nova/modules/bodyparts/code/taur_bodyparts.dm index 6ae3775f0a7..47a686253c9 100644 --- a/modular_nova/modules/bodyparts/code/taur_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/taur_bodyparts.dm @@ -3,7 +3,7 @@ limb_id = LIMBS_TAUR bodypart_flags = BODYPART_UNREMOVABLE can_be_surgically_removed = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_TAUR + bodyshape = parent_type::bodyshape | BODYSHAPE_TAUR /obj/item/bodypart/leg/right/taur/generate_icon_key() @@ -17,7 +17,7 @@ limb_id = LIMBS_TAUR bodypart_flags = BODYPART_UNREMOVABLE can_be_surgically_removed = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_TAUR + bodyshape = parent_type::bodyshape | BODYSHAPE_TAUR /obj/item/bodypart/leg/left/taur/generate_icon_key() @@ -26,9 +26,9 @@ return list("taur") /obj/item/bodypart/leg/right/robot/synth/taur - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_TAUR + bodyshape = parent_type::bodyshape | BODYSHAPE_TAUR damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT) /obj/item/bodypart/leg/left/robot/synth/taur - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_TAUR + bodyshape = parent_type::bodyshape | BODYSHAPE_TAUR damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT) diff --git a/modular_nova/modules/bodyparts/code/teshari_bodyparts.dm b/modular_nova/modules/bodyparts/code/teshari_bodyparts.dm index 2127353beff..b816f59867f 100644 --- a/modular_nova/modules/bodyparts/code/teshari_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/teshari_bodyparts.dm @@ -6,7 +6,7 @@ // teshari! /obj/item/bodypart/head/mutant/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_TESHARI brute_modifier = TESHARI_BRUTE_MODIFIER burn_modifier = TESHARI_BURN_MODIFIER @@ -34,7 +34,7 @@ /obj/item/bodypart/chest/mutant/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_TESHARI brute_modifier = TESHARI_BRUTE_MODIFIER burn_modifier = TESHARI_BURN_MODIFIER @@ -72,7 +72,7 @@ /obj/item/bodypart/arm/left/mutant/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_TESHARI unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -82,7 +82,7 @@ /obj/item/bodypart/arm/right/mutant/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_TESHARI unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -92,7 +92,7 @@ /obj/item/bodypart/leg/left/mutant/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_TESHARI digitigrade_type = /obj/item/bodypart/leg/left/digitigrade/teshari brute_modifier = TESHARI_BRUTE_MODIFIER @@ -100,7 +100,7 @@ /obj/item/bodypart/leg/right/mutant/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_TESHARI digitigrade_type = /obj/item/bodypart/leg/right/digitigrade/teshari brute_modifier = TESHARI_BRUTE_MODIFIER @@ -108,14 +108,14 @@ /obj/item/bodypart/leg/left/digitigrade/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM base_limb_id = SPECIES_TESHARI brute_modifier = TESHARI_BRUTE_MODIFIER burn_modifier = TESHARI_BURN_MODIFIER /obj/item/bodypart/leg/right/digitigrade/teshari icon_greyscale = BODYPART_ICON_TESHARI - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM base_limb_id = SPECIES_TESHARI brute_modifier = TESHARI_BRUTE_MODIFIER burn_modifier = TESHARI_BURN_MODIFIER diff --git a/modular_nova/modules/bodyparts/code/vox_bodyparts.dm b/modular_nova/modules/bodyparts/code/vox_bodyparts.dm index 81753b988a8..7ac3fc59906 100644 --- a/modular_nova/modules/bodyparts/code/vox_bodyparts.dm +++ b/modular_nova/modules/bodyparts/code/vox_bodyparts.dm @@ -1,42 +1,42 @@ // voxs! /obj/item/bodypart/head/mutant/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SNOUTED | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM limb_id = SPECIES_VOX /obj/item/bodypart/chest/mutant/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM limb_id = SPECIES_VOX /obj/item/bodypart/arm/left/mutant/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM limb_id = SPECIES_VOX /obj/item/bodypart/arm/right/mutant/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM limb_id = SPECIES_VOX /obj/item/bodypart/leg/left/mutant/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM limb_id = SPECIES_VOX digitigrade_type = /obj/item/bodypart/leg/left/digitigrade/vox /obj/item/bodypart/leg/right/mutant/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM limb_id = SPECIES_VOX digitigrade_type = /obj/item/bodypart/leg/right/digitigrade/vox /obj/item/bodypart/leg/left/digitigrade/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM base_limb_id = SPECIES_VOX /obj/item/bodypart/leg/right/digitigrade/vox icon_greyscale = BODYPART_ICON_VOX - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_SNOUTED | BODYSHAPE_CUSTOM base_limb_id = SPECIES_VOX diff --git a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/snout.dm b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/snout.dm index 9eb7da1b4dd..010610b382f 100644 --- a/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/snout.dm +++ b/modular_nova/modules/customization/modules/mob/dead/new_player/sprite_accessories/snout.dm @@ -17,7 +17,7 @@ /obj/item/organ/external/snout mutantpart_key = "snout" mutantpart_info = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF")) - external_bodytypes = NONE // We don't actually want this to have BODYTYPE_SNOUTED by default, since some of them don't apply that. + external_bodyshapes = NONE // We don't actually want this to have by default, since some of them don't apply that. preference = "feature_snout" /datum/bodypart_overlay/mutant/snout @@ -32,9 +32,9 @@ /obj/item/organ/external/snout/Insert(mob/living/carbon/reciever, special, movement_flags) if(sprite_accessory_flags & SPRITE_ACCESSORY_USE_MUZZLED_SPRITE) - external_bodytypes |= BODYTYPE_SNOUTED + external_bodyshapes |= BODYSHAPE_SNOUTED if(sprite_accessory_flags & SPRITE_ACCESSORY_USE_ALT_FACEWEAR_LAYER) - external_bodytypes |= BODYTYPE_ALT_FACEWEAR_LAYER + external_bodyshapes |= BODYSHAPE_ALT_FACEWEAR_LAYER return ..() diff --git a/modular_nova/modules/customization/modules/mob/living/carbon/human/custom_bodytype.dm b/modular_nova/modules/customization/modules/mob/living/carbon/human/custom_bodytype.dm index f3ce6b8b109..d5b07bc60ed 100644 --- a/modular_nova/modules/customization/modules/mob/living/carbon/human/custom_bodytype.dm +++ b/modular_nova/modules/customization/modules/mob/living/carbon/human/custom_bodytype.dm @@ -52,7 +52,7 @@ GLOB.species_clothing_fallback_cache[name]["[file_to_use]-[state_to_use]-[meta]"] = cached_value /** - * Allow for custom clothing icon generation. Only called if the species is BODYTYPE_CUSTOM + * Allow for custom clothing icon generation. Only called if the species is BODYSHAPE_CUSTOM * If null is returned, use default human icon. * Arguments: * * item_slot: The slot we're updating. One of LOADOUT_ITEM_HEAD, etc. diff --git a/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm index e7ba998c769..c941415cf65 100644 --- a/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_nova/modules/customization/modules/mob/living/carbon/human/species.dm @@ -23,7 +23,7 @@ GLOBAL_LIST_EMPTY(customizable_races) var/veteran_only = FALSE ///Flavor text of the species displayed on character creation screeen var/flavor_text = "No description." - ///Path to BODYTYPE_CUSTOM species worn icons. An assoc list of ITEM_SLOT_X => /icon + ///Path to BODYSHAPE_CUSTOM species worn icons. An assoc list of ITEM_SLOT_X => /icon var/list/custom_worn_icons = list() ///Is this species restricted from changing their body_size in character creation? var/body_size_restricted = FALSE @@ -147,7 +147,7 @@ GLOBAL_LIST_EMPTY(customizable_races) var/female_sprite_flags = FEMALE_UNIFORM_FULL // the default gender shaping if(underwear) var/icon_state = underwear.icon_state - if(underwear.has_digitigrade && (species_human.bodytype & BODYTYPE_DIGITIGRADE)) + if(underwear.has_digitigrade && (species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) icon_state += "_d" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY // for digi gender shaping if(species_human.dna.species.sexes && species_human.physique == FEMALE && (underwear.gender == MALE)) @@ -189,7 +189,7 @@ GLOBAL_LIST_EMPTY(customizable_races) if(socks) var/mutable_appearance/socks_overlay var/icon_state = socks.icon_state - if((species_human.bodytype & BODYTYPE_DIGITIGRADE)) + if((species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) icon_state += "_d" socks_overlay = mutable_appearance(socks.icon, icon_state, -BODY_LAYER) if(!socks.use_static) diff --git a/modular_nova/modules/customization/modules/surgery/organs/taur_body.dm b/modular_nova/modules/customization/modules/surgery/organs/taur_body.dm index 81b842a1af6..147c6b39fe6 100644 --- a/modular_nova/modules/customization/modules/surgery/organs/taur_body.dm +++ b/modular_nova/modules/customization/modules/surgery/organs/taur_body.dm @@ -2,7 +2,7 @@ name = "taur body" zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_EXTERNAL_TAUR - external_bodytypes = BODYTYPE_TAUR + external_bodyshapes = BODYSHAPE_TAUR use_mob_sprite_as_obj_sprite = TRUE preference = "feature_taur" @@ -33,7 +33,7 @@ /obj/item/organ/external/taur_body/Insert(mob/living/carbon/reciever, special, movement_flags) if(sprite_accessory_flags & SPRITE_ACCESSORY_HIDE_SHOES) - external_bodytypes |= BODYTYPE_HIDE_SHOES + external_bodyshapes |= BODYSHAPE_HIDE_SHOES old_right_leg = reciever.get_bodypart(BODY_ZONE_R_LEG) old_left_leg = reciever.get_bodypart(BODY_ZONE_L_LEG) @@ -49,12 +49,12 @@ new_right_leg = new /obj/item/bodypart/leg/right/robot/synth/taur() - new_left_leg.bodytype |= external_bodytypes + new_left_leg.bodyshape |= external_bodyshapes new_left_leg.replace_limb(reciever, TRUE) if(old_left_leg) old_left_leg.forceMove(src) - new_right_leg.bodytype |= external_bodytypes + new_right_leg.bodyshape |= external_bodyshapes new_right_leg.replace_limb(reciever, TRUE) if(old_right_leg) old_right_leg.forceMove(src) @@ -86,7 +86,7 @@ old_right_leg.replace_limb(organ_owner, TRUE) old_right_leg = null - // We don't call `synchronize_bodytypes()` here, because it's already going to get called in the parent because `external_bodytypes` has a value. + // We don't call `synchronize_bodytypes()` here, because it's already going to get called in the parent because `external_bodyshapes` has a value. return ..() diff --git a/modular_nova/modules/digitigrade_cybernetics/code/robot_bodyparts.dm b/modular_nova/modules/digitigrade_cybernetics/code/robot_bodyparts.dm index 14a78961450..c1933c808e3 100644 --- a/modular_nova/modules/digitigrade_cybernetics/code/robot_bodyparts.dm +++ b/modular_nova/modules/digitigrade_cybernetics/code/robot_bodyparts.dm @@ -5,34 +5,34 @@ name = "cyborg digitigrade right leg" icon_static = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' icon = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/left/robot/digi name = "cyborg digitigrade left leg" icon_static = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' icon = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/right/robot/surplus/digi name = "prosthetic digitigrade right leg" icon_static = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' icon = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/left/robot/surplus/digi name = "prosthetic digitigrade right leg" icon_static = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' icon = 'modular_nova/modules/digitigrade_cybernetics/icons/digitigrade_parts.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/right/robot/advanced/digi name = "advanced digitigrade right leg" icon_static = 'modular_nova/modules/digitigrade_cybernetics/icons/advanced_digitigrade_parts.dmi' icon = 'modular_nova/modules/digitigrade_cybernetics/icons/advanced_digitigrade_parts.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE /obj/item/bodypart/leg/left/robot/advanced/digi name = "advanced digitigrade right leg" icon_static = 'modular_nova/modules/digitigrade_cybernetics/icons/advanced_digitigrade_parts.dmi' icon = 'modular_nova/modules/digitigrade_cybernetics/icons/advanced_digitigrade_parts.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE diff --git a/modular_nova/modules/emotes/code/additionalemotes/turf_emote.dm b/modular_nova/modules/emotes/code/additionalemotes/turf_emote.dm index bef6ec5589d..ede2feb952c 100644 --- a/modular_nova/modules/emotes/code/additionalemotes/turf_emote.dm +++ b/modular_nova/modules/emotes/code/additionalemotes/turf_emote.dm @@ -15,10 +15,10 @@ if(ishuman(user)) //feet - if(!(human_user.bodytype & BODYTYPE_DIGITIGRADE) && !(human_user.dna.species.mutant_bodyparts["taur"])) + if(!(human_user.bodyshape & BODYSHAPE_DIGITIGRADE) && !(human_user.dna.species.mutant_bodyparts["taur"])) user.allowed_turfs += "footprint" - if((human_user.bodytype & BODYTYPE_DIGITIGRADE) || human_user.dna.species.mutant_bodyparts["taur"]) + if((human_user.bodyshape & BODYSHAPE_DIGITIGRADE) || human_user.dna.species.mutant_bodyparts["taur"]) user.allowed_turfs += list("pawprint", "hoofprint", "clawprint") //species & taurs diff --git a/modular_nova/modules/medical/code/wounds/medical.dm b/modular_nova/modules/medical/code/wounds/medical.dm index 5a3723fff4b..9d0e4ba2487 100644 --- a/modular_nova/modules/medical/code/wounds/medical.dm +++ b/modular_nova/modules/medical/code/wounds/medical.dm @@ -46,7 +46,7 @@ prefix = gauze_prefix var/suffix = gauzed_bodypart.body_zone - if(gauzed_bodypart.bodytype & BODYTYPE_DIGITIGRADE) + if(gauzed_bodypart.bodyshape & BODYSHAPE_DIGITIGRADE) suffix += "_digitigrade" return "[prefix]_[suffix]" diff --git a/modular_nova/modules/modular_items/lewd_items/code/lewd_clothing/shibari_worn_uniform.dm b/modular_nova/modules/modular_items/lewd_items/code/lewd_clothing/shibari_worn_uniform.dm index 60980b35b60..b248a0aca88 100644 --- a/modular_nova/modules/modular_items/lewd_items/code/lewd_clothing/shibari_worn_uniform.dm +++ b/modular_nova/modules/modular_items/lewd_items/code/lewd_clothing/shibari_worn_uniform.dm @@ -149,7 +149,7 @@ //stuff to apply processing on equip and add mood event for perverts /obj/item/clothing/under/shibari/groin/equipped(mob/living/user, slot) var/mob/living/carbon/human/hooman = user - slowdown = hooman?.bodytype & BODYTYPE_TAUR ? 4 : 0 + slowdown = hooman?.bodyshape & BODYSHAPE_TAUR ? 4 : 0 return..() //processing stuff diff --git a/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm b/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm index d87c9549ef2..cefff5e5fae 100644 --- a/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm +++ b/modular_nova/modules/modular_items/lewd_items/code/lewd_items/shibari.dm @@ -141,7 +141,7 @@ return var/obj/item/stack/shibari_rope/split_rope = null var/slow = 0 - if(them.bodytype & BODYTYPE_TAUR) + if(them.bodyshape & BODYSHAPE_TAUR) split_rope = split_stack(null, 2) slow = 4 else @@ -218,7 +218,7 @@ if(them.shoes) to_chat(user, span_warning("They're already wearing something on this slot!")) return - if(them.bodytype & BODYTYPE_TAUR) + if(them.bodyshape & BODYSHAPE_TAUR) to_chat(user, span_warning("You can't tie their feet, they're a taur!")) return them.visible_message(span_warning("[user] starts tying [them]'s feet!"),\ @@ -250,7 +250,7 @@ if(!do_after(user, HAS_TRAIT(user, TRAIT_RIGGER) ? 20 : 60, them)) return var/slow = 0 - if(them.bodytype & BODYTYPE_TAUR) + if(them.bodyshape & BODYSHAPE_TAUR) slow = 4 var/obj/item/stack/shibari_rope/split_rope = split_stack(null, 1) if(split_rope) @@ -283,7 +283,7 @@ return var/obj/item/stack/shibari_rope/split_rope = null var/slow = 0 - if(them.bodytype & BODYTYPE_TAUR) + if(them.bodyshape & BODYSHAPE_TAUR) split_rope = split_stack(null, 2) slow = 4 else diff --git a/modular_nova/modules/synths/code/bodyparts/limbs.dm b/modular_nova/modules/synths/code/bodyparts/limbs.dm index 1126295f1fe..a1a3506de08 100644 --- a/modular_nova/modules/synths/code/bodyparts/limbs.dm +++ b/modular_nova/modules/synths/code/bodyparts/limbs.dm @@ -6,7 +6,6 @@ icon_greyscale = BODYPART_ICON_IPC limb_id = SPECIES_SYNTH should_draw_greyscale = TRUE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = NONE brute_modifier = SYNTH_BRUTE_MODIFIER burn_modifier = SYNTH_BURN_MODIFIER @@ -58,7 +57,7 @@ icon_greyscale = BODYPART_ICON_SYNTHLIZARD should_draw_greyscale = TRUE limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE base_limb_id = BODYPART_ID_DIGITIGRADE change_exempt_flags = NONE brute_modifier = SYNTH_BRUTE_MODIFIER @@ -72,7 +71,7 @@ icon_greyscale = BODYPART_ICON_SYNTHLIZARD should_draw_greyscale = TRUE limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_DIGITIGRADE + bodyshape = parent_type::bodyshape | BODYSHAPE_DIGITIGRADE base_limb_id = BODYPART_ID_DIGITIGRADE change_exempt_flags = NONE brute_modifier = SYNTH_BRUTE_MODIFIER diff --git a/modular_nova/modules/tesh_augments/code/robot_bodyparts.dm b/modular_nova/modules/tesh_augments/code/robot_bodyparts.dm index d894847ed62..329d87c3356 100644 --- a/modular_nova/modules/tesh_augments/code/robot_bodyparts.dm +++ b/modular_nova/modules/tesh_augments/code/robot_bodyparts.dm @@ -21,7 +21,7 @@ desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." icon = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' icon_static = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -34,7 +34,7 @@ desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." icon_static = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -47,7 +47,7 @@ desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." icon_static = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -60,7 +60,7 @@ desc = "A skeletal limb wrapped in pseudomuscles and membranous feathers, with a low-conductivity case." icon_static = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -73,7 +73,7 @@ desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell, covered in a layer of membranous feathers." icon_static = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM brute_modifier = 1 burn_modifier = 0.9 @@ -85,7 +85,7 @@ desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals. A layer of membranous feathers covers the stark metal." icon_static = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW unarmed_damage_high = TESHARI_PUNCH_HIGH @@ -102,7 +102,7 @@ desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 @@ -121,7 +121,7 @@ desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -139,7 +139,7 @@ desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -157,7 +157,7 @@ desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -175,7 +175,7 @@ desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -193,7 +193,7 @@ desc = "A skeletal, robotic wing. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -213,7 +213,7 @@ desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -232,7 +232,7 @@ desc = "A skeletal, robotic hindlimb. Outdated and fragile, but it's still better than nothing. A layer of membranous feathers hides the cheap assembly." icon_static = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/surplus_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 0.3 unarmed_damage_high = TESHARI_PUNCH_HIGH * 0.5 @@ -252,7 +252,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -270,7 +270,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -288,7 +288,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -306,7 +306,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -324,7 +324,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -342,7 +342,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -360,7 +360,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 @@ -378,7 +378,7 @@ desc = "An advanced robotic hindlimb. These designs are usually reserved for those still on the search for Avalon." icon_static = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' icon = 'modular_nova/modules/tesh_augments/icons/advanced_augments_teshari.dmi' - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM unarmed_damage_low = TESHARI_PUNCH_LOW * 2 unarmed_damage_high = TESHARI_PUNCH_HIGH * 3 diff --git a/tff_modular/modules/nabbers/code/nabber_bodyparts.dm b/tff_modular/modules/nabbers/code/nabber_bodyparts.dm index 0e5fbf238c7..7c040f01b81 100644 --- a/tff_modular/modules/nabbers/code/nabber_bodyparts.dm +++ b/tff_modular/modules/nabbers/code/nabber_bodyparts.dm @@ -7,7 +7,7 @@ /obj/item/bodypart/head/mutant/nabber icon_greyscale = BODYPART_ICON_NABBER - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_NABBER brute_modifier = NABBER_BRUTE_MODIFIER burn_modifier = NABBER_BURN_MODIFIER @@ -34,7 +34,7 @@ /obj/item/bodypart/chest/mutant/nabber icon_greyscale = BODYPART_ICON_NABBER - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_NABBER brute_modifier = NABBER_BRUTE_MODIFIER burn_modifier = NABBER_BURN_MODIFIER @@ -55,7 +55,7 @@ /obj/item/bodypart/arm/left/mutant/nabber icon_greyscale = BODYPART_ICON_NABBER - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_NABBER unarmed_damage_low = NABBER_PUNCH_LOW unarmed_damage_high = NABBER_PUNCH_HIGH @@ -64,7 +64,7 @@ /obj/item/bodypart/arm/right/mutant/nabber icon_greyscale = BODYPART_ICON_NABBER - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_NABBER unarmed_damage_low = NABBER_PUNCH_LOW unarmed_damage_high = NABBER_PUNCH_HIGH @@ -73,14 +73,14 @@ /obj/item/bodypart/leg/left/mutant/nabber icon_greyscale = BODYPART_ICON_NABBER - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_NABBER brute_modifier = NABBER_BRUTE_MODIFIER burn_modifier = NABBER_BURN_MODIFIER /obj/item/bodypart/leg/right/mutant/nabber icon_greyscale = BODYPART_ICON_NABBER - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + bodyshape = parent_type::bodyshape | BODYSHAPE_CUSTOM limb_id = SPECIES_NABBER brute_modifier = NABBER_BRUTE_MODIFIER burn_modifier = NABBER_BURN_MODIFIER From 6f3fbc0cd1238e347ec407134f3f8431af819d84 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:37:18 +0300 Subject: [PATCH 07/14] Antag optin (#1891) * PLEASE * remove the remnants of the fallen state * we should improve this somewhat * Apply suggestions from code review * Apply suggestions from code review * Update code/modules/jobs/job_types/_job.dm * Update code/datums/brain_damage/creepy_trauma.dm * me when * Typo * Skyrat defines->nova defines * Revert "Skyrat defines->nova defines" This reverts commit 46f5fd5ab97edd58aac59d0fdbdcd48bebc54f95. * Update tgstation.dme * Revert "Update tgstation.dme" This reverts commit 1f5bc9672bba5b28e7d08c47eac695222ee36d67. * Update tgstation.dme * Update tgstation.dme * fix config * awarfgh * this should work? * ill finish this later * okay * arggh * well, at least it can be lazy * agshj * lil fixy * config * tis is a g ood change * guess who forgot to push a commit * Apply suggestions from code review * lets just safeguard * move maroon to rr * Trigger CI * awagga * 2nd debug code * lets fix compile * respect the be antag switch * i need to push this shit already * ok --------- Co-authored-by: nikothedude <59709059+nikothedude@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Iajret --- .../~nova_defines/antag_optin_defines.dm | 45 +++++++++ .../dynamic/dynamic_rulesets_midround.dm | 6 +- code/datums/brain_damage/creepy_trauma.dm | 7 +- code/game/gamemodes/objective.dm | 15 ++- .../antagonists/cult/cult_objectives.dm | 9 +- .../sacrifice_knowledge.dm | 6 ++ code/modules/jobs/job_types/_job.dm | 9 ++ .../mob/living/carbon/human/examine.dm | 6 ++ config/nova/config_nova.txt | 3 + .../code/modules/mob/living/examine_tgui.dm | 41 +++++++-- .../antag_opt_in/code/antag_optin_config.dm | 2 + .../code/antag_optin_preferences.dm | 33 +++++++ modular_nova/modules/antag_opt_in/code/job.dm | 72 +++++++++++++++ .../modules/antag_opt_in/code/mind.dm | 92 +++++++++++++++++++ .../modules/antag_opt_in/code/objective.dm | 74 +++++++++++++++ .../antag_opt_in/code/objective_item.dm | 20 ++++ modular_nova/modules/antag_opt_in/readme.md | 33 +++++++ .../modules/mob/living/silicon/examine.dm | 7 ++ .../code/opposing_force_datum.dm | 32 +++++++ tgstation.dme | 7 ++ .../packages/tgui/interfaces/ExaminePanel.jsx | 26 ++++++ .../tgui/interfaces/OpposingForcePanel.jsx | 48 +++++++++- .../nova/antag_optin.tsx | 13 +++ 23 files changed, 589 insertions(+), 17 deletions(-) create mode 100644 code/__DEFINES/~nova_defines/antag_optin_defines.dm create mode 100644 modular_nova/modules/antag_opt_in/code/antag_optin_config.dm create mode 100644 modular_nova/modules/antag_opt_in/code/antag_optin_preferences.dm create mode 100644 modular_nova/modules/antag_opt_in/code/job.dm create mode 100644 modular_nova/modules/antag_opt_in/code/mind.dm create mode 100644 modular_nova/modules/antag_opt_in/code/objective.dm create mode 100644 modular_nova/modules/antag_opt_in/code/objective_item.dm create mode 100644 modular_nova/modules/antag_opt_in/readme.md create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/antag_optin.tsx diff --git a/code/__DEFINES/~nova_defines/antag_optin_defines.dm b/code/__DEFINES/~nova_defines/antag_optin_defines.dm new file mode 100644 index 00000000000..50e750053b9 --- /dev/null +++ b/code/__DEFINES/~nova_defines/antag_optin_defines.dm @@ -0,0 +1,45 @@ +//defines for antag opt in objective checking +//objectives check for all players with a value equal or greater than the 'threat' level of an objective then pick from that list +//command + sec roles are always opted in regardless of opt in status + +/// For temporary or otherwise 'inconvenient' objectives like kidnapping or theft +#define OPT_IN_YES_TEMP 1 +/// Cool with being killed or otherwise occupied but not removed from the round +#define OPT_IN_YES_KILL 2 +/// Fine with being round removed. +#define OPT_IN_YES_ROUND_REMOVE 3 + +#define OPT_IN_YES_TEMP_STRING "Yes - Temporary/Inconvenience" +#define OPT_IN_YES_KILL_STRING "Yes - Kill" +#define OPT_IN_YES_ROUND_REMOVE_STRING "Yes - Round Remove" +#define OPT_IN_NOT_TARGET_STRING "No" + +/// Assoc list of stringified opt_in_## define to the front-end string to show users as a representation of the setting. +GLOBAL_LIST_INIT(antag_opt_in_strings, list( + "0" = OPT_IN_NOT_TARGET_STRING, + "1" = OPT_IN_YES_TEMP_STRING, + "2" = OPT_IN_YES_KILL_STRING, + "3" = OPT_IN_YES_ROUND_REMOVE_STRING, +)) + +/// Assoc list of stringified opt_in_## define to the color associated with it. +GLOBAL_LIST_INIT(antag_opt_in_colors, list( + OPT_IN_NOT_TARGET_STRING = COLOR_GRAY, + OPT_IN_YES_TEMP_STRING = COLOR_EMERALD, + OPT_IN_YES_KILL_STRING = COLOR_ORANGE, + OPT_IN_YES_ROUND_REMOVE_STRING = COLOR_RED +)) + +/// Prefers not to be a target. Will still be a potential target if playing sec or command. +#define OPT_IN_NOT_TARGET 0 + +/// The minimum opt-in level for people playing sec. +#define SECURITY_OPT_IN_LEVEL OPT_IN_YES_KILL +/// The minimum opt-in level for people playing command. +#define COMMAND_OPT_IN_LEVEL OPT_IN_YES_KILL + +/// The default opt in level for preferences and mindless mobs. +#define OPT_IN_DEFAULT_LEVEL OPT_IN_NOT_TARGET + +/// If the player has any non-ghost role antags enabled, they are forced to use a minimum of this. +#define OPT_IN_ANTAG_ENABLED_LEVEL OPT_IN_YES_TEMP diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm index 036236b0a91..79e47cb3b3d 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_midround.dm @@ -942,12 +942,16 @@ /datum/dynamic_ruleset/midround/from_ghosts/paradox_clone/proc/find_original() var/list/possible_targets = list() + var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN for(var/mob/living/carbon/human/player in GLOB.player_list) if(!player.client || !player.mind || player.stat) continue if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) continue - possible_targets += player + // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + Antag Optin + if (!opt_in_disabled && player.mind?.get_effective_opt_in_level() < OPT_IN_YES_ROUND_REMOVE) + continue + // NOVA EDIT ADDITION END if(possible_targets.len) return pick(possible_targets) diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index b056ddfb8de..11283588543 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -131,15 +131,18 @@ var/list/special_pool = list() //The special list, for quirk-based var/chosen_victim //The obsession target + var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN for(var/mob/player as anything in GLOB.player_list)//prevents crew members falling in love with nuke ops they never met, and other annoying hijinks if(!player.client || !player.mind || isnewplayer(player) || player.stat == DEAD || isbrain(player) || player == owner) continue if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) continue - // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + Antag Optin if(SSticker.IsRoundInProgress() && istype(get_area(player), /area/centcom/interlink)) continue - // NOVA EDIT END + if (!opt_in_disabled && player.mind?.get_effective_opt_in_level() < OPT_IN_YES_KILL) + continue + // NOVA EDIT ADDITION END viable_minds += player.mind for(var/datum/mind/possible_target as anything in viable_minds) if(possible_target != owner && ishuman(possible_target.current)) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f8a2cbede01..7c7deb058f2 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -157,6 +157,7 @@ GLOBAL_LIST_EMPTY(objectives) //NOVA EDIT ADDITION var/datum/mind/O = I if(O.late_joiner) try_target_late_joiners = TRUE + var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN for(var/datum/mind/possible_target in get_crewmember_minds()) if(possible_target in owners) continue @@ -166,6 +167,10 @@ GLOBAL_LIST_EMPTY(objectives) //NOVA EDIT ADDITION continue if(!is_valid_target(possible_target)) continue + // NOVA EDIT ADDITION START - Antag Opt In + if (!opt_in_disabled && !opt_in_valid(possible_target)) + continue + // NOVA EDIT ADDITION END possible_targets += possible_target if(try_target_late_joiners) var/list/all_possible_targets = possible_targets.Copy() @@ -871,7 +876,15 @@ GLOBAL_LIST_EMPTY(possible_items) /datum/objective/destroy/find_target(dupe_search_range, list/blacklist) var/list/possible_targets = active_ais(TRUE) possible_targets -= blacklist - var/mob/living/silicon/ai/target_ai = pick(possible_targets) + //var/mob/living/silicon/ai/target_ai = pick(possible_targets) // NOVA EDIT REMOVAL - Uses the below loop + // NOVA EDIT ADDITION BEGIN - ANTAG OPTIN + var/mob/living/silicon/ai/target_ai + var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN + for (var/mob/living/silicon/ai/possible_target as anything in shuffle(possible_targets)) + if (!opt_in_disabled && !opt_in_valid(possible_target)) + continue + target_ai = possible_target + // NOVA EDIT ADDITION END target = target_ai.mind update_explanation_text() return target diff --git a/code/modules/antagonists/cult/cult_objectives.dm b/code/modules/antagonists/cult/cult_objectives.dm index 7da5d095661..42312eea2dd 100644 --- a/code/modules/antagonists/cult/cult_objectives.dm +++ b/code/modules/antagonists/cult/cult_objectives.dm @@ -19,19 +19,24 @@ return var/datum/team/cult/cult = team var/list/target_candidates = list() + var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) // NOVA EDIT ADDITION - ANTAG OPT-IN for(var/mob/living/carbon/human/player in GLOB.player_list) - // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + Antag Optin if(SSticker.IsRoundInProgress() && istype(get_area(player), /area/centcom/interlink)) continue + if (!opt_in_disabled && !opt_in_valid(player)) + continue // NOVA EDIT END if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD) target_candidates += player.mind if(target_candidates.len == 0) message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.") for(var/mob/living/carbon/human/player in GLOB.player_list) - // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + // NOVA EDIT ADDITION START - Players in the interlink can't be obsession targets + Antag Optin if(SSticker.IsRoundInProgress() && istype(get_area(player), /area/centcom/interlink)) continue + if (!opt_in_disabled && !opt_in_valid(player)) + continue // NOVA EDIT END if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD) target_candidates += player.mind diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 797d754ea0b..f515b3e25bd 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -113,6 +113,10 @@ continue if(possible_target.current.stat == DEAD) continue + // NOVA EDIT ADDITION BEGIN - Antag opt-in (Only security and command can be targetted) + if (!possible_target.assigned_role?.heretic_sac_target) + continue + // NOVA EDIT ADDITION END valid_targets += possible_target @@ -142,12 +146,14 @@ valid_targets -= sec_mind break + /* NOVA EDIT REMOVAL -- Antag Opt In (Only sec and command may be targetted) // Third target, someone in their department. for(var/datum/mind/department_mind as anything in shuffle(valid_targets)) if(department_mind.assigned_role?.departments_bitflags & user.mind.assigned_role?.departments_bitflags) final_targets += department_mind valid_targets -= department_mind break + */ // NOVA EDIT REMOVAL END // Now grab completely random targets until we'll full var/target_sanity = 0 diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index c0a56dc7a67..70bc9113150 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -312,6 +312,15 @@ info += span_boldnotice("As this station was initially staffed with a \ [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] \ have been added to your ID card.") + //NOVA EDIT ADDITION BEGIN - ANTAG OPT IN + if (!CONFIG_GET(flag/disable_antag_opt_in_preferences)) + if (isnum(minimum_opt_in_level) && minimum_opt_in_level > OPT_IN_NOT_TARGET) + info += span_bolddanger("This job forces a minimum opt-in setting of [GLOB.antag_opt_in_strings["[minimum_opt_in_level]"]].") + if (heretic_sac_target) + info += span_bolddanger("This job can be sacrificed by heretics.") + if (contractable) + info += span_bolddanger("This job can be targeted by contractors.") + //NOVA EDIT ADDITION END //NOVA EDIT ADDITION START - ALTERNATIVE_JOB_TITLES if(alt_title != title) info += span_warning("Remember that alternate titles are purely for flavor and roleplay.") diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 735d6f83cc1..c628b9ddcb8 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -505,6 +505,12 @@ if(erp_status_pref && !CONFIG_GET(flag/disable_erp_preferences)) . += span_notice("ERP STATUS: [erp_status_pref]") + if (!CONFIG_GET(flag/disable_antag_opt_in_preferences)) + var/opt_in_status = mind?.get_effective_opt_in_level() + if (!isnull(opt_in_status)) + var/stringified_optin = GLOB.antag_opt_in_strings["[opt_in_status]"] + . += span_notice("Antag Opt-in Status: [stringified_optin]") + //Temporary flavor text addition: if(temporary_flavor_text) if(length_char(temporary_flavor_text) < TEMPORARY_FLAVOR_PREVIEW_LIMIT) diff --git a/config/nova/config_nova.txt b/config/nova/config_nova.txt index deb7f925ea8..31f620888d9 100644 --- a/config/nova/config_nova.txt +++ b/config/nova/config_nova.txt @@ -146,3 +146,6 @@ VETERAN_LEGACY_SYSTEM ## How much time arrivals shuttle should stay at station after its engines recharged before returning to interlink. In deciseconds. 150 - 15 seconds. 0 - disables autoreturn. ARRIVALS_WAIT 150 + +## Uncomment to completely disable the opt-in system, which is a system that forces objectives to only roll on individuals who consent to it. +#DISABLE_ANTAG_OPT_IN_PREFERENCES diff --git a/modular_nova/master_files/code/modules/mob/living/examine_tgui.dm b/modular_nova/master_files/code/modules/mob/living/examine_tgui.dm index 5648dda48d3..de181c91ffc 100644 --- a/modular_nova/master_files/code/modules/mob/living/examine_tgui.dm +++ b/modular_nova/master_files/code/modules/mob/living/examine_tgui.dm @@ -54,19 +54,30 @@ var/custom_species_lore var/obscured var/ooc_notes = "" + var/ideal_antag_optin_status + var/current_antag_optin_status var/headshot = "" // Handle OOC notes first - if(preferences && preferences.read_preference(/datum/preference/toggle/master_erp_preferences)) - var/e_prefs = preferences.read_preference(/datum/preference/choiced/erp_status) - var/e_prefs_nc = preferences.read_preference(/datum/preference/choiced/erp_status_nc) - var/e_prefs_v = preferences.read_preference(/datum/preference/choiced/erp_status_v) - var/e_prefs_mechanical = preferences.read_preference(/datum/preference/choiced/erp_status_mechanics) - ooc_notes += "ERP: [e_prefs]\n" - ooc_notes += "Non-Con: [e_prefs_nc]\n" - ooc_notes += "Vore: [e_prefs_v]\n" - ooc_notes += "ERP Mechanics: [e_prefs_mechanical]\n" - ooc_notes += "\n" + if(preferences) + if(preferences.read_preference(/datum/preference/toggle/master_erp_preferences)) + var/e_prefs = preferences.read_preference(/datum/preference/choiced/erp_status) + var/e_prefs_nc = preferences.read_preference(/datum/preference/choiced/erp_status_nc) + var/e_prefs_v = preferences.read_preference(/datum/preference/choiced/erp_status_v) + var/e_prefs_mechanical = preferences.read_preference(/datum/preference/choiced/erp_status_mechanics) + ooc_notes += "ERP: [e_prefs]\n" + ooc_notes += "Non-Con: [e_prefs_nc]\n" + ooc_notes += "Vore: [e_prefs_v]\n" + ooc_notes += "ERP Mechanics: [e_prefs_mechanical]\n" + ooc_notes += "\n" + + if(!CONFIG_GET(flag/disable_antag_opt_in_preferences)) + var/antag_prefs = holder.mind?.ideal_opt_in_level + var/effective_opt_in_level = holder.mind?.get_effective_opt_in_level() + if(isnull(antag_prefs)) + antag_prefs = preferences.read_preference(/datum/preference/choiced/antag_opt_in_status) + current_antag_optin_status = GLOB.antag_opt_in_strings[num2text(effective_opt_in_level)] + ideal_antag_optin_status = GLOB.antag_opt_in_strings[num2text(antag_prefs)] // Now we handle silicon and/or human, order doesn't really matter // If other variants of mob/living need to be handled at some point, put them here @@ -97,4 +108,14 @@ data["custom_species"] = custom_species data["custom_species_lore"] = custom_species_lore data["headshot"] = headshot + + data["ideal_antag_optin_status"] = ideal_antag_optin_status + data["current_antag_optin_status"] = current_antag_optin_status + return data + +/datum/examine_panel/ui_static_data(mob/user) + var/list/data = list() + + data["opt_in_colors"] = GLOB.antag_opt_in_colors + return data diff --git a/modular_nova/modules/antag_opt_in/code/antag_optin_config.dm b/modular_nova/modules/antag_opt_in/code/antag_optin_config.dm new file mode 100644 index 00000000000..bff8c325131 --- /dev/null +++ b/modular_nova/modules/antag_opt_in/code/antag_optin_config.dm @@ -0,0 +1,2 @@ +/datum/config_entry/flag/disable_antag_opt_in_preferences + default = FALSE diff --git a/modular_nova/modules/antag_opt_in/code/antag_optin_preferences.dm b/modular_nova/modules/antag_opt_in/code/antag_optin_preferences.dm new file mode 100644 index 00000000000..eb6038e62e8 --- /dev/null +++ b/modular_nova/modules/antag_opt_in/code/antag_optin_preferences.dm @@ -0,0 +1,33 @@ +/datum/preference/choiced/antag_opt_in_status + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "antag_opt_in_status_pref" + +/datum/preference/choiced/antag_opt_in_status/init_possible_values() + return list(OPT_IN_YES_TEMP, OPT_IN_YES_KILL, OPT_IN_YES_ROUND_REMOVE, OPT_IN_NOT_TARGET) + +/datum/preference/choiced/antag_opt_in_status/create_default_value() + return OPT_IN_DEFAULT_LEVEL + +/datum/preference/choiced/antag_opt_in_status/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + return !(CONFIG_GET(flag/disable_antag_opt_in_preferences)) + +/datum/preference/choiced/antag_opt_in_status/deserialize(input, datum/preferences/preferences) + if(CONFIG_GET(flag/disable_antag_opt_in_preferences)) + return OPT_IN_DEFAULT_LEVEL + + return ..() + +/datum/preference/choiced/antag_opt_in_status/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + return FALSE + +/datum/preference/choiced/antag_opt_in_status/compile_constant_data() + var/list/data = ..() + + // An assoc list of values to display names so we don't show players numbers in their settings! + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.antag_opt_in_strings + + return data diff --git a/modular_nova/modules/antag_opt_in/code/job.dm b/modular_nova/modules/antag_opt_in/code/job.dm new file mode 100644 index 00000000000..1eb819d5c99 --- /dev/null +++ b/modular_nova/modules/antag_opt_in/code/job.dm @@ -0,0 +1,72 @@ +/datum/job + /// The minimum antag opt-in any holder of this job must use. If null, will defer to the mind's opt in level. + var/minimum_opt_in_level + /// Can this job be targetted as a heretic sacrifice target? + var/heretic_sac_target + /// Is this job targetable by contractors? + var/contractable + +/// Updates [minimum_opt_in_level] [heretic_sac_target] and [contractable]. +/datum/job/proc/update_opt_in_vars() + if(CONFIG_GET(flag/disable_antag_opt_in_preferences)) + return + + if(isnull(minimum_opt_in_level)) + minimum_opt_in_level = get_initial_opt_in_level() + if(isnull(heretic_sac_target)) + heretic_sac_target = initialize_heretic_target_status() + if(isnull(contractable)) + contractable = initialize_contractable_status() + + update_opt_in_desc_suffix() + +/// Returns this job's initial opt in level, taking into account departmental bitflags. +/datum/job/proc/get_initial_opt_in_level() + if (departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY)) + return SECURITY_OPT_IN_LEVEL + if (departments_bitflags & (DEPARTMENT_BITFLAG_COMMAND)) + return COMMAND_OPT_IN_LEVEL + +/// Determines if this job should be sacrificable by heretics. +/datum/job/proc/initialize_heretic_target_status() + if (departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_COMMAND)) + return TRUE + + return FALSE + +/// Determines if this job should be targetable by contractors. +/datum/job/proc/initialize_contractable_status() + if (departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY | DEPARTMENT_BITFLAG_COMMAND)) + return TRUE + + return FALSE + +/// Generates and sets a suffix appended to our description detailing our opt-in variables. +/datum/job/proc/update_opt_in_desc_suffix() + var/list/suffixes = list() + + if (minimum_opt_in_level) + suffixes += " Forces a minimum of [GLOB.antag_opt_in_strings["[minimum_opt_in_level]"]] antag opt-in." + if (contractable) + suffixes += " Targetable by contractors." + if (heretic_sac_target) + suffixes += " Targetable by heretics." + if (length(suffixes)) + var/suffix = jointext(suffixes, "") + set_opt_in_desc_suffix(suffix) + +/// Setter for [new_suffix]. Resets desc then appends the new suffix. +/datum/job/proc/set_opt_in_desc_suffix(new_suffix) + description = initial(description) + + if (new_suffix) + description += new_suffix + +/datum/controller/subsystem/job/SetupOccupations() + . = ..() + + if(CONFIG_GET(flag/disable_antag_opt_in_preferences)) + return + + for(var/datum/job/job as anything in all_occupations) + job.update_opt_in_vars() diff --git a/modular_nova/modules/antag_opt_in/code/mind.dm b/modular_nova/modules/antag_opt_in/code/mind.dm new file mode 100644 index 00000000000..91224664bf5 --- /dev/null +++ b/modular_nova/modules/antag_opt_in/code/mind.dm @@ -0,0 +1,92 @@ +/// If a player has any of these enabled, they are forced to use a minimum of OPT_IN_ANTAG_ENABLED_LEVEL antag optin. Dynamic - checked on the fly, not cached. +GLOBAL_LIST_INIT(optin_forcing_midround_antag_categories, list( + ROLE_CHANGELING_MIDROUND, + ROLE_MALF_MIDROUND, + ROLE_OBSESSED, + ROLE_SLEEPER_AGENT, +)) + +/// If a player has any of these enabled ON SPAWN, they are forced to use a minimum of OPT_IN_ANTAG_ENABLED_LEVEL antag optin for the rest of the round. +GLOBAL_LIST_INIT(optin_forcing_on_spawn_antag_categories, list( + ROLE_BROTHER, + ROLE_CHANGELING, + ROLE_CULTIST, + ROLE_HERETIC, + ROLE_MALF, + ROLE_OPERATIVE, + ROLE_TRAITOR, + ROLE_WIZARD, + ROLE_ASSAULT_OPERATIVE, + ROLE_CLOWN_OPERATIVE, + ROLE_NUCLEAR_OPERATIVE, + ROLE_HERETIC_SMUGGLER, + ROLE_PROVOCATEUR, + ROLE_STOWAWAY_CHANGELING, + ROLE_SYNDICATE_INFILTRATOR, +)) + +/datum/mind + /// The optin level set by preferences. + var/ideal_opt_in_level = OPT_IN_DEFAULT_LEVEL + /// Set on the FIRST mob login. Set by on-spawn antags (e.g. if you have traitor on and spawn, this will be set to OPT_IN_ANTAG_ENABLED_LEVEL and cannot change) + var/on_spawn_antag_opt_in_level = OPT_IN_NOT_TARGET + /// Set to TRUE on a successful transfer_mind() call. If TRUE, transfer_mind() will not refresh opt in. + var/opt_in_initialized + +/mob/living/Login() + . = ..() + + if (isnull(mind)) + return + if (isnull(client?.prefs)) + return + if (!mind.opt_in_initialized) + mind.update_opt_in(client.prefs) + mind.send_antag_optin_reminder() + mind.opt_in_initialized = TRUE + +/// Refreshes our ideal/on spawn antag opt in level by accessing preferences. +/datum/mind/proc/update_opt_in(datum/preferences/preference_instance = GLOB.preferences_datums[lowertext(key)]) + if (isnull(preference_instance)) + return + + ideal_opt_in_level = preference_instance.read_preference(/datum/preference/choiced/antag_opt_in_status) + + if (preference_instance.read_preference(/datum/preference/toggle/be_antag)) + for (var/antag_category in GLOB.optin_forcing_on_spawn_antag_categories) + if (antag_category in preference_instance.be_special) + on_spawn_antag_opt_in_level = OPT_IN_ANTAG_ENABLED_LEVEL + break + +/// Sends a bold message to our holder, telling them if their optin setting has been set to a minimum due to their antag preferences. +/datum/mind/proc/send_antag_optin_reminder() + var/datum/preferences/preference_instance = GLOB.preferences_datums[lowertext(key)] + var/client/our_client = preference_instance?.parent // that moment when /mind doesnt have a ref to client :) + if (our_client) + var/antag_level = get_antag_opt_in_level() + if (antag_level <= OPT_IN_NOT_TARGET) + return + var/stringified_level = GLOB.antag_opt_in_strings["[antag_level]"] + to_chat(our_client, span_boldnotice("Due to your antag preferences, your antag-optin status has been set to a minimum of [stringified_level].")) + +/// Gets the actual opt-in level used for determining targets. +/datum/mind/proc/get_effective_opt_in_level() + var/step_1 = max(ideal_opt_in_level, get_job_opt_in_level()) + var/step_2 = max(step_1, get_antag_opt_in_level()) + return step_2 + +/// Returns the opt in level of our job. +/datum/mind/proc/get_job_opt_in_level() + return assigned_role?.minimum_opt_in_level || OPT_IN_NOT_TARGET + +/// If we have any antags enabled in GLOB.optin_forcing_midround_antag_categories, returns OPT_IN_ANTAG_ENABLED_LEVEL. OPT_IN_NOT_TARGET otherwise. +/datum/mind/proc/get_antag_opt_in_level() + if (on_spawn_antag_opt_in_level > OPT_IN_NOT_TARGET) + return on_spawn_antag_opt_in_level + + var/datum/preferences/preference_instance = GLOB.preferences_datums[lowertext(key)] + if (!isnull(preference_instance) && preference_instance.read_preference(/datum/preference/toggle/be_antag)) + for (var/antag_category in GLOB.optin_forcing_midround_antag_categories) + if (antag_category in preference_instance.be_special) + return OPT_IN_ANTAG_ENABLED_LEVEL + return OPT_IN_NOT_TARGET diff --git a/modular_nova/modules/antag_opt_in/code/objective.dm b/modular_nova/modules/antag_opt_in/code/objective.dm new file mode 100644 index 00000000000..1c806b04957 --- /dev/null +++ b/modular_nova/modules/antag_opt_in/code/objective.dm @@ -0,0 +1,74 @@ +/datum/objective + /// The default opt in level of this objective. Only targets with opt in above or at this will be considered for this objective. + var/default_opt_in_level = OPT_IN_YES_KILL + +/// Simple getter for [default_opt_in_level]. Use for custom behavior. +/datum/objective/proc/get_opt_in_level(datum/mind/target_mind) + return default_opt_in_level + +/// Returns whether or not our opt in levels/variables are correct for the target. If true, they can be picked as a target. +/datum/objective/proc/opt_in_valid(datum/mind/target_mind) + return (get_opt_in_level(target_mind) <= target_mind.get_effective_opt_in_level()) + +// ROUND REMOVE +/datum/objective/maroon + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +/datum/objective/assassinate/paradox_clone + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +/datum/objective/capture + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +/datum/objective/absorb + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +/datum/objective/absorb_changeling + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +/datum/objective/sacrifice + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +/datum/objective/debrain + default_opt_in_level = OPT_IN_YES_ROUND_REMOVE + +// KILL + +/datum/objective/assassinate + default_opt_in_level = OPT_IN_YES_KILL + +/datum/objective/destroy + default_opt_in_level = OPT_IN_YES_KILL + +/datum/objective/mutiny + default_opt_in_level = OPT_IN_YES_KILL + +// TEMP + +/datum/objective/protect + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/protect/nonhuman + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/steal_n_of_type + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/steal + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/escape/escape_with_identity + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/jailbreak + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/contract + default_opt_in_level = OPT_IN_YES_TEMP + +/datum/objective/contract/opt_in_valid(datum/mind/target_mind) + var/datum/job/target_job = target_mind.assigned_role + if (!target_job?.contractable) + return FALSE + + return ..() diff --git a/modular_nova/modules/antag_opt_in/code/objective_item.dm b/modular_nova/modules/antag_opt_in/code/objective_item.dm new file mode 100644 index 00000000000..32c89aa9238 --- /dev/null +++ b/modular_nova/modules/antag_opt_in/code/objective_item.dm @@ -0,0 +1,20 @@ +/datum/objective_item + /// The opt in level all owners of the item must meet for this to be eligible as an objective target. + var/opt_in_level = OPT_IN_YES_TEMP + +/// Returns TRUE if we have no owners, or all owners's effective opt in level is above [opt_in_level]. FALSE otherwise. +/datum/objective_item/proc/owner_opted_in() + if (!length(item_owner)) + return TRUE + for (var/mob/living/player as anything in GLOB.player_list) + if ((player.mind?.assigned_role.title in item_owner) && player.stat != DEAD && !is_centcom_level(player.z)) // is an owner, copypasted from objective_items.dm owner_exists() + if (player.mind.get_effective_opt_in_level() < opt_in_level) + return FALSE + return TRUE + +/datum/objective_item/valid_objective_for(list/potential_thieves, require_owner) + var/opt_in_disabled = CONFIG_GET(flag/disable_antag_opt_in_preferences) + if (!opt_in_disabled && require_owner && !owner_opted_in()) + return FALSE + + return ..() diff --git a/modular_nova/modules/antag_opt_in/readme.md b/modular_nova/modules/antag_opt_in/readme.md new file mode 100644 index 00000000000..de41e00958b --- /dev/null +++ b/modular_nova/modules/antag_opt_in/readme.md @@ -0,0 +1,33 @@ +https://github.com/NovaSector/NovaSector/pull/121 + +## \ + +Module ID: ANTAG_OPTIN + +### Description: + + +Adds functionality to allow players to 'opt-in' to being an antagonist's mechanical target, with three different levels of involvement - being temporarily inconvenienced, killed, and round removed. Command roles & security are automatically opted-in to at least 'KILL' level. Additionally, contractor & heretic have their objectives adjusted to only have command staff & security as their targets + +### TG Proc/File Changes: + +- Changes in several antag files (will list later) +- examine_tgui.dm (Adds opt in info to OOC examine info) +- objective.dm (target selection stuff) + +### Modular Overrides: + +- N/A + +### Defines: + +- antag_opt_in - lives in ~skyrat_defines located in __DEFINES folder. Defines named OPT_IN_YES_KILL, OPT_IN_YES_TEMP, OPT_IN_YES_ROUND_REMOVE, and OPT_IN_OPT_IN_NOT_TARGET - used for managing opt in stuff. + +### Included files that are not contained in this module: + +- tgui\packages\tgui\interfaces\PreferencesMenu\preferences\features\character_preferences\skyrat\antag_optin.tsx + +### Credits: + +- niko - for doing stuff and taking over +- plum - the original author diff --git a/modular_nova/modules/customization/modules/mob/living/silicon/examine.dm b/modular_nova/modules/customization/modules/mob/living/silicon/examine.dm index 3eb789b6a28..f83c5843116 100644 --- a/modular_nova/modules/customization/modules/mob/living/silicon/examine.dm +++ b/modular_nova/modules/customization/modules/mob/living/silicon/examine.dm @@ -17,6 +17,13 @@ var/erp_status_pref = client.prefs.read_preference(/datum/preference/choiced/erp_status) if(erp_status_pref && !CONFIG_GET(flag/disable_erp_preferences)) . += span_notice("ERP STATUS: [erp_status_pref]") + + if (!CONFIG_GET(flag/disable_antag_opt_in_preferences)) + var/opt_in_status = mind?.get_effective_opt_in_level() + if (!isnull(opt_in_status)) + var/stringified_optin = GLOB.antag_opt_in_strings["[opt_in_status]"] + . += span_notice("Antag Opt-in Status: <b><font color='[GLOB.antag_opt_in_colors[stringified_optin]]'>[stringified_optin]</font></b>") + if(temporary_flavor_text) if(length_char(temporary_flavor_text) <= 40) . += span_notice("<b>They look different than usual:</b> [temporary_flavor_text]") diff --git a/modular_nova/modules/opposing_force/code/opposing_force_datum.dm b/modular_nova/modules/opposing_force/code/opposing_force_datum.dm index 3f688332cb5..e6f3571a10a 100644 --- a/modular_nova/modules/opposing_force/code/opposing_force_datum.dm +++ b/modular_nova/modules/opposing_force/code/opposing_force_datum.dm @@ -216,6 +216,16 @@ ) data["selected_equipment"] += list(equipment_data) + data["current_crew"] = generate_optin_crew_list() + + return data + +/datum/opposing_force/ui_static_data(mob/user) + var/list/data = list() + + data["opt_in_colors"] = GLOB.antag_opt_in_colors + data["opt_in_enabled"] = (!CONFIG_GET(flag/disable_antag_opt_in_preferences)) + return data /datum/opposing_force/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) @@ -1021,3 +1031,25 @@ return opfor.ui_interact(usr) + +/proc/generate_optin_crew_list() + var/list/output = list() + + for (var/datum/record/locked/iterated_record as anything in GLOB.manifest.locked) + var/datum/mind/mind_datum = iterated_record.mind_ref.resolve() + if (!istype(mind_datum)) + continue + var/name = iterated_record.name + var/rank = iterated_record.rank + + var/opt_in_status = mind_datum.get_effective_opt_in_level() + var/ideal_opt_in_status = mind_datum.ideal_opt_in_level + + output += list(list( + "name" = name, + "rank" = rank, + "opt_in_status" = GLOB.antag_opt_in_strings["[opt_in_status]"], + "ideal_opt_in_status" = GLOB.antag_opt_in_strings["[ideal_opt_in_status]"] + )) + + return output diff --git a/tgstation.dme b/tgstation.dme index 8e80cbb8e44..725b5a9dca8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -399,6 +399,7 @@ #include "code\__DEFINES\~nova_defines\admin.dm" #include "code\__DEFINES\~nova_defines\airlock.dm" #include "code\__DEFINES\~nova_defines\ammo_defines.dm" +#include "code\__DEFINES\~nova_defines\antag_optin_defines.dm" #include "code\__DEFINES\~nova_defines\antagonists.dm" #include "code\__DEFINES\~nova_defines\apc_defines.dm" #include "code\__DEFINES\~nova_defines\armaments.dm" @@ -6646,6 +6647,12 @@ #include "modular_nova\modules\alternative_job_titles\code\job.dm" #include "modular_nova\modules\ammo_workbench\code\ammo_workbench.dm" #include "modular_nova\modules\ammo_workbench\code\design_disks.dm" +#include "modular_nova\modules\antag_opt_in\code\antag_optin_config.dm" +#include "modular_nova\modules\antag_opt_in\code\antag_optin_preferences.dm" +#include "modular_nova\modules\antag_opt_in\code\job.dm" +#include "modular_nova\modules\antag_opt_in\code\mind.dm" +#include "modular_nova\modules\antag_opt_in\code\objective.dm" +#include "modular_nova\modules\antag_opt_in\code\objective_item.dm" #include "modular_nova\modules\apc_arcing\apc.dm" #include "modular_nova\modules\armaments\code\armament_component.dm" #include "modular_nova\modules\armaments\code\armament_entries.dm" diff --git a/tgui/packages/tgui/interfaces/ExaminePanel.jsx b/tgui/packages/tgui/interfaces/ExaminePanel.jsx index 7ed8129e4ba..b8807db8c24 100644 --- a/tgui/packages/tgui/interfaces/ExaminePanel.jsx +++ b/tgui/packages/tgui/interfaces/ExaminePanel.jsx @@ -43,6 +43,9 @@ export const ExaminePanel = (props) => { custom_species, custom_species_lore, headshot, + ideal_antag_optin_status, + current_antag_optin_status, + opt_in_colors = { optin, color }, } = data; return ( <Window title="Examine Panel" width={900} height={670} theme="admin"> @@ -105,6 +108,29 @@ export const ExaminePanel = (props) => { title="OOC Notes" preserveWhitespace > + {ideal_antag_optin_status && ( + <Stack.Item> + Current Antag Opt-In Status:{' '} + <span + style={{ + fontWeight: 'bold', + color: opt_in_colors[current_antag_optin_status], + }} + > + {current_antag_optin_status} + </span> + {'\n'} + Antag Opt-In Status {'(Preferences)'}:{' '} + <span + style={{ + color: opt_in_colors[ideal_antag_optin_status], + }} + > + {ideal_antag_optin_status} + </span> + {'\n\n'} + </Stack.Item> + )} {formatURLs(ooc_notes)} </Section> </Stack.Item> diff --git a/tgui/packages/tgui/interfaces/OpposingForcePanel.jsx b/tgui/packages/tgui/interfaces/OpposingForcePanel.jsx index 76d2f11b470..7f25e09847d 100644 --- a/tgui/packages/tgui/interfaces/OpposingForcePanel.jsx +++ b/tgui/packages/tgui/interfaces/OpposingForcePanel.jsx @@ -22,7 +22,7 @@ import { Window } from '../layouts'; export const OpposingForcePanel = (props) => { const [tab, setTab] = useState(1); const { act, data } = useBackend(); - const { admin_mode, creator_ckey, owner_antag } = data; + const { admin_mode, creator_ckey, owner_antag, opt_in_enabled } = data; return ( <Window title={'Opposing Force: ' + creator_ckey} @@ -74,6 +74,15 @@ export const OpposingForcePanel = (props) => { > Admin Chat </Tabs.Tab> + {!!opt_in_enabled && ( + <Tabs.Tab + width="100%" + selected={tab === 4} + onClick={() => setTab(4)} + > + Target List + </Tabs.Tab> + )} </> )} </Tabs> @@ -89,6 +98,7 @@ export const OpposingForcePanel = (props) => { {tab === 1 && <OpposingForceTab />} {tab === 2 && <EquipmentTab />} {tab === 3 && <AdminChatTab />} + {tab === 4 && <TargetTab />} </> )} </Window.Content> @@ -910,3 +920,39 @@ export const AdminTab = (props) => { </Stack> ); }; + +export const TargetTab = (props) => { + const { act, data } = useBackend(); + const { current_crew = [], opt_in_colors = { optin, color } } = data; + return ( + <Stack vertical fill> + <Stack.Item grow={10}> + <Section title="Currently active crew"> + {current_crew.map((crew) => ( + <Stack vertical={false} key={crew.name} pb="10px"> + <Stack.Item> + <span style={{ textDecoration: 'underline' }}>{crew.name}</span> + {': '} + {crew.rank}, Current Opt-In status:{' '} + <span + style={{ + fontWeight: 'bold', + color: opt_in_colors[crew.opt_in_status], + }} + > + {crew.opt_in_status} + </span> + , Ideal Opt-in status:{' '} + <span + style={{ color: opt_in_colors[crew.ideal_opt_in_status] }} + > + {crew.ideal_opt_in_status} + </span> + </Stack.Item> + </Stack> + ))} + </Section> + </Stack.Item> + </Stack> + ); +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/antag_optin.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/antag_optin.tsx new file mode 100644 index 00000000000..8e3032932a2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/nova/antag_optin.tsx @@ -0,0 +1,13 @@ +// THIS IS A NOVA SECTOR UI FILE +import { FeatureChoiced, FeatureDropdownInput } from '../../base'; + +export const antag_opt_in_status_pref: FeatureChoiced = { + name: 'Be Antagonist Target', + description: + 'This is for objective targetting and OOC consent.\ + By extension, picking "Round Remove" will allow you to be round removed in applicable situations, even by non-antagonists. \ + Enabling any non-ghost antags \ + (revenant, abductor contractor, etc.) will force your opt-in to be, \ + at minimum, "Temporarily Inconvenience".', + component: FeatureDropdownInput, +}; From 3eea3386c3ea139b9bd24efa268bc2dfc974091b Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:37:22 +0300 Subject: [PATCH 08/14] Automatic changelog for PR #2130 [ci skip] --- html/changelogs/AutoChangeLog-pr-2130.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2130.yml diff --git a/html/changelogs/AutoChangeLog-pr-2130.yml b/html/changelogs/AutoChangeLog-pr-2130.yml new file mode 100644 index 00000000000..d65d654f6d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2130.yml @@ -0,0 +1,4 @@ +author: "13spacemen" +delete-after: True +changes: + - refactor: "Bodytypes to do with character sprite shape now have their own bodyshape var, all sprite handling is done with bodyshape and not bodytype anymore" \ No newline at end of file From 35d3508352b30968d85a9f5378b6ba91341f3487 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:37:45 +0300 Subject: [PATCH 09/14] Fixes synth brains getting deleted when gibbed (#2181) * Fixes synthetic brains not always dropping when they get gibbed * Missing code * Update organs.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Iajret <HellDog15@gmail.com> --- code/modules/mob/living/carbon/death.dm | 2 +- code/modules/mob/living/death.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 85a6b06a2d3..13d7b37e6b8 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -42,7 +42,7 @@ for(var/obj/item/organ/organ as anything in organs) if((drop_bitflags & DROP_BRAIN) && istype(organ, /obj/item/organ/internal/brain)) - if(drop_bitflags & DROP_BODYPARTS) + if(drop_bitflags & DROP_BODYPARTS && (check_zone(organ.zone) != BODY_ZONE_CHEST)) // NOVA EDIT CHANGE - sYNTH BRAINS - ORIGINAL: if(drop_bitflags & DROP_BODYPARTS) continue // the head will drop, so the brain should stay inside organ.Remove(src) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index ee0450f4075..92abcffd186 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -19,7 +19,7 @@ death(TRUE) ghostize() - spill_organs(drop_bitflags) + spill_organs(issynthetic(src) ? drop_bitflags|DROP_BRAIN : drop_bitflags) // NOVA EDIT CHANGE - Synths always drop brains - ORIGINAL: spill_organs(drop_bitflags) if(drop_bitflags & DROP_BODYPARTS) spread_bodyparts(drop_bitflags) From 5b15c04b1ae95cffa7e6ff9139b3d97a416cc37d Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:37:47 +0300 Subject: [PATCH 10/14] Automatic changelog for PR #1891 [ci skip] --- html/changelogs/AutoChangeLog-pr-1891.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1891.yml diff --git a/html/changelogs/AutoChangeLog-pr-1891.yml b/html/changelogs/AutoChangeLog-pr-1891.yml new file mode 100644 index 00000000000..0c0adbabea4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1891.yml @@ -0,0 +1,4 @@ +author: "nikothedude" +delete-after: True +changes: + - rscadd: "Added antagonist opt-in! Brave crewmates wishing to be the target of nefarious evildoers now may indicate this desire in their character preferences." \ No newline at end of file From 9bedff67a0083cb3d2138a2dd4c3c93ecb9346d2 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:37:59 +0300 Subject: [PATCH 11/14] [MIRROR] Adds New Changeling Ability: Hive Head (#2192) * Adds New Changeling Ability: Hive Head (#81502) ## About The Pull Request This PR adds a new changeling ability to the game, entitled 'Hive Head'. A basic description is shown below, as seen in-game. ![image](https://github.com/tgstation/tgstation/assets/47086570/4eed4f2e-3193-4522-b5ac-95b48e871346) Hive Head is a two-point ability for Changeling which encases your head in a bee hive. The bee hive is rather unremarkable as a defensive utility, boasting extremely poor resistances to all damage types except for BIO and providing flash resistance (your eyes are being covered). Along with this, since Hive Head covers your head, you cannot use it conjunction with chitinous armor, since it requires your head slot be open. While this all sounds rather bad, the major reason to use this ability is upon activation, you gain another ability which costs no chemicals and operates on a cooldown: Release Bees. Release Bees summons 6 bees on your location which will attack anything that isn't you or directly allied to you for 20 seconds, which afterwards the bees will vanish. By default, these bees are standard and do not inject any sort of chemicals into your victims, so while they can provide a good distraction and do some damage, they aren't really that useful. The true value of this ability comes with the fact that the Hive Head is also a reagent container, which stores up to 50 units of whatever you want to put inside. While you can't get what you put into the Hive Head out in any way, summoned bees will pull from the reagents inside your Hive Head to inject into targets, increasing the amount of !!FUN!! you can have with them drastically. For example, if you go into the bar and dump a bunch of different drinks into the Hive Head, your summoned bees will have equal chance to select any of those drinks to be what they inject into people. Reagents inside the Hive Head will stay there until it is dispelled, which upon re-using the ability, the Hive Head will be empty. Hive Head also has the additional utility that Release Bees works at any time so long as you're still wearing it. However, only 1 bee will be summoned whilst you are in hard crit or dead. Release Bees has a cooldown of 30 seconds. Additionally, if mixing chemical cocktails to have a swarm of bees forcefully inject into people isn't to your liking, Hive Head provides an alternate mode of use if a legion core is used on it. Using a legion core on the Hive Head will cause it to mutate, changing its appearance and functionality. The Legion Hive Head, as opposed to releasing 6 bees, releases 4 legion skulls to fight for you instead. These legion skulls do more damage than bees, but can be dispelled by any attack and only last for 10 seconds as opposed to 20, but this also comes with the added benefit of a shorter cooldown time of 15 seconds as opposed to 30. The major benefit of this version of the ability is that if the skulls down a humanoid target, the skulls will turn that person into an allied legion, who will use their abilities to support you with healing and additional skull summoning should they run into a target. Just as disabling Hive Head normally removes chemicals, Hive Head will return to normal upon deactivating and reactivating the ability, requiring another legion core be used to access this version again. ![image](https://github.com/tgstation/tgstation/assets/47086570/d30b238c-caaa-4b45-9371-a2a1f0686378) Additionally, this PR adds the sound of a swarm of bees for when the ability gets activated, new sprites to facilitate implementing this ability, and some changes to how the armor subset of changeling abilities work internally in order to add ones that only apply a helmet or armor as opposed to both. This PR also fixes a bug with bees having an incorrect sprite offset (they look like they're one tile over to the left currently). As always, the numbers and mechanics can be changed if need be, and I'm open to hearing others' thoughts about this. ## Why It's Good For The Game Changeling hasn't received a new ability in a very long time, only reworks to their existing kit, so there haven't been any new toys to shake up the experience with. Hive Head is something new that fits Changeling's preference for one-on-one combat (the bees pretty much always aggro on the same target) while also playing into that weird alien shapeshifter vibe. Along with this, being able to change what chemicals the bees inject into people opens the door to creative ways of using it alongside the rest of the sandbox, so it'll be interesting to see what players come up with. The additional legion mode is just a cherry on top, allowing people to play around with the cool legion skull mechanics in an antagonistic setting. ## Changelog :cl: add: New Changeling Ability: Hive Head fix: Fixed bees having an improper sprite offset /:cl: * Adds New Changeling Ability: Hive Head * Update screenshot_antag_icons.dm * Revert "Update screenshot_antag_icons.dm" This reverts commit b91ccdb61ea26d1b002a9a17fd92c9e9797cc7b6. * Maybe this will fix it * Revert "Maybe this will fix it" This reverts commit 0f60d2832ec0c3c38cacf2fb5747c62f8d860730. --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: IndieanaJones <47086570+IndieanaJones@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Iajret <HellDog15@gmail.com> --- .../changeling/powers/mutations.dm | 156 ++++++++++++++++-- .../mob/living/basic/farm_animals/bee/_bee.dm | 4 - icons/mob/actions/actions_changeling.dmi | Bin 9757 -> 20554 bytes icons/mob/clothing/head/helmet.dmi | Bin 40300 -> 38349 bytes icons/obj/clothing/head/helmet.dmi | Bin 20174 -> 19135 bytes sound/creatures/bee_swarm.ogg | Bin 0 -> 20749 bytes 6 files changed, 144 insertions(+), 16 deletions(-) create mode 100644 sound/creatures/bee_swarm.ogg diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 7ad2b14448c..1f3ac272d6f 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -90,8 +90,8 @@ chemical_cost = 1000 dna_cost = CHANGELING_POWER_UNOBTAINABLE - var/helmet_type = /obj/item - var/suit_type = /obj/item + var/helmet_type = null + var/suit_type = null var/suit_name_simple = " " var/helmet_name_simple = " " var/recharge_slowdown = 0 @@ -125,10 +125,14 @@ if(!ishuman(user) || !changeling) return 1 var/mob/living/carbon/human/H = user + if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type)) - H.visible_message(span_warning("[H] casts off [H.p_their()] [suit_name_simple]!"), span_warning("We cast off our [suit_name_simple]."), span_hear("You hear the organic matter ripping and tearing!")) - H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it - H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) + var/name_to_use = (isnull(suit_type) ? helmet_name_simple : suit_name_simple) + H.visible_message(span_warning("[H] casts off [H.p_their()] [name_to_use]!"), span_warning("We cast off our [name_to_use]."), span_hear("You hear the organic matter ripping and tearing!")) + if(!isnull(helmet_type)) + H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it + if(!isnull(suit_type)) + H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) H.update_worn_oversuit() H.update_worn_head() H.update_body_parts() @@ -141,18 +145,19 @@ return 1 /datum/action/changeling/suit/sting_action(mob/living/carbon/human/user) - if(!user.canUnEquip(user.wear_suit)) + if(!user.canUnEquip(user.wear_suit) && !isnull(suit_type)) user.balloon_alert(user, "body occupied!") return - if(!user.canUnEquip(user.head)) + if(!user.canUnEquip(user.head) && !isnull(helmet_type)) user.balloon_alert(user, "head occupied!") return ..() - user.dropItemToGround(user.head) - user.dropItemToGround(user.wear_suit) - - user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) - user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) + if(!isnull(suit_type)) + user.dropItemToGround(user.wear_suit) + user.equip_to_slot_if_possible(new suit_type(user), ITEM_SLOT_OCLOTHING, 1, 1, 1) + if(!isnull(helmet_type)) + user.dropItemToGround(user.head) + user.equip_to_slot_if_possible(new helmet_type(user), ITEM_SLOT_HEAD, 1, 1, 1) var/datum/antagonist/changeling/changeling = IS_CHANGELING(user) changeling.chem_recharge_slowdown += recharge_slowdown @@ -582,3 +587,130 @@ /obj/item/clothing/head/helmet/changeling/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + +/datum/action/changeling/suit/hive_head + name = "Hive Head" + desc = "We coat our head in a waxy outing coating similar to a bee hive which can be used to manufacture bees to attack our enemies. Costs 15 chemicals." + helptext = "While the hive head does not provide much in the ways of armor, it does allow the user to send bees out to attack targets. Reagents can poured inside the hive to cause all bees released to inject said reagents." + button_icon_state = "hive_head" + chemical_cost = 15 + dna_cost = 2 + req_human = FALSE + blood_on_castoff = TRUE + + helmet_type = /obj/item/clothing/head/helmet/changeling_hivehead + helmet_name_simple = "hive head" + +/obj/item/clothing/head/helmet/changeling_hivehead + name = "hive head" + desc = "A strange, waxy outer coating covering your head. Gives you tinnitus." + icon_state = "hivehead" + inhand_icon_state = null + flash_protect = FLASH_PROTECTION_FLASH + item_flags = DROPDEL + armor_type = /datum/armor/changeling_hivehead + flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT + actions_types = list(/datum/action/cooldown/hivehead_spawn_minions) + ///Does this hive head hold reagents? + var/holds_reagents = TRUE + +/obj/item/clothing/head/helmet/changeling_hivehead/Initialize(mapload) + . = ..() + if(holds_reagents) + create_reagents(50, REFILLABLE) + +/datum/armor/changeling_hivehead + melee = 10 + bullet = 10 + laser = 10 + energy = 10 + bio = 50 + +/obj/item/clothing/head/helmet/changeling_hivehead/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT) + +/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, params) + . = ..() + if(!istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core/legion) || !holds_reagents) + return + visible_message(span_boldwarning("As [user] shoves [attacking_item] into [src], [src] begins to mutate.")) + var/mob/living/carbon/wearer = loc + playsound(wearer, 'sound/effects/attackblob.ogg', 60, TRUE) + wearer.temporarilyRemoveItemFromInventory(wearer.head, TRUE) + wearer.equip_to_slot_if_possible(new /obj/item/clothing/head/helmet/changeling_hivehead/legion(wearer), ITEM_SLOT_HEAD, 1, 1, 1) + qdel(attacking_item) + + +/datum/action/cooldown/hivehead_spawn_minions + name = "Release Bees" + desc = "Release a group of bees to attack all other lifeforms." + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + button_icon = 'icons/mob/simple/bees.dmi' + button_icon_state = "queen_item" + cooldown_time = 30 SECONDS + ///The mob we're going to spawn + var/spawn_type = /mob/living/basic/bee + ///How many are we going to spawn + var/spawn_count = 6 + ///How long our summoned mobs last for + var/spawn_lifespan = 25 SECONDS + +/datum/action/cooldown/hivehead_spawn_minions/PreActivate(atom/target) + if(owner.movement_type & VENTCRAWLING) + owner.balloon_alert(owner, "unavailable here") + return + . = ..() + +/datum/action/cooldown/hivehead_spawn_minions/Activate(atom/target) + . = ..() + do_tell() + var/spawns = spawn_count + if(owner.stat >= HARD_CRIT) + spawns = 1 + for(var/i in 1 to spawns) + var/mob/living/basic/summoned_minion = new spawn_type(get_turf(owner)) + summoned_minion.faction = list("[REF(owner)]") + if(spawn_lifespan != 0 SECONDS) + QDEL_IN(summoned_minion, spawn_lifespan) + minion_additional_changes(summoned_minion) + +///Our tell that we're using this ability. Usually a sound and a visible message.area +/datum/action/cooldown/hivehead_spawn_minions/proc/do_tell() + owner.visible_message(span_warning("[owner]'s head begins to buzz as bees begin to pour out!"), span_warning("We release the bees."), span_hear("You hear a loud buzzing sound!")) + playsound(owner, 'sound/creatures/bee_swarm.ogg', 60, TRUE) + +///Stuff we want to do to our minions. This is in its own proc so subtypes can override this behaviour. +/datum/action/cooldown/hivehead_spawn_minions/proc/minion_additional_changes(mob/living/basic/minion) + var/mob/living/basic/bee/summoned_bee = minion + var/mob/living/carbon/wearer = owner + if(istype(summoned_bee) && length(wearer.head.reagents.reagent_list)) + summoned_bee.assign_reagent(pick(wearer.head.reagents.reagent_list)) + +/obj/item/clothing/head/helmet/changeling_hivehead/legion + name = "legion hive head" + desc = "A strange, boney coating covering your head with a fleshy inside. Surprisingly comfortable." + icon_state = "hivehead_legion" + actions_types = list(/datum/action/cooldown/hivehead_spawn_minions/legion) + holds_reagents = FALSE + +/datum/action/cooldown/hivehead_spawn_minions/legion + name = "Release Legion" + desc = "Release a group of legion to attack all other lifeforms." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_head" + cooldown_time = 15 SECONDS + spawn_type = /mob/living/basic/legion_brood + spawn_count = 4 + //Legion heads go away by themselves, we don't have to handle that + spawn_lifespan = 0 SECONDS + +/datum/action/cooldown/hivehead_spawn_minions/legion/do_tell() + owner.visible_message(span_warning("[owner]'s head begins to shake as legion begin to pour out!"), span_warning("We release the legion."), span_hear("You hear a loud squishing sound!")) + playsound(owner, 'sound/effects/attackblob.ogg', 60, TRUE) + +/datum/action/cooldown/hivehead_spawn_minions/legion/minion_additional_changes(mob/living/basic/minion) + var/mob/living/basic/legion_brood/brood = minion + if (istype(brood)) + brood.assign_creator(owner, FALSE) diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm index 66c0d129962..5510b81679e 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -25,10 +25,6 @@ response_harm_continuous = "squashes" response_harm_simple = "squash" - mob_size = MOB_SIZE_LARGE - pixel_x = -16 - base_pixel_x = -16 - speed = 1 maxHealth = 10 health = 10 diff --git a/icons/mob/actions/actions_changeling.dmi b/icons/mob/actions/actions_changeling.dmi index bb3634a1dde11cbf038a2a23837463018d42df5b..25a4e10aa578bafbd721ac751f9d33bfc67e2527 100644 GIT binary patch delta 20274 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 delta 9391 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 diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 5b30ae65b8f23717b34a8d7e603ffcf301403c0c..49edcf8422f26a14c1723fc4fad8151a6f34d13f 100644 GIT binary patch literal 38349 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 literal 40300 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 abweqM((~DFW~UJX4jW4ci$*iA`2PaOzxg%* diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index d9f02085e732ea55bf5efbc45527ca4f715e413b..94d11e6b8204070cd363d64aa19260334a0f19e8 100644 GIT binary patch literal 19135 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 Ef*y6cPyhe` literal 20174 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 C8IYU+ diff --git a/sound/creatures/bee_swarm.ogg b/sound/creatures/bee_swarm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7cf5a5a3d9f2efe702a8630db515851773671c93 GIT binary patch literal 20749 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 literal 0 HcmV?d00001 From 06197e5d6ac5de150fb70b6e5cee7b7ac9980f03 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:38:19 +0300 Subject: [PATCH 12/14] [MIRROR] Adds a multi-dimensional bomb payload to the black market. (#2204) * Adds a multi-dimensional bomb payload to the black market. (#81562) ## About The Pull Request This PR adds a !!!FUN!!! bomb payload to the blackmarket, which, upon detonation, transmutates all terrain in a range like the dimensional anomaly would. You can also select the dimensional theme to use by using it in your hand. I believe however, this thing should cost a fuckton to get and only show up occasionally. 8k to 10k was my original idea, but I think that's perhaps not high enough given its flagrant potential. Perhaps I should also make it so the more dangerous themes yield a shorter range than others. Suggestions are welcome. Screenshot of what happens when you don't set the theme: ![chaotic_mess](https://github.com/tgstation/tgstation/assets/42542238/e4c3264d-17e0-45b6-90c2-3c30a592ae2d) This PR also turns dimension themes into singletons so we access them more easily. Nothing to write home about. ## Why It's Good For The Game The black market could always use some extra thingy or two anyway, and this thing could either be a source of emergent gameplay, or a recipe for a disaster. Perhaps second to the Big Slappy for how funny it could be. ## Changelog :cl: add: Added a multi-dimensional bomb payload to the black market. It's very expensive. /:cl: * Adds a multi-dimensional bomb payload to the black market. * Increases the cost of the bomb --------- Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> Co-authored-by: Mal <13398309+vinylspiders@users.noreply.github.com> --- code/controllers/subsystem/materials.dm | 5 ++ code/game/machinery/syndicatebomb.dm | 62 +++++++++++++++++++ .../anomalies/anomalies_dimensional.dm | 10 ++- .../anomalies/anomalies_dimensional_themes.dm | 30 +++++---- .../cargo/markets/market_items/weapons.dm | 9 +++ .../hostile/megafauna/colossus.dm | 5 +- .../cargo/markets/market_items/weapons.dm | 5 ++ 7 files changed, 109 insertions(+), 17 deletions(-) diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 4ae9272e970..25efd8695dc 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(materials) new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE), ) + ///A list of dimensional themes used by the dimensional anomaly and other things, most of which require materials to function. + var/list/datum/dimension_theme/dimensional_themes + ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() materials = list() @@ -47,6 +50,8 @@ SUBSYSTEM_DEF(materials) continue // Do not initialize at mapload InitializeMaterial(list(mat_type)) + dimensional_themes = init_subtypes_w_path_keys(/datum/dimension_theme) + /** Creates and caches a material datum. * * Arugments: diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index bc1523bde0e..ab381b14fad 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -584,6 +584,68 @@ qdel(src) +#define DIMENSION_CHOICE_RANDOM "None/Randomized" + +/obj/item/bombcore/dimensional + name = "multi-dimensional payload" + desc = "A wicked payload meant to wildly transmutate terrain over a wide area, a power no mere human should wield." + range_heavy = 17 + var/datum/dimension_theme/chosen_theme + +/obj/item/bombcore/dimensional/Destroy() + chosen_theme = null + return ..() + +/obj/item/bombcore/dimensional/examine(mob/user) + . = ..() + . += span_notice("Use in hand to change the linked dimension. Current dimension: [chosen_theme?.name || "None, output will be random"].") + +/obj/item/bombcore/dimensional/attack_self(mob/user) + . = ..() + var/list/choosable_dimensions = list() + var/datum/radial_menu_choice/null_choice = new + null_choice.name = DIMENSION_CHOICE_RANDOM + choosable_dimensions += null_choice + for(var/datum/dimension_theme/theme as anything in SSmaterials.dimensional_themes) + var/datum/radial_menu_choice/theme_choice = new + theme_choice.image = image(initial(theme.icon), initial(theme.icon_state)) + theme_choice.name = initial(theme.name) + choosable_dimensions[theme] = theme_choice + + var/datum/dimension_theme/picked = show_radial_menu(user, src, choosable_dimensions, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 38, require_near = TRUE) + if(isnull(picked)) + return + if(picked == DIMENSION_CHOICE_RANDOM) + chosen_theme = null + else + chosen_theme = picked + balloon_alert(user, "set to [chosen_theme?.name || DIMENSION_CHOICE_RANDOM]") + +/obj/item/bombcore/dimensional/proc/check_menu(mob/user) + if(!user.is_holding(src) || user.incapacitated()) + return FALSE + return TRUE + +/obj/item/bombcore/dimensional/detonate() + var/list/affected_turfs = circle_range_turfs(src, range_heavy) + var/theme_count = length(SSmaterials.dimensional_themes) + var/num_affected = 0 + for(var/turf/affected as anything in affected_turfs) + var/datum/dimension_theme/theme_to_use = chosen_theme + if(isnull(chosen_theme)) + theme_to_use = SSmaterials.dimensional_themes[SSmaterials.dimensional_themes[rand(1, theme_count)]] + if(!theme_to_use.can_convert(affected)) + continue + num_affected++ + var/skip_sound = TRUE + if(num_affected % 5) //makes it play the sound more sparingly + skip_sound = FALSE + var/time_mult = round(get_dist_euclidian(get_turf(src), affected)) + 1 + addtimer(CALLBACK(theme_to_use, TYPE_PROC_REF(/datum/dimension_theme, apply_theme), affected, skip_sound, TRUE), 0.1 SECONDS * time_mult) + qdel(src) + +#undef DIMENSION_CHOICE_RANDOM + ///Syndicate Detonator (aka the big red button)/// /obj/item/syndicatedetonator diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional.dm b/code/game/objects/effects/anomalies/anomalies_dimensional.dm index 9aea9dfea6a..16dd5bafcfa 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional.dm @@ -21,6 +21,11 @@ animate(src, transform = matrix()*0.85, time = 3, loop = -1) animate(transform = matrix(), time = 3, loop = -1) +/obj/effect/anomaly/dimensional/Destroy() + theme = null + target_turfs = null + return ..() + /obj/effect/anomaly/dimensional/anomalyEffect(seconds_per_tick) . = ..() transmute_area() @@ -36,8 +41,7 @@ return var/turf/affected_turf = target_turfs[1] - new /obj/effect/temp_visual/transmute_tile_flash(affected_turf) - theme.apply_theme(affected_turf) + theme.apply_theme(affected_turf, show_effect = TRUE) target_turfs -= affected_turf /** @@ -47,7 +51,7 @@ /obj/effect/anomaly/dimensional/proc/prepare_area(new_theme_path) if (!new_theme_path) new_theme_path = pick(subtypesof(/datum/dimension_theme)) - theme = new new_theme_path() + theme = SSmaterials.dimensional_themes[new_theme_path] apply_theme_icon() target_turfs = list() diff --git a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm index 16408ea9ce6..c6190a0d84a 100644 --- a/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm +++ b/code/game/objects/effects/anomalies/anomalies_dimensional_themes.dm @@ -1,4 +1,3 @@ - /** * Datum which describes a theme and replaces turfs and objects in specified locations to match that theme */ @@ -44,12 +43,16 @@ * * Arguments * * affected_turf - Turf to transform. + * * skip_sound - If the sound shouldn't be played. + * * show_effect - if the temp visual effect should be shown. */ -/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE) +/datum/dimension_theme/proc/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE) if (!replace_turf(affected_turf)) return if (!skip_sound) playsound(affected_turf, sound, 100, TRUE) + if(show_effect) + new /obj/effect/temp_visual/transmute_tile_flash(affected_turf) for (var/obj/object in affected_turf) replace_object(object) if (length(random_spawns) && prob(random_spawn_chance) && !affected_turf.is_blocked_turf(exclude_mobs = TRUE)) @@ -250,7 +253,7 @@ /datum/dimension_theme/radioactive name = "Radioactive" icon = 'icons/obj/ore.dmi' - icon_state = "Uranium ore" + icon_state = "uranium" material = /datum/material/uranium sound = 'sound/items/welder.ogg' @@ -353,7 +356,14 @@ name = "Fancy" icon = 'icons/obj/clothing/head/costume.dmi' icon_state = "fancycrown" + replace_floors = null replace_walls = /turf/closed/wall/mineral/wood/nonmetal + replace_objs = list( + /obj/structure/chair = list(/obj/structure/chair/comfy = 1), + /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), + ) + ///cooldown for changing carpets, It's kinda dull to always use the same one, but we also can't make it too random. + COOLDOWN_DECLARE(carpet_switch_cd) #define FANCY_CARPETS list(\ /turf/open/floor/eighties, \ @@ -369,14 +379,12 @@ /turf/open/floor/carpet/royalblack, \ /turf/open/floor/carpet/royalblue,) -/datum/dimension_theme/fancy/New() - . = ..() - replace_floors = list(pick(FANCY_CARPETS) = 1) - replace_objs = list( - /obj/structure/chair = list(/obj/structure/chair/comfy = 1), - /obj/machinery/door/airlock = list(/obj/machinery/door/airlock/wood = 1, /obj/machinery/door/airlock/wood/glass = 1), - /obj/structure/table/wood = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1), - ) +/datum/dimension_theme/fancy/apply_theme(turf/affected_turf, skip_sound = FALSE, show_effect = FALSE) + if(COOLDOWN_FINISHED(src, carpet_switch_cd)) + replace_floors = list(pick(FANCY_CARPETS) = 1) + replace_objs[/obj/structure/table/wood] = list(pick(subtypesof(/obj/structure/table/wood/fancy)) = 1) + COOLDOWN_START(src, carpet_switch_cd, 90 SECONDS) + return ..() #undef FANCY_CARPETS diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index ee16daae7d5..052074a30b3 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -73,3 +73,12 @@ price_max = CARGO_CRATE_VALUE * 4 stock_max = 1 availability_prob = 75 + +/datum/market_item/weapon/dimensional_bomb + name = "Multi-Dimensional Bomb Core" + desc = "A special bomb core, one of a kind, for all your 'terraforming gone wrong' purposes." + item = /obj/item/bombcore/dimensional + price_min = CARGO_CRATE_VALUE * 40 + price_max = CARGO_CRATE_VALUE * 50 + stock_max = 1 + availability_prob = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 9253448563b..ac9031f59c3 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -356,8 +356,7 @@ /obj/machinery/anomalous_crystal/theme_warp/Initialize(mapload) . = ..() - var/terrain_type = pick(subtypesof(/datum/dimension_theme)) - terrain_theme = new terrain_type() + terrain_theme = SSmaterials.dimensional_themes[pick(subtypesof(/datum/dimension_theme))] observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme.name]\"." /obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) @@ -372,7 +371,7 @@ return TRUE /obj/machinery/anomalous_crystal/theme_warp/Destroy() - QDEL_NULL(terrain_theme) + terrain_theme = null converted_areas.Cut() return ..() diff --git a/modular_nova/master_files/code/modules/cargo/markets/market_items/weapons.dm b/modular_nova/master_files/code/modules/cargo/markets/market_items/weapons.dm index 40ad5def7a4..64a09914c83 100644 --- a/modular_nova/master_files/code/modules/cargo/markets/market_items/weapons.dm +++ b/modular_nova/master_files/code/modules/cargo/markets/market_items/weapons.dm @@ -6,3 +6,8 @@ price_max = CARGO_CRATE_VALUE * 4 stock_max = 3 availability_prob = 80 + +// Makes this even more expensive +/datum/market_item/weapon/dimensional_bomb + price_min = CARGO_CRATE_VALUE * 180 + price_max = CARGO_CRATE_VALUE * 200 From 483439774463e51241e4898d28e1321bdaeac7c6 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:44:17 +0300 Subject: [PATCH 13/14] Automatic changelog for PR #2181 [ci skip] --- html/changelogs/AutoChangeLog-pr-2181.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2181.yml diff --git a/html/changelogs/AutoChangeLog-pr-2181.yml b/html/changelogs/AutoChangeLog-pr-2181.yml new file mode 100644 index 00000000000..8dc7d10cbad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2181.yml @@ -0,0 +1,4 @@ +author: "vinylspiders" +delete-after: True +changes: + - bugfix: "synths should now always drop their brains when gibbed" \ No newline at end of file From dff75c0303d38917a7d0503be5048c9307911cab Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 1 Mar 2024 14:44:41 +0300 Subject: [PATCH 14/14] Automatic changelog for PR #2192 [ci skip] --- html/changelogs/AutoChangeLog-pr-2192.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2192.yml diff --git a/html/changelogs/AutoChangeLog-pr-2192.yml b/html/changelogs/AutoChangeLog-pr-2192.yml new file mode 100644 index 00000000000..67763b4fb43 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2192.yml @@ -0,0 +1,5 @@ +author: "IndieanaJones" +delete-after: True +changes: + - rscadd: "New Changeling Ability: Hive Head" + - bugfix: "Fixed bees having an improper sprite offset" \ No newline at end of file