From 61036e99d95c9733f6cfd3c53567fae2744e9728 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 May 2024 14:04:35 +1000 Subject: [PATCH 001/212] Generalizing player-triggered sleeping, shaking awake and hugging. --- code/modules/mob/living/carbon/carbon.dm | 64 -------------- .../mob/living/carbon/carbon_defines.dm | 2 - code/modules/mob/living/carbon/human/human.dm | 60 +------------- .../living/carbon/human/human_attackhand.dm | 80 +++++++++++++++--- .../mob/living/carbon/human/human_status.dm | 14 ---- code/modules/mob/living/life.dm | 5 ++ code/modules/mob/living/living.dm | 8 ++ code/modules/mob/living/living_attackhand.dm | 83 +++++++++++++++++++ code/modules/mob/living/living_defines.dm | 3 + code/modules/mob/living/living_status.dm | 8 ++ code/modules/mob/mob_helpers.dm | 2 +- .../species/species_bodytype_helpers.dm | 3 + code/modules/species/species_helpers.dm | 10 +++ nebula.dme | 1 - 14 files changed, 193 insertions(+), 150 deletions(-) delete mode 100644 code/modules/mob/living/carbon/human/human_status.dm diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 77e737692f..b043a9d662 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -119,63 +119,6 @@ /mob/proc/swap_hand() SHOULD_CALL_PARENT(TRUE) -/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) - if(!is_asystole()) - if (on_fire) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if (M.on_fire) - M.visible_message("[M] tries to pat out [src]'s flames, but to no avail!", - "You try to pat out [src]'s flames, but to no avail! Put yourself out first!") - else - M.visible_message("[M] tries to pat out [src]'s flames!", - "You try to pat out [src]'s flames! Hot!") - if(do_mob(M, src, 15)) - src.fire_stacks -= 0.5 - if (prob(10) && (M.fire_stacks <= 0)) - M.fire_stacks += 1 - M.IgniteMob() - if (M.on_fire) - M.visible_message("The fire spreads from [src] to [M]!", - "The fire spreads to you as well!") - else - src.fire_stacks -= 0.5 //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. - if (src.fire_stacks <= 0) - M.visible_message("[M] successfully pats out [src]'s flames.", - "You successfully pat out [src]'s flames.") - src.ExtinguishMob() - src.fire_stacks = 0 - else - var/t_him = "it" - if (src.gender == MALE) - t_him = "him" - else if (src.gender == FEMALE) - t_him = "her" - - var/obj/item/uniform = get_equipped_item(slot_w_uniform_str) - if(uniform) - uniform.add_fingerprint(M) - - var/show_ssd = get_species_name() - if(show_ssd && ssd_check()) - M.visible_message("[M] shakes [src] trying to wake [t_him] up!", \ - "You shake [src], but they do not respond... Maybe they have S.S.D?") - else if(current_posture.prone ||HAS_STATUS(src, STAT_ASLEEP) || player_triggered_sleeping) - player_triggered_sleeping = 0 - ADJ_STATUS(src, STAT_ASLEEP, -5) - if(!HAS_STATUS(src, STAT_ASLEEP)) - set_posture(/decl/posture/standing) - M.visible_message("[M] shakes [src] trying to wake [t_him] up!", \ - "You shake [src] trying to wake [t_him] up!") - else - M.attempt_hug(src) - - if(stat != DEAD) - ADJ_STATUS(src, STAT_PARA, -3) - ADJ_STATUS(src, STAT_STUN, -3) - ADJ_STATUS(src, STAT_WEAK, -3) - - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - /mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) if(eyecheck() < intensity || override_blindness_check) return ..() @@ -188,13 +131,6 @@ /mob/living/carbon/restrained() return get_equipped_item(slot_handcuffed_str) -/mob/living/carbon/verb/mob_sleep() - set name = "Sleep" - set category = "IC" - - if(alert("Are you sure you want to [player_triggered_sleeping ? "wake up?" : "sleep for a while? Use 'sleep' again to wake up"]", "Sleep", "No", "Yes") == "Yes") - player_triggered_sleeping = !player_triggered_sleeping - /mob/living/carbon/Bump(var/atom/movable/AM, yes) if(now_pushing || !yes) return diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 90c30e8728..96e7afdbc0 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -27,5 +27,3 @@ var/tmp/list/internal_organs var/tmp/list/external_organs var/list/organs_by_category - - var/player_triggered_sleeping = 0 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 78ba0cc2ef..c686b7f742 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -828,63 +828,6 @@ /mob/living/carbon/human/is_invisible_to(var/mob/viewer) return (is_cloaked() || ..()) -/mob/living/carbon/human/help_shake_act(mob/living/carbon/M) - if(src != M) - ..() - else - var/decl/pronouns/G = get_pronouns() - visible_message( \ - SPAN_NOTICE("[src] examines [G.self]."), \ - SPAN_NOTICE("You check yourself for injuries.") \ - ) - - for(var/obj/item/organ/external/org in get_external_organs()) - var/list/status = list() - - var/feels = 1 + round(org.pain/100, 0.1) - var/feels_brute = (org.brute_dam * feels) - if(feels_brute > 0) - switch(feels_brute / org.max_damage) - if(0 to 0.35) - status += "slightly sore" - if(0.35 to 0.65) - status += "very sore" - if(0.65 to INFINITY) - status += "throbbing with agony" - - var/feels_burn = (org.burn_dam * feels) - if(feels_burn > 0) - switch(feels_burn / org.max_damage) - if(0 to 0.35) - status += "tingling" - if(0.35 to 0.65) - status += "stinging" - if(0.65 to INFINITY) - status += "burning fiercely" - - if(org.status & ORGAN_MUTATED) - status += "misshapen" - if(org.status & ORGAN_BLEEDING) - status += "bleeding" - if(org.is_dislocated()) - status += "dislocated" - if(org.status & ORGAN_BROKEN) - status += "hurts when touched" - - if(org.status & ORGAN_DEAD) - if(BP_IS_PROSTHETIC(org) || BP_IS_CRYSTAL(org)) - status += "is irrecoverably damaged" - else - status += "is grey and necrotic" - else if(org.damage >= org.max_damage && org.germ_level >= INFECTION_LEVEL_TWO) - status += "is likely beyond saving, and has begun to decay" - if(!org.is_usable() || org.is_dislocated()) - status += "dangling uselessly" - if(status.len) - src.show_message("My [org.name] is [english_list(status)].",1) - else - src.show_message("My [org.name] is OK.",1) - /mob/living/carbon/human/proc/resuscitate() if(!is_asystole() || !should_have_organ(BP_HEART)) return @@ -1233,3 +1176,6 @@ volume = round(volume) if(volume > 0 && range > 0) playsound(T, footsound, volume, 1, range) + +/mob/living/carbon/human/try_awaken(mob/user) + return !is_asystole() && ..() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 2b1fc6bd28..1cd230c8c1 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -25,17 +25,76 @@ . |= limb.unarmed_attacks /mob/living/carbon/human/default_help_interaction(mob/user) - if(user != src && ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) - if (performing_cpr) - performing_cpr = FALSE + + if(user != src) + if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) + if (performing_cpr) + performing_cpr = FALSE + else + performing_cpr = TRUE + start_compressions(user, TRUE) + return TRUE + + if(apply_pressure(user, user.get_target_zone())) + return TRUE + + return ..() + + var/decl/pronouns/G = get_pronouns() + visible_message( + SPAN_NOTICE("\The [src] examines [G.self]."), + SPAN_NOTICE("You check yourself for injuries.") + ) + + // TODO: move status strings onto the organ and handle crystal/prosthetic limbs. + for(var/obj/item/organ/external/org in get_external_organs()) + var/list/status = list() + + var/feels = 1 + round(org.pain/100, 0.1) + var/feels_brute = (org.brute_dam * feels) + if(feels_brute > 0) + switch(feels_brute / org.max_damage) + if(0 to 0.35) + status += "slightly sore" + if(0.35 to 0.65) + status += "very sore" + if(0.65 to INFINITY) + status += "throbbing with agony" + + var/feels_burn = (org.burn_dam * feels) + if(feels_burn > 0) + switch(feels_burn / org.max_damage) + if(0 to 0.35) + status += "tingling" + if(0.35 to 0.65) + status += "stinging" + if(0.65 to INFINITY) + status += "burning fiercely" + + if(org.status & ORGAN_MUTATED) + status += "misshapen" + if(org.status & ORGAN_BLEEDING) + status += "bleeding" + if(org.is_dislocated()) + status += "dislocated" + if(org.status & ORGAN_BROKEN) + status += "hurts when touched" + + if(org.status & ORGAN_DEAD) + if(BP_IS_PROSTHETIC(org) || BP_IS_CRYSTAL(org)) + status += "is irrecoverably damaged" + else + status += "is grey and necrotic" + else if(org.damage >= org.max_damage && org.germ_level >= INFECTION_LEVEL_TWO) + status += "is likely beyond saving, and has begun to decay" + if(!org.is_usable() || org.is_dislocated()) + status += "dangling uselessly" + + if(status.len) + show_message("My [org.name] is [english_list(status)].",1) else - performing_cpr = TRUE - start_compressions(user, TRUE) - return TRUE - if(!(user == src && apply_pressure(user, user.get_target_zone()))) - help_shake_act(user) - return TRUE - . = ..() + show_message("My [org.name] is OK.",1) + return TRUE /mob/living/carbon/human/default_disarm_interaction(mob/user) var/decl/species/user_species = user.get_species() @@ -77,7 +136,6 @@ last_handled_by_mob = weakref(H) H.last_attack = world.time - if(!affecting) to_chat(user, SPAN_DANGER("They are missing that limb!")) return TRUE diff --git a/code/modules/mob/living/carbon/human/human_status.dm b/code/modules/mob/living/carbon/human/human_status.dm deleted file mode 100644 index 0204ad8e21..0000000000 --- a/code/modules/mob/living/carbon/human/human_status.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/carbon/human/set_status(condition, amount) - switch(condition) - if(STAT_WEAK) - amount *= species.weaken_mod - if(STAT_STUN) - amount *= species.stun_mod - if(STAT_PARA) - amount *= species.paralysis_mod - . = ..() - -/mob/living/carbon/human/handle_status_effects() - if((ssd_check() && species.get_ssd(src)) || player_triggered_sleeping) - SET_STATUS_MAX(src, STAT_ASLEEP, 2) - . = ..() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 2e1e4f551d..79c4f00557 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -362,6 +362,11 @@ if(stat == DEAD) return FALSE + // Should we be asleep? + var/decl/species/my_species = get_species() + if(player_triggered_sleeping || (ssd_check() && my_species?.get_ssd(src))) + SET_STATUS_MAX(src, STAT_ASLEEP, 2) + // Handle some general state updates. if(HAS_STATUS(src, STAT_PARA)) set_stat(UNCONSCIOUS) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 376ffa9d76..26a45f53c2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1491,3 +1491,11 @@ default behaviour is: /mob/living/proc/is_asystole() return FALSE + +/mob/living/verb/mob_sleep() + set name = "Sleep" + set category = "IC" + + if(alert("Are you sure you want to [player_triggered_sleeping ? "wake up?" : "sleep for a while? Use 'sleep' again to wake up"]", "Sleep", "No", "Yes") == "Yes") + player_triggered_sleeping = !player_triggered_sleeping + diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index 14b602b699..66fb0ba50e 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -24,6 +24,10 @@ /mob/living/proc/default_help_interaction(var/mob/user) SHOULD_CALL_PARENT(TRUE) + if(try_extinguish(user)) + return TRUE + if(try_awaken(user)) + return TRUE return FALSE /mob/living/proc/default_disarm_interaction(var/mob/user) @@ -38,3 +42,82 @@ // default_grab_interaction, so we override it here to return FALSE and avoid double-grabbing. /mob/living/handle_grab_interaction(var/mob/user) return FALSE + +// Returns TRUE if further interactions should be halted, FALSE otherwise. +/mob/living/proc/try_extinguish(mob/living/user) + if (!on_fire || !istype(user)) + return FALSE + + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if (user.on_fire) + user.visible_message( + SPAN_WARNING("\The [user] tries to pat out \the [src]'s flames, but to no avail!"), + SPAN_WARNING("You try to pat out [src]'s flames, but to no avail! Put yourself out first!") + ) + return TRUE + + user.visible_message( + SPAN_WARNING("\The [user] tries to pat out \the [src]'s flames!"), + SPAN_WARNING("You try to pat out \the [src]'s flames! Hot!") + ) + + if(!do_mob(user, src, 15)) + return TRUE + + fire_stacks -= 0.5 + if (prob(10) && (user.fire_stacks <= 0)) + user.fire_stacks += 1 + user.IgniteMob() + if (user.on_fire) + user.visible_message( + SPAN_DANGER("The fire spreads from \the [src] to \the [user]!"), + SPAN_DANGER("The fire spreads to you as well!") + ) + return TRUE + + fire_stacks -= 0.5 //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. + if (fire_stacks <= 0) + user.visible_message( + SPAN_NOTICE("\The [user] successfully pats out \the [src]'s flames."), + SPAN_NOTICE("You successfully pat out \the [src]'s flames.") + ) + ExtinguishMob() + fire_stacks = 0 + + return TRUE + +// Returns TRUE if further interactions should be halted, FALSE otherwise. +/mob/living/proc/try_awaken(mob/user) + + if(stat != UNCONSCIOUS) + return FALSE + + var/decl/pronouns/pronouns = get_pronouns() + var/obj/item/uniform = get_equipped_item(slot_w_uniform_str) + if(uniform) + uniform.add_fingerprint(user) + + var/show_ssd = get_species_name() + if(show_ssd && ssd_check()) + user.visible_message( + SPAN_NOTICE("\The [user] shakes \the [src] trying to wake [pronouns.him] up!"), + SPAN_NOTICE("You shake \the [src], but they do not respond...") + ) + else if(current_posture?.prone || HAS_STATUS(src, STAT_ASLEEP) || player_triggered_sleeping) + player_triggered_sleeping = FALSE + ADJ_STATUS(src, STAT_ASLEEP, -5) + if(!HAS_STATUS(src, STAT_ASLEEP)) + set_posture(/decl/posture/lying) // overrides 'delibrate' lying so you will stand up if possible. + user.visible_message( + SPAN_NOTICE("\The [user] shakes \the [src] trying to wake [pronouns.him] up!"), + SPAN_NOTICE("You shake \the [src] trying to wake [pronouns.him] up!") + ) + else + user.attempt_hug(src) + + if(stat != DEAD) + ADJ_STATUS(src, STAT_PARA, -3) + ADJ_STATUS(src, STAT_STUN, -3) + ADJ_STATUS(src, STAT_WEAK, -3) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return TRUE diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ad35e6c5e4..864320eaa1 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -77,3 +77,6 @@ var/stance_damage = 0 var/list/smell_cooldown + + /// Whether or not this mob has a client who wishes to sleep indefinitely. + var/player_triggered_sleeping = FALSE diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 11c0199220..661787ae35 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -9,7 +9,15 @@ var/decl/status_condition/cond = GET_DECL(condition) if(!cond.check_can_set(src)) return FALSE + + var/decl/species/my_species = get_species() + if(my_species) + amount = my_species.adjust_status(src, condition, amount) + var/decl/bodytype/my_bodytype = get_bodytype() + if(my_bodytype) + amount = my_bodytype.adjust_status(src, condition, amount) amount = clamp(amount, 0, 1000) + if(amount == PENDING_STATUS(src, condition)) return FALSE LAZYSET(pending_status_counters, condition, amount) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 921d975c24..3660a038f8 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -541,7 +541,7 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) return 1 /mob/proc/ssd_check() - return !client && !teleop + return !client && !teleop && !ai /mob/proc/try_teleport(var/area/thearea) if(!istype(thearea)) diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/species/species_bodytype_helpers.dm index a92d48f193..18cd6979b1 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/species/species_bodytype_helpers.dm @@ -43,3 +43,6 @@ /decl/bodytype/proc/apply_appearance(var/mob/living/carbon/human/H) if(base_color) H.set_skin_colour(base_color) + +/decl/bodytype/proc/adjust_status(mob/living/target, condition, amount) + return amount diff --git a/code/modules/species/species_helpers.dm b/code/modules/species/species_helpers.dm index 690edaae75..4568a520d5 100644 --- a/code/modules/species/species_helpers.dm +++ b/code/modules/species/species_helpers.dm @@ -60,3 +60,13 @@ var/global/list/stored_shock_by_ref = list() /decl/species/proc/get_shock_vulnerability(var/mob/living/carbon/human/H) return shock_vulnerability + +/decl/species/proc/adjust_status(mob/living/target, condition, amount) + switch(condition) + if(STAT_WEAK) + return amount * weaken_mod + if(STAT_STUN) + return amount * stun_mod + if(STAT_PARA) + return amount * paralysis_mod + return amount diff --git a/nebula.dme b/nebula.dme index 345a9f2b31..3fb36e4924 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2751,7 +2751,6 @@ #include "code\modules\mob\living\carbon\human\human_powers.dm" #include "code\modules\mob\living\carbon\human\human_skin.dm" #include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\human_status.dm" #include "code\modules\mob\living\carbon\human\human_verbs.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" From 736d711a0f619b9150f4db95cf352486ec86fa97 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 May 2024 14:19:36 +1000 Subject: [PATCH 002/212] Cleaning up some hug code. --- code/modules/emotes/emote_define.dm | 60 ++++++++--------- code/modules/mechs/mech.dm | 5 +- code/modules/mob/hugs.dm | 65 +++++++++---------- code/modules/mob/living/living.dm | 5 ++ code/modules/mob/living/living_attackhand.dm | 30 +++++---- .../modules/mob/living/silicon/robot/robot.dm | 8 +-- code/modules/mob/living/silicon/silicon.dm | 3 + .../mob/living/simple_animal/simple_animal.dm | 6 ++ 8 files changed, 101 insertions(+), 81 deletions(-) diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm index 20e9d4b9b7..c569acef3e 100644 --- a/code/modules/emotes/emote_define.dm +++ b/code/modules/emotes/emote_define.dm @@ -1,3 +1,25 @@ +/proc/emote_replace_target_tokens(var/msg, var/atom/target) + . = msg + if(istype(target)) + var/decl/pronouns/target_gender = target.get_pronouns() + . = replacetext(., "$TARGET_S$", target_gender.s) + . = replacetext(., "$TARGET_THEY$", target_gender.he) + . = replacetext(., "$TARGET_THEM$", target_gender.him) + . = replacetext(., "$TARGET_THEIR$", target_gender.his) + . = replacetext(., "$TARGET_SELF$", target_gender.self) + . = replacetext(., "$TARGET$", "\the [target]") + +/proc/emote_replace_user_tokens(var/msg, var/atom/user) + . = msg + if(istype(user)) + var/decl/pronouns/user_gender = user.get_pronouns() + . = replacetext(., "$USER_S$", user_gender.s) + . = replacetext(., "$USER_THEY$", user_gender.he) + . = replacetext(., "$USER_THEM$", user_gender.him) + . = replacetext(., "$USER_THEIR$", user_gender.his) + . = replacetext(., "$USER_SELF$", user_gender.self) + . = replacetext(., "$USER$", "\the [user]") + // Note about emote messages: // - $USER$ / $TARGET$ will be replaced with the relevant name, in bold. // - $USER_THEM$ / $TARGET_THEM$ / $USER_THEIR$ / $TARGET_THEIR$ will be replaced with a @@ -121,8 +143,8 @@ var/global/list/_emotes_by_key var/emote_string = all_strings[string_key] if(!length(emote_string)) continue - emote_string = replace_target_tokens(emote_string, dummy_emote_target) - emote_string = replace_user_tokens(emote_string, dummy_emote_user) + emote_string = emote_replace_target_tokens(emote_string, dummy_emote_target) + emote_string = emote_replace_user_tokens(emote_string, dummy_emote_user) emote_string = uppertext(emote_string) for(var/token in tokens) if(findtext(emote_string, token)) @@ -219,20 +241,20 @@ var/global/list/_emotes_by_key var/use_1p = get_emote_message_1p(user, target, extra_params) if(use_1p) if(target) - use_1p = replace_target_tokens(use_1p, target) - use_1p = "[capitalize(replace_user_tokens(use_1p, user))]" + use_1p = emote_replace_target_tokens(use_1p, target) + use_1p = "[capitalize(emote_replace_user_tokens(use_1p, user))]" var/use_3p = get_emote_message_3p(user, target, extra_params) if(use_3p) if(target) - use_3p = replace_target_tokens(use_3p, target) - use_3p = "[replace_user_tokens(use_3p, user)]" + use_3p = emote_replace_target_tokens(use_3p, target) + use_3p = "[emote_replace_user_tokens(use_3p, user)]" var/use_radio = get_radio_message(user) if(use_radio) if(target) - use_radio = replace_target_tokens(use_radio, target) - use_radio = replace_user_tokens(use_radio, user) + use_radio = emote_replace_target_tokens(use_radio, target) + use_radio = emote_replace_user_tokens(use_radio, user) var/use_range = emote_range if (!use_range) @@ -254,28 +276,6 @@ var/global/list/_emotes_by_key do_sound(user) return TRUE -/decl/emote/proc/replace_target_tokens(var/msg, var/atom/target) - . = msg - if(istype(target)) - var/decl/pronouns/target_gender = target.get_pronouns() - . = replacetext(., "$TARGET_S$", target_gender.s) - . = replacetext(., "$TARGET_THEY$", target_gender.he) - . = replacetext(., "$TARGET_THEM$", target_gender.him) - . = replacetext(., "$TARGET_THEIR$", target_gender.his) - . = replacetext(., "$TARGET_SELF$", target_gender.self) - . = replacetext(., "$TARGET$", "\the [target]") - -/decl/emote/proc/replace_user_tokens(var/msg, var/atom/user) - . = msg - if(istype(user)) - var/decl/pronouns/user_gender = user.get_pronouns() - . = replacetext(., "$USER_S$", user_gender.s) - . = replacetext(., "$USER_THEY$", user_gender.he) - . = replacetext(., "$USER_THEM$", user_gender.him) - . = replacetext(., "$USER_THEIR$", user_gender.his) - . = replacetext(., "$USER_SELF$", user_gender.self) - . = replacetext(., "$USER$", "\the [user]") - /decl/emote/proc/get_radio_message(var/atom/user) if(emote_message_radio_synthetic && check_synthetic(user)) return emote_message_radio_synthetic diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 1069f3ba6c..1e3ea76f7a 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -238,4 +238,7 @@ var/static/list/available_postures = list( /decl/posture/standing ) - return available_postures \ No newline at end of file + return available_postures + +/mob/living/exosuit/try_awaken(mob/user) + return FALSE diff --git a/code/modules/mob/hugs.dm b/code/modules/mob/hugs.dm index ac4f5a4f96..1ce632931f 100644 --- a/code/modules/mob/hugs.dm +++ b/code/modules/mob/hugs.dm @@ -9,48 +9,45 @@ var/global/list/_default_hug_messages = list( var/decl/bodytype/bodytype = get_bodytype() return bodytype?.get_hug_zone_messages(zone) || bodytype?.default_hug_message || global._default_hug_messages[zone] +/mob/proc/get_default_3p_hug_message(mob/living/target) + if(target && get_dir(src, target) == target.dir) + return "$USER$ rubs $TARGET$'s back soothingly." + return "$USER$ hugs $TARGET$ to make $TARGET_THEM$ feel better." + +/mob/proc/get_default_1p_hug_message(mob/living/target) + if(target && get_dir(src, target) == target.dir) + return "You rub $TARGET$'s back soothingly." + return "You hug $TARGET$ to make $TARGET_THEM$ feel better." + /mob/proc/attempt_hug(var/mob/living/target, var/hug_3p, var/hug_1p) if(!istype(target)) return FALSE - if(isnull(hug_3p) || isnull(hug_1p)) - - if(get_dir(src, target) == target.dir) - hug_3p = "$USER$ rubs $TARGET$'s back soothingly." - hug_1p = "You rub $TARGET$'s back soothingly." - else - hug_3p = "$USER$ hugs $TARGET$ to make $TARGET_THEM$ feel better." - hug_1p = "You hug $TARGET$ to make $TARGET_THEM$ feel better." - - var/list/use_hug_messages = target.get_hug_zone_messages(get_target_zone()) - if(length(use_hug_messages) >= 2) - hug_3p = use_hug_messages[1] - hug_1p = use_hug_messages[2] + var/list/use_hug_messages = target.get_hug_zone_messages(get_target_zone()) + if(length(use_hug_messages) >= 2) + hug_3p = use_hug_messages[1] + hug_1p = use_hug_messages[2] - if(hug_1p && hug_3p) - var/decl/pronouns/my_pronouns = get_pronouns() - var/decl/pronouns/target_pronouns = target.get_pronouns() - - hug_3p = replacetext(hug_3p, "$USER$", "\the [src]") - hug_3p = replacetext(hug_3p, "$USER_THEM$", my_pronouns.him) - hug_3p = replacetext(hug_3p, "$USER_THEIR$", my_pronouns.his) + if(isnull(hug_3p) || isnull(hug_1p)) + hug_1p = get_default_1p_hug_message(target) + hug_3p = get_default_3p_hug_message(target) - hug_3p = replacetext(hug_3p, "$TARGET$", "\the [target]") - hug_3p = replacetext(hug_3p, "$TARGET_THEM$", target_pronouns.him) - hug_3p = replacetext(hug_3p, "$TARGET_THEIR$", target_pronouns.his) + if(!hug_1p || !hug_3p) + return FALSE - hug_1p = replacetext(hug_1p, "$TARGET$", "\the [target]") - hug_1p = replacetext(hug_1p, "$TARGET_THEM$", target_pronouns.him) - hug_1p = replacetext(hug_1p, "$TARGET_THEIR$", target_pronouns.his) + hug_3p = emote_replace_user_tokens(hug_3p, src) + hug_3p = emote_replace_target_tokens(hug_3p, target) + hug_1p = emote_replace_target_tokens(hug_1p, target) + visible_message( + SPAN_NOTICE(capitalize(hug_3p)), + SPAN_NOTICE(capitalize(hug_1p)) + ) - visible_message( - SPAN_NOTICE(capitalize(hug_3p)), - SPAN_NOTICE(capitalize(hug_1p)) - ) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if(src != target) - update_personal_goal(/datum/goal/achievement/givehug, TRUE) - target.update_personal_goal(/datum/goal/achievement/gethug, TRUE) + if(src != target) + update_personal_goal(/datum/goal/achievement/givehug, TRUE) + target.update_personal_goal(/datum/goal/achievement/gethug, TRUE) - return TRUE + return TRUE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 26a45f53c2..86eecd4580 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -974,6 +974,11 @@ default behaviour is: . = ..() if(.) + if(stat != DEAD) + ADJ_STATUS(src, STAT_PARA, -3) + ADJ_STATUS(src, STAT_STUN, -3) + ADJ_STATUS(src, STAT_WEAK, -3) + if(fire_stacks >= target.fire_stacks + 3) target.fire_stacks += 1 fire_stacks -= 1 diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index 66fb0ba50e..243a53ab39 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -89,20 +89,25 @@ // Returns TRUE if further interactions should be halted, FALSE otherwise. /mob/living/proc/try_awaken(mob/user) - if(stat != UNCONSCIOUS) - return FALSE + if(isSynthetic() || stat == CONSCIOUS) + return user.attempt_hug(src) var/decl/pronouns/pronouns = get_pronouns() var/obj/item/uniform = get_equipped_item(slot_w_uniform_str) if(uniform) uniform.add_fingerprint(user) + // They're SSD, so permanently asleep. var/show_ssd = get_species_name() if(show_ssd && ssd_check()) user.visible_message( SPAN_NOTICE("\The [user] shakes \the [src] trying to wake [pronouns.him] up!"), SPAN_NOTICE("You shake \the [src], but they do not respond...") ) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + . = TRUE + + // Not SSD, so try to wake them up. else if(current_posture?.prone || HAS_STATUS(src, STAT_ASLEEP) || player_triggered_sleeping) player_triggered_sleeping = FALSE ADJ_STATUS(src, STAT_ASLEEP, -5) @@ -112,12 +117,15 @@ SPAN_NOTICE("\The [user] shakes \the [src] trying to wake [pronouns.him] up!"), SPAN_NOTICE("You shake \the [src] trying to wake [pronouns.him] up!") ) - else - user.attempt_hug(src) - - if(stat != DEAD) - ADJ_STATUS(src, STAT_PARA, -3) - ADJ_STATUS(src, STAT_STUN, -3) - ADJ_STATUS(src, STAT_WEAK, -3) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - return TRUE + . = TRUE + + if(.) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + if(stat != DEAD) + ADJ_STATUS(src, STAT_PARA, -3) + ADJ_STATUS(src, STAT_STUN, -3) + ADJ_STATUS(src, STAT_WEAK, -3) + return + + // Fallback. + return user.attempt_hug(src) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1f491f41fb..89ac965502 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -646,11 +646,9 @@ else if (H.wrapped == W) H.wrapped = null -/mob/living/silicon/robot/default_help_interaction(mob/user) - if(ishuman(user)) - user.attempt_hug(src) - return TRUE - . = ..() + +/mob/living/silicon/robot/try_awaken(mob/user) + return user?.attempt_hug(src) /mob/living/silicon/robot/default_hurt_interaction(mob/user) var/decl/species/user_species = user.get_species() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 1d07aae4a9..db0594e6cb 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -458,3 +458,6 @@ /decl/posture/standing ) return available_postures + +/mob/living/silicon/try_awaken(mob/user) + return FALSE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 19fb5c95d6..ff4f4d26d6 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -609,3 +609,9 @@ var/global/list/simplemob_icon_bitflag_cache = list() /decl/posture/lying/deliberate ) return available_postures + +/mob/living/simple_animal/get_default_3p_hug_message(mob/living/target) + return "$USER$ nuzzles $TARGET$." + +/mob/living/simple_animal/get_default_1p_hug_message(mob/living/target) + return "You nuzzle $TARGET$." From b42e86de19e8854544239043495a47a413b01330 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 May 2024 14:39:33 +1000 Subject: [PATCH 003/212] Cleaning up psionics slightly so it stops creating the ability handler unnecessarily. --- .../datums/extensions/abilities/abilities_mob.dm | 6 +++--- code/modules/mob/mob_helpers.dm | 2 +- mods/content/psionics/_psionics.dm | 4 ++-- .../psionics/datum/antagonists/foundation.dm | 2 +- .../psionics/datum/antagonists/paramount.dm | 2 +- mods/content/psionics/datum/chems.dm | 6 +++--- mods/content/psionics/datum/jobs.dm | 2 +- mods/content/psionics/items/brain.dm | 2 +- mods/content/psionics/items/cerebro_enhancers.dm | 6 +++--- mods/content/psionics/items/id_card.dm | 6 +++--- mods/content/psionics/items/implant.dm | 8 ++++---- .../system/psionics/complexus/complexus.dm | 3 ++- .../system/psionics/complexus/complexus_topic.dm | 2 +- .../system/psionics/equipment/psipower.dm | 2 +- .../system/psionics/equipment/psipower_tinker.dm | 2 +- .../system/psionics/equipment/psipower_tk.dm | 6 +++--- .../system/psionics/events/mini_spasm.dm | 4 ++-- .../psionics/system/psionics/faculties/_power.dm | 4 ++-- .../system/psionics/faculties/coercion.dm | 6 +++--- .../system/psionics/faculties/energistics.dm | 2 +- .../system/psionics/faculties/psychokinesis.dm | 4 ++-- .../system/psionics/faculties/redaction.dm | 4 ++-- .../psionics/system/psionics/interface/ui_hub.dm | 6 +++--- .../system/psionics/interface/ui_toggles.dm | 4 ++-- mods/content/psionics/system/psionics/mob/mob.dm | 16 ++++++++-------- .../psionics/system/psionics/mob/mob_assay.dm | 4 ++-- 26 files changed, 58 insertions(+), 57 deletions(-) diff --git a/code/datums/extensions/abilities/abilities_mob.dm b/code/datums/extensions/abilities/abilities_mob.dm index ccdc5112f2..b72d0ac2c5 100644 --- a/code/datums/extensions/abilities/abilities_mob.dm +++ b/code/datums/extensions/abilities/abilities_mob.dm @@ -2,10 +2,10 @@ var/datum/extension/abilities/abilities if(create_if_missing) abilities = get_or_create_extension(src, /datum/extension/abilities) - else + else if(has_extension(src, /datum/extension/abilities)) abilities = get_extension(src, /datum/extension/abilities) - if(!abilities) - return null + if(!abilities) + return null var/datum/ability_handler/handler = locate(handler_type) in abilities.ability_handlers if(!handler && create_if_missing) handler = add_ability_handler(handler_type) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3660a038f8..564b3e2ace 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -541,7 +541,7 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) return 1 /mob/proc/ssd_check() - return !client && !teleop && !ai + return !client && !teleop && (last_ckey || !ai) /mob/proc/try_teleport(var/area/thearea) if(!istype(thearea)) diff --git a/mods/content/psionics/_psionics.dm b/mods/content/psionics/_psionics.dm index 555420d7e1..37937aecb2 100644 --- a/mods/content/psionics/_psionics.dm +++ b/mods/content/psionics/_psionics.dm @@ -5,7 +5,7 @@ /decl/modpack/psionics/get_player_panel_options(var/mob/M) . = list("Psionics:
") if(isliving(M)) - var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) if(psi) . += "Remove psionics.

" . += "Trigger latencies.
" @@ -27,6 +27,6 @@ /datum/preferences/copy_to(mob/living/carbon/human/character, is_preview_copy = FALSE) character = ..() - var/datum/ability_handler/psionics/psi = !is_preview_copy && istype(character) && character.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = !is_preview_copy && istype(character) && character.get_ability_handler(/datum/ability_handler/psionics) if(psi) psi.update() diff --git a/mods/content/psionics/datum/antagonists/foundation.dm b/mods/content/psionics/datum/antagonists/foundation.dm index c4dcab654e..8da03b4ff7 100644 --- a/mods/content/psionics/datum/antagonists/foundation.dm +++ b/mods/content/psionics/datum/antagonists/foundation.dm @@ -32,7 +32,7 @@ player.set_psi_rank(PSI_COERCION, 3, defer_update = TRUE) player.set_psi_rank(PSI_PSYCHOKINESIS, 3, defer_update = TRUE) player.set_psi_rank(PSI_ENERGISTICS, 3, defer_update = TRUE) - var/datum/ability_handler/psionics/psi = player.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = player.get_ability_handler(/datum/ability_handler/psionics) psi?.update(TRUE) /decl/hierarchy/outfit/foundation diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 27f7ed5262..332d756be6 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -30,7 +30,7 @@ player.set_psi_rank(PSI_COERCION, 3, defer_update = TRUE) player.set_psi_rank(PSI_PSYCHOKINESIS, 3, defer_update = TRUE) player.set_psi_rank(PSI_ENERGISTICS, 3, defer_update = TRUE) - var/datum/ability_handler/psionics/psi = player.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = player.get_ability_handler(/datum/ability_handler/psionics) psi?.update(TRUE) /decl/special_role/paramount/create_objectives(var/datum/mind/player) diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index c7dc4aa79d..a61c7b53bb 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,10 +1,10 @@ /decl/material/liquid/crystal_agent/do_material_check(var/mob/living/carbon/M) var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (M.get_ability_handler(/datum/ability_handler/psionics, FALSE) || (M.mind && wizards.is_antagonist(M.mind))) ? MAT_NULLGLASS : ..() + . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? MAT_NULLGLASS : ..() /decl/material/liquid/glowsap/gleam/affect_overdose(var/mob/living/M) ..() - var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) psi?.check_latency_trigger(30, "a [name] overdose") /decl/chemical_reaction/synthesis/nullglass @@ -18,7 +18,7 @@ var/weakref/donor_ref = LAZYACCESS(blood_data, "donor") var/mob/living/donor = donor_ref?.resolve() var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics, FALSE) || (donor.mind && wizards.is_antagonist(donor.mind)))) + . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics) || (donor.mind && wizards.is_antagonist(donor.mind)))) /decl/chemical_reaction/synthesis/nullglass/on_reaction(var/datum/reagents/holder, var/created_volume, var/reaction_flags) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) diff --git a/mods/content/psionics/datum/jobs.dm b/mods/content/psionics/datum/jobs.dm index 2e3bfd907f..48f342be0f 100644 --- a/mods/content/psionics/datum/jobs.dm +++ b/mods/content/psionics/datum/jobs.dm @@ -14,7 +14,7 @@ for(var/psi in psi_faculties) H.set_psi_rank(psi, psi_faculties[psi], take_larger = TRUE, defer_update = TRUE) - var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics) if(psi) psi.update() if(give_psionic_implant_on_join) diff --git a/mods/content/psionics/items/brain.dm b/mods/content/psionics/items/brain.dm index e15c8aa724..181774f76d 100644 --- a/mods/content/psionics/items/brain.dm +++ b/mods/content/psionics/items/brain.dm @@ -1,4 +1,4 @@ /obj/item/organ/internal/brain/handle_severe_damage() . = ..() - var/datum/ability_handler/psionics/psi = owner?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = owner?.get_ability_handler(/datum/ability_handler/psionics) psi?.check_latency_trigger(20, "physical trauma") \ No newline at end of file diff --git a/mods/content/psionics/items/cerebro_enhancers.dm b/mods/content/psionics/items/cerebro_enhancers.dm index bb4d17dce1..01c1bfc56d 100644 --- a/mods/content/psionics/items/cerebro_enhancers.dm +++ b/mods/content/psionics/items/cerebro_enhancers.dm @@ -87,7 +87,7 @@ sleep(80) - var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics) psi?.reset() to_chat(H, SPAN_NOTICE("\The [src] chimes quietly as it finishes removing the subpersonas from your brain.")) @@ -109,7 +109,7 @@ if(.) var/mob/living/carbon/human/H = lastloc if(istype(H)) - var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics) psi?.reset() H = loc if(!istype(H) || H.get_equipped_item(slot_head_str) != src) @@ -149,7 +149,7 @@ H.set_psi_rank(faculty, boosted_rank, take_larger = TRUE, temporary = TRUE) else H.set_psi_rank(faculty, unboosted_rank, take_larger = TRUE, temporary = TRUE) - var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = H.get_ability_handler(/datum/ability_handler/psionics) if(psi) psi.max_stamina = boosted_psipower psi.stamina = psi.max_stamina diff --git a/mods/content/psionics/items/id_card.dm b/mods/content/psionics/items/id_card.dm index 0e872bfefd..27d4d5be40 100644 --- a/mods/content/psionics/items/id_card.dm +++ b/mods/content/psionics/items/id_card.dm @@ -18,7 +18,7 @@ /obj/item/card/id/foundation/examine(mob/user, distance) . = ..() if(distance <= 1 && isliving(user)) - var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics) if(psi) to_chat(user, SPAN_WARNING("There is a psionic compulsion surrounding \the [src], forcing anyone who reads it to perceive it as a legitimate document of authority. The actual text just reads 'I can do what I want.'")) else @@ -27,11 +27,11 @@ /obj/item/card/id/foundation/attack_self(var/mob/user) . = ..() if(isliving(user)) - var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics) if(psi) for(var/mob/M in viewers(world.view, get_turf(user))-user) if(isliving(M)) - var/datum/ability_handler/psionics/other_psi = M.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/other_psi = M.get_ability_handler(/datum/ability_handler/psionics) if(!other_psi) to_chat(M, SPAN_NOTICE("This is the real deal, stamped by [global.using_map.boss_name]. It gives the holder the full authority to pursue their goals. You believe \the [user] implicitly.")) continue diff --git a/mods/content/psionics/items/implant.dm b/mods/content/psionics/items/implant.dm index abd789d425..d80839f176 100644 --- a/mods/content/psionics/items/implant.dm +++ b/mods/content/psionics/items/implant.dm @@ -32,17 +32,17 @@ /obj/item/implant/psi_control/removed() var/mob/living/M = imp_in - if(disrupts_psionics() && istype(M) && M.get_ability_handler(/datum/ability_handler/psionics, FALSE)) + if(disrupts_psionics() && istype(M) && M.get_ability_handler(/datum/ability_handler/psionics)) to_chat(M, SPAN_NOTICE("You feel the chilly shackles around your psionic faculties fade away.")) . = ..() /obj/item/implant/psi_control/proc/update_functionality(var/silent) var/mob/living/M = imp_in if(get_psi_mode() == PSI_IMPLANT_DISABLED || malfunction) - if(implanted && !silent && istype(M) && M.get_ability_handler(/datum/ability_handler/psionics, FALSE)) + if(implanted && !silent && istype(M) && M.get_ability_handler(/datum/ability_handler/psionics)) to_chat(M, SPAN_NOTICE("You feel the chilly shackles around your psionic faculties fade away.")) else - if(implanted && !silent && istype(M) && M.get_ability_handler(/datum/ability_handler/psionics, FALSE)) + if(implanted && !silent && istype(M) && M.get_ability_handler(/datum/ability_handler/psionics)) to_chat(M, SPAN_NOTICE("Bands of hollow ice close themselves around your psionic faculties.")) /obj/item/implant/psi_control/meltdown() @@ -104,7 +104,7 @@ SET_STATUS_MAX(imp_in, STAT_WEAK, 5) if(isliving(imp_in)) var/mob/living/M = imp_in - var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) psi?.stunned(5) else if(use_psi_mode == PSI_IMPLANT_WARN) to_chat(imp_in, SPAN_WARNING("Your psi dampener primly informs you it has reported this violation.")) diff --git a/mods/content/psionics/system/psionics/complexus/complexus.dm b/mods/content/psionics/system/psionics/complexus/complexus.dm index 902cb2fb01..990edecd13 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus.dm @@ -79,7 +79,8 @@ if(owner) cancel() if(owner.client) - owner.client.screen -= list(ui, ui.components) + if(ui) + owner.client.screen -= list(ui, ui.components) for(var/thing in SSpsi.all_aura_images) owner.client.images -= thing QDEL_NULL(ui) diff --git a/mods/content/psionics/system/psionics/complexus/complexus_topic.dm b/mods/content/psionics/system/psionics/complexus/complexus_topic.dm index 875e3e812d..592d019437 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_topic.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_topic.dm @@ -5,7 +5,7 @@ . = ..() if(!. && check_rights(R_ADMIN)) if(href_list["remove_psionics"]) - if(owner?.get_ability_handler(/datum/ability_handler/psionics, FALSE) == src && !QDELETED(src)) + if(owner?.get_ability_handler(/datum/ability_handler/psionics) == src && !QDELETED(src)) log_and_message_admins("removed all psionics from [key_name(owner)].") to_chat(owner, SPAN_NOTICE("Your psionic powers vanish abruptly, leaving you cold and empty.")) QDEL_NULL(src) diff --git a/mods/content/psionics/system/psionics/equipment/psipower.dm b/mods/content/psionics/system/psionics/equipment/psipower.dm index 0d48b14fd4..b13f77a4cf 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower.dm @@ -31,7 +31,7 @@ . = ..(target, user, proximity) /obj/item/ability/psionic/Process() - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) psi?.spend_power(maintain_cost, backblast_on_failure = FALSE) if((!owner || owner.do_psionics_check(maintain_cost, owner) || loc != owner || !(src in owner.get_held_items())) && !QDELETED(src)) qdel(src) diff --git a/mods/content/psionics/system/psionics/equipment/psipower_tinker.dm b/mods/content/psionics/system/psionics/equipment/psipower_tinker.dm index 6f0d1fefed..bf945c82f5 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower_tinker.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower_tinker.dm @@ -8,7 +8,7 @@ var/use_tool_quality = TOOL_QUALITY_WORST var/mob/living/owner = loc - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(psi) switch(psi.get_rank(PSI_PSYCHOKINESIS)) if(PSI_RANK_LATENT) diff --git a/mods/content/psionics/system/psionics/equipment/psipower_tk.dm b/mods/content/psionics/system/psionics/equipment/psipower_tk.dm index 77a8a40fdc..787d2a5905 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower_tk.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower_tk.dm @@ -9,7 +9,7 @@ . = ..() /obj/item/ability/psionic/telekinesis/Process() - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(!focus || !isturf(focus.loc) || get_dist(get_turf(focus), get_turf(owner)) > psi?.get_rank(PSI_PSYCHOKINESIS)) owner.drop_from_inventory(src) return @@ -30,7 +30,7 @@ else return FALSE - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(_focus.anchored || (check_paramount && psi?.get_rank(PSI_PSYCHOKINESIS) < PSI_RANK_PARAMOUNT)) focus = _focus . = attack_self(owner) @@ -54,7 +54,7 @@ /obj/item/ability/psionic/telekinesis/afterattack(var/atom/target, var/mob/living/user, var/proximity) - var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics) if(!target || !user || (isobj(target) && !isturf(target.loc)) || !psi?.can_use() || !psi?.spend_power(5)) return diff --git a/mods/content/psionics/system/psionics/events/mini_spasm.dm b/mods/content/psionics/system/psionics/events/mini_spasm.dm index 202ab4a632..cbf083b019 100644 --- a/mods/content/psionics/system/psionics/events/mini_spasm.dm +++ b/mods/content/psionics/system/psionics/events/mini_spasm.dm @@ -41,7 +41,7 @@ if(disabilities.len) victim.disabilities |= pick(disabilities) - var/datum/ability_handler/psionics/psi = victim.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = victim.get_ability_handler(/datum/ability_handler/psionics) if(psi) to_chat(victim, SPAN_DANGER("A hauntingly familiar sound hisses from [html_icon(source)] \the [source], and your vision flickers!")) psi.backblast(rand(5,15)) @@ -57,7 +57,7 @@ victim.take_damage(rand(10,20), BRAIN) victim.set_psi_rank(pick_n_take(faculties), 1) sleep(30) - psi = victim.get_ability_handler(/datum/ability_handler/psionics, FALSE) + psi = victim.get_ability_handler(/datum/ability_handler/psionics) psi?.update() sleep(45) psi?.check_latency_trigger(100, "a psionic scream", redactive = TRUE) diff --git a/mods/content/psionics/system/psionics/faculties/_power.dm b/mods/content/psionics/system/psionics/faculties/_power.dm index 7c32f73e38..75c6c5ab05 100644 --- a/mods/content/psionics/system/psionics/faculties/_power.dm +++ b/mods/content/psionics/system/psionics/faculties/_power.dm @@ -17,7 +17,7 @@ /decl/psionic_power/proc/invoke(var/mob/living/user, var/atom/target) - var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics) if(!psi) return FALSE @@ -42,7 +42,7 @@ /decl/psionic_power/proc/handle_post_power(var/mob/living/user, var/atom/target) if(cooldown) - var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics) psi?.set_cooldown(cooldown) if(admin_log && ismob(user) && ismob(target)) admin_attack_log(user, target, "Used psipower ([name])", "Was subjected to a psipower ([name])", "used a psipower ([name]) on") diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index 2a4379742a..bc597cb3b7 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -32,7 +32,7 @@ return FALSE . = ..() if(.) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) user.visible_message(SPAN_DANGER("\The [user] suddenly throws back their head, as though screaming silently!")) to_chat(user, SPAN_DANGER("You strike at all around you with a deafening psionic scream!")) for(var/mob/living/M in orange(user, psi?.get_rank(PSI_COERCION))) @@ -208,7 +208,7 @@ to_chat(user, SPAN_NOTICE("You insinuate your mentality into that of \the [target]...")) to_chat(target, SPAN_WARNING("Your persona is being probed by the psychic lens of \the [user].")) if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, 0, 1)) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) psi?.backblast(rand(5,10)) return TRUE to_chat(user, SPAN_NOTICE("You retreat from \the [target], holding your new knowledge close.")) @@ -229,7 +229,7 @@ return FALSE . = ..() if(.) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) user.visible_message(SPAN_WARNING("\The [user] holds the head of \the [target] in both hands...")) to_chat(user, SPAN_NOTICE("You probe \the [target]'s mind for various ailments..")) to_chat(target, SPAN_WARNING("Your mind is being cleansed of ailments by \the [user].")) diff --git a/mods/content/psionics/system/psionics/faculties/energistics.dm b/mods/content/psionics/system/psionics/faculties/energistics.dm index b99530330e..3552758d42 100644 --- a/mods/content/psionics/system/psionics/faculties/energistics.dm +++ b/mods/content/psionics/system/psionics/faculties/energistics.dm @@ -67,7 +67,7 @@ if(.) user.visible_message("\The [user]'s eyes flare with light!") - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) var/user_rank = psi?.get_rank(faculty) var/obj/item/projectile/pew var/pew_sound diff --git a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm index 4f7b3850dc..8ab5976c74 100644 --- a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm +++ b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm @@ -23,7 +23,7 @@ return FALSE . = ..() if(.) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) switch(psi?.get_rank(faculty)) if(PSI_RANK_PARAMOUNT) return new /obj/item/ability/psionic/psiblade/master/grand/paramount(user, user) @@ -70,7 +70,7 @@ if(.) var/distance = get_dist(user, target) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) if(distance > psi?.get_rank(PSI_PSYCHOKINESIS)) to_chat(user, "Your telekinetic power won't reach that far.") return FALSE diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index e5c9501411..e427fd9694 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -64,7 +64,7 @@ user.visible_message(SPAN_NOTICE("\The [user] rests a hand on \the [target]'s [E.name]...")) to_chat(target, SPAN_NOTICE("A healing warmth suffuses you.")) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) var/redaction_rank = psi?.get_rank(PSI_REDACTION) var/pk_rank = psi?.get_rank(PSI_PSYCHOKINESIS) if(pk_rank >= PSI_RANK_LATENT && redaction_rank >= PSI_RANK_MASTER) @@ -178,7 +178,7 @@ user.visible_message(SPAN_NOTICE("\The [user] splays out their hands over \the [target]'s body...")) if(!do_after(user, 100, target, 0, 1)) - var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = user?.get_ability_handler(/datum/ability_handler/psionics) psi?.backblast(rand(10,25)) return TRUE diff --git a/mods/content/psionics/system/psionics/interface/ui_hub.dm b/mods/content/psionics/system/psionics/interface/ui_hub.dm index bc11e824bf..cd87e52821 100644 --- a/mods/content/psionics/system/psionics/interface/ui_hub.dm +++ b/mods/content/psionics/system/psionics/interface/ui_hub.dm @@ -20,7 +20,7 @@ /obj/screen/psi/hub/on_update_icon() var/mob/living/owner = owner_ref?.resolve() - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) icon_state = psi?.suppressed ? "psi_suppressed" : "psi_active" if(world.time < psi?.next_power_use) overlays |= on_cooldown @@ -44,7 +44,7 @@ if(!istype(owner)) qdel(src) return - var/datum/ability_handler/psionics/psi = owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = owner.get_ability_handler(/datum/ability_handler/psionics) if(!psi) return maptext = "[round((psi.stamina/psi.max_stamina)*100)]%" @@ -53,7 +53,7 @@ /obj/screen/psi/hub/handle_click(mob/user, params) var/mob/living/owner = owner_ref?.resolve() - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(!psi) return diff --git a/mods/content/psionics/system/psionics/interface/ui_toggles.dm b/mods/content/psionics/system/psionics/interface/ui_toggles.dm index f7b268542b..5585ac5d80 100644 --- a/mods/content/psionics/system/psionics/interface/ui_toggles.dm +++ b/mods/content/psionics/system/psionics/interface/ui_toggles.dm @@ -6,13 +6,13 @@ /obj/screen/psi/armour/on_update_icon() ..() var/mob/living/owner = owner_ref.resolve() - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(psi && invisibility == 0) icon_state = psi.use_psi_armour ? "psiarmour_on" : "psiarmour_off" /obj/screen/psi/armour/handle_click(mob/user, params) var/mob/living/owner = owner_ref?.resolve() - var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(!psi) return psi.use_psi_armour = !psi.use_psi_armour diff --git a/mods/content/psionics/system/psionics/mob/mob.dm b/mods/content/psionics/system/psionics/mob/mob.dm index 0e5e22d36d..0fcce774d3 100644 --- a/mods/content/psionics/system/psionics/mob/mob.dm +++ b/mods/content/psionics/system/psionics/mob/mob.dm @@ -10,8 +10,8 @@ if(!get_target_zone()) // Can't target a zone, so you can't really invoke psionics. to_chat(src, SPAN_NOTICE("You feel something strange brush against your mind... but your brain is not able to grasp it.")) return - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, TRUE) - var/current_rank = psi.get_rank(faculty) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) + var/current_rank = psi?.get_rank(faculty) if(current_rank != rank && (!take_larger || current_rank < rank)) psi.set_rank(faculty, rank, defer_update, temporary) @@ -26,7 +26,7 @@ /mob/living/carbon/human/check_shields(var/damage = 0, var/atom/damage_source = null, var/mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") var/obj/item/projectile/P = damage_source - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, TRUE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(istype(P) && !P.disrupts_psionics() && psi && P.starting && prob(psi.get_armour(SSmaterials.get_armor_key(P.atom_damage_type, P.damage_flags())) * 0.5) && psi.spend_power(round(damage/10))) visible_message("\The [src] deflects [attack_text]!") P.redirect(P.starting.x + rand(-2,2), P.starting.y + rand(-2,2), get_turf(src), src) @@ -35,26 +35,26 @@ /mob/living/carbon/get_cuff_breakout_mod() . = ..() - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi) . = clamp(. - (psi.get_rank(PSI_PSYCHOKINESIS)*0.2), 0, 1) /mob/living/can_break_cuffs() - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) . = (psi && psi.can_use() && psi.get_rank(PSI_PSYCHOKINESIS) >= PSI_RANK_PARAMOUNT) /mob/living/carbon/get_special_resist_time() . = ..() - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi && psi.can_use()) . += ((25 SECONDS) * psi.get_rank(PSI_PSYCHOKINESIS)) /mob/living/is_telekinetic() - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) . = psi && !psi.suppressed && psi.get_rank(PSI_PSYCHOKINESIS) >= PSI_RANK_OPERANT /mob/living/get_armors_by_zone(def_zone, damage_type, damage_flags) . = ..() - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi) . += get_extension(psi, /datum/extension/armor) diff --git a/mods/content/psionics/system/psionics/mob/mob_assay.dm b/mods/content/psionics/system/psionics/mob/mob_assay.dm index 8436d0ca30..c0b05f7459 100644 --- a/mods/content/psionics/system/psionics/mob/mob_assay.dm +++ b/mods/content/psionics/system/psionics/mob/mob_assay.dm @@ -14,7 +14,7 @@ dat += "

Summary

" dat += "
" - var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/psi = get_ability_handler(/datum/ability_handler/psionics) if(psi) // Hi Warhammer 40k rating system, how are you? @@ -32,7 +32,7 @@ // This space intentionally left blank (for Omega-Minus psi vampires. todo) var/decl/special_role/beguiled/beguiled = GET_DECL(/decl/special_role/beguiled) if(viewer != usr && beguiled.is_antagonist(mind) && ishuman(viewer)) - var/datum/ability_handler/psionics/viewer_psi = viewer.get_ability_handler(/datum/ability_handler/psionics, FALSE) + var/datum/ability_handler/psionics/viewer_psi = viewer.get_ability_handler(/datum/ability_handler/psionics) if(viewer_psi && viewer_psi.get_rank(PSI_REDACTION) >= PSI_RANK_GRANDMASTER) dat += "Their mind has been subverted by another operant psychic; their actions are not their own." From ebdba90293a2eb3a212a4454a027eafb2ea2f0ed Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 May 2024 14:48:09 +1000 Subject: [PATCH 004/212] Fixes some issues with animal bodytypes causing stance checks. --- code/modules/mechs/mech.dm | 4 ++++ code/modules/mob/living/silicon/silicon.dm | 4 ++++ code/modules/mob/living/simple_animal/friendly/cat.dm | 8 ++++---- .../mob/living/simple_animal/friendly/corgi.dm | 8 ++++---- .../modules/mob/living/simple_animal/friendly/crab.dm | 11 +++++++++-- .../modules/mob/living/simple_animal/simple_animal.dm | 10 ++++++++++ 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 1e3ea76f7a..355c074be8 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -242,3 +242,7 @@ /mob/living/exosuit/try_awaken(mob/user) return FALSE + +/mob/living/exosuit/handle_stance() + stance_damage = 0 + return diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index db0594e6cb..624e4ae967 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -461,3 +461,7 @@ /mob/living/silicon/try_awaken(mob/user) return FALSE + +/mob/living/silicon/handle_stance() + stance_damage = 0 + return diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index f642b3b3ff..15bd6fd2fe 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -23,9 +23,9 @@ var/mob/flee_target /mob/living/simple_animal/cat/get_bodytype() - return GET_DECL(/decl/bodytype/animal/cat) + return GET_DECL(/decl/bodytype/quadruped/animal/cat) -/decl/bodytype/animal/cat/Initialize() +/decl/bodytype/quadruped/animal/cat/Initialize() equip_adjust = list( slot_head_str = list( "[NORTH]" = list( 1, -9), @@ -232,9 +232,9 @@ butchery_data = /decl/butchery_data/animal/cat/kitten /mob/living/simple_animal/cat/kitten/get_bodytype() - return GET_DECL(/decl/bodytype/animal/kitten) + return GET_DECL(/decl/bodytype/quadruped/animal/kitten) -/decl/bodytype/animal/kitten/Initialize() +/decl/bodytype/quadruped/animal/kitten/Initialize() equip_adjust = list( slot_head_str = list( "[NORTH]" = list( 1, -14), diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index b27af3d4fb..6d021ba10a 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -21,9 +21,9 @@ butchery_data = /decl/butchery_data/animal/corgi /mob/living/simple_animal/corgi/get_bodytype() - return GET_DECL(/decl/bodytype/animal/corgi) + return GET_DECL(/decl/bodytype/quadruped/animal/corgi) -/decl/bodytype/animal/corgi/Initialize() +/decl/bodytype/quadruped/animal/corgi/Initialize() equip_adjust = list( slot_head_str = list( "[NORTH]" = list( 1, -8), @@ -113,9 +113,9 @@ butchery_data = /decl/butchery_data/animal/corgi/puppy /mob/living/simple_animal/corgi/puppy/get_bodytype() - return GET_DECL(/decl/bodytype/animal/puppy) + return GET_DECL(/decl/bodytype/quadruped/animal/puppy) -/decl/bodytype/animal/puppy/Initialize() +/decl/bodytype/quadruped/animal/puppy/Initialize() equip_adjust = list( slot_head_str = list( "[NORTH]" = list( 0, -12), diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 3ab661ad9d..fc2d285dc3 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -20,10 +20,17 @@ ai = /datum/ai/crab butchery_data = /decl/butchery_data/animal/arthropod/crab +// TODO +/decl/bodytype/hexapod/animal + abstract_type = /decl/bodytype/hexapod/animal + name = "hexapod animal" + bodytype_flag = 0 + bodytype_category = "hexapodal animal body" + /mob/living/simple_animal/crab/get_bodytype() - return GET_DECL(/decl/bodytype/animal/crab) + return GET_DECL(/decl/bodytype/hexapod/animal/crab) -/decl/bodytype/animal/crab/Initialize() +/decl/bodytype/hexapod/animal/crab/Initialize() equip_adjust = list( slot_head_str = list( "[NORTH]" = list(-1, -10), diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ff4f4d26d6..23caead87c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -593,6 +593,12 @@ var/global/list/simplemob_icon_bitflag_cache = list() bodytype_flag = 0 bodytype_category = "animal body" +/decl/bodytype/quadruped/animal + abstract_type = /decl/bodytype/quadruped/animal + name = "quadruped animal" + bodytype_flag = 0 + bodytype_category = "quadrupedal animal body" + /mob/living/simple_animal/proc/get_melee_accuracy() return clamp(sa_accuracy - melee_accuracy_mods(), 0, 100) @@ -615,3 +621,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/get_default_1p_hug_message(mob/living/target) return "You nuzzle $TARGET$." + +/mob/living/simple_animal/handle_stance() + stance_damage = 0 + return From c8040c5b0dab5577d691997462742bdeab8582e0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 May 2024 14:52:13 +1000 Subject: [PATCH 005/212] Updating arguments to action_intent creation for some mobs. --- code/_onclick/hud/animal.dm | 2 +- code/_onclick/hud/deity.dm | 2 +- mods/content/xenobiology/slime/slime_hud.dm | 5 ++--- mods/mobs/borers/mob/borer/borer_hud.dm | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm index 3b76ab719c..e0eed1acee 100644 --- a/code/_onclick/hud/animal.dm +++ b/code/_onclick/hud/animal.dm @@ -3,7 +3,7 @@ hud_used = /datum/hud/animal /datum/hud/animal/FinalizeInstantiation() - action_intent = new(null, mymob) + action_intent = new(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) adding += action_intent ..() diff --git a/code/_onclick/hud/deity.dm b/code/_onclick/hud/deity.dm index 12824de990..8a9e3d77d0 100644 --- a/code/_onclick/hud/deity.dm +++ b/code/_onclick/hud/deity.dm @@ -2,7 +2,7 @@ hud_used = /datum/hud/deity /datum/hud/deity/FinalizeInstantiation() - action_intent = new /obj/screen/intent/deity(null, mymob) + action_intent = new /obj/screen/intent/deity(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) adding += action_intent ..() var/obj/screen/intent/deity/D = action_intent diff --git a/mods/content/xenobiology/slime/slime_hud.dm b/mods/content/xenobiology/slime/slime_hud.dm index 5bc0d0917f..c1dcf1b914 100644 --- a/mods/content/xenobiology/slime/slime_hud.dm +++ b/mods/content/xenobiology/slime/slime_hud.dm @@ -1,5 +1,4 @@ /datum/hud/slime/FinalizeInstantiation() - action_intent = new /obj/screen/intent(null, mymob) - src.adding = list(action_intent) - + action_intent = new(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) + adding = list(action_intent) ..() diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index 6fb2524917..34251dbc64 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -14,7 +14,7 @@ . = ..() /datum/hud/borer/FinalizeInstantiation() - hud_intent_selector = new(null, mymob) + hud_intent_selector = new(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) adding += hud_intent_selector hud_inject_chemicals = new(null, mymob) hud_leave_host = new(null, mymob) From ece80d71ba4363dc4a50c8def6cf7f85d28bed75 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 May 2024 21:28:16 +1000 Subject: [PATCH 006/212] Fixes default hair icons being stacked on chosen hair. --- code/modules/organs/external/_external_icons.dm | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 76f373c038..9dc008b224 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -149,12 +149,16 @@ var/global/list/organ_icon_cache = list() /obj/item/organ/external/proc/set_sprite_accessory(var/accessory_type, var/accessory_category, var/accessory_color, var/skip_update = FALSE) + var/list/refresh_accessories = list() + var/decl/sprite_accessory/accessory_decl = GET_DECL(accessory_type) if(!accessory_category) if(!accessory_decl) return accessory_category = accessory_decl.accessory_category + var/decl/sprite_accessory_category/accessory_cat_decl = GET_DECL(accessory_category) + var/list/accessories = LAZYACCESS(_sprite_accessories, accessory_category) if(!accessories) accessories = list() @@ -172,17 +176,22 @@ var/global/list/organ_icon_cache = list() return if(LAZYACCESS(accessories, accessory_type) == accessory_color) return + if(accessory_cat_decl.single_selection) + refresh_accessories |= accessories + accessories.Cut() LAZYSET(accessories, accessory_type, accessory_color) + refresh_accessories += accessory_decl else if(!(accessory_type in accessories)) return remove_sprite_accessory(accessory_type, TRUE) if(!skip_update) - if(owner && accessory_type) - var/decl/sprite_accessory/refresh_accessory = GET_DECL(accessory_type) - if(refresh_accessory) - refresh_accessory.refresh_mob(owner) + if(owner && length(refresh_accessories)) + for(var/refresh_accessory_type in refresh_accessories) + var/decl/sprite_accessory/refresh_accessory = GET_DECL(refresh_accessory_type) + if(refresh_accessory) + refresh_accessory.refresh_mob(owner) update_icon() /obj/item/organ/external/proc/get_heritable_sprite_accessories() From bbabf42a3080572178253a07075cf1a07f58839f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 May 2024 20:25:17 +1000 Subject: [PATCH 007/212] Xenobotany genetics now use a proper decl system. --- code/__defines/hydroponics.dm | 106 +++++----- code/controllers/subsystems/plants.dm | 71 +++---- .../objects/items/devices/scanners/plant.dm | 129 ++---------- code/modules/genetics/_gene.dm | 7 + code/modules/genetics/plants/_gene_plant.dm | 63 ++++++ code/modules/genetics/plants/_plant_trait.dm | 36 ++++ .../genetics/plants/gene_atmosphere.dm | 15 ++ .../genetics/plants/gene_biochemistry.dm | 51 +++++ code/modules/genetics/plants/gene_diet.dm | 29 +++ .../genetics/plants/gene_environment.dm | 15 ++ code/modules/genetics/plants/gene_fruit.dm | 16 ++ .../modules/genetics/plants/gene_hardiness.dm | 18 ++ .../genetics/plants/gene_metabolism.dm | 28 +++ code/modules/genetics/plants/gene_output.dm | 19 ++ code/modules/genetics/plants/gene_pigment.dm | 8 + code/modules/genetics/plants/gene_special.dm | 9 + .../modules/genetics/plants/gene_structure.dm | 8 + code/modules/genetics/plants/gene_vigour.dm | 17 ++ .../genetics/plants/trait_alter_temp.dm | 8 + code/modules/genetics/plants/trait_biolum.dm | 8 + .../genetics/plants/trait_biolum_colour.dm | 4 + .../genetics/plants/trait_carnivorous.dm | 12 ++ code/modules/genetics/plants/trait_chems.dm | 3 + .../genetics/plants/trait_consume_gasses.dm | 8 + .../genetics/plants/trait_endurance.dm | 5 + .../genetics/plants/trait_explosive.dm | 9 + .../genetics/plants/trait_exude_gasses.dm | 10 + .../genetics/plants/trait_flesh_colour.dm | 2 + .../genetics/plants/trait_harvest_repeat.dm | 9 + .../genetics/plants/trait_heat_tolerance.dm | 14 ++ .../plants/trait_highkpa_tolerance.dm | 12 ++ .../genetics/plants/trait_ideal_heat.dm | 12 ++ .../genetics/plants/trait_ideal_light.dm | 12 ++ .../genetics/plants/trait_immutable.dm | 11 + code/modules/genetics/plants/trait_juicy.dm | 11 + code/modules/genetics/plants/trait_large.dm | 2 + .../genetics/plants/trait_leaves_colour.dm | 2 + .../genetics/plants/trait_light_tolerance.dm | 14 ++ .../genetics/plants/trait_lowkpa_tolerance.dm | 12 ++ .../genetics/plants/trait_maturation.dm | 4 + .../plants/trait_nutrient_consumption.dm | 4 + .../modules/genetics/plants/trait_parasite.dm | 9 + .../genetics/plants/trait_pest_tolerance.dm | 11 + .../genetics/plants/trait_photosynthesis.dm | 5 + .../genetics/plants/trait_plant_colour.dm | 4 + .../genetics/plants/trait_plant_icon.dm | 7 + code/modules/genetics/plants/trait_potency.dm | 5 + .../genetics/plants/trait_produces_power.dm | 9 + .../genetics/plants/trait_product_colour.dm | 4 + .../genetics/plants/trait_product_icon.dm | 4 + .../genetics/plants/trait_product_type.dm | 4 + .../genetics/plants/trait_production.dm | 4 + .../plants/trait_requires_nutrients.dm | 13 ++ .../genetics/plants/trait_requires_water.dm | 13 ++ .../genetics/plants/trait_slice_amount.dm | 4 + .../genetics/plants/trait_slice_product.dm | 4 + code/modules/genetics/plants/trait_spread.dm | 11 + code/modules/genetics/plants/trait_stings.dm | 9 + .../genetics/plants/trait_teleporting.dm | 9 + .../genetics/plants/trait_toxins_tolerance.dm | 11 + .../plants/trait_water_consumption.dm | 4 + .../genetics/plants/trait_weed_tolerance.dm | 11 + code/modules/genetics/plants/trait_yield.dm | 4 + code/modules/hydroponics/seed.dm | 198 +++--------------- code/modules/hydroponics/seed_gene_mut.dm | 124 +---------- code/modules/hydroponics/seed_machines.dm | 24 ++- .../spreading/spreading_response.dm | 4 +- .../projectiles/guns/energy/special.dm | 16 +- .../modules/projectiles/projectile/special.dm | 2 +- nebula.dme | 60 ++++++ 70 files changed, 890 insertions(+), 530 deletions(-) create mode 100644 code/modules/genetics/_gene.dm create mode 100644 code/modules/genetics/plants/_gene_plant.dm create mode 100644 code/modules/genetics/plants/_plant_trait.dm create mode 100644 code/modules/genetics/plants/gene_atmosphere.dm create mode 100644 code/modules/genetics/plants/gene_biochemistry.dm create mode 100644 code/modules/genetics/plants/gene_diet.dm create mode 100644 code/modules/genetics/plants/gene_environment.dm create mode 100644 code/modules/genetics/plants/gene_fruit.dm create mode 100644 code/modules/genetics/plants/gene_hardiness.dm create mode 100644 code/modules/genetics/plants/gene_metabolism.dm create mode 100644 code/modules/genetics/plants/gene_output.dm create mode 100644 code/modules/genetics/plants/gene_pigment.dm create mode 100644 code/modules/genetics/plants/gene_special.dm create mode 100644 code/modules/genetics/plants/gene_structure.dm create mode 100644 code/modules/genetics/plants/gene_vigour.dm create mode 100644 code/modules/genetics/plants/trait_alter_temp.dm create mode 100644 code/modules/genetics/plants/trait_biolum.dm create mode 100644 code/modules/genetics/plants/trait_biolum_colour.dm create mode 100644 code/modules/genetics/plants/trait_carnivorous.dm create mode 100644 code/modules/genetics/plants/trait_chems.dm create mode 100644 code/modules/genetics/plants/trait_consume_gasses.dm create mode 100644 code/modules/genetics/plants/trait_endurance.dm create mode 100644 code/modules/genetics/plants/trait_explosive.dm create mode 100644 code/modules/genetics/plants/trait_exude_gasses.dm create mode 100644 code/modules/genetics/plants/trait_flesh_colour.dm create mode 100644 code/modules/genetics/plants/trait_harvest_repeat.dm create mode 100644 code/modules/genetics/plants/trait_heat_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_highkpa_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_ideal_heat.dm create mode 100644 code/modules/genetics/plants/trait_ideal_light.dm create mode 100644 code/modules/genetics/plants/trait_immutable.dm create mode 100644 code/modules/genetics/plants/trait_juicy.dm create mode 100644 code/modules/genetics/plants/trait_large.dm create mode 100644 code/modules/genetics/plants/trait_leaves_colour.dm create mode 100644 code/modules/genetics/plants/trait_light_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_lowkpa_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_maturation.dm create mode 100644 code/modules/genetics/plants/trait_nutrient_consumption.dm create mode 100644 code/modules/genetics/plants/trait_parasite.dm create mode 100644 code/modules/genetics/plants/trait_pest_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_photosynthesis.dm create mode 100644 code/modules/genetics/plants/trait_plant_colour.dm create mode 100644 code/modules/genetics/plants/trait_plant_icon.dm create mode 100644 code/modules/genetics/plants/trait_potency.dm create mode 100644 code/modules/genetics/plants/trait_produces_power.dm create mode 100644 code/modules/genetics/plants/trait_product_colour.dm create mode 100644 code/modules/genetics/plants/trait_product_icon.dm create mode 100644 code/modules/genetics/plants/trait_product_type.dm create mode 100644 code/modules/genetics/plants/trait_production.dm create mode 100644 code/modules/genetics/plants/trait_requires_nutrients.dm create mode 100644 code/modules/genetics/plants/trait_requires_water.dm create mode 100644 code/modules/genetics/plants/trait_slice_amount.dm create mode 100644 code/modules/genetics/plants/trait_slice_product.dm create mode 100644 code/modules/genetics/plants/trait_spread.dm create mode 100644 code/modules/genetics/plants/trait_stings.dm create mode 100644 code/modules/genetics/plants/trait_teleporting.dm create mode 100644 code/modules/genetics/plants/trait_toxins_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_water_consumption.dm create mode 100644 code/modules/genetics/plants/trait_weed_tolerance.dm create mode 100644 code/modules/genetics/plants/trait_yield.dm diff --git a/code/__defines/hydroponics.dm b/code/__defines/hydroponics.dm index 22b8fee80f..6aa4a63f76 100644 --- a/code/__defines/hydroponics.dm +++ b/code/__defines/hydroponics.dm @@ -1,65 +1,53 @@ //Misc #define DEAD_PLANT_COLOUR "#c2a180" -// Definitions for genes (trait groupings) -#define GENE_BIOCHEMISTRY "biochemistry" -#define GENE_HARDINESS "hardiness" -#define GENE_ENVIRONMENT "environment" -#define GENE_METABOLISM "metabolism" -#define GENE_STRUCTURE "appearance" -#define GENE_DIET "diet" -#define GENE_PIGMENT "pigment" -#define GENE_OUTPUT "output" -#define GENE_ATMOSPHERE "atmosphere" -#define GENE_VIGOUR "vigour" -#define GENE_FRUIT "fruit" -#define GENE_SPECIAL "special" - -#define ALL_GENES list(GENE_BIOCHEMISTRY,GENE_HARDINESS,GENE_ENVIRONMENT,GENE_METABOLISM,GENE_STRUCTURE,GENE_DIET,GENE_PIGMENT,GENE_OUTPUT,GENE_ATMOSPHERE,GENE_VIGOUR,GENE_FRUIT,GENE_SPECIAL) - -//Definitions for traits (individual descriptors) -#define TRAIT_CHEMS 1 -#define TRAIT_EXUDE_GASSES 2 -#define TRAIT_ALTER_TEMP 3 -#define TRAIT_POTENCY 4 -#define TRAIT_HARVEST_REPEAT 5 -#define TRAIT_PRODUCES_POWER 6 -#define TRAIT_JUICY 7 -#define TRAIT_PRODUCT_ICON 8 -#define TRAIT_PLANT_ICON 9 -#define TRAIT_CONSUME_GASSES 10 -#define TRAIT_REQUIRES_NUTRIENTS 11 -#define TRAIT_NUTRIENT_CONSUMPTION 12 -#define TRAIT_REQUIRES_WATER 13 -#define TRAIT_WATER_CONSUMPTION 14 -#define TRAIT_CARNIVOROUS 15 -#define TRAIT_PARASITE 16 -#define TRAIT_STINGS 17 -#define TRAIT_IDEAL_HEAT 18 -#define TRAIT_HEAT_TOLERANCE 19 -#define TRAIT_IDEAL_LIGHT 20 -#define TRAIT_LIGHT_TOLERANCE 21 -#define TRAIT_LOWKPA_TOLERANCE 22 -#define TRAIT_HIGHKPA_TOLERANCE 23 -#define TRAIT_EXPLOSIVE 24 -#define TRAIT_TOXINS_TOLERANCE 25 -#define TRAIT_PEST_TOLERANCE 26 -#define TRAIT_WEED_TOLERANCE 27 -#define TRAIT_ENDURANCE 28 -#define TRAIT_YIELD 29 -#define TRAIT_SPREAD 30 -#define TRAIT_MATURATION 31 -#define TRAIT_PRODUCTION 32 -#define TRAIT_TELEPORTING 33 -#define TRAIT_PLANT_COLOUR 34 -#define TRAIT_PRODUCT_COLOUR 35 -#define TRAIT_BIOLUM 36 -#define TRAIT_BIOLUM_COLOUR 37 -#define TRAIT_IMMUTABLE 38 -#define TRAIT_FLESH_COLOUR 39 -#define TRAIT_LARGE 40 -#define TRAIT_LEAVES_COLOUR 41 -#define TRAIT_PHOTOSYNTHESIS 42 +// Defining these to point to the relevant decl types just to avoid a massive changeset. +// TODO: rename to PLANT_TRAIT or bare decls to avoid mixing up with GetTrait etc. +#define TRAIT_CHEMS /decl/plant_trait/chems +#define TRAIT_EXUDE_GASSES /decl/plant_trait/exude_gasses +#define TRAIT_ALTER_TEMP /decl/plant_trait/alter_temp +#define TRAIT_POTENCY /decl/plant_trait/potency +#define TRAIT_HARVEST_REPEAT /decl/plant_trait/harvest_repeat +#define TRAIT_PRODUCES_POWER /decl/plant_trait/produces_power +#define TRAIT_JUICY /decl/plant_trait/juicy +#define TRAIT_PRODUCT_ICON /decl/plant_trait/product_icon +#define TRAIT_PLANT_ICON /decl/plant_trait/plant_icon +#define TRAIT_CONSUME_GASSES /decl/plant_trait/consume_gasses +#define TRAIT_REQUIRES_NUTRIENTS /decl/plant_trait/requires_nutrients +#define TRAIT_NUTRIENT_CONSUMPTION /decl/plant_trait/nutrient_consumption +#define TRAIT_REQUIRES_WATER /decl/plant_trait/requires_water +#define TRAIT_WATER_CONSUMPTION /decl/plant_trait/water_consumption +#define TRAIT_CARNIVOROUS /decl/plant_trait/carnivorous +#define TRAIT_PARASITE /decl/plant_trait/parasite +#define TRAIT_STINGS /decl/plant_trait/stings +#define TRAIT_IDEAL_HEAT /decl/plant_trait/ideal_heat +#define TRAIT_HEAT_TOLERANCE /decl/plant_trait/heat_tolerance +#define TRAIT_IDEAL_LIGHT /decl/plant_trait/ideal_light +#define TRAIT_LIGHT_TOLERANCE /decl/plant_trait/light_tolerance +#define TRAIT_LOWKPA_TOLERANCE /decl/plant_trait/lowkpa_tolerance +#define TRAIT_HIGHKPA_TOLERANCE /decl/plant_trait/highkpa_tolerance +#define TRAIT_EXPLOSIVE /decl/plant_trait/explosive +#define TRAIT_TOXINS_TOLERANCE /decl/plant_trait/toxins_tolerance +#define TRAIT_PEST_TOLERANCE /decl/plant_trait/pest_tolerance +#define TRAIT_WEED_TOLERANCE /decl/plant_trait/weed_tolerance +#define TRAIT_ENDURANCE /decl/plant_trait/endurance +#define TRAIT_YIELD /decl/plant_trait/yield +#define TRAIT_SPREAD /decl/plant_trait/spread +#define TRAIT_MATURATION /decl/plant_trait/maturation +#define TRAIT_PRODUCTION /decl/plant_trait/production +#define TRAIT_TELEPORTING /decl/plant_trait/teleporting +#define TRAIT_PLANT_COLOUR /decl/plant_trait/plant_colour +#define TRAIT_PRODUCT_COLOUR /decl/plant_trait/product_colour +#define TRAIT_BIOLUM /decl/plant_trait/biolum +#define TRAIT_BIOLUM_COLOUR /decl/plant_trait/biolum_colour +#define TRAIT_IMMUTABLE /decl/plant_trait/immutable +#define TRAIT_FLESH_COLOUR /decl/plant_trait/flesh_colour +#define TRAIT_LARGE /decl/plant_trait/large +#define TRAIT_LEAVES_COLOUR /decl/plant_trait/leaves_colour +#define TRAIT_PHOTOSYNTHESIS /decl/plant_trait/photosynthesis +#define TRAIT_PRODUCT_TYPE /decl/plant_trait/product_type +#define TRAIT_SLICE_PRODUCT /decl/plant_trait/slice_product +#define TRAIT_SLICE_AMOUNT /decl/plant_trait/slice_amount // Seed noun datums #define SEED_NOUN_SPORES "spores" diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index 5d704ae9aa..a6256b5633 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -1,19 +1,23 @@ PROCESSING_SUBSYSTEM_DEF(plants) - name = "Plants" - priority = SS_PRIORITY_PLANTS - runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME - flags = SS_BACKGROUND|SS_POST_FIRE_TIMING + name = "Plants" + priority = SS_PRIORITY_PLANTS + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + flags = SS_BACKGROUND|SS_POST_FIRE_TIMING init_order = SS_INIT_PLANTS - wait = 60 + wait = 60 - var/list/product_descs = list() // Stores generated fruit descs. - var/list/seeds = list() // All seed data stored here. - var/list/gene_tag_masks = list() // Gene obfuscation for delicious trial and error goodness. - var/list/plant_icon_cache = list() // Stores images of growth, fruits and seeds. - var/list/plant_sprites = list() // List of all harvested product sprites. - var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages. - var/list/gene_masked_list = list() // Stored gene masked list, rather than recreating it when needed. - var/list/plant_gene_datums = list() // Stored datum versions of the gene masked list. + /// Stores generated fruit descs. + var/list/product_descs = list() + /// All seed data stored here. + var/list/seeds = list() + /// Stores images of growth, fruits and seeds. + var/list/plant_icon_cache = list() + /// List of all harvested product sprites. + var/list/plant_sprites = list() + /// List of all growth sprites plus number of growth stages. + var/list/plant_product_sprites = list() + /// Precalculated gene decl/mask list for use in botany machine UI. + var/list/gene_masked_list = list() /datum/controller/subsystem/processing/plants/Initialize() // Build the icon lists. @@ -38,6 +42,11 @@ PROCESSING_SUBSYSTEM_DEF(plants) if(split) plant_product_sprites |= copytext(icostate,1,split) + // Pre-init all our gene master datums. This generates mask strings and prepares us for trait copying/mutation. + // We'll also populate our masked gene list here for the botany machine UI. + for(var/decl/plant_gene/gene in decls_repository.get_decls_of_type_unassociated(/decl/plant_gene)) + gene_masked_list.Add(list(list("tag" = "\ref[gene]", "mask" = gene.name))) + // Populate the global seed datum list. for(var/type in subtypesof(/datum/seed)) var/datum/seed/S = new type @@ -45,29 +54,6 @@ PROCESSING_SUBSYSTEM_DEF(plants) seeds[S.name] = S S.roundstart = 1 - //Might as well mask the gene types while we're at it. - var/list/gene_datums = decls_repository.get_decls_of_subtype(/decl/plantgene) - var/list/used_masks = list() - var/list/plant_traits = ALL_GENES - while(plant_traits && plant_traits.len) - var/gene_tag = pick(plant_traits) - var/gene_mask = "[uppertext(num2hex(rand(0,255)))]" - - while(gene_mask in used_masks) - gene_mask = "[uppertext(num2hex(rand(0,255)))]" - - var/decl/plantgene/G - - for(var/D in gene_datums) - var/decl/plantgene/P = gene_datums[D] - if(gene_tag == P.gene_tag) - G = P - gene_datums -= D - used_masks += gene_mask - plant_traits -= gene_tag - gene_tag_masks[gene_tag] = gene_mask - plant_gene_datums[gene_mask] = G - gene_masked_list.Add(list(list("tag" = gene_tag, "mask" = gene_mask))) . = ..() // Proc for creating a random seed type. @@ -77,13 +63,10 @@ PROCESSING_SUBSYSTEM_DEF(plants) seed.name = "[seed.uid]" seed.base_seed_value = rand(10, 15) seeds[seed.name] = seed - if(survive_on_station) seed.consume_gasses = null - seed.set_trait(TRAIT_IDEAL_HEAT,293) - seed.set_trait(TRAIT_HEAT_TOLERANCE,20) - seed.set_trait(TRAIT_IDEAL_LIGHT,4) - seed.set_trait(TRAIT_LIGHT_TOLERANCE,5) - seed.set_trait(TRAIT_LOWKPA_TOLERANCE,25) - seed.set_trait(TRAIT_HIGHKPA_TOLERANCE,200) - return seed \ No newline at end of file + for(var/decl/plant_trait/plant_trait in decls_repository.get_decls_of_type_unassociated(/decl/plant_trait)) + var/val = plant_trait.get_station_survivable_value() + if(!isnull(val)) + seed.set_trait(plant_trait.type, val) + return seed diff --git a/code/game/objects/items/devices/scanners/plant.dm b/code/game/objects/items/devices/scanners/plant.dm index a05a6f93c4..4f9921fff6 100644 --- a/code/game/objects/items/devices/scanners/plant.dm +++ b/code/game/objects/items/devices/scanners/plant.dm @@ -57,14 +57,25 @@ var/form_title = "[grown_seed.product_name] (#[grown_seed.uid])" dat += "

Plant data for [form_title]

" - dat += "

General Data

" + var/list/general_data = list() + var/list/extended_trait_data = list() + + if(length(grown_seed.mutants)) + extended_trait_data += "It exhibits a high degree of potential subspecies shift." + + for(var/decl/plant_trait/plant_trait in decls_repository.get_decls_of_subtype_unassociated(/decl/plant_trait)) + if(plant_trait.shows_general_data) + general_data[plant_trait.name] = grown_seed.get_trait(plant_trait.type) + if(plant_trait.shows_extended_data) + var/extended_data = plant_trait.get_extended_data(grown_seed.get_trait(plant_trait.type), grown_seed) + if(extended_data) + extended_trait_data += extended_data + dat += "

General Data

" dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" + if(length(general_data)) + for(var/trait_name in general_data) + dat += "" dat += "
Endurance[grown_seed.get_trait(TRAIT_ENDURANCE)]
Yield[grown_seed.get_trait(TRAIT_YIELD)]
Maturation time[grown_seed.get_trait(TRAIT_MATURATION)]
Production time[grown_seed.get_trait(TRAIT_PRODUCTION)]
Potency[grown_seed.get_trait(TRAIT_POTENCY)]
[uppertext(trait_name)][general_data[trait_name]]
" if(LAZYLEN(grown_reagents?.reagent_volumes)) @@ -75,109 +86,7 @@ dat += "
- [R.get_reagent_name(grown_reagents)], [REAGENT_VOLUME(grown_reagents, rtype)] unit(s)" dat += "

Other Data

" - - if(grown_seed.get_trait(TRAIT_HARVEST_REPEAT)) - dat += "This plant can be harvested repeatedly.
" - - if(grown_seed.get_trait(TRAIT_IMMUTABLE) == -1) - dat += "This plant is highly mutable.
" - else if(grown_seed.get_trait(TRAIT_IMMUTABLE) > 0) - dat += "This plant does not possess genetics that are alterable.
" - - if(grown_seed.get_trait(TRAIT_REQUIRES_NUTRIENTS)) - if(grown_seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) < 0.05) - dat += "It consumes a small amount of nutrient fluid.
" - else if(grown_seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) > 0.2) - dat += "It requires a heavy supply of nutrient fluid.
" - else - dat += "It requires a supply of nutrient fluid.
" - - if(grown_seed.get_trait(TRAIT_REQUIRES_WATER)) - if(grown_seed.get_trait(TRAIT_WATER_CONSUMPTION) < 1) - dat += "It requires very little water.
" - else if(grown_seed.get_trait(TRAIT_WATER_CONSUMPTION) > 5) - dat += "It requires a large amount of water.
" - else - dat += "It requires a stable supply of water.
" - - if(grown_seed.mutants && grown_seed.mutants.len) - dat += "It exhibits a high degree of potential subspecies shift.
" - - dat += "It thrives in a temperature of [grown_seed.get_trait(TRAIT_IDEAL_HEAT)] Kelvin." - - if(grown_seed.get_trait(TRAIT_LOWKPA_TOLERANCE) < 20) - dat += "
It is well adapted to low pressure levels." - if(grown_seed.get_trait(TRAIT_HIGHKPA_TOLERANCE) > 220) - dat += "
It is well adapted to high pressure levels." - - if(grown_seed.get_trait(TRAIT_HEAT_TOLERANCE) > 30) - dat += "
It is well adapted to a range of temperatures." - else if(grown_seed.get_trait(TRAIT_HEAT_TOLERANCE) < 10) - dat += "
It is very sensitive to temperature shifts." - - dat += "
It thrives in a light level of [grown_seed.get_trait(TRAIT_IDEAL_LIGHT)] lumen\s." - - if(grown_seed.get_trait(TRAIT_LIGHT_TOLERANCE) > 10) - dat += "
It is well adapted to a range of light levels." - else if(grown_seed.get_trait(TRAIT_LIGHT_TOLERANCE) < 3) - dat += "
It is very sensitive to light level shifts." - - if(grown_seed.get_trait(TRAIT_TOXINS_TOLERANCE) < 3) - dat += "
It is highly sensitive to toxins." - else if(grown_seed.get_trait(TRAIT_TOXINS_TOLERANCE) > 6) - dat += "
It is remarkably resistant to toxins." - - if(grown_seed.get_trait(TRAIT_PEST_TOLERANCE) < 3) - dat += "
It is highly sensitive to pests." - else if(grown_seed.get_trait(TRAIT_PEST_TOLERANCE) > 6) - dat += "
It is remarkably resistant to pests." - - if(grown_seed.get_trait(TRAIT_WEED_TOLERANCE) < 3) - dat += "
It is highly sensitive to weeds." - else if(grown_seed.get_trait(TRAIT_WEED_TOLERANCE) > 6) - dat += "
It is remarkably resistant to weeds." - - switch(grown_seed.get_trait(TRAIT_SPREAD)) - if(1) - dat += "
It is able to be planted outside of a tray." - if(2) - dat += "
It is a robust and vigorous vine that will spread rapidly." - - switch(grown_seed.get_trait(TRAIT_CARNIVOROUS)) - if(1) - dat += "
It is carnivorous and will eat tray pests for sustenance." - if(2) - dat += "
It is carnivorous and poses a significant threat to living things around it." - - if(grown_seed.get_trait(TRAIT_PARASITE)) - dat += "
It is capable of parisitizing and gaining sustenance from tray weeds." - if(grown_seed.get_trait(TRAIT_ALTER_TEMP)) - dat += "
It will periodically alter the local temperature by [grown_seed.get_trait(TRAIT_ALTER_TEMP)] degrees Kelvin." - - if(grown_seed.get_trait(TRAIT_BIOLUM)) - dat += "
It is [grown_seed.get_trait(TRAIT_BIOLUM_COLOUR) ? "bio-luminescent" : "bio-luminescent"]." - - if(grown_seed.get_trait(TRAIT_PRODUCES_POWER)) - dat += "
The fruit will function as a battery if prepared appropriately." - - if(grown_seed.get_trait(TRAIT_STINGS)) - dat += "
The fruit is covered in stinging spines." - - if(grown_seed.get_trait(TRAIT_JUICY) == 1) - dat += "
The fruit is soft-skinned and juicy." - else if(grown_seed.get_trait(TRAIT_JUICY) == 2) - dat += "
The fruit is excessively juicy." - - if(grown_seed.get_trait(TRAIT_EXPLOSIVE)) - dat += "
The fruit is internally unstable." - - if(grown_seed.get_trait(TRAIT_TELEPORTING)) - dat += "
The fruit is temporal/spatially unstable." - - if(grown_seed.get_trait(TRAIT_EXUDE_GASSES)) - dat += "
It will release gas into the environment." - - if(grown_seed.get_trait(TRAIT_CONSUME_GASSES)) - dat += "
It will remove gas from the environment." + if(length(extended_trait_data)) + dat += jointext(extended_trait_data, "
") return JOINTEXT(dat) \ No newline at end of file diff --git a/code/modules/genetics/_gene.dm b/code/modules/genetics/_gene.dm new file mode 100644 index 0000000000..02c40d3691 --- /dev/null +++ b/code/modules/genetics/_gene.dm @@ -0,0 +1,7 @@ +/* +TODO: Post DNA2 removal, shared gene data subtype. +/decl/gene + abstract_type = /decl/gene + var/expected_source + var/expected_target +*/ \ No newline at end of file diff --git a/code/modules/genetics/plants/_gene_plant.dm b/code/modules/genetics/plants/_gene_plant.dm new file mode 100644 index 0000000000..79168f4345 --- /dev/null +++ b/code/modules/genetics/plants/_gene_plant.dm @@ -0,0 +1,63 @@ +/decl/plant_gene + abstract_type = /decl/plant_gene + //expected_source = /datum/seed + //expected_target = /datum/seed + /// Set to a randomized gene mask in Initialize(). + var/name + /// Actual name of the gene, used mostly for VV. + var/unmasked_name + /// A list of trait values to copy wholesale in copy_initial_seed_values(). + var/list/associated_traits + /// Tracker to make sure masked names are unique. + var/static/list/_used_masks = list() + +/decl/plant_gene/Initialize() + . = ..() + while(isnull(name) || (name in _used_masks)) + name = uppertext(num2hex(rand(0,255))) + _used_masks |= name + +/decl/plant_gene/validate() + . = ..() + if(!istext(name) || length(name) != 2) + . += "null or invalid post-mask name: [name || "NULL"]" + if(!istext(unmasked_name)) + . += "null or invalid unmasked name: [unmasked_name || "NULL"]" + for(var/trait in associated_traits) + if(!ispath(trait, /decl/plant_trait)) + . += "erroneous trait value in associated traits: [trait || "NULL"]" + +// Splicing products has some detrimental effects on yield and lifespan. +// We handle this before we do the rest of the looping (in overrides), as normal traits don't really include lists. +/decl/plant_gene/proc/modify_seed(datum/plantgene/gene, datum/seed/seed) + SHOULD_CALL_PARENT(TRUE) + for(var/trait in gene.values) + seed.set_trait(trait, gene.values[trait]) + +// Specific gene data is handled in overrides before calling parent. +/decl/plant_gene/proc/copy_initial_seed_values(datum/plantgene/gene, datum/seed/seed) + SHOULD_CALL_PARENT(TRUE) + if(length(associated_traits)) + for(var/trait in associated_traits) + LAZYSET(gene.values, trait, seed.get_trait(trait)) + +/decl/plant_gene/proc/mutate(datum/seed/seed, turf/location) + return + +// Instance of a gene, used for copying data around. Functionally just a holder for a list. +// Could probably be replaced by `/decl/plant_gene/foo = list(some_trait = some_value)` down the track. +/datum/plantgene + /// Reference back to our master + var/decl/plant_gene/genetype + /// Values to copy into the target seed datum. + var/list/values + +/datum/plantgene/New(decl/plant_gene/gene_archetype, datum/seed/donor) + genetype = gene_archetype + if(ispath(genetype)) + genetype = GET_DECL(genetype) + if(!istype(genetype)) + CRASH("Non-gene decl data passed to plant gene instance: [gene_archetype || "NULL"].") + if(!istype(donor)) + CRASH("Non-seed datum passed to plant gene instance: [donor || "NULL"].") + genetype.copy_initial_seed_values(src, donor) diff --git a/code/modules/genetics/plants/_plant_trait.dm b/code/modules/genetics/plants/_plant_trait.dm new file mode 100644 index 0000000000..59e22f1ace --- /dev/null +++ b/code/modules/genetics/plants/_plant_trait.dm @@ -0,0 +1,36 @@ +/decl/plant_trait + abstract_type = /decl/plant_trait + /// Descriptive name for this trait. + var/name + /// Shows a simple name: value header in the plant scanner. + var/shows_general_data = FALSE + /// Provides a dynamic string to the plant scanner (see get_extended_data()) + var/shows_extended_data = FALSE + /// Multiplier for value when calculating seed worth. + var/base_worth = 0 + /// Value assumed if the trait has not been inserted into the traits list. + var/default_value = 0 + /// Set to skip master gene checking in validate(). + var/requires_master_gene = TRUE + +/decl/plant_trait/proc/get_station_survivable_value() + return + +/decl/plant_trait/proc/get_extended_data(val, datum/seed/grown_seed) + return + +/decl/plant_trait/proc/get_worth_of_value(val) + return base_worth * val + +/decl/plant_trait/proc/handle_post_trait_set(datum/seed/seed) + return + +/decl/plant_trait/validate() + . = ..() + if(!istext(name)) + . += "null or invalid name: [name || "NULL"]" + if(requires_master_gene) + for(var/decl/plant_gene/plant_gene in decls_repository.get_decls_of_subtype_unassociated(/decl/plant_gene)) + if(type in plant_gene.associated_traits) + return + . += "could not find master gene" diff --git a/code/modules/genetics/plants/gene_atmosphere.dm b/code/modules/genetics/plants/gene_atmosphere.dm new file mode 100644 index 0000000000..f51bd5d7a2 --- /dev/null +++ b/code/modules/genetics/plants/gene_atmosphere.dm @@ -0,0 +1,15 @@ +/decl/plant_gene/atmosphere + unmasked_name = "atmosphere" + associated_traits = list( + TRAIT_HEAT_TOLERANCE, + TRAIT_LOWKPA_TOLERANCE, + TRAIT_HIGHKPA_TOLERANCE + ) + +/decl/plant_gene/atmosphere/mutate(datum/seed/seed, turf/location) + if(prob(60)) + seed.set_trait(TRAIT_HEAT_TOLERANCE, seed.get_trait(TRAIT_HEAT_TOLERANCE)+rand(-5,5),800,70) + if(prob(60)) + seed.set_trait(TRAIT_LOWKPA_TOLERANCE, seed.get_trait(TRAIT_LOWKPA_TOLERANCE)+rand(-5,5),80,0) + if(prob(60)) + seed.set_trait(TRAIT_HIGHKPA_TOLERANCE, seed.get_trait(TRAIT_HIGHKPA_TOLERANCE)+rand(-5,5),500,110) diff --git a/code/modules/genetics/plants/gene_biochemistry.dm b/code/modules/genetics/plants/gene_biochemistry.dm new file mode 100644 index 0000000000..9239b95f29 --- /dev/null +++ b/code/modules/genetics/plants/gene_biochemistry.dm @@ -0,0 +1,51 @@ +/decl/plant_gene/biochemistry + unmasked_name = "biochemistry" + associated_traits = list( + TRAIT_POTENCY + ) + var/list/modify_traits = list( + TRAIT_YIELD, + TRAIT_ENDURANCE + ) + +/decl/plant_gene/biochemistry/mutate(datum/seed/seed) + seed.set_trait(TRAIT_POTENCY, seed.get_trait(TRAIT_POTENCY)+rand(-20,20),200, 0) + +/decl/plant_gene/biochemistry/modify_seed(datum/plantgene/gene, datum/seed/seed) + + for(var/trait in modify_traits) + if(seed.get_trait(trait) > 0) + seed.set_trait(trait, seed.get_trait(trait), null, 1, 0.85) + + LAZYINITLIST(seed.chems) + var/list/gene_value = LAZYACCESS(gene.values, TRAIT_CHEMS) + for(var/rid in gene_value) + + var/list/gene_chem = gene_value[rid] + if(!seed.chems[rid]) + seed.chems[rid] = gene_chem.Copy() + continue + + for(var/i = 1 to length(gene_chem)) + if(isnull(gene_chem[i])) + gene_chem[i] = 0 + if(seed.chems[rid][i]) + seed.chems[rid][i] = max(1, round((gene_chem[i] + seed.chems[rid][i])/2)) + else + seed.chems[rid][i] = gene_chem[i] + + var/list/new_gasses = LAZYACCESS(gene.values, TRAIT_EXUDE_GASSES) + if(islist(new_gasses) && length(new_gasses)) + LAZYDISTINCTADD(seed.exude_gasses, new_gasses) + for(var/gas in seed.exude_gasses) + seed.exude_gasses[gas] = max(1, round(seed.exude_gasses[gas] * 0.8)) + + LAZYREMOVE(gene.values, TRAIT_EXUDE_GASSES) + LAZYREMOVE(gene.values, TRAIT_CHEMS) + + return ..() + +/decl/plant_gene/biochemistry/copy_initial_seed_values(datum/plantgene/gene, datum/seed/seed) + LAZYSET(gene.values, TRAIT_CHEMS, seed.chems?.Copy()) + LAZYSET(gene.values, TRAIT_EXUDE_GASSES, seed.exude_gasses?.Copy()) + return ..() diff --git a/code/modules/genetics/plants/gene_diet.dm b/code/modules/genetics/plants/gene_diet.dm new file mode 100644 index 0000000000..bc002938ed --- /dev/null +++ b/code/modules/genetics/plants/gene_diet.dm @@ -0,0 +1,29 @@ +/decl/plant_gene/diet + unmasked_name = "diet" + associated_traits = list( + TRAIT_CARNIVOROUS, + TRAIT_PARASITE, + TRAIT_NUTRIENT_CONSUMPTION, + TRAIT_WATER_CONSUMPTION + ) + +/decl/plant_gene/diet/mutate(datum/seed/seed, turf/location) + if(prob(60)) + seed.set_trait(TRAIT_CARNIVOROUS, seed.get_trait(TRAIT_CARNIVOROUS)+rand(-1,1),2,0) + if(prob(60)) + seed.set_trait(TRAIT_PARASITE, !seed.get_trait(TRAIT_PARASITE)) + if(prob(65)) + seed.set_trait(TRAIT_NUTRIENT_CONSUMPTION, seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION)+rand(-0.1,0.1),5,0) + if(prob(65)) + seed.set_trait(TRAIT_WATER_CONSUMPTION, seed.get_trait(TRAIT_WATER_CONSUMPTION)+rand(-1,1),50,0) + +/decl/plant_gene/diet/modify_seed(datum/plantgene/gene, datum/seed/seed) + var/list/new_gasses = LAZYACCESS(gene.values, TRAIT_CONSUME_GASSES) + if(islist(new_gasses) && length(new_gasses)) + LAZYDISTINCTADD(seed.consume_gasses, new_gasses) + gene.values -= TRAIT_CONSUME_GASSES + return ..() + +/decl/plant_gene/diet/copy_initial_seed_values(datum/plantgene/gene, datum/seed/seed) + LAZYSET(gene.values, TRAIT_CONSUME_GASSES, seed.consume_gasses?.Copy()) + return ..() diff --git a/code/modules/genetics/plants/gene_environment.dm b/code/modules/genetics/plants/gene_environment.dm new file mode 100644 index 0000000000..2ada19ba2c --- /dev/null +++ b/code/modules/genetics/plants/gene_environment.dm @@ -0,0 +1,15 @@ +/decl/plant_gene/environment + unmasked_name = "environment" + associated_traits = list( + TRAIT_IDEAL_HEAT, + TRAIT_IDEAL_LIGHT, + TRAIT_LIGHT_TOLERANCE + ) + +/decl/plant_gene/environment/mutate(datum/seed/seed, turf/location) + if(prob(60)) + seed.set_trait(TRAIT_IDEAL_HEAT, seed.get_trait(TRAIT_IDEAL_HEAT)+rand(-2,2),10,0) + if(prob(60)) + seed.set_trait(TRAIT_IDEAL_LIGHT, seed.get_trait(TRAIT_IDEAL_LIGHT)+rand(-2,2),10,0) + if(prob(60)) + seed.set_trait(TRAIT_LIGHT_TOLERANCE, seed.get_trait(TRAIT_LIGHT_TOLERANCE)+rand(-5,5),100,0) diff --git a/code/modules/genetics/plants/gene_fruit.dm b/code/modules/genetics/plants/gene_fruit.dm new file mode 100644 index 0000000000..6ea6f419f6 --- /dev/null +++ b/code/modules/genetics/plants/gene_fruit.dm @@ -0,0 +1,16 @@ +/decl/plant_gene/fruit + unmasked_name = "fruit" + associated_traits = list( + TRAIT_STINGS, + TRAIT_EXPLOSIVE, + TRAIT_FLESH_COLOUR, + TRAIT_JUICY + ) + +/decl/plant_gene/fruit/mutate(datum/seed/seed, turf/location) + if(prob(65)) + seed.set_trait(TRAIT_STINGS, !seed.get_trait(TRAIT_STINGS)) + if(prob(65)) + seed.set_trait(TRAIT_EXPLOSIVE, !seed.get_trait(TRAIT_EXPLOSIVE)) + if(prob(65)) + seed.set_trait(TRAIT_JUICY, !seed.get_trait(TRAIT_JUICY)) diff --git a/code/modules/genetics/plants/gene_hardiness.dm b/code/modules/genetics/plants/gene_hardiness.dm new file mode 100644 index 0000000000..86002a5604 --- /dev/null +++ b/code/modules/genetics/plants/gene_hardiness.dm @@ -0,0 +1,18 @@ +/decl/plant_gene/hardiness + unmasked_name = "hardiness" + associated_traits = list( + TRAIT_TOXINS_TOLERANCE, + TRAIT_PEST_TOLERANCE, + TRAIT_WEED_TOLERANCE, + TRAIT_ENDURANCE + ) + +/decl/plant_gene/hardiness/mutate(datum/seed/seed, turf/location) + if(prob(60)) + seed.set_trait(TRAIT_TOXINS_TOLERANCE, seed.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + seed.set_trait(TRAIT_PEST_TOLERANCE, seed.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + seed.set_trait(TRAIT_WEED_TOLERANCE, seed.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + seed.set_trait(TRAIT_ENDURANCE, seed.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0) diff --git a/code/modules/genetics/plants/gene_metabolism.dm b/code/modules/genetics/plants/gene_metabolism.dm new file mode 100644 index 0000000000..01dc3c5c8f --- /dev/null +++ b/code/modules/genetics/plants/gene_metabolism.dm @@ -0,0 +1,28 @@ +/decl/plant_gene/metabolism + unmasked_name = "metabolism" + associated_traits = list( + TRAIT_REQUIRES_NUTRIENTS, + TRAIT_REQUIRES_WATER, + TRAIT_ALTER_TEMP + ) + +/decl/plant_gene/metabolism/mutate(datum/seed/seed, turf/location) + if(prob(65)) + seed.set_trait(TRAIT_REQUIRES_NUTRIENTS, seed.get_trait(TRAIT_REQUIRES_NUTRIENTS)+rand(-2,2),10,0) + if(prob(65)) + seed.set_trait(TRAIT_REQUIRES_WATER, seed.get_trait(TRAIT_REQUIRES_WATER)+rand(-2,2),10,0) + if(prob(40)) + seed.set_trait(TRAIT_ALTER_TEMP, seed.get_trait(TRAIT_ALTER_TEMP)+rand(-5,5),100,0) + +/decl/plant_gene/metabolism/modify_seed(datum/plantgene/gene, datum/seed/seed) + seed.product_type = LAZYACCESS(gene.values, TRAIT_PRODUCT_TYPE) + seed.slice_product = LAZYACCESS(gene.values, TRAIT_SLICE_PRODUCT) + seed.slice_amount = LAZYACCESS(gene.values, TRAIT_SLICE_AMOUNT) + LAZYREMOVE(gene.values, TRAIT_PRODUCT_TYPE) + return ..() + +/decl/plant_gene/metabolism/copy_initial_seed_values(datum/plantgene/gene, datum/seed/seed) + LAZYSET(gene.values, TRAIT_PRODUCT_TYPE, seed.product_type) + LAZYSET(gene.values, TRAIT_SLICE_PRODUCT, seed.slice_product) + LAZYSET(gene.values, TRAIT_SLICE_AMOUNT, seed.slice_amount) + return ..() diff --git a/code/modules/genetics/plants/gene_output.dm b/code/modules/genetics/plants/gene_output.dm new file mode 100644 index 0000000000..57c5b7f87e --- /dev/null +++ b/code/modules/genetics/plants/gene_output.dm @@ -0,0 +1,19 @@ +/decl/plant_gene/output + unmasked_name = "output" + associated_traits = list( + TRAIT_PRODUCES_POWER, + TRAIT_BIOLUM + ) + +/decl/plant_gene/output/mutate(datum/seed/seed, turf/location) + if(prob(50)) + seed.set_trait(TRAIT_BIOLUM, !seed.get_trait(TRAIT_BIOLUM)) + if(seed.get_trait(TRAIT_BIOLUM)) + location.visible_message(SPAN_NOTICE("\The [seed.display_name] begins to glow!")) + if(prob(50)) + seed.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) + location.visible_message(SPAN_NOTICE("\The [seed.display_name]'s glow changes colour!")) + else + location.visible_message(SPAN_NOTICE("\The [seed.display_name]'s glow dims...")) + if(prob(60)) + seed.set_trait(TRAIT_PRODUCES_POWER, !seed.get_trait(TRAIT_PRODUCES_POWER)) diff --git a/code/modules/genetics/plants/gene_pigment.dm b/code/modules/genetics/plants/gene_pigment.dm new file mode 100644 index 0000000000..e7b87dea2f --- /dev/null +++ b/code/modules/genetics/plants/gene_pigment.dm @@ -0,0 +1,8 @@ +/decl/plant_gene/pigment + unmasked_name = "pigment" + associated_traits = list( + TRAIT_PLANT_COLOUR, + TRAIT_PRODUCT_COLOUR, + TRAIT_BIOLUM_COLOUR, + TRAIT_LEAVES_COLOUR + ) diff --git a/code/modules/genetics/plants/gene_special.dm b/code/modules/genetics/plants/gene_special.dm new file mode 100644 index 0000000000..4d45d5cf59 --- /dev/null +++ b/code/modules/genetics/plants/gene_special.dm @@ -0,0 +1,9 @@ +/decl/plant_gene/special + unmasked_name = "special" + associated_traits = list( + TRAIT_TELEPORTING + ) + +/decl/plant_gene/special/mutate(datum/seed/seed, turf/location) + if(prob(65)) + seed.set_trait(TRAIT_TELEPORTING, !seed.get_trait(TRAIT_TELEPORTING)) diff --git a/code/modules/genetics/plants/gene_structure.dm b/code/modules/genetics/plants/gene_structure.dm new file mode 100644 index 0000000000..228d09d57c --- /dev/null +++ b/code/modules/genetics/plants/gene_structure.dm @@ -0,0 +1,8 @@ +/decl/plant_gene/structure + unmasked_name = "structure" + associated_traits = list( + TRAIT_PLANT_ICON, + TRAIT_PRODUCT_ICON, + TRAIT_HARVEST_REPEAT, + TRAIT_LARGE + ) diff --git a/code/modules/genetics/plants/gene_vigour.dm b/code/modules/genetics/plants/gene_vigour.dm new file mode 100644 index 0000000000..1d98a5480a --- /dev/null +++ b/code/modules/genetics/plants/gene_vigour.dm @@ -0,0 +1,17 @@ +/decl/plant_gene/vigour + unmasked_name = "vigour" + associated_traits = list( + TRAIT_PRODUCTION, + TRAIT_MATURATION, + TRAIT_YIELD, + TRAIT_SPREAD + ) + +/decl/plant_gene/vigour/mutate(datum/seed/seed, turf/location) + if(prob(65)) + seed.set_trait(TRAIT_PRODUCTION, seed.get_trait(TRAIT_PRODUCTION)+rand(-1,1),10,0) + if(prob(65)) + seed.set_trait(TRAIT_MATURATION, seed.get_trait(TRAIT_MATURATION)+rand(-1,1),30,0) + if(prob(55)) + seed.set_trait(TRAIT_SPREAD, seed.get_trait(TRAIT_SPREAD)+rand(-1,1),2,0) + location.visible_message(SPAN_NOTICE("\The [seed.display_name] spasms visibly.")) diff --git a/code/modules/genetics/plants/trait_alter_temp.dm b/code/modules/genetics/plants/trait_alter_temp.dm new file mode 100644 index 0000000000..5fb53109ef --- /dev/null +++ b/code/modules/genetics/plants/trait_alter_temp.dm @@ -0,0 +1,8 @@ +/// If set, the plant will periodically alter local temp by this amount. +/decl/plant_trait/alter_temp + name = "temperature alteration" + shows_extended_data = TRUE + +/decl/plant_trait/alter_temp/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It will periodically alter the local temperature by [val] degrees Kelvin." diff --git a/code/modules/genetics/plants/trait_biolum.dm b/code/modules/genetics/plants/trait_biolum.dm new file mode 100644 index 0000000000..26c5d38b69 --- /dev/null +++ b/code/modules/genetics/plants/trait_biolum.dm @@ -0,0 +1,8 @@ +/// Plant is bioluminescent. +/decl/plant_trait/biolum + name = "bioluminescence" + shows_extended_data = TRUE + +/decl/plant_trait/biolum/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It is [grown_seed?.get_trait(TRAIT_BIOLUM_COLOUR) ? "bio-luminescent" : "bio-luminescent"]." diff --git a/code/modules/genetics/plants/trait_biolum_colour.dm b/code/modules/genetics/plants/trait_biolum_colour.dm new file mode 100644 index 0000000000..270b8fcb81 --- /dev/null +++ b/code/modules/genetics/plants/trait_biolum_colour.dm @@ -0,0 +1,4 @@ +/// The colour of the plant's radiance. +/decl/plant_trait/biolum_colour + name = "bioluminescence colour" + default_value = null diff --git a/code/modules/genetics/plants/trait_carnivorous.dm b/code/modules/genetics/plants/trait_carnivorous.dm new file mode 100644 index 0000000000..69559b6132 --- /dev/null +++ b/code/modules/genetics/plants/trait_carnivorous.dm @@ -0,0 +1,12 @@ +/// 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine). +/decl/plant_trait/carnivorous + name = "carnivorous" + shows_extended_data = TRUE + base_worth = 5 + +/decl/plant_trait/carnivorous/get_extended_data(val, datum/seed/grown_seed) + switch(val) + if(1) + return "It is carnivorous and will eat tray pests for sustenance." + if(2) + return "It is carnivorous and poses a significant threat to living things around it." diff --git a/code/modules/genetics/plants/trait_chems.dm b/code/modules/genetics/plants/trait_chems.dm new file mode 100644 index 0000000000..187123c146 --- /dev/null +++ b/code/modules/genetics/plants/trait_chems.dm @@ -0,0 +1,3 @@ +/decl/plant_trait/chems + name = "chemicals" + requires_master_gene = FALSE diff --git a/code/modules/genetics/plants/trait_consume_gasses.dm b/code/modules/genetics/plants/trait_consume_gasses.dm new file mode 100644 index 0000000000..3fc7e1e47e --- /dev/null +++ b/code/modules/genetics/plants/trait_consume_gasses.dm @@ -0,0 +1,8 @@ +/decl/plant_trait/consume_gasses + name = "gas consumption" + shows_extended_data = TRUE + requires_master_gene = FALSE + +/decl/plant_trait/consume_gasses/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It will remove gas from the environment." diff --git a/code/modules/genetics/plants/trait_endurance.dm b/code/modules/genetics/plants/trait_endurance.dm new file mode 100644 index 0000000000..b50280565a --- /dev/null +++ b/code/modules/genetics/plants/trait_endurance.dm @@ -0,0 +1,5 @@ +/// Maximum plant HP when growing. +/decl/plant_trait/endurance + name = "endurance" + shows_general_data = TRUE + default_value = 100 \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_explosive.dm b/code/modules/genetics/plants/trait_explosive.dm new file mode 100644 index 0000000000..103d47d254 --- /dev/null +++ b/code/modules/genetics/plants/trait_explosive.dm @@ -0,0 +1,9 @@ +/// When thrown, acts as a grenade. +/decl/plant_trait/explosive + name = "explosiveness" + shows_extended_data = TRUE + base_worth = -2 + +/decl/plant_trait/explosive/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "The fruit is internally unstable." diff --git a/code/modules/genetics/plants/trait_exude_gasses.dm b/code/modules/genetics/plants/trait_exude_gasses.dm new file mode 100644 index 0000000000..1e88e3f127 --- /dev/null +++ b/code/modules/genetics/plants/trait_exude_gasses.dm @@ -0,0 +1,10 @@ +/decl/plant_trait/exude_gasses + name = "gas exuding" + shows_extended_data = TRUE + requires_master_gene = FALSE + +/decl/plant_trait/exude_gasses/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It will release gas into the environment." + + diff --git a/code/modules/genetics/plants/trait_flesh_colour.dm b/code/modules/genetics/plants/trait_flesh_colour.dm new file mode 100644 index 0000000000..ab87e3d7e1 --- /dev/null +++ b/code/modules/genetics/plants/trait_flesh_colour.dm @@ -0,0 +1,2 @@ +/decl/plant_trait/flesh_colour + name = "flesh colour" \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_harvest_repeat.dm b/code/modules/genetics/plants/trait_harvest_repeat.dm new file mode 100644 index 0000000000..38f196e42c --- /dev/null +++ b/code/modules/genetics/plants/trait_harvest_repeat.dm @@ -0,0 +1,9 @@ +/// If 1, this plant will fruit repeatedly. +/decl/plant_trait/harvest_repeat + name = "repeat harvestability" + shows_extended_data = TRUE + base_worth = 3 + +/decl/plant_trait/harvest_repeat/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "This plant can be harvested repeatedly." diff --git a/code/modules/genetics/plants/trait_heat_tolerance.dm b/code/modules/genetics/plants/trait_heat_tolerance.dm new file mode 100644 index 0000000000..e2366d8a2a --- /dev/null +++ b/code/modules/genetics/plants/trait_heat_tolerance.dm @@ -0,0 +1,14 @@ +/// Departure from ideal that is survivable. +/decl/plant_trait/heat_tolerance + name = "heat tolerance" + shows_extended_data = TRUE + default_value = 20 + +/decl/plant_trait/heat_tolerance/get_station_survivable_value() + return 20 + +/decl/plant_trait/heat_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val > 30) + return "It is well adapted to a range of temperatures." + if(val < 10) + return "It is very sensitive to temperature shifts." diff --git a/code/modules/genetics/plants/trait_highkpa_tolerance.dm b/code/modules/genetics/plants/trait_highkpa_tolerance.dm new file mode 100644 index 0000000000..840f64bb36 --- /dev/null +++ b/code/modules/genetics/plants/trait_highkpa_tolerance.dm @@ -0,0 +1,12 @@ +/// High pressure capacity. +/decl/plant_trait/highkpa_tolerance + name = "high pressure tolerance" + shows_extended_data = TRUE + default_value = 200 + +/decl/plant_trait/highkpa_tolerance/get_station_survivable_value() + return 200 + +/decl/plant_trait/highkpa_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val > 220) + return "It is well adapted to high pressure levels." diff --git a/code/modules/genetics/plants/trait_ideal_heat.dm b/code/modules/genetics/plants/trait_ideal_heat.dm new file mode 100644 index 0000000000..42e1072480 --- /dev/null +++ b/code/modules/genetics/plants/trait_ideal_heat.dm @@ -0,0 +1,12 @@ +/// Preferred temperature in Kelvin. +/decl/plant_trait/ideal_heat + name = "ideal heat" + shows_extended_data = TRUE + default_value = 293 + +/decl/plant_trait/ideal_heat/get_station_survivable_value() + return 293 + +/decl/plant_trait/ideal_heat/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It thrives in a temperature of [val] Kelvin." diff --git a/code/modules/genetics/plants/trait_ideal_light.dm b/code/modules/genetics/plants/trait_ideal_light.dm new file mode 100644 index 0000000000..a5ce1ccb19 --- /dev/null +++ b/code/modules/genetics/plants/trait_ideal_light.dm @@ -0,0 +1,12 @@ +/// Preferred light level in luminosity. +/decl/plant_trait/ideal_light + name = "ideal light" + shows_extended_data = TRUE + default_value = 5 + +/decl/plant_trait/ideal_light/get_station_survivable_value() + return 4 + +/decl/plant_trait/ideal_light/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It thrives in a light level of [val] lumen\s." diff --git a/code/modules/genetics/plants/trait_immutable.dm b/code/modules/genetics/plants/trait_immutable.dm new file mode 100644 index 0000000000..3d57079ec4 --- /dev/null +++ b/code/modules/genetics/plants/trait_immutable.dm @@ -0,0 +1,11 @@ +/// If set, plant will never mutate. If -1, plant is highly mutable. +/decl/plant_trait/immutable + name = "genetic immutability" + shows_extended_data = TRUE + requires_master_gene = FALSE + +/decl/plant_trait/immutable/get_extended_data(val, datum/seed/grown_seed) + if(val == -1) + return "This plant is highly mutable." + if(val > 0) + return "This plant does not possess genetics that are alterable." diff --git a/code/modules/genetics/plants/trait_juicy.dm b/code/modules/genetics/plants/trait_juicy.dm new file mode 100644 index 0000000000..96e1a127ce --- /dev/null +++ b/code/modules/genetics/plants/trait_juicy.dm @@ -0,0 +1,11 @@ +/// When thrown, causes a splatter decal. +/decl/plant_trait/juicy + name = "juiciness" + shows_extended_data = TRUE + +/decl/plant_trait/juicy/get_extended_data(val, datum/seed/grown_seed) + switch(val) + if(1) + return "The fruit is soft-skinned and juicy." + if(2) + return "The fruit is excessively juicy." diff --git a/code/modules/genetics/plants/trait_large.dm b/code/modules/genetics/plants/trait_large.dm new file mode 100644 index 0000000000..3027978507 --- /dev/null +++ b/code/modules/genetics/plants/trait_large.dm @@ -0,0 +1,2 @@ +/decl/plant_trait/large + name = "largeness" \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_leaves_colour.dm b/code/modules/genetics/plants/trait_leaves_colour.dm new file mode 100644 index 0000000000..11dda0364f --- /dev/null +++ b/code/modules/genetics/plants/trait_leaves_colour.dm @@ -0,0 +1,2 @@ +/decl/plant_trait/leaves_colour + name = "leaf colour" diff --git a/code/modules/genetics/plants/trait_light_tolerance.dm b/code/modules/genetics/plants/trait_light_tolerance.dm new file mode 100644 index 0000000000..89060959a5 --- /dev/null +++ b/code/modules/genetics/plants/trait_light_tolerance.dm @@ -0,0 +1,14 @@ +/// Departure from ideal that is survivable. +/decl/plant_trait/light_tolerance + name = "light tolerance" + shows_extended_data = TRUE + default_value = 3 + +/decl/plant_trait/light_tolerance/get_station_survivable_value() + return 5 + +/decl/plant_trait/light_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val > 10) + return "It is well adapted to a range of light levels." + if(val < 3) + return "It is very sensitive to light level shifts." diff --git a/code/modules/genetics/plants/trait_lowkpa_tolerance.dm b/code/modules/genetics/plants/trait_lowkpa_tolerance.dm new file mode 100644 index 0000000000..2250a1f71f --- /dev/null +++ b/code/modules/genetics/plants/trait_lowkpa_tolerance.dm @@ -0,0 +1,12 @@ +/// Low pressure capacity. +/decl/plant_trait/lowkpa_tolerance + name = "low pressure tolerance" + shows_extended_data = TRUE + default_value = 25 + +/decl/plant_trait/lowkpa_tolerance/get_station_survivable_value() + return 25 + +/decl/plant_trait/lowkpa_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val < 20) + return "It is well adapted to low pressure levels." diff --git a/code/modules/genetics/plants/trait_maturation.dm b/code/modules/genetics/plants/trait_maturation.dm new file mode 100644 index 0000000000..9395de1bc6 --- /dev/null +++ b/code/modules/genetics/plants/trait_maturation.dm @@ -0,0 +1,4 @@ +/// Time taken before the plant is mature. +/decl/plant_trait/maturation + name = "maturation time" + shows_general_data = TRUE diff --git a/code/modules/genetics/plants/trait_nutrient_consumption.dm b/code/modules/genetics/plants/trait_nutrient_consumption.dm new file mode 100644 index 0000000000..8630c68338 --- /dev/null +++ b/code/modules/genetics/plants/trait_nutrient_consumption.dm @@ -0,0 +1,4 @@ +/// Plant eats this much per tick. +/decl/plant_trait/nutrient_consumption + name = "nutrient consumption" + default_value = 0.25 \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_parasite.dm b/code/modules/genetics/plants/trait_parasite.dm new file mode 100644 index 0000000000..e39c076368 --- /dev/null +++ b/code/modules/genetics/plants/trait_parasite.dm @@ -0,0 +1,9 @@ + /// 0 = no, 1 = gain health from weed level. +/decl/plant_trait/parasite + name = "parasitism" + shows_extended_data = TRUE + base_worth = 5 + +/decl/plant_trait/parasite/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "It is capable of parisitising and gaining sustenance from tray weeds." \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_pest_tolerance.dm b/code/modules/genetics/plants/trait_pest_tolerance.dm new file mode 100644 index 0000000000..310659b29e --- /dev/null +++ b/code/modules/genetics/plants/trait_pest_tolerance.dm @@ -0,0 +1,11 @@ +/// Threshold for pests to impact health. +/decl/plant_trait/pest_tolerance + name = "pest tolerance" + shows_extended_data = TRUE + default_value = 5 + +/decl/plant_trait/pest_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val < 3) + return "It is highly sensitive to pests." + if(val > 6) + return "It is remarkably resistant to pests." \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_photosynthesis.dm b/code/modules/genetics/plants/trait_photosynthesis.dm new file mode 100644 index 0000000000..eb84c05668 --- /dev/null +++ b/code/modules/genetics/plants/trait_photosynthesis.dm @@ -0,0 +1,5 @@ +/// If it turns CO2 into oxygen +/decl/plant_trait/photosynthesis + name = "photosynthesis" + default_value = 1 + requires_master_gene = FALSE diff --git a/code/modules/genetics/plants/trait_plant_colour.dm b/code/modules/genetics/plants/trait_plant_colour.dm new file mode 100644 index 0000000000..3c7430f37c --- /dev/null +++ b/code/modules/genetics/plants/trait_plant_colour.dm @@ -0,0 +1,4 @@ +/// Colour of the plant icon. +/decl/plant_trait/plant_colour + name = "plant colour" + default_value = "#46b543" \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_plant_icon.dm b/code/modules/genetics/plants/trait_plant_icon.dm new file mode 100644 index 0000000000..8d3cff7bcb --- /dev/null +++ b/code/modules/genetics/plants/trait_plant_icon.dm @@ -0,0 +1,7 @@ +/// Icon to use for the plant growing in the tray. +/decl/plant_trait/plant_icon + name = "plant icon" + default_value = null + +/decl/plant_trait/plant_icon/handle_post_trait_set(datum/seed/seed) + seed.update_growth_stages() \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_potency.dm b/code/modules/genetics/plants/trait_potency.dm new file mode 100644 index 0000000000..86b6d2949b --- /dev/null +++ b/code/modules/genetics/plants/trait_potency.dm @@ -0,0 +1,5 @@ +/// General purpose plant strength value. +/decl/plant_trait/potency + name = "potency" + shows_general_data = TRUE + default_value = 1 diff --git a/code/modules/genetics/plants/trait_produces_power.dm b/code/modules/genetics/plants/trait_produces_power.dm new file mode 100644 index 0000000000..dcad4dd6e3 --- /dev/null +++ b/code/modules/genetics/plants/trait_produces_power.dm @@ -0,0 +1,9 @@ +/// Can be used to make a battery. +/decl/plant_trait/produces_power + name = "power production" // TODO look up the chemical reaction that causes this + shows_extended_data = TRUE + base_worth = 3 + +/decl/plant_trait/produces_power/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "The fruit will function as a battery if prepared appropriately." diff --git a/code/modules/genetics/plants/trait_product_colour.dm b/code/modules/genetics/plants/trait_product_colour.dm new file mode 100644 index 0000000000..858eb67f3f --- /dev/null +++ b/code/modules/genetics/plants/trait_product_colour.dm @@ -0,0 +1,4 @@ +/// Colour to apply to product icon. +/decl/plant_trait/product_colour + name = "product colour" + default_value = COLOR_WHITE \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_product_icon.dm b/code/modules/genetics/plants/trait_product_icon.dm new file mode 100644 index 0000000000..5994ccf9b0 --- /dev/null +++ b/code/modules/genetics/plants/trait_product_icon.dm @@ -0,0 +1,4 @@ +/// Icon to use for fruit coming from this plant. +/decl/plant_trait/product_icon + name = "product_icon" + default_value = null diff --git a/code/modules/genetics/plants/trait_product_type.dm b/code/modules/genetics/plants/trait_product_type.dm new file mode 100644 index 0000000000..e21c499058 --- /dev/null +++ b/code/modules/genetics/plants/trait_product_type.dm @@ -0,0 +1,4 @@ +/decl/plant_trait/product_type + name = "product type" + default_value = null + requires_master_gene = FALSE diff --git a/code/modules/genetics/plants/trait_production.dm b/code/modules/genetics/plants/trait_production.dm new file mode 100644 index 0000000000..851f4f099e --- /dev/null +++ b/code/modules/genetics/plants/trait_production.dm @@ -0,0 +1,4 @@ +/// Time before harvesting can be undertaken again. +/decl/plant_trait/production + name = "production time" + shows_general_data = TRUE diff --git a/code/modules/genetics/plants/trait_requires_nutrients.dm b/code/modules/genetics/plants/trait_requires_nutrients.dm new file mode 100644 index 0000000000..d2a5935200 --- /dev/null +++ b/code/modules/genetics/plants/trait_requires_nutrients.dm @@ -0,0 +1,13 @@ +/// The plant can starve. +/decl/plant_trait/requires_nutrients + name = "required nutrients" + shows_extended_data = TRUE + default_value = 1 + +/decl/plant_trait/requires_nutrients/get_extended_data(val, datum/seed/grown_seed) + if(val) + if(val < 0.05) + return "It consumes a small amount of nutrient fluid." + if(val > 0.2) + return "It requires a heavy supply of nutrient fluid." + return "It requires a supply of nutrient fluid." diff --git a/code/modules/genetics/plants/trait_requires_water.dm b/code/modules/genetics/plants/trait_requires_water.dm new file mode 100644 index 0000000000..53b316c97c --- /dev/null +++ b/code/modules/genetics/plants/trait_requires_water.dm @@ -0,0 +1,13 @@ +/// The plant can become dehydrated. +/decl/plant_trait/requires_water + name = "required water" + shows_extended_data = TRUE + default_value = 1 + +/decl/plant_trait/requires_water/get_extended_data(val, datum/seed/grown_seed) + if(val) + if(val < 1) + return "It requires very little water." + if(val > 5) + return "It requires a large amount of water." + return "It requires a steady supply of water." diff --git a/code/modules/genetics/plants/trait_slice_amount.dm b/code/modules/genetics/plants/trait_slice_amount.dm new file mode 100644 index 0000000000..d2d5ad2aca --- /dev/null +++ b/code/modules/genetics/plants/trait_slice_amount.dm @@ -0,0 +1,4 @@ +/decl/plant_trait/slice_amount + name = "slice amount" + default_value = null + requires_master_gene = FALSE diff --git a/code/modules/genetics/plants/trait_slice_product.dm b/code/modules/genetics/plants/trait_slice_product.dm new file mode 100644 index 0000000000..434ba795bd --- /dev/null +++ b/code/modules/genetics/plants/trait_slice_product.dm @@ -0,0 +1,4 @@ +/decl/plant_trait/slice_product + name = "slice type" + default_value = null + requires_master_gene = FALSE diff --git a/code/modules/genetics/plants/trait_spread.dm b/code/modules/genetics/plants/trait_spread.dm new file mode 100644 index 0000000000..6cd873fcbc --- /dev/null +++ b/code/modules/genetics/plants/trait_spread.dm @@ -0,0 +1,11 @@ +/// 0 limits plant to tray, 1 = creepers, 2 = vines. +/decl/plant_trait/spread + name = "spread" + shows_extended_data = TRUE + +/decl/plant_trait/spread/get_extended_data(val, datum/seed/grown_seed) + switch(val) + if(1) + return "It is able to be planted outside of a tray." + if(2) + return "It is a robust and vigorous vine that will spread rapidly." diff --git a/code/modules/genetics/plants/trait_stings.dm b/code/modules/genetics/plants/trait_stings.dm new file mode 100644 index 0000000000..9b62e88d75 --- /dev/null +++ b/code/modules/genetics/plants/trait_stings.dm @@ -0,0 +1,9 @@ +/// Can cause damage/inject reagents when thrown or handled. +/decl/plant_trait/stings + name = "stinging" + shows_extended_data = TRUE + base_worth = -2 + +/decl/plant_trait/stings/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "The fruit is covered in stinging spines." diff --git a/code/modules/genetics/plants/trait_teleporting.dm b/code/modules/genetics/plants/trait_teleporting.dm new file mode 100644 index 0000000000..077293a45a --- /dev/null +++ b/code/modules/genetics/plants/trait_teleporting.dm @@ -0,0 +1,9 @@ +/// Uses the teleport tomato effect. +/decl/plant_trait/teleporting + name = "teleporting" + shows_extended_data = TRUE + base_worth = 5 + +/decl/plant_trait/teleporting/get_extended_data(val, datum/seed/grown_seed) + if(val) + return "The fruit is temporal/spatially unstable." diff --git a/code/modules/genetics/plants/trait_toxins_tolerance.dm b/code/modules/genetics/plants/trait_toxins_tolerance.dm new file mode 100644 index 0000000000..59b84d0382 --- /dev/null +++ b/code/modules/genetics/plants/trait_toxins_tolerance.dm @@ -0,0 +1,11 @@ +/// Resistance to poison. +/decl/plant_trait/toxins_tolerance + name = "toxins tolerance" + shows_extended_data = TRUE + default_value = 5 + +/decl/plant_trait/toxins_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val < 3) + return "It is highly sensitive to toxins." + if(val > 6) + return "It is remarkably resistant to toxins." \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_water_consumption.dm b/code/modules/genetics/plants/trait_water_consumption.dm new file mode 100644 index 0000000000..03cdcb95dc --- /dev/null +++ b/code/modules/genetics/plants/trait_water_consumption.dm @@ -0,0 +1,4 @@ +/// Plant drinks this much per tick. +/decl/plant_trait/water_consumption + name = "water consumption" + default_value = 3 diff --git a/code/modules/genetics/plants/trait_weed_tolerance.dm b/code/modules/genetics/plants/trait_weed_tolerance.dm new file mode 100644 index 0000000000..051cf58b98 --- /dev/null +++ b/code/modules/genetics/plants/trait_weed_tolerance.dm @@ -0,0 +1,11 @@ +/// Threshold for weeds to impact health. +/decl/plant_trait/weed_tolerance + name = "weed tolerance" + shows_extended_data = TRUE + default_value = 5 + +/decl/plant_trait/weed_tolerance/get_extended_data(val, datum/seed/grown_seed) + if(val < 3) + return "It is highly sensitive to weeds." + if(val > 6) + return "It is remarkably resistant to weeds." \ No newline at end of file diff --git a/code/modules/genetics/plants/trait_yield.dm b/code/modules/genetics/plants/trait_yield.dm new file mode 100644 index 0000000000..dcaf60b656 --- /dev/null +++ b/code/modules/genetics/plants/trait_yield.dm @@ -0,0 +1,4 @@ +/// Amount of product. +/decl/plant_trait/yield + name = "yield" + shows_general_data = TRUE diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 497f6bd03e..e3aa5c1254 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -1,10 +1,6 @@ /datum/codex_entry/scannable/flora category = /decl/codex_category/flora -/datum/plantgene - var/genetype // Label used when applying trait. - var/list/values // Values to copy into the target seed datum. - /datum/seed //Tracking. var/uid // Unique identifier. @@ -17,7 +13,7 @@ var/scanned // If it was scanned with a plant analyzer. var/can_self_harvest = 0 // Mostly used for living mobs. var/growth_stages = 0 // Number of stages the plant passes through before it is mature. - var/list/traits = list() // Initialized in New() + var/list/_traits // Initialized in New() var/list/mutants // Possible predefined mutant varieties, if any. var/list/chems // Chemicals that plant produces in products/injects into victim. var/list/dried_chems // Chemicals that a dried plant product will have. @@ -56,76 +52,39 @@ var/drying_state = "grown" /datum/seed/New() - - set_trait(TRAIT_IMMUTABLE, 0) // If set, plant will never mutate. If -1, plant is highly mutable. - set_trait(TRAIT_HARVEST_REPEAT, 0) // If 1, this plant will fruit repeatedly. - set_trait(TRAIT_PRODUCES_POWER, 0) // Can be used to make a battery. - set_trait(TRAIT_JUICY, 0) // When thrown, causes a splatter decal. - set_trait(TRAIT_EXPLOSIVE, 0) // When thrown, acts as a grenade. - set_trait(TRAIT_CARNIVOROUS, 0) // 0 = none, 1 = eat pests in tray, 2 = eat living things (when a vine). - set_trait(TRAIT_PARASITE, 0) // 0 = no, 1 = gain health from weed level. - set_trait(TRAIT_STINGS, 0) // Can cause damage/inject reagents when thrown or handled. - set_trait(TRAIT_YIELD, 0) // Amount of product. - set_trait(TRAIT_SPREAD, 0) // 0 limits plant to tray, 1 = creepers, 2 = vines. - set_trait(TRAIT_MATURATION, 0) // Time taken before the plant is mature. - set_trait(TRAIT_PRODUCTION, 0) // Time before harvesting can be undertaken again. - set_trait(TRAIT_TELEPORTING, 0) // Uses the teleport tomato effect. - set_trait(TRAIT_BIOLUM, 0) // Plant is bioluminescent. - set_trait(TRAIT_ALTER_TEMP, 0) // If set, the plant will periodically alter local temp by this amount. - set_trait(TRAIT_PRODUCT_ICON, 0) // Icon to use for fruit coming from this plant. - set_trait(TRAIT_PLANT_ICON, 0) // Icon to use for the plant growing in the tray. - set_trait(TRAIT_PRODUCT_COLOUR, 0) // Colour to apply to product icon. - set_trait(TRAIT_BIOLUM_COLOUR, 0) // The colour of the plant's radiance. - set_trait(TRAIT_POTENCY, 1) // General purpose plant strength value. - set_trait(TRAIT_REQUIRES_NUTRIENTS, 1) // The plant can starve. - set_trait(TRAIT_REQUIRES_WATER, 1) // The plant can become dehydrated. - set_trait(TRAIT_WATER_CONSUMPTION, 3) // Plant drinks this much per tick. - set_trait(TRAIT_LIGHT_TOLERANCE, 3) // Departure from ideal that is survivable. - set_trait(TRAIT_TOXINS_TOLERANCE, 5) // Resistance to poison. - set_trait(TRAIT_PEST_TOLERANCE, 5) // Threshold for pests to impact health. - set_trait(TRAIT_WEED_TOLERANCE, 5) // Threshold for weeds to impact health. - set_trait(TRAIT_IDEAL_LIGHT, 5) // Preferred light level in luminosity. - set_trait(TRAIT_HEAT_TOLERANCE, 20) // Departure from ideal that is survivable. - set_trait(TRAIT_LOWKPA_TOLERANCE, 25) // Low pressure capacity. - set_trait(TRAIT_ENDURANCE, 100) // Maximum plant HP when growing. - set_trait(TRAIT_HIGHKPA_TOLERANCE, 200) // High pressure capacity. - set_trait(TRAIT_IDEAL_HEAT, 293) // Preferred temperature in Kelvin. - set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.25) // Plant eats this much per tick. - set_trait(TRAIT_PLANT_COLOUR, "#46b543") // Colour of the plant icon. - set_trait(TRAIT_PHOTOSYNTHESIS, 1) // If it turns CO2 into oxygen - update_growth_stages() - - uid = "[sequential_id(/datum/seed/)]" + uid = "[sequential_id(/datum/seed)]" // TODO integrate other traits. /datum/seed/proc/get_monetary_value() . = 1 - // Positives! - . += 3 * get_trait(TRAIT_HARVEST_REPEAT) - . += 3 * get_trait(TRAIT_PRODUCES_POWER) - . += 5 * get_trait(TRAIT_CARNIVOROUS) - . += 5 * get_trait(TRAIT_PARASITE) - . += 5 * get_trait(TRAIT_TELEPORTING) - // Negatives! - . -= 2 * get_trait(TRAIT_STINGS) - . -= 2 * get_trait(TRAIT_EXPLOSIVE) + for(var/decl/plant_trait/plant_trait in decls_repository.get_decls_of_subtype_unassociated(/decl/plant_trait)) + . += plant_trait.get_worth_of_value(get_trait(plant_trait.type)) . = max(1, round(. * base_seed_value)) -/datum/seed/proc/get_trait(var/trait) - return traits["[trait]"] - /datum/seed/proc/get_trash_type() return trash_type -/datum/seed/proc/set_trait(var/trait,var/nval,var/ubound,var/lbound, var/degrade) - if(!isnull(degrade)) nval *= degrade - if(!isnull(ubound)) nval = min(nval,ubound) - if(!isnull(lbound)) nval = max(nval,lbound) - traits["[trait]"] = nval +/datum/seed/proc/set_trait(var/trait, var/nval, var/ubound, var/lbound, var/degrade) + if(!isnull(degrade)) + nval *= degrade + if(!isnull(ubound)) + nval = min(nval,ubound) + if(!isnull(lbound)) + nval = max(nval,lbound) + + var/decl/plant_trait/plant_trait = GET_DECL(trait) + if(!istype(plant_trait) || nval == plant_trait.default_value) + LAZYREMOVE(_traits, trait) + else + LAZYSET(_traits, trait, nval) + plant_trait.handle_post_trait_set(src) - if(trait == TRAIT_PLANT_ICON) - update_growth_stages() +/datum/seed/proc/get_trait(var/trait) + if(trait in _traits) + return _traits[trait] + var/decl/plant_trait/plant_trait = GET_DECL(trait) + return plant_trait.default_value /datum/seed/proc/create_spores(var/turf/T) if(!T) @@ -617,112 +576,11 @@ //Mutates a specific trait/set of traits. /datum/seed/proc/apply_gene(var/datum/plantgene/gene) - - if(!gene || !gene.values || get_trait(TRAIT_IMMUTABLE) > 0) return - - // Splicing products has some detrimental effects on yield and lifespan. - // We handle this before we do the rest of the looping, as normal traits don't really include lists. - switch(gene.genetype) - if(GENE_BIOCHEMISTRY) - - for(var/trait in list(TRAIT_YIELD, TRAIT_ENDURANCE)) - if(get_trait(trait) > 0) - set_trait(trait,get_trait(trait),null,1,0.85) - - if(!chems) - chems = list() - - var/list/gene_value = gene.values["[TRAIT_CHEMS]"] - for(var/rid in gene_value) - - var/list/gene_chem = gene_value[rid] - - if(!chems[rid]) - chems[rid] = gene_chem.Copy() - continue - - for(var/i=1;i<=gene_chem.len;i++) - - if(isnull(gene_chem[i])) gene_chem[i] = 0 - - if(chems[rid][i]) - chems[rid][i] = max(1,round((gene_chem[i] + chems[rid][i])/2)) - else - chems[rid][i] = gene_chem[i] - - var/list/new_gasses = gene.values["[TRAIT_EXUDE_GASSES]"] - if(islist(new_gasses)) - if(!exude_gasses) exude_gasses = list() - exude_gasses |= new_gasses - for(var/gas in exude_gasses) - exude_gasses[gas] = max(1,round(exude_gasses[gas]*0.8)) - - gene.values["[TRAIT_EXUDE_GASSES]"] = null - gene.values["[TRAIT_CHEMS]"] = null - - if(GENE_DIET) - var/list/new_gasses = gene.values["[TRAIT_CONSUME_GASSES]"] - consume_gasses |= new_gasses - gene.values["[TRAIT_CONSUME_GASSES]"] = null - - if(GENE_METABOLISM) - product_type = gene.values["product_type"] - slice_product = gene.values["slice_product"] - slice_amount = gene.values["slice_amount"] - - gene.values["product_type"] = null - - for(var/trait in gene.values) - set_trait(trait,gene.values["[trait]"]) - + if(!istype(gene) || !gene?.values || get_trait(TRAIT_IMMUTABLE) > 0) + return + gene.genetype.modify_seed(gene, src) update_growth_stages() -//Returns a list of the desired trait values. -/datum/seed/proc/get_gene(var/genetype) - - if(!genetype) return 0 - - var/list/traits_to_copy - var/datum/plantgene/P = new() - P.genetype = genetype - P.values = list() - - switch(genetype) - if(GENE_BIOCHEMISTRY) - P.values["[TRAIT_CHEMS]"] = chems - P.values["[TRAIT_EXUDE_GASSES]"] = exude_gasses - traits_to_copy = list(TRAIT_POTENCY) - if(GENE_OUTPUT) - traits_to_copy = list(TRAIT_PRODUCES_POWER,TRAIT_BIOLUM) - if(GENE_ATMOSPHERE) - traits_to_copy = list(TRAIT_HEAT_TOLERANCE,TRAIT_LOWKPA_TOLERANCE,TRAIT_HIGHKPA_TOLERANCE) - if(GENE_HARDINESS) - traits_to_copy = list(TRAIT_TOXINS_TOLERANCE,TRAIT_PEST_TOLERANCE,TRAIT_WEED_TOLERANCE,TRAIT_ENDURANCE) - if(GENE_METABOLISM) - P.values["product_type"] = product_type - P.values["slice_product"] = slice_product - P.values["slice_amount"] = slice_amount - traits_to_copy = list(TRAIT_REQUIRES_NUTRIENTS,TRAIT_REQUIRES_WATER,TRAIT_ALTER_TEMP) - if(GENE_VIGOUR) - traits_to_copy = list(TRAIT_PRODUCTION,TRAIT_MATURATION,TRAIT_YIELD,TRAIT_SPREAD) - if(GENE_DIET) - P.values["[TRAIT_CONSUME_GASSES]"] = consume_gasses - traits_to_copy = list(TRAIT_CARNIVOROUS,TRAIT_PARASITE,TRAIT_NUTRIENT_CONSUMPTION,TRAIT_WATER_CONSUMPTION) - if(GENE_ENVIRONMENT) - traits_to_copy = list(TRAIT_IDEAL_HEAT,TRAIT_IDEAL_LIGHT,TRAIT_LIGHT_TOLERANCE) - if(GENE_PIGMENT) - traits_to_copy = list(TRAIT_PLANT_COLOUR,TRAIT_PRODUCT_COLOUR,TRAIT_BIOLUM_COLOUR,TRAIT_LEAVES_COLOUR) - if(GENE_STRUCTURE) - traits_to_copy = list(TRAIT_PLANT_ICON,TRAIT_PRODUCT_ICON,TRAIT_HARVEST_REPEAT,TRAIT_LARGE) - if(GENE_FRUIT) - traits_to_copy = list(TRAIT_STINGS,TRAIT_EXPLOSIVE,TRAIT_FLESH_COLOUR,TRAIT_JUICY) - if(GENE_SPECIAL) - traits_to_copy = list(TRAIT_TELEPORTING) - - for(var/trait in traits_to_copy) - P.values["[trait]"] = get_trait(trait) - return (P ? P : 0) - //Place the plant products at the feet of the user. /datum/seed/proc/harvest(var/mob/user,var/yield_mod,var/harvest_sample,var/force_amount) @@ -818,7 +676,7 @@ new_seed.product_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][product_name]" new_seed.display_name = "[(roundstart ? "[(modified ? "modified" : "mutant")] " : "")][display_name]" new_seed.seed_noun = seed_noun - new_seed.traits = traits.Copy() + new_seed._traits = deepCopyList(_traits) new_seed.update_growth_stages() return new_seed @@ -878,7 +736,7 @@ clone.seed_noun = seed_noun //Seed traits - clone.traits = traits.Copy() + clone._traits = deepCopyList(_traits) clone.mutants = mutants?.Copy() clone.chems = chems?.Copy() clone.consume_gasses = consume_gasses?.Copy() diff --git a/code/modules/hydroponics/seed_gene_mut.dm b/code/modules/hydroponics/seed_gene_mut.dm index 419af33535..a80cf2fd10 100644 --- a/code/modules/hydroponics/seed_gene_mut.dm +++ b/code/modules/hydroponics/seed_gene_mut.dm @@ -1,4 +1,4 @@ -/datum/seed/proc/diverge_mutate_gene(var/decl/plantgene/G, var/turf/T) +/datum/seed/proc/diverge_mutate_gene(var/decl/plant_gene/G, var/turf/T) if(!istype(G)) log_debug("Attempted to mutate [src] with a non-plantgene var.") return src @@ -9,125 +9,3 @@ return S -/decl/plantgene - var/gene_tag - -/decl/plantgene/biochem - gene_tag = GENE_BIOCHEMISTRY - -/decl/plantgene/hardiness - gene_tag = GENE_HARDINESS - -/decl/plantgene/environment - gene_tag = GENE_ENVIRONMENT - -/decl/plantgene/metabolism - gene_tag = GENE_METABOLISM - -/decl/plantgene/structure - gene_tag = GENE_STRUCTURE - -/decl/plantgene/diet - gene_tag = GENE_DIET - -/decl/plantgene/pigment - gene_tag = GENE_PIGMENT - -/decl/plantgene/output - gene_tag = GENE_OUTPUT - -/decl/plantgene/atmosphere - gene_tag = GENE_ATMOSPHERE - -/decl/plantgene/vigour - gene_tag = GENE_VIGOUR - -/decl/plantgene/fruit - gene_tag = GENE_FRUIT - -/decl/plantgene/special - gene_tag = GENE_SPECIAL - -/decl/plantgene/proc/mutate(var/datum/seed/S) - return - -/decl/plantgene/biochem/mutate(var/datum/seed/S) - S.set_trait(TRAIT_POTENCY, S.get_trait(TRAIT_POTENCY)+rand(-20,20),200, 0) - -/decl/plantgene/hardiness/mutate(var/datum/seed/S) - if(prob(60)) - S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0) - if(prob(60)) - S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0) - if(prob(60)) - S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0) - if(prob(60)) - S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0) - -/decl/plantgene/environment/mutate(var/datum/seed/S) - if(prob(60)) - S.set_trait(TRAIT_IDEAL_HEAT, S.get_trait(TRAIT_IDEAL_HEAT)+rand(-2,2),10,0) - if(prob(60)) - S.set_trait(TRAIT_IDEAL_LIGHT, S.get_trait(TRAIT_IDEAL_LIGHT)+rand(-2,2),10,0) - if(prob(60)) - S.set_trait(TRAIT_LIGHT_TOLERANCE, S.get_trait(TRAIT_LIGHT_TOLERANCE)+rand(-5,5),100,0) - -/decl/plantgene/metabolism/mutate(var/datum/seed/S) - if(prob(65)) - S.set_trait(TRAIT_REQUIRES_NUTRIENTS, S.get_trait(TRAIT_REQUIRES_NUTRIENTS)+rand(-2,2),10,0) - if(prob(65)) - S.set_trait(TRAIT_REQUIRES_WATER, S.get_trait(TRAIT_REQUIRES_WATER)+rand(-2,2),10,0) - if(prob(40)) - S.set_trait(TRAIT_ALTER_TEMP, S.get_trait(TRAIT_ALTER_TEMP)+rand(-5,5),100,0) - -/decl/plantgene/diet/mutate(var/datum/seed/S) - if(prob(60)) - S.set_trait(TRAIT_CARNIVOROUS, S.get_trait(TRAIT_CARNIVOROUS)+rand(-1,1),2,0) - if(prob(60)) - S.set_trait(TRAIT_PARASITE, !S.get_trait(TRAIT_PARASITE)) - if(prob(65)) - S.set_trait(TRAIT_NUTRIENT_CONSUMPTION, S.get_trait(TRAIT_NUTRIENT_CONSUMPTION)+rand(-0.1,0.1),5,0) - if(prob(65)) - S.set_trait(TRAIT_WATER_CONSUMPTION, S.get_trait(TRAIT_WATER_CONSUMPTION)+rand(-1,1),50,0) - -/decl/plantgene/output/mutate(var/datum/seed/S, var/turf/T) - if(prob(50)) - S.set_trait(TRAIT_BIOLUM, !S.get_trait(TRAIT_BIOLUM)) - if(S.get_trait(TRAIT_BIOLUM)) - T.visible_message("\The [S.display_name] begins to glow!") - if(prob(50)) - S.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) - T.visible_message("\The [S.display_name]'s glow changes colour!") - else - T.visible_message("\The [S.display_name]'s glow dims...") - if(prob(60)) - S.set_trait(TRAIT_PRODUCES_POWER, !S.get_trait(TRAIT_PRODUCES_POWER)) - -/decl/plantgene/atmosphere/mutate(var/datum/seed/S) - if(prob(60)) - S.set_trait(TRAIT_HEAT_TOLERANCE, S.get_trait(TRAIT_HEAT_TOLERANCE)+rand(-5,5),800,70) - if(prob(60)) - S.set_trait(TRAIT_LOWKPA_TOLERANCE, S.get_trait(TRAIT_LOWKPA_TOLERANCE)+rand(-5,5),80,0) - if(prob(60)) - S.set_trait(TRAIT_HIGHKPA_TOLERANCE, S.get_trait(TRAIT_HIGHKPA_TOLERANCE)+rand(-5,5),500,110) - -/decl/plantgene/vigour/mutate(var/datum/seed/S, var/turf/T) - if(prob(65)) - S.set_trait(TRAIT_PRODUCTION, S.get_trait(TRAIT_PRODUCTION)+rand(-1,1),10,0) - if(prob(65)) - S.set_trait(TRAIT_MATURATION, S.get_trait(TRAIT_MATURATION)+rand(-1,1),30,0) - if(prob(55)) - S.set_trait(TRAIT_SPREAD, S.get_trait(TRAIT_SPREAD)+rand(-1,1),2,0) - T.visible_message("\The [S.display_name] spasms visibly, shifting in the tray.") - -/decl/plantgene/fruit/mutate(var/datum/seed/S) - if(prob(65)) - S.set_trait(TRAIT_STINGS, !S.get_trait(TRAIT_STINGS)) - if(prob(65)) - S.set_trait(TRAIT_EXPLOSIVE, !S.get_trait(TRAIT_EXPLOSIVE)) - if(prob(65)) - S.set_trait(TRAIT_JUICY, !S.get_trait(TRAIT_JUICY)) - -/decl/plantgene/special/mutate(var/datum/seed/S) - if(prob(65)) - S.set_trait(TRAIT_TELEPORTING, !S.get_trait(TRAIT_TELEPORTING)) diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index f14356dae2..b56c5a6ca9 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -127,9 +127,7 @@ var/list/data = list() - var/list/geneMasks = SSplants.gene_masked_list - data["geneMasks"] = geneMasks - + data["geneMasks"] = SSplants.gene_masked_list data["activity"] = active data["degradation"] = degradation @@ -215,21 +213,27 @@ if(href_list["get_gene"]) - if(!genetics || !loaded_disk) return + if(!genetics || !loaded_disk) + return + + var/decl/plant_gene/gene_master = locate(href_list["get_gene"]) + if(ispath(gene_master)) + gene_master = GET_DECL(gene_master) + + if(!istype(gene_master)) + return last_action = world.time active = 1 - var/datum/plantgene/P = genetics.get_gene(href_list["get_gene"]) - if(!P) return - loaded_disk.genes += P + loaded_disk.genes += new /datum/plantgene(gene_master, genetics) loaded_disk.genesource = "[genetics.display_name]" if(!genetics.roundstart) loaded_disk.genesource += " (variety #[genetics.uid])" - loaded_disk.name += " ([SSplants.gene_tag_masks[href_list["get_gene"]]], #[genetics.uid])" - loaded_disk.desc += " The label reads \'gene [SSplants.gene_tag_masks[href_list["get_gene"]]], sampled from [genetics.display_name]\'." + loaded_disk.name += " ([gene_master.name], #[genetics.uid])" + loaded_disk.desc += " The label reads \'gene [gene_master.name], sampled from [genetics.display_name]\'." eject_disk = 1 degradation += rand(20,60) + user.skill_fail_chance(SKILL_BOTANY, 100, SKILL_ADEPT) @@ -277,7 +281,7 @@ for(var/datum/plantgene/P in loaded_disk.genes) if(data["locus"] != "") data["locus"] += ", " - data["locus"] += "[SSplants.gene_tag_masks[P.genetype]]" + data["locus"] += "[P.genetype.name]" else data["disk"] = 0 diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index d464c28805..e7ef9f180d 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -11,7 +11,7 @@ //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. spawn(1) - if(prob(seed.get_trait(((TRAIT_POTENCY)/2)*3))) + if(prob((seed.get_trait(TRAIT_POTENCY) / 2) * 3)) entangle(M) /obj/effect/vine/attack_hand(var/mob/user) @@ -29,7 +29,7 @@ wake_neighbors() if(!is_mature()) return - if(prob(seed.get_trait(((TRAIT_POTENCY)/2)*3))) + if(prob((seed.get_trait(TRAIT_POTENCY) / 2) * 3)) entangle(victim) var/mob/living/carbon/human/H = victim if(istype(H) && H.get_equipped_item(slot_shoes_str)) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 0b8a92bd27..1db229b0b7 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -62,7 +62,7 @@ list(mode_name="increase yield", projectile_type=/obj/item/projectile/energy/florayield, indicator_color=COLOR_YELLOW), list(mode_name="induce specific mutations", projectile_type=/obj/item/projectile/energy/floramut/gene, indicator_color=COLOR_LIME), ) - var/decl/plantgene/gene = null + var/decl/plant_gene/gene = null /obj/item/gun/energy/floragun/get_charge_state(var/initial_state) return "[initial_state]100" @@ -85,16 +85,10 @@ set category = "Object" set src in view(1) - var/genemask = input("Choose a gene to modify.") as null|anything in SSplants.plant_gene_datums - - if(!genemask) - return - - gene = SSplants.plant_gene_datums[genemask] - - to_chat(usr, "You set the [src]'s targeted genetic area to [genemask].") - - return + var/decl/plant_gene/new_gene = input("Choose a gene to modify.") as null|anything in decls_repository.get_decls_of_type_unassociated(/decl/plant_gene) + if(istype(new_gene)) + gene = new_gene + to_chat(usr, SPAN_INFO("You set the \the [src]'s targeted genetic area to [gene.name].")) /obj/item/gun/energy/floragun/consume_next_projectile() . = ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 77ccdc5f90..6094d2dd9e 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -115,7 +115,7 @@ damage = 0 atom_damage_type = TOX nodamage = 1 - var/decl/plantgene/gene = null + var/decl/plant_gene/gene = null /obj/item/projectile/energy/florayield name = "beta somatoray" diff --git a/nebula.dme b/nebula.dme index 345a9f2b31..4d03bf530a 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2370,6 +2370,66 @@ #include "code\modules\games\cards_cag.dm" #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\genetics\_gene.dm" +#include "code\modules\genetics\plants\_gene_plant.dm" +#include "code\modules\genetics\plants\_plant_trait.dm" +#include "code\modules\genetics\plants\gene_atmosphere.dm" +#include "code\modules\genetics\plants\gene_biochemistry.dm" +#include "code\modules\genetics\plants\gene_diet.dm" +#include "code\modules\genetics\plants\gene_environment.dm" +#include "code\modules\genetics\plants\gene_fruit.dm" +#include "code\modules\genetics\plants\gene_hardiness.dm" +#include "code\modules\genetics\plants\gene_metabolism.dm" +#include "code\modules\genetics\plants\gene_output.dm" +#include "code\modules\genetics\plants\gene_pigment.dm" +#include "code\modules\genetics\plants\gene_special.dm" +#include "code\modules\genetics\plants\gene_structure.dm" +#include "code\modules\genetics\plants\gene_vigour.dm" +#include "code\modules\genetics\plants\trait_alter_temp.dm" +#include "code\modules\genetics\plants\trait_biolum.dm" +#include "code\modules\genetics\plants\trait_biolum_colour.dm" +#include "code\modules\genetics\plants\trait_carnivorous.dm" +#include "code\modules\genetics\plants\trait_chems.dm" +#include "code\modules\genetics\plants\trait_consume_gasses.dm" +#include "code\modules\genetics\plants\trait_endurance.dm" +#include "code\modules\genetics\plants\trait_explosive.dm" +#include "code\modules\genetics\plants\trait_exude_gasses.dm" +#include "code\modules\genetics\plants\trait_flesh_colour.dm" +#include "code\modules\genetics\plants\trait_harvest_repeat.dm" +#include "code\modules\genetics\plants\trait_heat_tolerance.dm" +#include "code\modules\genetics\plants\trait_highkpa_tolerance.dm" +#include "code\modules\genetics\plants\trait_ideal_heat.dm" +#include "code\modules\genetics\plants\trait_ideal_light.dm" +#include "code\modules\genetics\plants\trait_immutable.dm" +#include "code\modules\genetics\plants\trait_juicy.dm" +#include "code\modules\genetics\plants\trait_large.dm" +#include "code\modules\genetics\plants\trait_leaves_colour.dm" +#include "code\modules\genetics\plants\trait_light_tolerance.dm" +#include "code\modules\genetics\plants\trait_lowkpa_tolerance.dm" +#include "code\modules\genetics\plants\trait_maturation.dm" +#include "code\modules\genetics\plants\trait_nutrient_consumption.dm" +#include "code\modules\genetics\plants\trait_parasite.dm" +#include "code\modules\genetics\plants\trait_pest_tolerance.dm" +#include "code\modules\genetics\plants\trait_photosynthesis.dm" +#include "code\modules\genetics\plants\trait_plant_colour.dm" +#include "code\modules\genetics\plants\trait_plant_icon.dm" +#include "code\modules\genetics\plants\trait_potency.dm" +#include "code\modules\genetics\plants\trait_produces_power.dm" +#include "code\modules\genetics\plants\trait_product_colour.dm" +#include "code\modules\genetics\plants\trait_product_icon.dm" +#include "code\modules\genetics\plants\trait_product_type.dm" +#include "code\modules\genetics\plants\trait_production.dm" +#include "code\modules\genetics\plants\trait_requires_nutrients.dm" +#include "code\modules\genetics\plants\trait_requires_water.dm" +#include "code\modules\genetics\plants\trait_slice_amount.dm" +#include "code\modules\genetics\plants\trait_slice_product.dm" +#include "code\modules\genetics\plants\trait_spread.dm" +#include "code\modules\genetics\plants\trait_stings.dm" +#include "code\modules\genetics\plants\trait_teleporting.dm" +#include "code\modules\genetics\plants\trait_toxins_tolerance.dm" +#include "code\modules\genetics\plants\trait_water_consumption.dm" +#include "code\modules\genetics\plants\trait_weed_tolerance.dm" +#include "code\modules\genetics\plants\trait_yield.dm" #include "code\modules\ghosttrap\trap.dm" #include "code\modules\goals\_goal.dm" #include "code\modules\goals\goal_ambition.dm" From a69b933c212765d1e296678c3fec41e0bdf719da Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 10 May 2024 00:38:25 +0000 Subject: [PATCH 008/212] Automatic changelog generation [ci skip] --- html/changelog.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index d8fbac3613..6701ce3dcd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -166,14 +166,6 @@

MistakeNot4892 updated:

  • You can now dry yourself or others off with a towel.
  • You will now drip contact reagents onto your turf if you get splashed or dunked.
  • - -

    08 March 2024

    -

    MistakeNot4892 updated:

    -
      -
    • Combs, brushes and files are available in loadout.
    • -
    • New grooming activities added.
    • -
    • Long grass will partially mask things inside it.
    • -
    From 9ee919c30b5c400c2ed32b2a2d7e6e098263064c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 May 2024 12:17:27 +1000 Subject: [PATCH 009/212] Adding deer and foxes, and tweaking mice and rabbits. --- code/_macros.dm | 2 +- code/datums/trading/traders/misc.dm | 4 +- code/game/objects/items/glassjar.dm | 2 +- code/game/objects/random/subtypes/closets.dm | 2 +- code/game/objects/random/subtypes/mobs.dm | 6 +- code/game/objects/structures/flaps.dm | 2 +- code/game/turfs/initialization/maintenance.dm | 2 +- code/modules/assembly/mousetrap.dm | 2 +- code/modules/butchery/butchery_data_animal.dm | 7 ++ .../butchery/butchery_data_livestock.dm | 11 +++ code/modules/events/infestation.dm | 8 +- .../solids/materials_solid_butchery.dm | 4 + code/modules/mob/living/living.dm | 4 + .../mob/living/simple_animal/friendly/cat.dm | 8 +- .../living/simple_animal/friendly/lizard.dm | 5 +- .../living/simple_animal/friendly/possum.dm | 1 + .../mob/living/simple_animal/hostile/bat.dm | 2 +- .../mob/living/simple_animal/hostile/bear.dm | 2 +- .../mob/living/simple_animal/hostile/drake.dm | 2 +- .../living/simple_animal/hostile/faithless.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 4 +- .../living/simple_animal/hostile/hostile.dm | 28 +----- .../mob/living/simple_animal/hostile/leech.dm | 2 +- .../mob/living/simple_animal/hostile/mimic.dm | 2 +- .../hostile/retaliate/exoplanet.dm | 8 +- .../hostile/retaliate/giant_crab.dm | 2 +- .../retaliate/giant_parrot/giant_parrot.dm | 2 +- .../hostile/retaliate/king_of_goats.dm | 4 +- .../mob/living/simple_animal/hostile/slug.dm | 2 +- .../living/simple_animal/hostile/vagrant.dm | 2 +- .../living/simple_animal/passive/_passive.dm | 84 ++++++++++++++++++ .../mob/living/simple_animal/passive/deer.dm | 51 +++++++++++ .../mob/living/simple_animal/passive/fox.dm | 77 ++++++++++++++++ .../{friendly => passive}/mouse.dm | 60 ++++++------- .../{friendly => passive}/rabbit.dm | 8 +- .../simple_animal/simple_animal_combat.dm | 17 ++++ code/modules/mob/observer/ghost/ghost.dm | 4 +- code/modules/mob/transform_procs.dm | 2 +- code/modules/random_map/noise/desert.dm | 2 +- code/modules/random_map/noise/tundra.dm | 2 +- .../spells/artifacts/spellbound_servants.dm | 2 +- code/modules/spells/targeted/shapeshift.dm | 4 +- .../artifacts/standalone/autocloner.dm | 4 +- food.dmi | Bin 180438 -> 0 bytes icons/mob/simple_animal/buck.dmi | Bin 0 -> 1410 bytes icons/mob/simple_animal/doe.dmi | Bin 0 -> 1259 bytes icons/mob/simple_animal/fox.dmi | Bin 0 -> 1186 bytes icons/mob/simple_animal/rabbit_black.dmi | Bin 585 -> 589 bytes icons/mob/simple_animal/rabbit_brown.dmi | Bin 592 -> 593 bytes icons/mob/simple_animal/rabbit_white.dmi | Bin 594 -> 600 bytes maps/away/errant_pisces/errant_pisces.dm | 2 +- maps/exodus/exodus-2.dmm | 36 ++++---- maps/ministation/ministation-1.dmm | 4 +- maps/tradeship/tradeship-0.dmm | 4 +- .../xenobiology/mobs/slime_feeding_helpers.dm | 15 +--- mods/valsalia/icons/posters.dmi | Bin 6572 -> 0 bytes nebula.dme | 8 +- tools/map_migrations/3987_deer_foxes.txt | 2 + 58 files changed, 377 insertions(+), 145 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/passive/_passive.dm create mode 100644 code/modules/mob/living/simple_animal/passive/deer.dm create mode 100644 code/modules/mob/living/simple_animal/passive/fox.dm rename code/modules/mob/living/simple_animal/{friendly => passive}/mouse.dm (68%) rename code/modules/mob/living/simple_animal/{friendly => passive}/rabbit.dm (81%) create mode 100644 code/modules/mob/living/simple_animal/simple_animal_combat.dm delete mode 100644 food.dmi create mode 100644 icons/mob/simple_animal/buck.dmi create mode 100644 icons/mob/simple_animal/doe.dmi create mode 100644 icons/mob/simple_animal/fox.dmi delete mode 100644 mods/valsalia/icons/posters.dmi create mode 100644 tools/map_migrations/3987_deer_foxes.txt diff --git a/code/_macros.dm b/code/_macros.dm index 46616f82d4..150d0e4929 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -42,7 +42,7 @@ #define isdeity(A) istype(A, /mob/living/deity) -#define ismouse(A) istype(A, /mob/living/simple_animal/mouse) +#define ismouse(A) istype(A, /mob/living/simple_animal/passive/mouse) #define islizard(A) istype(A, /mob/living/simple_animal/lizard) diff --git a/code/datums/trading/traders/misc.dm b/code/datums/trading/traders/misc.dm index 02ca5a40e9..f2ca4e57a0 100644 --- a/code/datums/trading/traders/misc.dm +++ b/code/datums/trading/traders/misc.dm @@ -32,7 +32,7 @@ /mob/living/simple_animal/cat = TRADER_THIS_TYPE, /mob/living/simple_animal/crab = TRADER_THIS_TYPE, /mob/living/simple_animal/lizard = TRADER_THIS_TYPE, - /mob/living/simple_animal/mouse = TRADER_THIS_TYPE, + /mob/living/simple_animal/passive/mouse = TRADER_THIS_TYPE, /mob/living/simple_animal/mushroom = TRADER_THIS_TYPE, /mob/living/simple_animal/tindalos = TRADER_THIS_TYPE, /mob/living/simple_animal/tomato = TRADER_THIS_TYPE, @@ -55,7 +55,7 @@ /mob/living/simple_animal/cat = TRADER_THIS_TYPE, /mob/living/simple_animal/crab = TRADER_THIS_TYPE, /mob/living/simple_animal/lizard = TRADER_THIS_TYPE, - /mob/living/simple_animal/mouse = TRADER_THIS_TYPE, + /mob/living/simple_animal/passive/mouse = TRADER_THIS_TYPE, /mob/living/simple_animal/mushroom = TRADER_THIS_TYPE, /mob/living/simple_animal/tindalos = TRADER_THIS_TYPE, /mob/living/simple_animal/tomato = TRADER_THIS_TYPE, diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index c1055c2c77..d5a2770362 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -12,7 +12,7 @@ pickup_sound = 'sound/foley/bottlepickup1.ogg' var/list/accept_mobs = list( /mob/living/simple_animal/lizard, - /mob/living/simple_animal/mouse + /mob/living/simple_animal/passive/mouse ) var/contains = 0 // 0 = nothing, 1 = money, 2 = animal, 3 = spiderling diff --git a/code/game/objects/random/subtypes/closets.dm b/code/game/objects/random/subtypes/closets.dm index 368008273e..956ef9fd70 100644 --- a/code/game/objects/random/subtypes/closets.dm +++ b/code/game/objects/random/subtypes/closets.dm @@ -5,7 +5,7 @@ icon_state = "base" var/vermin_chance = 0.1 var/list/locker_vermin = list( - /mob/living/simple_animal/mouse, + /mob/living/simple_animal/passive/mouse, /mob/living/simple_animal/opossum ) diff --git a/code/game/objects/random/subtypes/mobs.dm b/code/game/objects/random/subtypes/mobs.dm index 1788cc4722..222c3baa24 100644 --- a/code/game/objects/random/subtypes/mobs.dm +++ b/code/game/objects/random/subtypes/mobs.dm @@ -7,9 +7,9 @@ /obj/random/mouse/spawn_choices() var/static/list/spawnable_choices = list( - /mob/living/simple_animal/mouse/brown = 30, - /mob/living/simple_animal/mouse/gray = 30, - /mob/living/simple_animal/mouse/white = 15 + /mob/living/simple_animal/passive/mouse/brown = 30, + /mob/living/simple_animal/passive/mouse/gray = 30, + /mob/living/simple_animal/passive/mouse/white = 15 ) return spawnable_choices diff --git a/code/game/objects/structures/flaps.dm b/code/game/objects/structures/flaps.dm index b635591e34..cdcc501272 100644 --- a/code/game/objects/structures/flaps.dm +++ b/code/game/objects/structures/flaps.dm @@ -14,7 +14,7 @@ var/list/mobs_can_pass = list( /mob/living/bot, - /mob/living/simple_animal/mouse, + /mob/living/simple_animal/passive/mouse, /mob/living/silicon/robot/drone ) var/airtight = FALSE diff --git a/code/game/turfs/initialization/maintenance.dm b/code/game/turfs/initialization/maintenance.dm index 5cef122ea6..4431a959bc 100644 --- a/code/game/turfs/initialization/maintenance.dm +++ b/code/game/turfs/initialization/maintenance.dm @@ -38,7 +38,7 @@ if(prob(vermin_probability)) if(prob(80)) - new /mob/living/simple_animal/mouse(T) + new /mob/living/simple_animal/passive/mouse(T) else new /mob/living/simple_animal/lizard(T) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 9de4e7f4f8..a37c69d93b 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -44,7 +44,7 @@ affecting.take_external_damage(1, 0) else if(ismouse(target)) - var/mob/living/simple_animal/mouse/M = target + var/mob/living/simple_animal/passive/mouse/M = target visible_message("SPLAT!") M.splat() playsound(target.loc, 'sound/effects/snap.ogg', 50, 1) diff --git a/code/modules/butchery/butchery_data_animal.dm b/code/modules/butchery/butchery_data_animal.dm index 710b7c6a4f..fd0318ca54 100644 --- a/code/modules/butchery/butchery_data_animal.dm +++ b/code/modules/butchery/butchery_data_animal.dm @@ -9,6 +9,13 @@ var/product = new stomach_type(get_turf(donor), gut_material, donor) LAZYADD(., product) +/decl/butchery_data/animal/fox + meat_name = "fox" + meat_type = /obj/item/chems/food/butchery/meat + meat_amount = 3 + skin_material = /decl/material/solid/organic/skin/fur/orange + gut_type = /obj/item/chems/food/butchery/offal/small + /decl/butchery_data/animal/corgi meat_name = "dog" meat_type = /obj/item/chems/food/butchery/meat/corgi diff --git a/code/modules/butchery/butchery_data_livestock.dm b/code/modules/butchery/butchery_data_livestock.dm index 7f06c31468..c78568d59d 100644 --- a/code/modules/butchery/butchery_data_livestock.dm +++ b/code/modules/butchery/butchery_data_livestock.dm @@ -24,6 +24,17 @@ skin_material = /decl/material/solid/organic/skin/goat skin_amount = 8 +/decl/butchery_data/animal/ruminant/deer + meat_name = "venison" + meat_type = /obj/item/chems/food/butchery/meat/ + meat_amount = 5 + bone_amount = 9 + skin_material = /decl/material/solid/organic/skin/deer + skin_amount = 9 + +/decl/butchery_data/animal/ruminant/deer/buck + // todo: drop antlers + /decl/butchery_data/animal/ruminant/cow meat_name = "beef" meat_type = /obj/item/chems/food/butchery/meat/beef diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index 84536702b0..fbf2649b50 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -39,10 +39,10 @@ switch(vermin) if(VERM_MICE) spawn_types = list( - /mob/living/simple_animal/mouse/brown, - /mob/living/simple_animal/mouse/gray, - /mob/living/simple_animal/mouse/white, - /mob/living/simple_animal/mouse/rat + /mob/living/simple_animal/passive/mouse/brown, + /mob/living/simple_animal/passive/mouse/gray, + /mob/living/simple_animal/passive/mouse/white, + /mob/living/simple_animal/passive/mouse/rat ) max_number = 12 vermstring = "mice" diff --git a/code/modules/materials/definitions/solids/materials_solid_butchery.dm b/code/modules/materials/definitions/solids/materials_solid_butchery.dm index ce3ebb1c48..267e479dd1 100644 --- a/code/modules/materials/definitions/solids/materials_solid_butchery.dm +++ b/code/modules/materials/definitions/solids/materials_solid_butchery.dm @@ -140,6 +140,10 @@ color = COLOR_GRAY40 uid = "solid_skin_cow" +/decl/material/solid/organic/skin/deer + color = COLOR_BROWN + uid = "solid_skin_deer" + /decl/material/solid/organic/skin/shark name = "sharkskin" color = COLOR_PURPLE_GRAY diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 376ffa9d76..cf0f66222c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1491,3 +1491,7 @@ default behaviour is: /mob/living/proc/is_asystole() return FALSE + +/mob/living/proc/get_remains_type() + var/decl/species/my_species = get_species() + return my_species?.remains_type diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index f642b3b3ff..e1420879ef 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -19,7 +19,7 @@ butchery_data = /decl/butchery_data/animal/cat base_animal_type = /mob/living/simple_animal/cat var/turns_since_scan = 0 - var/mob/living/simple_animal/mouse/movement_target + var/mob/living/simple_animal/passive/mouse/movement_target var/mob/flee_target /mob/living/simple_animal/cat/get_bodytype() @@ -41,7 +41,7 @@ //MICE! if((src.loc) && isturf(src.loc)) if(!current_posture.prone && !buckled) - for(var/mob/living/simple_animal/mouse/M in loc) + for(var/mob/living/simple_animal/passive/mouse/M in loc) if(!M.stat) M.splat() visible_emote(pick("bites \the [M]!","toys with \the [M].","chomps on \the [M]!")) @@ -49,7 +49,7 @@ stop_automated_movement = 0 break - for(var/mob/living/simple_animal/mouse/snack in oview(src,5)) + for(var/mob/living/simple_animal/passive/mouse/snack in oview(src,5)) if(snack.stat < DEAD && prob(15)) audible_emote(pick("hisses and spits!","mrowls fiercely!","eyes [snack] hungrily.")) break @@ -85,7 +85,7 @@ if( !movement_target || !(movement_target.loc in oview(src, 4)) ) movement_target = null stop_automated_movement = 0 - for(var/mob/living/simple_animal/mouse/snack in oview(src)) //search for a new target + for(var/mob/living/simple_animal/passive/mouse/snack in oview(src)) //search for a new target if(isturf(snack.loc) && !snack.stat) movement_target = snack break diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index e5071cd778..79b4de2b3a 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -10,4 +10,7 @@ possession_candidate = 1 can_escape = TRUE pass_flags = PASS_FLAG_TABLE - butchery_data = /decl/butchery_data/animal/reptile/small \ No newline at end of file + butchery_data = /decl/butchery_data/animal/reptile/small + +/mob/living/simple_animal/lizard/get_remains_type() + return /obj/item/remains/lizard diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 6651801ead..5fdc3e5270 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -29,6 +29,7 @@ /datum/ai/opossum expected_type = /mob/living/simple_animal/opossum + /datum/ai/opossum/do_process(time_elapsed) . = ..() if(!prob(1)) diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index 9ec9322834..a7f5e3bfb7 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -34,7 +34,7 @@ return 0 return ..() -/mob/living/simple_animal/hostile/scarybat/AttackingTarget() +/mob/living/simple_animal/hostile/scarybat/attack_target(mob/target) . =..() var/mob/living/L = . if(istype(L)) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index a9ce9857de..79e7d46caa 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -104,7 +104,7 @@ /mob/living/simple_animal/hostile/bear/LoseTarget() ..(5) -/mob/living/simple_animal/hostile/bear/AttackingTarget() +/mob/living/simple_animal/hostile/bear/attack_target(mob/target) if(!Adjacent(target_mob)) return custom_emote(1, pick( list("slashes at [target_mob]", "bites [target_mob]") ) ) diff --git a/code/modules/mob/living/simple_animal/hostile/drake.dm b/code/modules/mob/living/simple_animal/hostile/drake.dm index 679e6fc0c7..ef7cdc3e5c 100644 --- a/code/modules/mob/living/simple_animal/hostile/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/drake.dm @@ -28,7 +28,7 @@ /mob/living/simple_animal/hostile/drake/lava_act(datum/gas_mixture/air, temperature, pressure) return -/mob/living/simple_animal/hostile/drake/AttackingTarget() +/mob/living/simple_animal/hostile/drake/attack_target(mob/target) . = ..() if(empowered_attack) depower() diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index e772dfd6e3..8cb9218c26 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -38,7 +38,7 @@ if(.) audible_emote("wails at [.]") -/mob/living/simple_animal/hostile/faithless/AttackingTarget() +/mob/living/simple_animal/hostile/faithless/attack_target(mob/target) . =..() var/mob/living/L = . if(istype(L)) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 0f99a1a57b..d1b8d1e3cc 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -146,7 +146,7 @@ if(prob(15)) custom_emote(1,"locks its eyes on [.]") -/mob/living/simple_animal/hostile/giant_spider/AttackingTarget() +/mob/living/simple_animal/hostile/giant_spider/attack_target(mob/target) . = ..() if(isliving(.)) if(current_health < get_max_health()) @@ -272,7 +272,7 @@ Nurse caste procs . = ..() divorce() -/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget() +/mob/living/simple_animal/hostile/giant_spider/nurse/attack_target(mob/target) . = ..() if(ishuman(.)) var/mob/living/carbon/human/H = . diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 1bf6af8567..06326c288d 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -116,7 +116,7 @@ stance = HOSTILE_STANCE_ATTACKING walk_to(src, target_mob, 1, move_to_delay) -/mob/living/simple_animal/hostile/proc/AttackTarget() +/mob/living/simple_animal/hostile/proc/handle_attacking_target() stop_automated_movement = 1 if(!target_mob || SA_attackable(target_mob)) LoseTarget() @@ -132,31 +132,9 @@ if(next_move >= world.time) return 0 if(get_dist(src, target_mob) <= 1) //Attacking - AttackingTarget() + attack_target(target_mob) return 1 -/mob/living/simple_animal/hostile/proc/AttackingTarget() - - if(buckled_mob == target_mob && (!faction || buckled_mob.faction != faction)) - - visible_message(SPAN_DANGER("\The [src] attempts to unseat \the [buckled_mob]!")) - set_dir(pick(global.cardinal)) - setClickCooldown(attack_delay) - - if(prob(33)) - unbuckle_mob() - if(buckled_mob != target_mob && !QDELETED(target_mob)) - to_chat(target_mob, SPAN_DANGER("You are thrown off \the [src]!")) - SET_STATUS_MAX(target_mob, STAT_WEAK, 3) - - return target_mob - - if(!Adjacent(target_mob)) - return - if(isliving(target_mob)) - UnarmedAttack(target_mob) - return target_mob - /mob/living/simple_animal/hostile/proc/LoseTarget() stance = HOSTILE_STANCE_IDLE target_mob = null @@ -196,7 +174,7 @@ face_atom(target_mob) if(destroy_surroundings) DestroySurroundings() - AttackTarget() + handle_attacking_target() if(HOSTILE_STANCE_INSIDE) //we aren't inside something so just switch stance = HOSTILE_STANCE_IDLE else diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index 97e37ae613..7b67b8644f 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -27,7 +27,7 @@ else belly -= 1 -/mob/living/simple_animal/hostile/leech/AttackingTarget() +/mob/living/simple_animal/hostile/leech/attack_target(mob/target) . = ..() if(ishuman(.) && belly <= 75) var/mob/living/carbon/human/H = . diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 6aecb71dbe..efa10e0d96 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -120,7 +120,7 @@ var/global/list/protected_objects = list( if(destroy_objects) ..() -/mob/living/simple_animal/hostile/mimic/AttackingTarget() +/mob/living/simple_animal/hostile/mimic/attack_target(mob/target) . =..() if(knockdown_people) var/mob/living/L = . diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 00922a240c..0e19309d1f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -41,8 +41,10 @@ continue beast.visible_message(SPAN_DANGER("\The [beast] consumes the body of \the [S]!")) var/turf/T = get_turf(S) - var/obj/item/remains/xeno/X = new(T) - X.desc += "These look like they belong to \a [S.name]." + var/remains_type = S.get_remains_type() + if(remains_type) + var/obj/item/remains/X = new remains_type(T) + X.desc += "These look like they belonged to \a [S.name]." beast.adjust_nutrition(5 * S.get_max_health()) if(prob(5)) S.gib() @@ -190,7 +192,7 @@ if(. && ishuman(user)) reflect_unarmed_damage(user, BURN, "amorphous mass") -/mob/living/simple_animal/hostile/retaliate/beast/charbaby/AttackingTarget() +/mob/living/simple_animal/hostile/retaliate/beast/charbaby/attack_target(mob/target) . = ..() if(isliving(target_mob) && prob(25)) var/mob/living/L = target_mob diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm index e47f574e27..3651874d0b 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_crab.dm @@ -65,7 +65,7 @@ ..() process_grab() -/mob/living/simple_animal/hostile/retaliate/giant_crab/AttackingTarget() +/mob/living/simple_animal/hostile/retaliate/giant_crab/attack_target(mob/target) . = ..() if(ishuman(.)) var/mob/living/carbon/human/H = . diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm index 4ccdc73fec..0df6b5ec78 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/giant_parrot/giant_parrot.dm @@ -38,7 +38,7 @@ set_scale(2) update_icon() -/mob/living/simple_animal/hostile/retaliate/parrot/space/AttackingTarget() +/mob/living/simple_animal/hostile/retaliate/parrot/space/attack_target(mob/target) . = ..() if(ishuman(.) && can_act() && !is_on_special_ability_cooldown() && Adjacent(.)) var/mob/living/carbon/human/H = . diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm index 9a8319229a..6f6d182d79 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/king_of_goats.dm @@ -218,7 +218,7 @@ QDEL_NULL(boss_theme) . = ..() -/mob/living/simple_animal/hostile/retaliate/goat/king/AttackingTarget() +/mob/living/simple_animal/hostile/retaliate/goat/king/attack_target(mob/target) . = ..() if(isliving(target_mob)) var/mob/living/L = target_mob @@ -227,7 +227,7 @@ ADJ_STATUS(L, STAT_CONFUSE, 1) visible_message(SPAN_WARNING("\The [L] is bowled over by the impact of [src]'s attack!")) -/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/AttackingTarget() +/mob/living/simple_animal/hostile/retaliate/goat/king/phase2/attack_target(mob/target) . = ..() if(current_damtype != BRUTE) special_attacks++ diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 1c7acb354d..da1eafacb8 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -43,7 +43,7 @@ chest.embed_in_organ(holder, FALSE, "\The [src] latches itself onto \the [H]!") holder.sync(src) -/mob/living/simple_animal/hostile/slug/AttackingTarget() +/mob/living/simple_animal/hostile/slug/attack_target(mob/target) . = ..() if(ishuman(.)) var/mob/living/carbon/human/H = . diff --git a/code/modules/mob/living/simple_animal/hostile/vagrant.dm b/code/modules/mob/living/simple_animal/hostile/vagrant.dm index fe24496581..c745d4b122 100644 --- a/code/modules/mob/living/simple_animal/hostile/vagrant.dm +++ b/code/modules/mob/living/simple_animal/hostile/vagrant.dm @@ -86,7 +86,7 @@ set_light(3, 0.2) move_to_delay = 2 -/mob/living/simple_animal/hostile/vagrant/AttackingTarget() +/mob/living/simple_animal/hostile/vagrant/attack_target(mob/target) . = ..() if(ishuman(.)) var/mob/living/carbon/human/H = . diff --git a/code/modules/mob/living/simple_animal/passive/_passive.dm b/code/modules/mob/living/simple_animal/passive/_passive.dm new file mode 100644 index 0000000000..39598e6000 --- /dev/null +++ b/code/modules/mob/living/simple_animal/passive/_passive.dm @@ -0,0 +1,84 @@ +/datum/ai/passive + expected_type = /mob/living/simple_animal + var/weakref/flee_target + var/turns_since_scan + +/datum/ai/passive/proc/update_targets() + //see if we should stop fleeing + var/mob/living/simple_animal/critter = body + var/atom/flee_target_atom = flee_target?.resolve() + if(istype(flee_target_atom) && (flee_target_atom.loc in view(body))) + walk_away(body, flee_target_atom, 7, 2) + critter.stop_automated_movement = TRUE + else + flee_target = null + critter.stop_automated_movement = FALSE + return !isnull(flee_target) + +/datum/ai/passive/do_process(time_elapsed) + ..() + + // Handle fleeing from aggressors. + turns_since_scan++ + if (turns_since_scan > 5) + walk_to(body, 0) + turns_since_scan = 0 + if(update_targets()) + return + + var/mob/living/simple_animal/critter = body + // Handle sleeping or wandering. + if(body.stat == CONSCIOUS && prob(0.5)) + body.set_stat(UNCONSCIOUS) + critter.wander = FALSE + critter.speak_chance = 0 + else if(body.stat == UNCONSCIOUS && prob(1)) + body.set_stat(CONSCIOUS) + critter.wander = TRUE + +/datum/ai/passive/proc/set_flee_target(atom/A) + if(A) + flee_target = weakref(A) + turns_since_scan = 5 + +/mob/living/simple_animal/passive + possession_candidate = TRUE + abstract_type = /mob/living/simple_animal/passive + ai = /datum/ai/passive + speak_chance = 0.5 + turns_per_move = 5 + see_in_dark = 6 + minbodytemp = 223 + maxbodytemp = 323 + +/mob/living/simple_animal/passive/attackby(var/obj/item/O, var/mob/user) + . = ..() + if(O.force) + var/datum/ai/passive/preyi = ai + if(istype(preyi)) + preyi.set_flee_target(user? user : loc) + +/mob/living/simple_animal/passive/default_hurt_interaction(mob/user) + . = ..() + if(.) + var/datum/ai/passive/preyi = ai + if(istype(preyi)) + preyi.set_flee_target(user) + +/mob/living/simple_animal/passive/explosion_act() + . = ..() + var/datum/ai/passive/preyi = ai + if(istype(preyi)) + preyi.set_flee_target(loc) + +/mob/living/simple_animal/passive/bullet_act(var/obj/item/projectile/proj) + . = ..() + var/datum/ai/passive/preyi = ai + if(istype(preyi)) + preyi.set_flee_target(isliving(proj.firer) ? proj.firer : loc) + +/mob/living/simple_animal/passive/hitby(atom/movable/AM, var/datum/thrownthing/TT) + . = ..() + var/datum/ai/passive/preyi = ai + if(istype(preyi)) + preyi.set_flee_target(TT.thrower || loc) diff --git a/code/modules/mob/living/simple_animal/passive/deer.dm b/code/modules/mob/living/simple_animal/passive/deer.dm new file mode 100644 index 0000000000..044390456d --- /dev/null +++ b/code/modules/mob/living/simple_animal/passive/deer.dm @@ -0,0 +1,51 @@ +/mob/living/simple_animal/passive/deer + name = "deer" + gender = NEUTER + icon = 'icons/mob/simple_animal/doe.dmi' + desc = "A fleet-footed forest animal known for its grace, speed and timidity." + speak_emote = list("bleats") + emote_hear = list("bleats") + emote_see = list("shakes its head", "stamps a hoof", "looks around quickly") + emote_speech = list("Ough!", "Ourgh!", "Mroough!", "Broough?") + speak_chance = 0.5 + turns_per_move = 5 + see_in_dark = 6 + faction = "deer" + max_health = 60 + butchery_data = /decl/butchery_data/animal/ruminant/deer + natural_weapon = /obj/item/natural_weapon/hooves + mob_size = MOB_SIZE_LARGE + +/mob/living/simple_animal/passive/deer/doe + name = "doe" + icon = 'icons/mob/simple_animal/doe.dmi' + butchery_data = /decl/butchery_data/animal/ruminant/deer + gender = FEMALE + speak_emote = list("bleats") + emote_hear = list("bleats") + +/mob/living/simple_animal/passive/deer/buck + name = "buck" + icon = 'icons/mob/simple_animal/buck.dmi' + butchery_data = /decl/butchery_data/animal/ruminant/deer/buck + gender = MALE + speak_emote = list("bellows") + emote_hear = list("bellows") + +/mob/living/simple_animal/passive/deer/Initialize() + + if(gender == NEUTER) + if(prob(10)) // Internet seems to think a 10:1 ratio of bucks to does isn't uncommon, adjust later if this is bollocks + name = "buck" + icon = 'icons/mob/simple_animal/buck.dmi' + butchery_data = /decl/butchery_data/animal/ruminant/deer/buck + gender = MALE + speak_emote = list("bellows") + emote_hear = list("bellows") + else + name = "doe" + icon = 'icons/mob/simple_animal/doe.dmi' + butchery_data = /decl/butchery_data/animal/ruminant/deer + gender = FEMALE + + return ..() diff --git a/code/modules/mob/living/simple_animal/passive/fox.dm b/code/modules/mob/living/simple_animal/passive/fox.dm new file mode 100644 index 0000000000..972e48ab08 --- /dev/null +++ b/code/modules/mob/living/simple_animal/passive/fox.dm @@ -0,0 +1,77 @@ +/datum/ai/passive/fox + var/weakref/hunt_target + +/datum/ai/passive/fox/update_targets() + // Fleeing takes precedence. + . = ..() + if(!. && !hunt_target) // TODO: generalized nutrition process. && body.get_nutrition() < body.get_max_nutrition() * 0.5) + for(var/mob/living/snack in view(body)) //search for a new target + if(can_hunt(snack)) + hunt_target = weakref(snack) + break + + return . || !!hunt_target + +/datum/ai/passive/fox/proc/can_hunt(mob/living/victim) + return !victim.isSynthetic() && (victim.stat == DEAD || victim.get_object_size() < body.get_object_size()) + +/datum/ai/passive/fox/do_process(time_elapsed) + + ..() + + var/mob/living/simple_animal/critter = body + if(!istype(critter) || body.incapacitated() || body.current_posture?.prone || body.buckled || flee_target || !hunt_target) + return + + var/atom/hunt_target_atom = hunt_target?.resolve() + if(!isliving(hunt_target_atom) || QDELETED(hunt_target_atom) || !(hunt_target_atom in view(body))) + hunt_target = null + critter.stop_automated_movement = FALSE + return + + // Find or pursue the target. + if(!body.Adjacent(hunt_target_atom)) + critter.stop_automated_movement = 1 + walk_to(body, hunt_target_atom, 0, 3) + return + + // Hunt/consume the target. + var/mob/living/hunt_mob = hunt_target_atom + if(hunt_mob.stat != DEAD) + critter.attack_target(hunt_target_atom) + + if(QDELETED(hunt_mob)) + hunt_target = null + critter.stop_automated_movement = FALSE + return + + if(hunt_mob.stat != DEAD) + return + + // Eat the mob. + hunt_target = null + critter.stop_automated_movement = FALSE + body.visible_message(SPAN_DANGER("\The [body] consumes the body of \the [hunt_mob]!")) + var/remains_type = hunt_mob.get_remains_type() + if(remains_type) + var/obj/item/remains/remains = new remains_type(get_turf(hunt_mob)) + remains.desc += "These look like they belonged to \a [hunt_mob.name]." + body.adjust_nutrition(5 * hunt_mob.get_max_health()) + if(prob(5)) + hunt_mob.gib() + else + qdel(hunt_mob) + +/mob/living/simple_animal/passive/fox + name = "fox" + desc = "A cunning and graceful predatory mammal, known for its red fur and eerie screams." + icon = 'icons/mob/simple_animal/fox.dmi' + natural_weapon = /obj/item/natural_weapon/bite/weak + ai = /datum/ai/passive/fox + mob_size = MOB_SIZE_SMALL + emote_speech = list("Yip!","AIEE!","YIPE!") + speak_emote = list("yelps", "yips", "hisses", "screams") + emote_hear = list("screams","yips") + emote_see = list("paces back and forth", "flicks its tail") + pass_flags = PASS_FLAG_TABLE + butchery_data = /decl/butchery_data/animal/fox diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/passive/mouse.dm similarity index 68% rename from code/modules/mob/living/simple_animal/friendly/mouse.dm rename to code/modules/mob/living/simple_animal/passive/mouse.dm index 83a2cb8a9b..0c7ce6f9f0 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/passive/mouse.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/mouse +/mob/living/simple_animal/passive/mouse name = "mouse" real_name = "mouse" desc = "It's a small rodent." @@ -20,50 +20,44 @@ universal_understand = TRUE holder_type = /obj/item/holder mob_size = MOB_SIZE_MINISCULE - possession_candidate = 1 can_escape = TRUE can_pull_size = ITEM_SIZE_TINY can_pull_mobs = MOB_PULL_NONE - base_animal_type = /mob/living/simple_animal/mouse + base_animal_type = /mob/living/simple_animal/passive/mouse butchery_data = /decl/butchery_data/animal/small/furred - ai = /datum/ai/mouse + ai = /datum/ai/passive/mouse var/body_color //brown, gray and white, leave blank for random var/splatted = FALSE -/mob/living/simple_animal/mouse/get_dexterity(var/silent) +/mob/living/simple_animal/passive/mouse/get_remains_type() + return /obj/item/remains/mouse + +/mob/living/simple_animal/passive/mouse/get_dexterity(var/silent) return DEXTERITY_NONE // Mice are troll bait, give them no power. -/datum/ai/mouse - expected_type = /mob/living/simple_animal/mouse +/datum/ai/passive/mouse + expected_type = /mob/living/simple_animal/passive/mouse -/datum/ai/mouse/do_process() +/datum/ai/passive/mouse/do_process() ..() - var/mob/living/simple_animal/mouse/mouse = body + var/mob/living/simple_animal/passive/mouse/mouse = body if(prob(mouse.speak_chance)) playsound(mouse.loc, 'sound/effects/mousesqueek.ogg', 50) - if(mouse.stat == CONSCIOUS && prob(0.5)) - mouse.set_stat(UNCONSCIOUS) - mouse.wander = FALSE - mouse.speak_chance = 0 - else if(mouse.stat == UNCONSCIOUS) - if(prob(1)) - mouse.set_stat(CONSCIOUS) - mouse.wander = TRUE - else if(prob(5)) - INVOKE_ASYNC(mouse, TYPE_PROC_REF(/mob/living/simple_animal, audible_emote), "snuffles.") - -/mob/living/simple_animal/mouse/Initialize() + if(mouse.stat == UNCONSCIOUS && prob(5)) + INVOKE_ASYNC(mouse, TYPE_PROC_REF(/mob/living/simple_animal, audible_emote), "snuffles.") + +/mob/living/simple_animal/passive/mouse/Initialize() verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide if(name == initial(name)) - name = "[name] ([sequential_id(/mob/living/simple_animal/mouse)])" + name = "[name] ([sequential_id(/mob/living/simple_animal/passive/mouse)])" real_name = name set_mouse_icon() . = ..() -/mob/living/simple_animal/mouse/proc/set_mouse_icon() +/mob/living/simple_animal/passive/mouse/proc/set_mouse_icon() if(!body_color) body_color = pick( list("brown","gray","white") ) switch(body_color) @@ -78,17 +72,17 @@ icon = 'icons/mob/simple_animal/mouse_brown.dmi' desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." -/mob/living/simple_animal/mouse/proc/splat() +/mob/living/simple_animal/passive/mouse/proc/splat() take_damage(get_max_health()) // Enough damage to kill splatted = TRUE death() -/mob/living/simple_animal/mouse/on_update_icon() +/mob/living/simple_animal/passive/mouse/on_update_icon() . = ..() if(stat == DEAD && splatted) icon_state = "world-splat" -/mob/living/simple_animal/mouse/Crossed(atom/movable/AM) +/mob/living/simple_animal/passive/mouse/Crossed(atom/movable/AM) ..() if(!ishuman(AM) || stat) return @@ -98,31 +92,31 @@ /* * Mouse types */ -/mob/living/simple_animal/mouse/white +/mob/living/simple_animal/passive/mouse/white body_color = "white" icon = 'icons/mob/simple_animal/mouse_white.dmi' -/mob/living/simple_animal/mouse/gray +/mob/living/simple_animal/passive/mouse/gray body_color = "gray" icon = 'icons/mob/simple_animal/mouse_gray.dmi' -/mob/living/simple_animal/mouse/brown +/mob/living/simple_animal/passive/mouse/brown body_color = "brown" icon = 'icons/mob/simple_animal/mouse_brown.dmi' //TOM IS ALIVE! SQUEEEEEEEE~K :) -/mob/living/simple_animal/mouse/brown/Tom +/mob/living/simple_animal/passive/mouse/brown/Tom name = "Tom" desc = "Jerry the cat is not amused." -/mob/living/simple_animal/mouse/brown/Tom/Initialize() +/mob/living/simple_animal/passive/mouse/brown/Tom/Initialize() . = ..() // Change my name back, don't want to be named Tom (666) SetName(initial(name)) real_name = name // rats, they're the rats (from Polaris) -/mob/living/simple_animal/mouse/rat +/mob/living/simple_animal/passive/mouse/rat name = "rat" desc = "A large rodent, often seen hiding in maintenance areas and making a nuisance of itself." body_color = "rat" @@ -130,5 +124,5 @@ butchery_data = /decl/butchery_data/animal/small/furred/gray max_health = 20 -/mob/living/simple_animal/mouse/rat/set_mouse_icon() +/mob/living/simple_animal/passive/mouse/rat/set_mouse_icon() return diff --git a/code/modules/mob/living/simple_animal/friendly/rabbit.dm b/code/modules/mob/living/simple_animal/passive/rabbit.dm similarity index 81% rename from code/modules/mob/living/simple_animal/friendly/rabbit.dm rename to code/modules/mob/living/simple_animal/passive/rabbit.dm index a1f8c2e255..45ecfab962 100644 --- a/code/modules/mob/living/simple_animal/friendly/rabbit.dm +++ b/code/modules/mob/living/simple_animal/passive/rabbit.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/rabbit +/mob/living/simple_animal/passive/rabbit name = "white rabbit" desc = "A hopping mammal with long ears and a love for carrots." icon = 'icons/mob/simple_animal/rabbit_white.dmi' @@ -7,16 +7,16 @@ speak_emote = list("chitters") emote_hear = list("chitters") emote_see = list("hops","lifts its head","sniffs the air","wiggles its tail") - mob_size = MOB_SIZE_SMALL + mob_size = MOB_SIZE_TINY butchery_data = /decl/butchery_data/animal/rabbit speak_chance = 0.5 -/mob/living/simple_animal/rabbit/brown +/mob/living/simple_animal/passive/rabbit/brown name = "brown rabbit" icon = 'icons/mob/simple_animal/rabbit_brown.dmi' butchery_data = /decl/butchery_data/animal/rabbit/brown -/mob/living/simple_animal/rabbit/black +/mob/living/simple_animal/passive/rabbit/black name = "black rabbit" icon = 'icons/mob/simple_animal/rabbit_black.dmi' butchery_data = /decl/butchery_data/animal/rabbit/black diff --git a/code/modules/mob/living/simple_animal/simple_animal_combat.dm b/code/modules/mob/living/simple_animal/simple_animal_combat.dm new file mode 100644 index 0000000000..7a74cc8722 --- /dev/null +++ b/code/modules/mob/living/simple_animal/simple_animal_combat.dm @@ -0,0 +1,17 @@ +/mob/living/simple_animal/proc/attack_target(mob/target) + + if(buckled_mob == target && (!faction || buckled_mob.faction != faction)) + visible_message(SPAN_DANGER("\The [src] attempts to unseat \the [buckled_mob]!")) + set_dir(pick(global.cardinal)) + setClickCooldown(attack_delay) + if(prob(33)) + unbuckle_mob() + if(buckled_mob != target && !QDELETED(target)) + to_chat(target, SPAN_DANGER("You are thrown off \the [src]!")) + SET_STATUS_MAX(target, STAT_WEAK, 3) + return target + + if(isliving(target) && Adjacent(target)) + a_intent = I_HURT + UnarmedAttack(target, TRUE) + return target diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index 48f9167035..d2e89e4e52 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -388,7 +388,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //find a viable mouse candidate - var/mob/living/simple_animal/mouse/host + var/mob/living/simple_animal/passive/mouse/host var/obj/machinery/atmospherics/unary/vent_pump/vent_found var/list/found_vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/v in SSmachines.machinery) @@ -396,7 +396,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp found_vents.Add(v) if(found_vents.len) vent_found = pick(found_vents) - host = new /mob/living/simple_animal/mouse(vent_found.loc) + host = new /mob/living/simple_animal/passive/mouse(vent_found.loc) else to_chat(src, "Unable to find any unwelded vents to spawn mice at.") if(host) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index caf9e798a9..e1f036903c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -248,7 +248,7 @@ return 1 if(ispath(MP, /mob/living/simple_animal/tomato)) return 1 - if(ispath(MP, /mob/living/simple_animal/mouse)) + if(ispath(MP, /mob/living/simple_animal/passive/mouse)) return 1 if(ispath(MP, /mob/living/simple_animal/hostile/bear)) return 1 diff --git a/code/modules/random_map/noise/desert.dm b/code/modules/random_map/noise/desert.dm index a59d442a5a..08605c01e9 100644 --- a/code/modules/random_map/noise/desert.dm +++ b/code/modules/random_map/noise/desert.dm @@ -27,7 +27,7 @@ var/grass_path = pick(subtypesof(/obj/structure/flora/grass)) new grass_path(T) if(prob(5)) - var/mob_type = pick(list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse, /mob/living/simple_animal/mouse/rat)) + var/mob_type = pick(list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/passive/mouse, /mob/living/simple_animal/passive/mouse/rat)) new mob_type(T) if(5 to 6) if(prob(20)) diff --git a/code/modules/random_map/noise/tundra.dm b/code/modules/random_map/noise/tundra.dm index ceb9fd6f78..8c4d39d435 100644 --- a/code/modules/random_map/noise/tundra.dm +++ b/code/modules/random_map/noise/tundra.dm @@ -52,7 +52,7 @@ var/grass_path = pick(subtypesof(/obj/structure/flora/grass)) new grass_path(T) if(prob(5)) - var/mob_type = pick(list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/mouse, /mob/living/simple_animal/mouse/rat)) + var/mob_type = pick(list(/mob/living/simple_animal/lizard, /mob/living/simple_animal/passive/mouse, /mob/living/simple_animal/passive/mouse/rat)) new mob_type(T) if(7) if(prob(60)) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 79dccadb3f..49338f38b1 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -112,7 +112,7 @@ familiar_type = /mob/living/simple_animal/hostile/carp/pike if("Mouse") H.verbs |= /mob/living/proc/ventcrawl - familiar_type = /mob/living/simple_animal/mouse + familiar_type = /mob/living/simple_animal/passive/mouse if("Cat") H.mutations |= mRun familiar_type = /mob/living/simple_animal/cat diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm index 6e7725f772..45262cdf54 100644 --- a/code/modules/spells/targeted/shapeshift.dm +++ b/code/modules/spells/targeted/shapeshift.dm @@ -101,8 +101,8 @@ feedback = "BP" possible_transformations = list( /mob/living/simple_animal/lizard, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/mouse/rat, + /mob/living/simple_animal/passive/mouse, + /mob/living/simple_animal/passive/mouse/rat, /mob/living/simple_animal/corgi ) diff --git a/code/modules/xenoarcheaology/artifacts/standalone/autocloner.dm b/code/modules/xenoarcheaology/artifacts/standalone/autocloner.dm index 4c3ed1a86e..487bb59f80 100644 --- a/code/modules/xenoarcheaology/artifacts/standalone/autocloner.dm +++ b/code/modules/xenoarcheaology/artifacts/standalone/autocloner.dm @@ -29,8 +29,8 @@ /mob/living/simple_animal/cow, /mob/living/simple_animal/hostile/retaliate/parrot, /mob/living/simple_animal/crab, - /mob/living/simple_animal/mouse, - /mob/living/simple_animal/mouse/rat, + /mob/living/simple_animal/passive/mouse, + /mob/living/simple_animal/passive/mouse/rat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/retaliate/goose ) diff --git a/food.dmi b/food.dmi deleted file mode 100644 index c328cd96bcf7ebc09b90105c630b0c340d3d7144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180438 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%0AW`uaF6|dRkXPl3pDvzaO8<#djh` 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�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%0Dl9 z?YGyR1wROAP zkaTjY*S`n4WP;jDMJ-wlDJ3G@GeQ2exju;udfNler#fgmSRaomjZI2|H!G8TEV5rU=727kU4BH8tC;Kyt!gbv{f)itAJ4g}0&M8ku& zZ1=A&g)wqPq?*zB+J?NS%qj=<8Em&}e@fi3a+q!9fKi11VV^E?5NCA5V8iV#Nn&{` z0%=Hu?)VP<#8Xaj^GwNMT_eab2-DqRFgD*_KvqJ+K388q= z=z3C36Jd9AMSP{d8x%T0&}|YjXM%{n-#AgBa&g#ipqLwn=_xDtSeEgI z>Eu7qId|A(k53J{B(YLJ3K<=9*Wb&jVMJ!vB%ZH&Bq3U8%-$O5|ar$?w! z)nBwVx#M8A6R!8dV_7|yObk2@Iyl>tuD(LPN&s(OJE3VS_Z!*q^8qWBk+snRpU-=` zQ%t(;$sR*p=Z zYlAVUrIWAK+*5T3FiUD@62P);R<0{r`SEZ33(}NsVgU^apt;+xIq~ zvj^TfZ*`lFlx1#mm@LG#4Xjl8b=HnV{@FX&YF<9HoGOHO+NpGny09%wc4^h~XZ^+{ z@Vm(3v43)ch*^BtIMwc3{Z8^3&a;}@<=?ctETn7Sz`wnJVNvK{wI_!ZL08E(q2s?h zosT{J>^YG@zJjXVsMmkI)pmzl-ttiv-#Oyx6wbo^nRd7P-DCWaL0e8j1%I;X;QehV z&Ep{T!?&GZckxPFT>r%V!wCmB1}sG>c#$whNIO(JLZsNT_Yz*L*tTy6TCCc({}fuJ zmesf^tZ*Sj89>dSqzeH_i79{a`KJAg-c*at;)&uG7L4GqL=Yu#UF#R(6(->wRa8qtd@j+j9Gbsvh)|LH4x zXhzhu<>$?PCd1mlLeh^N%w#3=+NYvf=I;12c>6{VODH+)H^=dIY(Z2~FpW>|e*e?z zqwzQSQ97dBM5a-SNiO;;H4=#GP&1)E#{P`l1{>{UdN(eZ?w2iL((ii*dTT zgVeO?wM;QEy}5qq!nvtK!E^wBBDFcYwicyTSW?uOOx%SS@bQL(ia~JFvbjU%Nxcu7i^^%&f)-%xDIO8|YhdR( zqE3fV1lh}fft`(gc4k3T)B=0>+Q9xPkfGXkOTt~og==`!prDXqHq|9gcLpDpCl3DuuJ_o6*h`u_|v@?)jmj-)HW4aQ7BBhNnUMSAM>tdx+1XE#yx zeAw>>5=imni{69FeeHdjk1r+{K9cp1A-?`qN&smAgnUN)=td*H35g~2BsUwlaD#bU zxr24ufv__o;E)Z-;JWl2c(a|g{JyYQ5NgyKM!{DJUPTS$FGHy$g9t4k6wf4VD#2)> z!)=n17imC1%=ErjC3S|3g+g1;uEJTxE=m#`b#ajRk-*ebr+#4@vG znBg}gvz<~_xyi?qYqX#ipNl{YvFV&cnUSUWi&Xv;tgY@}!kn))cIbfo%t;vL?^InFdIr89fjW>akEoHo;?UXwn1Hf=;odR>Rd9< zv91^~Wp=*RKVcfda)Qjv*pT$pMIV=`@bfG7bE%8Bgt0f7QOYx;5~2>?^joD)$WwUB z^CwYZk1^3F?Q8!t)n?1FlDkEFhE$SjOgdWL9rQto;JWhQ8|nHlL@UUsZ|C{G?Bw& zQ;^XJLdBTSY}gMk&|YH6%`dowdmnp z04dqFqcq&4u@JRN3Qo?n1yKCIwTb=*Upc7$b>AOv`;S3YmLUCKdVnGBRd4o1)aOlR zklhEB2~jHZFDs>jhQrCw*%b&*6E4OxzSX*<5n793R_yd?e}ea3S@{#cGoIQ?_EV6P z55wyo2Dnr06i7UwA7Cy+ij9m^`1}Hz#v!vZpg3?x0_YH8{cp5~=6_$1I1_#1;LAPB z>vfzUo3v!DtgLED8KpQ~BHaD__z}Z{7djVM<#^#>Vbg&GRA%!h{y?V%yx<{*|6ZHG zhVZ6(N=SIvoWcUgc8r&`GGB}+Ywa_h&dwL4Xreu^r~DC%1HW-uL@*@Q{n-nCBG+Av zp8S{~IDPXP9@VR3uaA?ar0^|{W`r6V=w=DH&_$M_p$;Ykx?-vizBPW}&~I%=s{Oj- z)VVh)Wg-TazCpISY4H8`=<~x6$e=t-!hd8?X0A4Y89cO;=N0#YkPhr~%9b*}hX%T9 zHtj?ArL)vd4;v#}i2QhJRBWY+9@F4{ThuF>mw`SuQ8_{Q$dN zH&?q|S$k^z#FB=AT|`Ey{GTEw{uMFeg*#?|eSse0-1Rwos3Y*zt&pO|zFH7pB2ut1WheuqR-{VKxbvw&3=Of++W4SrQ1tO^B;K_$(g3Lm+Jh zN=%Ktjwry6S}Y5!Wt|-{kvKM!u(u}z^@X$1ikw>9hurPr*J;OE_=|8(9kjW{s-KR_Vx z6aJfI?+BOCzBloAU!XN2jmk*EGWhQPL`y<0F&Q~-X0Le|bum{f^Pea46+^vdnGhrc z5dZ9tR9k~j*$o2oJqbm zR%bpJOwDI zFO`2nk&VP?d^~m5i-MGKtaq9+)qc2XoM9cTGXyX?Wwr3Sy^_v7XQ=1;g-l?qhgW}Q z?6E?mb;abZFeis8WHC&#FI5c3pTO;g4(O*@7@HkR-}=Ya@5@VfUX7f0)OS7gRfU_u zgcI_+sBL0VI7@dPWnA0#Yr5K@9$^AkJ@!4rwvg|TiQk1h1aX*@+9F1g)6}bGp(_y?QmGQGzHuO^F$jllzG1{*M1al3Kp!y1>cvn_2FR#{a05 z85PxUnoc@|xH^0A*!o)MYJi#)x={Q#m>Ed(qYvZqs43dJ^ET zN^sB~6C?3>w8@Hzu^5gM$H6?*J#yo+SZTJ^Altz^9S@CQ}xg=L2ns6;XvUN>MA+%`QVjOB!1tJZ>)qx&1G$_6(MS;ubp;DG| z0}+ZgDYBV%I?cTAKo|ojQm2~oUnLHpML-g}3e(4OaF#%0s6N<&wCaE*7}74#a!Vgk z^+_IG6M$?xz=njLSX$XY3L-#y3=iq{O*-R^IC+ zK|CrLhqMprHfNeVeq|xtUPvFGxFQ!*Qc58NY+Dsn2#Gt~5U`1og)DdaE@j!rvMNjP zt_j{pcL0uN?dkc7fF^{jU_mw; z=FN{za0m-x77sowuC&pA0U{ zXl&R)&y7d^dh~%_V)qj5Z0(mb{*{E_YC4b@MOu>63Q2(56g7H{45Bqb2wGEaP0l;W zXH!m{*<6c!C?9P!k^tLt`+`>J(7y3+c*7p2ZmnF5UEdM4hCf=!2TR0a7&L7nbLNix zjT|#!Sh($hws!2W|AU)R8ZK6Bx(OQwCa(J=4@BW^&IU)&#jH@FfyPG0e;Wa#@7EV; z*=lHiS5`)?KL`C0{dh~hBdog^;a+)rvL4yifMj#0b4Svp#x7y|k^I;Os!*|#D=n6e zEV_ER#xLaQTY~$7F~3um~lS zS}_}zKWpNM$q#;PIN{NTqe*L1XiS#Di^1R773ndGn>C_@;ZzET6E_sHU|Yz330uGu zjI_#AA+9#Dm~CyH_?2zlpV#So16-0cv2sT8pT71n>{b6FuEGDsX*oCJ0w?#8fb zq1*`&3IHqHQsJwh>e?kqa!{tvYC$f^QD@&B`M$7hME|q9p&kncGZQc1TSNA>0m61d zeKdtW(pyva%kQ?JfrIj%#jP;CJx{Jm3@1JOL;UT$kY9h2eL{4M1s$3TILPx5V&!mKYDG^(D9?884xn^VJnrko;g)%#g`KvK)?NxFWWcMjRUaU5l{TFb~lS<{(O3I>zN zLj9Rp9kaXlP}UzjE1w=xyib0(YZYYFk0Y=c(my+%&lE1+U&xBbM-+f4n7!YiBjZ9j zK)bVpCL5&0IFQ1$4Zk#N!_9s^jb}Xm6AZ?=@1oz-Rx}X2g#ms;D(jRs`tKKgvf4D6 zpB=tWYs6_({zs=J49{W9hWZVrb1zg>tpnBnFedn8FR4}R0{h}HFz=N`Aw2GvB3Dm0d(+FyIm$^=tO`RL8u7Lh+RWLylTO$sIl@1m&ZQcuspm_HS9p1y7KK}lBiV%bp#Pp zQ8GVw*;@nM&7&@77Aj*&CR+;!^I89$1uMPzQmEix#0+gbt|p|!c|KIe+uls&P=LOx z%V^wKx+OYD)URK&zGZkbpW!ytUbPN2E0kkT*zK4iG1LI9n5=IN1lJO+YGflu&Pgd< z7QJL{kC2MpDX`qtZu0w0K#5Z#8QF1izGHO;Y7z1MBc>1HIX^M*;|%PFwGv|HXQPU( z1Z_<56()w+u{lq;C?jHK@ zh-xsl5`Kqd?+6ggnF|(fB2XdCI9Le8_6tkJr5JM1(Yy`^N^yiXw;T08=+7nI!7?-* z8D{z3#4p-gWCZ~SHxPF*%;*Ro^S_+1K>9-1=+z2!UcKRZS6ea`zVO|JWq$rJ@y`nb z=J{GE+RWazizSOZgKiWsB7qSQULQrDSu--6td5IM@5XhVpuggWa^n5Ba_)W$Fu$}U zro1Z_Rk;Ao7-u1m10Vs2%d_oxu?ND2dW)78QO0mL55Re3=LMMdwxDi z#KusHsSlM$;i|ZLvK@C|E#z28K35{AdQtqbbVublJEC4>T!R3Q4HH&jq;fLlwJQZ{ zlL1CvgB({gS@LR>QlQS(aMe<|)Y>1F`28Khx9(fodf23iNYn;H1L9!*xFdiswjXb8|9v;wo;;hL*(CeW35o zuPbrYx5OvMv&8q22jFRTu5s?^X%UVzqN*EH=@&cBeCq*(IqAw9&s8+2w5n5p7*lClA&j`-aB_-u=!sk`wG*)JCpbSj)JBq|kcuF`jyvi}QEm79$GJ8XdNBM0hpoHAqVTxGA z2F>W#!}bYT%-lGe_btU3M4eOmq}>DyZV|jE?2--I;2hv9cxCo(sC-7ev`tB=T2^x_j;+5w2m=%+o&;}ufT8S>Bcg7UOFCwUcOj@t2Q|;c#nnIkA3w(!owj@T81PPp@{hje0prr&=>;$c#+lg zJ8)LgFWiZW{QQXONyJ7MJ`o@yWubqtS*b$Yu#df;Sl`%?xo+!2 z4R~d3Qg0R-teU3q-ux*e1L^(=m3(1E?&$#!5*7iopq_$)v4eko+aw9Y#rAFEkvHQE z4myTEGC<7&F|u$-HT)aT=@K)!IhkDlOq;99I$h*kXrUUEv4vGW3m1N{)URKnSv6`} zi$FTtkgE{}==`)o%b9@39d7)(`Xn~8C&2GTa2&0oQuM@CJvb*s^hKZ;?Y_GK8IT32 zCKhjR@hsTcDk@AM^uHgAJ~AmfL7LZjWF^t3AY(}0Zu>o0`YxslDe-8$3UpkbpK6WW zJ?-8Ez3m3|zmd^Uym%P;ly|~z4n-P99y-jS**yF|G z5DuLqgJYDKkp{s-Sh2r%1N`}3%Qz;~RzWZt66D+d_|1QFNS##R{tJ>AA1q}2QSntO z+!EDqmIwm7>8BR1J+(rdI}`huYZg#)hae)ExT0=p=Hi3xRb8_F+?SZEEPFb;BZ}AJ zDYvEegfzKC>C(5O98@(qRic=b6rbf5<^P3Xo&+i4LSCj?rb4R%N?VKVFoL5-!%`mJ zm{UW!!77qq&cDei^wAAHGLb>s#PLHBs?xz!*tt8b4jxMr(687q-})F!8p~arVt?ry z;QaZ<%@XFI)x065krAn#M8W^@jCa2`*LF6siO>1Pc9OKdj5rE?9M_>V{+^$H^GK

    F9 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 IBuqp97Y5IkGXMYp diff --git a/icons/mob/simple_animal/buck.dmi b/icons/mob/simple_animal/buck.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1ea8af4e08751a1b13cc842f957b794433844b0d GIT binary patch literal 1410 zcmV-|1%3L7P)-POrWJ}Q}gQ=EQOriWS@8XBF2X^(YHvyowjZb>>b zDKso1Qbsg=XGCLAHe5?GY*;#TUO%Lgcanc&V^B9+OEfz#AUrT3H!B@KH77(lDq&DK zNz)|k@I00001bW%=J06^y0 zW&i*He|l6{bVOxyV{&P5bZKvH004NLQ&wi?^C?`dUi!&v&s2HS)i!-e#F*g;&HbhgU zo06J{q|^|f(&C)d)Pl^sbX>}n6$F&V z$38@&FG`L;pobFxe}>@(z@K4+{S!wHv3bXy91`rK3ag^+P#BtQWTqz_;)W1ej z@OlKs$3UVZ=h%1B*#Pddn3)6Sxr~`P@afixv1=6B6^r9Ej^V%iGR~4L%M$oM;!j5D z;ph34D2hT{2H6y26oCF1Jg@f%S=G#&AfRpAF@Q+XTrR+WKHmo{ zo2FR?04+ukfc7PfG!Ph=9T+T^%YZ@Fu2w6To~EgwAp6-2080Ev53|(`zgg|;EKSQ9 zb{d21F##7KThSOFI9NK*`JT=gS2QXnX4HSDKNz&r$+QgsS^(_ooGYb!PTtUa^bY{0 zVZa~uXIIY!_)FO_%2JP&(;udQ*12~QoI0-g+gpw3!;?S@Q$TMw!J`8~DJ2P^j~;&< zft7xH0B&87;{p*~e!S_8Lf2GrR z{ANuz8n&cx`%@RQ`^=YsSH~2@X2693(Fnky#Wa;WT0m0zam8P}~QQ1w03$cnSGAqY_5K4oSoRD&zNdvoa8Enwr< zMZb&a+_6qpBJWPXWS~YY3y;T`u2ZlIe0h6|_eO*d3;ccLD(A5MEh)Qn$7D?3CG=&! z!krQMCkZ}~z(JU`j0u+gDjUq>^`%e`8}%H(N_IJ1-zSFd;W99X~ZEL^ P&i6GEH*DD zFen{QLNGNfAv7x>T1z!4Bpg>sG+fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainG zjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)q=}0&ttc@!6~s0~Q>B}dnuw&- z5TDZGoYd5U%)E45%9Ryd{anBf1^}xkH384KH1q%f1B6LLK~z|U?U)U7qA(DKi5nn5 zH6RGRR;#W3xPJZrzjwPE!H5ZrSDm?=admLQi|><<1vdu4HLmf0h3I{rs#_O2FA)2*awi1BuOYo0cZqidQ6b9%J3CS&lhEwBup6g zC!-rsnS&6esdACq2$Sh_nuKHiIMGVYW=e{zZ;nB7zB`giZhJ_fo4Yri^XEVAS~;;cIizMNCj5zMwp|=pJt#oZx6t&13OlP(7I_VM1a#D4es&FB_4eMrw*Fu92yF|6&eN0 zrQ6`XzQ^Z19Z%Bv8NXWcjYcgEZh!7#_z?OA;MHjeu-fB>0l^5sq0^+S_ANaG2p@un zZ~)-c`v9*$c5aOZYtIt+_06LNz=jvFe%d|<&)cW9Gy&Q0LzdtW0rQk)IJ07d(h*^a_Bcq0#Q4pX}g*!Xqmb`h;R)yWOS?FBR#tPxY? z@fg$15Uc`U-`&x@(S3gsOWgjZJi6%EWK8b}U76p|&Ik@1V3*4@z_g!bW4hU%>#Et6 z`4#i_03qR~9o=rTcaUXcI>vGdipzUb=F^&Jdxp3J%H)Dc11rnMbVI;0984y_as}#e zh9deOrqaAsYUjbqGQs~J_;m|lf&kiHDSW2mBew!voLxF#7FbyprG*~S4ZyNoL2oOX z;je}i)QNUCc9;c77}O1601!k{#sv+M9DuU`PSFYQxUm3M!-RWc#zO3r6&BEbP0+m)&q(;=I72{{hC3 VP@%J>%wYfk002ovPDHLkV1oMWH-7*C literal 0 HcmV?d00001 diff --git a/icons/mob/simple_animal/fox.dmi b/icons/mob/simple_animal/fox.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e09862583037c3143763d3776927a8a558fcc48a GIT binary patch literal 1186 zcmV;T1YP@yP)4-e;_f$!<&yh|R^Q6A=3ALrrUz)c^sNF2~nAEZMY z*i#&YizDyphVnnikYM@0Rn?oP2ZBnt4gt(@jjXxieK_GlRBXc<+QZy+* zEG5;@&gi?^C?`dUi!&v&s2HS)i!-e#F*g;&HbhgUo06J{q|^{asj`Brp9|Op z0PgZ8xAJ>;-v9su97#k$R9J=WmupwzFc5~Z+$NfGNh@SqTdS_3fQnFB4*UQA*G?h= zZJIQ!XLr9a=fG(@$@^q-oirL}JKNd*v0WVf|B1iW98vee(fXUx-?S5}Xh*B_zxfNl#~UC{ZD4cpmKx&kPn6n_Q)5U>NZ+HS9{ z2$24O4*L2C2oQ=t3jhq={-9U>%9xCRF-BP4OAKX3Y1s)jk1Q z|DoWB((#xxRwSVI^^a@c5CQS1M|2T@u)ThOIy@{Dxruz=k8bo0BRB?{ApjVSMsX}D zQa=oNxi28{Z^K(Z(hf3}T~sm4gy<+nClwI+5TL$N4D~}KXaSxCc#0q5#yIhTxTeH5TLi>P5GKP6uBqySKQGE69aCNI+|M~ebpr7uF5PN&)c&@TZM`p}rn zX7jo5pu+U!_3d5L#KmG^*lOSjn^yt==K=s9%hh84ak;7%NY@$9)~Obd`dOa&MZceC zTuzI0eJrE{9dYqE0kDxTc=+UYfOgN- zUTP`<@);=4ECIbi-&GRrvaOc;$Hi*-0phIZ+~z6*L&hj|Yl^mZF{KLzma_E3MzkLXr z7S=|1N(gEnTa1x4p>mek%rYB-Zl2q%lX}yyR2XjAwsxi0n_;i%ZGYA8Rkdc=Ew{aG z{cd{_ptRpxofjtoN+*`piC3?0I&;6T|M!yn-!yD#N31Q58vpe_BaI zK~zYI?Uk`=!!QtrExLI0Sr*QkH>eTDa~?ss7tyhU9v}qajLA^Y+95P~+nP>y5>+sz zOYv_!oPD2scRrnpV%4fuzm=G;oIR_ms8v@rvt=bK?k~36KL>UTfn7(<#=LOAj4{w7 zeWILW4ge4V688tnyEpc_41w7Ie@EOO$%7UxTk(DJXSyEZh$Brx9gqW{2p|-q)mG97 z+6|4N^irKj{0cQr-7|5x1Yp4R<9Z_*C=ES}IRQRjEddH;wM1H^asy#Q?fdP{06c=S zG)V{-mUIZ=OiTeV-^Hp`|3G4%G0B|C0^Y!YW&zM*r+p3((P<$32-;+}aaheqv5?a| zS4{Vldjhmxdqk7Tx`~Fpb3J0NO0wZ!*y8}XAt8{T2CZ|M_`e;HIm8Pj8e9}Y6k;OT zBTq6aLZU7%WBmYlihtB2AZdlTRT4dHwpdHsxmd7az5s5>NCz*=#a#dZ002ovPDHLk FV1mctvIYPE delta 407 zcmV;I0cifs1jz)DFCX%{<3d70?9k*-Pfq{<07^2D{Qjt!Oe^yCE zK~zYI?Uk`^gD?<=?Wv3$#v*GTA+k{BJc30psAC83ts;wzVW{M_L)7GLYjwIatr4oa zRQ!nH;68J|vCl%RTD9u8lJUyLQDsS^s;pS7N>%cFx!wLba99W&b~LQ*BL{4k0xi-f z+Bud0012S*_)2;A%w88Euo&RPe}M*jHsaghFLXS_4m)Z>d*lFU0!WS6oBoAWz-lPG z(q~e?MuP+WKoQ1~0oV8IjX2N-T2^y024KL)Q%?Y)d!vwgE;bN0G``>N48RlUo|=R( zGSku0g@h6y-eT3Ne;^rq%%sm`0dHZCb^*}f&iEW4lhZ)@4vfugv5L21ZK;OXSM2Vm z^a;>-;}LDfb)7VO=UT+vEUB7*;fQ<4H3^CQG-#a5)c=)$EFm4>JAjvvlsJ)Uk(*2= zVWNk08mk#Vq(5pFNS8voR3@5TY^jzmXR%r@a6G002ovPDHLkV1j9& B!Xf|w diff --git a/icons/mob/simple_animal/rabbit_brown.dmi b/icons/mob/simple_animal/rabbit_brown.dmi index 031f8b7d6f04328e38e091f9cdd2d365562755c4..14279271ab10cc1a880d9c323a4e3f610cb49a2a 100644 GIT binary patch delta 415 zcmV;Q0bu^n1knVLFCv3Km9cJwFbsx?x-epbMb~?Sq6nQj-WxQcKGbd<@&MH-qT?-<*!u(>PCeaI z7Im_dHV9Q+Dt^RZ@E3lE#L2Q%t5*G1YPwSKq@v(aS(GByg)U^i+HC$D*ewKh4G$}O zF9F+yKui1yIwukUAOJM&pE>WI#Or*297POpkU;&=ixFQ3f8^s4b=2K*OO_-6$N+^z zz3DY`05u?Y;j;s#`qMVg400x4vbB5Y_U?d zVx@!XG^m|R`2R{Ekq{2>9Uv_P z79+j2B#R6tAyN}gV>ts{g+FQzh?YXQR3gnTwopr#bGBf^d;<7^MFrp6dG-JR002ov JPDHLkV1h!Ow{idg delta 414 zcmV;P0b%~p1kePKFCy}~<5@r`?9k+5M=JmT0AEBZOgABDKNeR%CcwbJD!;EUkx`I; zT1iAfR7i>Km9cJvFc60ER7MVC(KU~NEEILj8`Po~q;4I&w~8z>W~sy*bnXx}%2U?r zba%8ysOnPjBZhz7xj)&M`cSkKDasUhgRD9jr z{+T$4o(**rv^f(01}zSBmU3{80q6Jgg;ZcHv^}+u8)I&1{PEZmATzzyNNdhP0N2Zv z0eAq@(;^MHdm4}9cp{+!htt4@<+`Aaw*8AGSTc}lUll*vjrRG6BeXIzhZar6951J07*qo IM6N<$f~kwWA^-pY diff --git a/icons/mob/simple_animal/rabbit_white.dmi b/icons/mob/simple_animal/rabbit_white.dmi index 5ac0a288b04338464054d80579670c00106a5e78..7a9ebec3f1d3e9e851a6507d3149b6214b40c996 100644 GIT binary patch delta 433 zcmV;i0Z#tX1lRaq z5)k$lF9nTVLX#KiYt?kRlUoH-x)lG$!^!tacjuFoB&$}f`mMzD#Oz5~My)){nJqJ! zaeuMf{W-8-2<&TW7UqEirVW7x>4>tHIRHQaNIX1K-afI}_-_943fzr^hm{VU> z6}8_VI|3xC(-LXUX*GHVTrXD!;1N_ulZ27i-Fwff1TekHs#X6$V(RtTITHn(fi0Q^ zK#8?>F+c>jfp%~$XcO6Dn+*$C$bLFkO#PGl3@Dv;h$fPC!2xM)gBYulEcgl^xP{mu zA&}n&rL~dxzZ{S`gcE!R@DPF!XOa!_B#S%_)L|L(8^B%oqizASRtQ^Vrkl+cYH2$s b3pUIrlK4@JJo3Ga00000NkvXXu0mjf7!J`@ delta 427 zcmV;c0aX6j1kwbMBrPOROjJd{z`(Y@zw)}{&ePNE(B$Uk<^TWy+TGo%va-m`%)r3F z?Ck6+1wE6IRFHpMNklIT-ybaj zGG(K{mqwLa-HNx&P}qgepdxYIrb zi0C#Dz5{b@5=X4$tysu@>?>yXllugyz4nMEk#!X{d*@oj)Go=2uke9;NHqz8{5Gha zOT_=>fXpGD;5&ea5QR9=rbV7)vq diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index b71c35581b..76685fb08d 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -42,7 +42,7 @@ environment.merge(sharkmaw_chlorine) visible_message(SPAN_WARNING("\The [src]'s body releases some gas from the gills with a quiet fizz!")) -/mob/living/simple_animal/hostile/carp/shark/AttackingTarget() +/mob/living/simple_animal/hostile/carp/shark/attack_target(mob/target) set waitfor = 0//to deal with sleep() possibly stalling other procs . =..() var/mob/living/L = . diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 2ab9e42e27..0bd9e273d5 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -1184,7 +1184,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_starboard) "acE" = ( -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/tiled/dark, /area/exodus/security/tactical) "acF" = ( @@ -2739,7 +2739,7 @@ /turf/space, /area/shuttle/escape_pod_3) "afX" = ( -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/security_starboard) "afY" = ( @@ -9159,7 +9159,7 @@ /obj/structure/bed/chair{ dir = 8 }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/evahallway) "asY" = ( @@ -9552,7 +9552,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/arrivals) "auf" = ( @@ -10065,7 +10065,7 @@ /obj/structure/cable{ icon_state = "2-4" }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/security_port) "avl" = ( @@ -10543,7 +10543,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/library) "awj" = ( @@ -14856,7 +14856,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/mob/living/simple_animal/mouse/brown/Tom, +/mob/living/simple_animal/passive/mouse/brown/Tom, /turf/floor/tiled/dark, /area/exodus/security/nuke_storage) "aFw" = ( @@ -16148,7 +16148,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/evahallway) "aHR" = ( @@ -17493,7 +17493,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/bar) "aKP" = ( @@ -29894,7 +29894,7 @@ /obj/random/maintenance, /obj/random/maintenance, /obj/random/maintenance, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/locker) "blw" = ( @@ -33588,7 +33588,7 @@ /obj/random/maintenance, /obj/random/maintenance, /obj/random/maintenance, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/research_shuttle) "btf" = ( @@ -43654,7 +43654,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/tiled/steel_grid, /area/exodus/research/storage) "bMX" = ( @@ -45534,7 +45534,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/engineering) "bQU" = ( @@ -50469,7 +50469,7 @@ /obj/random/maintenance, /obj/random/maintenance, /obj/random/maintenance, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/research_port) "caT" = ( @@ -50539,7 +50539,7 @@ /turf/floor/tiled/white, /area/exodus/medical/patient_c) "cbc" = ( -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/research_starboard) "cbd" = ( @@ -60224,7 +60224,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/storage) "cyF" = ( -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/tiled/steel_grid, /area/exodus/maintenance/incinerator) "cyG" = ( @@ -62645,7 +62645,7 @@ /turf/floor/plating, /area/exodus/engineering/engine_room) "cKI" = ( -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/engineering) "cKM" = ( @@ -62978,7 +62978,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/exodus/maintenance/engi_engine) "cLK" = ( diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 07c49269e3..fb7bec6335 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -243,7 +243,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/mouse/brown/Tom, +/mob/living/simple_animal/passive/mouse/brown/Tom, /turf/floor/lino, /area/ministation/cafe) "bs" = ( @@ -7634,7 +7634,7 @@ /turf/floor/carpet/red, /area/ministation/detective) "HR" = ( -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor/plating, /area/ministation/maint/l2centrals) "HW" = ( diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 9001eb083b..69a8ed5e96 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -708,7 +708,7 @@ icon_state = "4-8" }, /obj/machinery/light, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor, /area/ship/trade/fore_port_underside_maint) "bD" = ( @@ -1584,7 +1584,7 @@ /area/ship/trade/livestock) "AO" = ( /obj/structure/hygiene/drain, -/mob/living/simple_animal/mouse, +/mob/living/simple_animal/passive/mouse, /turf/floor, /area/ship/trade/aft_starboard_underside_maint) "AT" = ( diff --git a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm index 3e1f33e5a8..c970be7f22 100644 --- a/mods/content/xenobiology/mobs/slime_feeding_helpers.dm +++ b/mods/content/xenobiology/mobs/slime_feeding_helpers.dm @@ -16,28 +16,21 @@ var/global/list/slime_pain_messages = list( if(QDELETED(src)) return new /obj/effect/decal/cleanable/mucus(get_turf(src)) + var/remains_type = get_remains_type() + if(remains_type) + new remains_type(get_turf(src)) dump_contents() qdel(src) . = rand(2,3) -/mob/living/simple_animal/mouse/eaten_by_slime() - new /obj/item/remains/mouse(get_turf(src)) - . = ..() - -/mob/living/simple_animal/lizard/eaten_by_slime() - new /obj/item/remains/lizard(get_turf(src)) - . = ..() - /mob/living/carbon/human/eaten_by_slime() - var/chomp_loc = loc var/list/limbs = get_external_organs() if(LAZYLEN(limbs) > 1) var/obj/item/organ/external/E = pick(limbs) if(E.limb_flags & ORGAN_FLAG_CAN_AMPUTATE) E.dismember(FALSE, DISMEMBER_METHOD_ACID) . = 1 - if((QDELETED(src) || LAZYLEN(limbs) <= 1) && species.remains_type) - new species.remains_type(get_turf(chomp_loc)) + if((QDELETED(src) || LAZYLEN(limbs) <= 1)) . = ..() // Simple check to ensure a target is currently being fed on. diff --git a/mods/valsalia/icons/posters.dmi b/mods/valsalia/icons/posters.dmi deleted file mode 100644 index cff06cdbabe668a844737bc8488aebaa5bae461c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6572 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 F{|^oNsp|j$ diff --git a/nebula.dme b/nebula.dme index 345a9f2b31..482505285d 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2882,6 +2882,7 @@ #include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\simple_animal_codex.dm" +#include "code\modules\mob\living\simple_animal\simple_animal_combat.dm" #include "code\modules\mob\living\simple_animal\simple_animal_damage.dm" #include "code\modules\mob\living\simple_animal\alien\alien.dm" #include "code\modules\mob\living\simple_animal\aquatic\_aquatic.dm" @@ -2901,10 +2902,8 @@ #include "code\modules\mob\living\simple_animal\friendly\frog.dm" #include "code\modules\mob\living\simple_animal\friendly\koala.dm" #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" #include "code\modules\mob\living\simple_animal\friendly\possum.dm" -#include "code\modules\mob\living\simple_animal\friendly\rabbit.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" #include "code\modules\mob\living\simple_animal\hostile\antlion.dm" #include "code\modules\mob\living\simple_animal\hostile\bad_drone.dm" @@ -2940,6 +2939,11 @@ #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\giant_parrot\giant_parrot.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\giant_parrot\giant_parrot_species.dm" +#include "code\modules\mob\living\simple_animal\passive\_passive.dm" +#include "code\modules\mob\living\simple_animal\passive\deer.dm" +#include "code\modules\mob\living\simple_animal\passive\fox.dm" +#include "code\modules\mob\living\simple_animal\passive\mouse.dm" +#include "code\modules\mob\living\simple_animal\passive\rabbit.dm" #include "code\modules\mob\new_player\lobby.dm" #include "code\modules\mob\new_player\login.dm" #include "code\modules\mob\new_player\logout.dm" diff --git a/tools/map_migrations/3987_deer_foxes.txt b/tools/map_migrations/3987_deer_foxes.txt new file mode 100644 index 0000000000..8c6438e116 --- /dev/null +++ b/tools/map_migrations/3987_deer_foxes.txt @@ -0,0 +1,2 @@ +/mob/living/simple_animal/rabbit/@SUBTYPES : /mob/living/simple_animal/passive/rabbit/@SUBTYPES{@OLD} +/mob/living/simple_animal/mouse : /mob/living/simple_animal/passive/mouse/@SUBTYPES{@OLD} \ No newline at end of file From 3d64fbf9b957079f859ac0b4f5402ca04e24c187 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 May 2024 14:44:29 +1000 Subject: [PATCH 010/212] Adding prey animals to Shaded Hills. --- maps/shaded_hills/levels/_levels.dm | 84 ++++++++++++++++++++++++ tools/map_migrations/3987_deer_foxes.txt | 2 +- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 985025db9b..0b1ade8bae 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -10,6 +10,9 @@ /decl/material/gas/nitrogen = MOLES_N2STANDARD ) +/datum/level_data/player_level/shaded_hills/proc/place_mobs() + return + /datum/level_data/player_level/shaded_hills/grassland name = "Shaded Hills - Grassland" level_id = "shaded_hills_grassland" @@ -25,11 +28,29 @@ ) /datum/level_data/player_level/shaded_hills/grassland/after_generate_level() + . = ..() + // Neither of these procs handle laterally linked levels yet. SSweather.setup_weather_system(src) SSdaycycle.add_linked_levels(get_all_connected_level_ids() | level_id, start_at_night = FALSE, update_interval = 20 MINUTES) + var/sanity = 100 + var/mob_count = 0 + while(mob_count < 10 && sanity) + sanity-- + var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) + if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(list( + /mob/living/simple_animal/passive/mouse = 9, + /mob/living/simple_animal/passive/rabbit = 3, + /mob/living/simple_animal/passive/rabbit/brown = 3, + /mob/living/simple_animal/passive/rabbit/black = 3, + /mob/living/simple_animal/opossum = 5 + )) + new mob_type(place_mob_at) + mob_count++ + /datum/level_data/player_level/shaded_hills/swamp name = "Shaded Hills - Swamp" level_id = "shaded_hills_swamp" @@ -41,6 +62,42 @@ /datum/random_map/noise/forage/shaded_hills/swamp ) +/datum/level_data/player_level/shaded_hills/swamp/after_generate_level() + . = ..() + var/sanity = 100 + var/mob_count = 0 + while(mob_count < 5 && sanity) + sanity-- + var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) + if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(list( + /mob/living/simple_animal/passive/mouse = 6, + /mob/living/simple_animal/passive/rabbit = 2, + /mob/living/simple_animal/passive/rabbit/brown = 2, + /mob/living/simple_animal/passive/rabbit/black = 2, + /mob/living/simple_animal/frog = 3, + /mob/living/simple_animal/frog/brown = 2, + /mob/living/simple_animal/frog/yellow = 2, + /mob/living/simple_animal/frog/purple = 1 + )) + new mob_type(place_mob_at) + mob_count++ + + sanity = 100 + mob_count = 0 + while(mob_count < 10 && sanity) + sanity-- + var/turf/floor/natural/mud/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) + if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(list( + /mob/living/simple_animal/frog = 3, + /mob/living/simple_animal/frog/brown = 2, + /mob/living/simple_animal/frog/yellow = 2, + /mob/living/simple_animal/frog/purple = 1 + )) + new mob_type(place_mob_at) + mob_count++ + /datum/level_data/player_level/shaded_hills/woods name = "Shaded Hills - Woods" level_id = "shaded_hills_woods" @@ -52,6 +109,33 @@ /datum/random_map/noise/forage/shaded_hills/woods ) +/datum/level_data/player_level/shaded_hills/woods/after_generate_level() + . = ..() + var/mob_count = 0 + var/sanity = 100 + while(mob_count < 10 && sanity) + sanity-- + var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) + if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(list( + /mob/living/simple_animal/passive/mouse = 6, + /mob/living/simple_animal/passive/rabbit = 2, + /mob/living/simple_animal/passive/rabbit/brown = 2, + /mob/living/simple_animal/passive/rabbit/black = 2, + /mob/living/simple_animal/opossum = 2 + )) + new mob_type(place_mob_at) + mob_count++ + + sanity = 100 + mob_count = 0 + while(mob_count < 5 && sanity) + sanity-- + var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) + if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) + new /mob/living/simple_animal/passive/deer(place_mob_at) + mob_count++ + /datum/level_data/player_level/shaded_hills/downlands name = "Shaded Hills - Downlands" level_id = "shaded_hills_downlands" diff --git a/tools/map_migrations/3987_deer_foxes.txt b/tools/map_migrations/3987_deer_foxes.txt index 8c6438e116..b3a20754bb 100644 --- a/tools/map_migrations/3987_deer_foxes.txt +++ b/tools/map_migrations/3987_deer_foxes.txt @@ -1,2 +1,2 @@ /mob/living/simple_animal/rabbit/@SUBTYPES : /mob/living/simple_animal/passive/rabbit/@SUBTYPES{@OLD} -/mob/living/simple_animal/mouse : /mob/living/simple_animal/passive/mouse/@SUBTYPES{@OLD} \ No newline at end of file +/mob/living/simple_animal/mouse/@SUBTYPES : /mob/living/simple_animal/passive/mouse/@SUBTYPES{@OLD} \ No newline at end of file From f507ec4024804e7c4ee45c6d0875bdb6ba677495 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 May 2024 18:51:43 +1000 Subject: [PATCH 011/212] Missed changes for zone selector tail change. --- .../hud/screen/screen_zone_selector.dm | 2 +- .../client/ui_styles/_ui_style_states.dm | 1 - code/modules/mob/mob.dm | 4 ++-- .../styles/constructs/zone_selector.dmi | Bin 637 -> 533 bytes .../screen/styles/midnight/zone_selector.dmi | Bin 1177 -> 1013 bytes .../styles/minimalist/zone_selector.dmi | Bin 890 -> 780 bytes icons/mob/screen/styles/old/zone_selector.dmi | Bin 616 -> 511 bytes .../styles/old_noborder/zone_selector.dmi | Bin 493 -> 428 bytes .../screen/styles/orange/zone_selector.dmi | Bin 672 -> 560 bytes .../mob/screen/styles/robot/zone_selector.dmi | Bin 720 -> 602 bytes .../mob/screen/styles/white/zone_selector.dmi | Bin 628 -> 536 bytes 11 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/_onclick/hud/screen/screen_zone_selector.dm b/code/_onclick/hud/screen/screen_zone_selector.dm index 58f4ee963a..008d2b9026 100644 --- a/code/_onclick/hud/screen/screen_zone_selector.dm +++ b/code/_onclick/hud/screen/screen_zone_selector.dm @@ -1,6 +1,6 @@ /obj/screen/zone_selector name = "damage zone" - icon_state = "zone_sel" + icon_state = "zone_sel_tail" screen_loc = ui_zonesel var/selecting = BP_CHEST diff --git a/code/modules/client/ui_styles/_ui_style_states.dm b/code/modules/client/ui_styles/_ui_style_states.dm index aa9ce6559c..bac1d05371 100644 --- a/code/modules/client/ui_styles/_ui_style_states.dm +++ b/code/modules/client/ui_styles/_ui_style_states.dm @@ -135,7 +135,6 @@ var/global/list/_ui_expected_states "uphint1" ), UI_ICON_ZONE_SELECT = list( - "zone_sel", "zone_sel_tail" ), UI_ICON_CHARGE = list( diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index bb4958c7d1..f2a3a63512 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1038,7 +1038,7 @@ /client/verb/body_groin() set name = "body-groin" set hidden = 1 - toggle_zone_sel(list(BP_GROIN)) + toggle_zone_sel(list(BP_GROIN,BP_TAIL)) /client/verb/body_r_leg() set name = "body-r-leg" @@ -1054,7 +1054,7 @@ if(!check_has_body_select()) return var/obj/screen/zone_selector/selector = mob.zone_sel - selector.set_selected_zone(next_in_list(mob.get_target_zone(),zones)) + selector.set_selected_zone(next_in_list(mob.get_target_zone(), zones)) /mob/proc/has_admin_rights() return check_rights(R_ADMIN, 0, src) diff --git a/icons/mob/screen/styles/constructs/zone_selector.dmi b/icons/mob/screen/styles/constructs/zone_selector.dmi index ab25fc71c2da421d2b8f0fea1f3d0c1c056e43eb..698da564e03b6a78625977d71a902650773355e3 100644 GIT binary patch delta 410 zcmV;L0cHOE1eF9KiBL{Q4GJ0x0000DNk~Le0000W0000W1Oos70D)9z$B`jA0dbLB zP=6=BBr!8biHkEOv#1y-Zpg)%R+N~V3SlcNxca$(jRycpz#VfVpn8)400AgTL_t(2 zkzJB8ZiO%mhUpFJ;N-PqAIn>#p1_hXkRb=iV$?B9cpX_NYscQUP6Cx)BO$@Z7dt;@ zc!G!ZJecdl@`Lf`%SkWehYQ3|5hPUSFoHOj!f8y% zR7%N=BT(NG<0UUPS~EfIg4%`ll^LlSHfocXSz5>p2ug-v7)sT&#~k#5P9SYs%#VTKAW8u;3cIct|B zS<{?G`7?Yo7i!&v&s2C_@$i+?Y#%>ly=_X%tFBxV+=V(Fv-XZc2oS725rbF+y+^>%_Q$jEy^GZ}f!o-xIv|Wi;F5!fc`4-W>)tvuY6MsX$ z#lS4M6+ZKyk4y5d3j?zdQn=;3g>+9CSSV_Eauiuy^3>*;NibmresQ4>$im1yVJ$V~ zLfyY7ymC*dj|#+@Il;rRC-t6%kx8JYhuUi4&a-gxzB3CY=?~;8*us4y;lZtKcY!)q zjV&?AL%4Hm?}zXkyt`?;IXHxqTU3vr!CCOA02&j-CqD$PsM?n6BD-*M+Ye#sd(xq< zJXQGQ9sg}`jvl`NVC9v6Z4&$N{;XNrTpq*w%Hpf>{}0!w+sFmEb(a7D002ovPDHLk FV1mi<@LvD` diff --git a/icons/mob/screen/styles/midnight/zone_selector.dmi b/icons/mob/screen/styles/midnight/zone_selector.dmi index 0eb2eba5cd3d182f302a41bdb2499e26e3ecadd1..93ff92e47e352d79de938210fdb6023f51f9d1ac 100644 GIT binary patch literal 1013 zcmVV=-0C=1w$FT~7Fc1ddIrkJlx|dd6vy=qMpsyeSug!rqkQ^0!dIz`fYw`AD znBk^Ce=b$>4vXROBy-5B2^M`vCb4{z-l-auVbPp<=cV$tXq2rXvr4J3c#-*(_~Y9x z{OsVSKo?2C9doM<&d>k=13F1WK~z|U#aGWu8$lHQtR9w*l@2C`h8#>3D+CWMdJuc) zAs!P?RcQW!{z*Odl0q##)SOC1La78AX%Dh!Q?toIRwM}nt&toQdRX6NcJ^0Np?(mu zv-9@7Z@zi&&F)yGQo-it%PZUgwzuC-jLpm>uj27X{ktI0Zl4(w`i=h)SY5CrK*2Ma z`Qg+^q?o)uKkW@0+_FxLcKggA5-tTepYEq~Thj6O_pf~&^Tj2WFBIjtyi;Q0_%M*f z(-*H8`Qm)KFGN==tr6e=fadPIUOKnMXzW5Fb zo@%^*c>%k51iN{J_1uOu`@H*6&J&q16^2%TR!=p~7nj)N!!^J z*s}meDn+Ri!r|B1lRd@q5YQ)7JeYsXsKxr&Gr;M5N(&zUbMjMWee=sFviJBN8|L%eZ}k9R jRV&wFb74LK=kxq8m~-O5fiFtW00000NkvXXu0mjf=PAtu literal 1177 zcmV;K1ZMk*P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#HM^7B&Ti&JxyxHwZXi;5L&6%4sJ(~1&vQz2{&h4CecnK)G| zE4cc(D7g4~asdDw#wl<$g}LPb00Y@cL_t(&fyG(ROB+EH{;VEC$4UniLnQ|j#Rh_h z7CneP^q@!eRE7Ev^iS%smlWF4Lz7dflu#;xM%sfcTB{om5|Km(S|d3q^ssrG+0E?i zt|r+BA=&KP_szcdy&tnXR4SFQvGMX65y<=ZZ$|(`ia#_lF?pRxJZeR;fO`Eb1^`jw zkEj;ZZ}Ga}DDZ6u5O^jt6D%6Z6tjPypEiSno90ohUO$Vuoe&kig8`h6x6;d-w&9;2 zUMmgr>>OKN+p>>~g*+1nd!CDU`r;KMTbz%#gt$;fItqN312_Pny8W)1UfyJM?2u&2 z0S*AGYg;HH&vcQHZ3%Iq)fpuIJy}Tz0RW&V2q7FF8N67?JHA)fwt!@cxvwFc?qiii zfv;o$U`0U{0ps`(x#?MCati=pe;db#T{gUI`!QgU_znjMA&`cZdve}L3QZHRbF^5< zBa>TzaeN5VsK6@^)96IiE3c!%x95O*{VW!y0>>w(?88RwBy=SvOu%YOQQ>znKqovq z#{eKcIfXHvaGYzjBcrRvei8+~XAS5QSM@FL?%2N<=a&F10f28c27=XqLE$@6fb(%B z1>JquPl|=SHWETyC{rK`e18T=o~H`zC3N1eFNb14pYeTb08gd>SYD0Y9|ZvAB8=lh z)T;Y1jS6VNemUK}u)*W&8PN7V_1MNA^kKYRbUL!KypHnj4q8{25C?lr6JQjjFf51yKX4bIbME#-GR6~V)K0o= zsBGS*3-k*=5Cbx~1;`VaR+1@3_(06 z%K&OEwCj>ZE<_}zQ2}68YSXCPnF0OA*Vlma)20b9)2LXpw)_;vOI+97sRj%H-+wP4 zgxy9cCjr$cD%p^(2_wD0k3V_Vanj@z`}4J^T}$x2fJ+*+6X~e4fFL$*wHFA8?{1L* zSmW1shZDjvKwh8}0RVPy4r4C08zU=^dK;X5&%;NK5)y=qLz_WAAESGM)Zi28>|MddDQ9D5! zKL!9lKEAmDFiiSxdV=-0C=1w$FT~7Fc1ddIrkJlx|dd6vy=qMpsyeSug!rqkQ^0!dIz`fYw`AD znBk^Ce=b$>4vXROBy-5B2^M`vCb4{z-l-auVbPp<=cV$tXq2rXvr4J3c#-*(_~Y9x z{OsVSKo?2C9doM<&d>k=0#QjsK~z|U#aBIUgD@C!HWo7Hoe6FE3*!_JH0&M)fhrb`&o6F^bs;bWT2MojTyh)Pe z3;=na|0((PdIbP%k|a43Ib-bQFUYmlPbA`z8e_?|*0nXZj~UAtdm#~z^Uk(yjp45A zoQAd5b<;HFopWCMM6_*N`|JR~gR8OYy1whW-WKB{2Y{w&CNmNPrvM*p^3&-wxqnr} zCl>%8Zg5SVloDy0;&3ASNE(ul%d*67w=?ZZDF`8qz%@H}TThcZ5JGN8|2U53ImKPpuZg7KGHN4QKcBbB>h6#e?&l4 zRlz}}wXUnG`dI-aVh-~C{JS(wgV%;t0krtI{5p>X;5}YwOb8aU;2uylJ%_kqKIU5j zmWXdK7MlI_EnW55R@r47nFCVpMOd}kztsFy?-7tl$?hnP)<9h{7@UI;On37aeQ zaJr`wOSrH5uK@OT8qyB=-sgomoQ53F^E}^sjJz)OE!hO#kLPdUgkAUKpyogT0000< KMNUMnLSTZ$oM;yS literal 890 zcmV-=1BLvFP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#HM^7B&Ti&JxyxHwZXi;5L&6%4sJ(~1&vQz2{&h4CecnK)G| zE4cc(D7g4~asdDw#wl<$g}LPb00O#6L_t(&f$fJ02bx1JkPrTKomu@!f&@*=lfFpmFIaE4)=ZkV-7fD>|HiuN&Xvew1qRq zQt95a&AqtLkQoP6yP(5*pk1f>*l9D`Ci3eWRAX~w0)43`3`6mfDb*T52mz%OWm%dIX(dk>CXV9{oEsCzF@Uc$HKkng ztx914o%CbUKDDOi8#y3J662u47)z5RdCHh2_{KA!Z&1GW)a!yEm~?O8l0WJIzWL}| zSL#{>{;yYl&lGaaAIt)efRgghCeu*8$Hc01WgY11@= zwixdPRLN6PEmP-^j<1%+7;%Di8kFT?(=#Zs=oMpr zvf8%o{AZxk(?Rg3ia)dz_|l%hC?sZpdQzjxrW7@}<{N7&eqGn{!=q`MvpN%Gmg(W> zmY0}ZkA3$ifUTT{_&>CdKCLVdN1gFkCdcDZ6m2zwd=B*ujR}|^kGtgm18Nh4=w`fl Qk^lez07*qoM6N<$f_#>%$N&HU diff --git a/icons/mob/screen/styles/old/zone_selector.dmi b/icons/mob/screen/styles/old/zone_selector.dmi index 2e2b5b4e074802696197def0aadafd5c57cf7e51..76fd6cf7272b51cfae2bcbace41ace9d0ac363b2 100644 GIT binary patch delta 397 zcmV;80doH61pfmiiBL{Q4GJ0x0000DNk~Le0000W0000W1Oos70D)9z#{d8TEs-TL z6&B-u9{>OV0d!JMQvg8b*k%9#0CACYP=6=BBr!8biHkEOv#1y-Zpg)%R+N~V3SlcN zxca$(jRycpz#VfVpn8)4009F@L_t(2k$uuJR)jDR24K8_?0ar6`@Dc*P7p4jc|)kS z%Y?Uu9bqqk!2?-|djX#((ALsBm;uDFh0_GSmtlZE$wj)V%OuTKl_r}^M3r49n}1yq zN}}SWxDAl=1&|q6IfE>TR184d?YLzD=Ufwm)K7lZBB5=>>KVHC7`22UtsBS80K~;( zCXl5K_m;OzAj;}Mhq_ex3{ayd+f`-(1CK-<`~x*IL@l-(K0cp)w}9KfyuY1v^9vH; zdwBhVj+ rC^_sKviF+I6gD4+E5tiQ9FM~fND_-8MlMyI00000NkvXXu0mjf%>JG4 delta 503 zcmV<$1N#wl=6E@5i`00Cf0L_t(YiLI5{l7t`(MYZVw(KQBEv9V#_$LJx`>o>&4 z0&^o^{zb6iiGU4{1m7ouby?ObDAQa8Wf7Xj(r~PSSx`c5EPLysl0af>J8)RG*0wiK tKCvh0MSNxn%~j#GeG|uiJGXa*{{mtvB205yT=W0{002ovPDHLkV1gLI&aMCe diff --git a/icons/mob/screen/styles/old_noborder/zone_selector.dmi b/icons/mob/screen/styles/old_noborder/zone_selector.dmi index dacea1000fb00ae21d8cbafb41034b51937ed773..31b4bf66cb40b05eca5f4cdf751b5d12921e8342 100644 GIT binary patch delta 322 zcmaFMyoOn|Gr-TCmrII^fq{Y7)59eQNGpIa3p0>x3`su@q*NxVYKV59nd1OtGnNGT z1v5B2yO9Ru6i&oVrcB%*=?-4d4+^V-if0#!=}ub&6TLFz2n!;hF*3C&jYf> z$_uI{12ydQba4#Pm^gQWA>Sbb9@odxM*^)%yQZ#Uj?Q}-2}zWo2^y~fw?3#M65n0!DWQ}czDVxz#Jz=$`Nr^6M!7^`n6F6QZMJkGH8 za8gfv*?E;^Su1mW7%wEK&0qD1kzIWei@ig$c7oXaV?QfTW?HY^XZLRM-CN3gj^F04 zxO&*aGUa;1`nA$*XB)QZ9oxdb_g<$1N#wl=6E@5i`008buL_t(IjlI&nZNo4S1>n0r1y7JG zRXk8okJz00ptyAZ(z+}637oJgeO;K_dPsEh?_c zOr?w^b!^&&P8d+*in&Fd@EwJcd=MTH8PK%-?sMI>3A?W;HXrZXyiVAS5AOT7FH|YJ zJ`DeJ{l7=JbucLdrWd@6%eE1?3i_=6)Ml^BrooO2C= z*hUx^K~>R4D}nyc*ZT+1oU;P&*V7?8g5^NMnny<{HCR-`=m@lHHS5CY2oTKK?RiE; zYzbic@Bo+x3xYkt7GZY6j8qXl0ai)h0zNtroLn5BX9Vs|2YYGPBY}%92|P>N7-&xF z;LQ~F!nUAJdSL{fNji8r&k0t7;vjlLU~IpZZ*9px1R@$Ct}%?o!Md^%KGTk1Ij~si z6S}MCO$^>v8>%i>ugc4W8@yDT%iFF$T+63j|1YY?7Uio4Ajkj!002ovPDHLkV1ljw BsGtA< delta 520 zcmV+j0{8u}1fT^WiBL{Q4GJ0x0000DNk~Le0000$0000W2m=5B0F^_Iwvi!N0d$di zP=7~>i!&v&s2C_@$ingc`eeD!l3>gw!4^W;HGjaLU?2CeZ<{3;a!Ig+HCX;2VKwB@VhM)4 zHDLb5uT+B{oea9%3{rs@^o5JTfSbW?YebAkjA@Zvwipb!8mu`$L@3{i!HBB?=X*R~ z-vGrJ33xppS|l5ccw-=Y%oXZBpA7mu8`v4=NXu*tTwV;AQ^J&Mv<4n81_(H!@_%?B zm1qq-o(;gq3tb@ZGaook1}@JAk`#wlIIyP@je*On0i@GZ5&G?H;P7goX7&S6$H3v$ zfY-)9kU!>hHE?(_;G{zXkJmori@3dLZlYg~JKaON@)t-*V94BnRD!sQIO znUptIn-1BmW7oafPMj!TZ7H-(aD%o==W=y;y}qH5->%oY!+!xWaxFt*BL`Ce0000< KMNUMnLSTaO$>&c1 diff --git a/icons/mob/screen/styles/robot/zone_selector.dmi b/icons/mob/screen/styles/robot/zone_selector.dmi index bac36b3b8b4a15327e4c8a9ae921e5b1c9236696..a7b3550559c3cb90b153cfa8edaa760a23cc43b1 100644 GIT binary patch delta 447 zcmV;w0YLuH1=<85iBL{Q4GJ0x0000DNk~Le0000W0000W2m=5B07RsU#*rag0dbLi zP=6=BBr!8biHkEOv#1y-Zpg)%R+N~V3SlcNxca$(jRycpz#VfVpn8)400B%%L_t(I zjeV0*f`cFoL=`MSBNgf1|ExO+go@j4^v7oMnoMAt=6_>C-Z|&JUzWwYhlbM+?~#B4 z`8j+E$w6?<6Va$>f*99z+d|+NBiCH)0)Ib;J?-f!^+}>Kk_vnktWou-=g5r_uYx^k z0Ub#n8VL&sIb=oTeCAx6$QeH&se)%8qLgwS!vtIXWPYLU#XJhU`5-fZ(C4ro%qa1| z!WinqW48K|YLw1EvJ2qAnYBEhY>111Fg|Gmm;;8;T_8n#D&gc{h=D-jqy(I#Pk#i= z-+F)_SAuH<{5J^lQc2BETelEU^nuWprHG*i^I>@lbeR#m5CY3S);|InpTv*@L1Diy zO9)~?#<4)~&-+C6(;#MGg5#)+yI>^9$r{#OdkD1$qDmMqPAA9=tOOM}19Sp4V}f42 p+4cIU1o5)fxO%<6UtZ*Y0i!Y;D-hgLKym;8002ovPDHLkV1nP5zuy1= delta 566 zcmV-60?GZ_1keQ`iBL{Q4GJ0x0000DNk~Le0000$0000W2m=5B0F^_Iwvi!Q0d$dl zP=7~>i!&v&s2C_@$i<$tzgqmXY66_4M`9o`s0}R zK`8{ZX3Pb0sXIaJiK9Tv0pPqsKJh4EjDNMSm)6c0<03Pyz<>*>q+Zr#eUtu55j|F3 zpyU&00c%(f^__9a!!!aTo-$xT*jE0)cLsefUDRKy* zEprkWaTa*RN9R7M`*H3nFydT;B##wFhf?QSgAuQTL_N-tJ=#I)a3TL>)(>lpP=7oS zKJg-e9o{|5``u-WMxe*D0APE8H;8q{hQmdm%d-H9x}6<%r?W*B=<=EY(4qw*u5&fOOuqUVp9vg>M*;cypM@fm)n0u*c;vRqiR=QQt_}AyBhZ zg_q@h6)1e$Vh&e<00000Ne4wvM6N<$ Ef|%Ln+a diff --git a/icons/mob/screen/styles/white/zone_selector.dmi b/icons/mob/screen/styles/white/zone_selector.dmi index 84311ae3500d8b5dac3669251d7b62aae04da661..fe86e824f98b9c432e2d875ab82287dffcdc3f7a 100644 GIT binary patch delta 404 zcmV;F0c-yB1egRNiBL{Q4GJ0x0000DNk~Le0000W0000W1Oos70D)9z$B`jJ0d|pP zP=6=BBr!8biHkEOv#1y-Zpg)%R+N~V3T5Zy=NEuk$_lQ2E?|oQgO(reatZM-0003U zNklE@L)_in=+RNqk6X+C!Fc=&D z%^)Ol*-;or?~X|?%xggWGQ}XYgJ0bIRCW;3$_BBP_8_dLPrM$50}iTDI3G6Xd1abj zgcG5l?eSMmW(l$JF^;q70LCNkC!*lsV-!tkYMN(%B5>D=1@|Z^h@D8^dl5ymOZ!zq y$c@j_n{QqvZTK$Wi$UKlo3FzaKn?)yb@&JCtDkS^#@CDh0000T zP=7~>i!&v&s2C_@$iDfHT(o1?i+-5P0 z^b*!mDyXECv%A+UW|5w6HhFFUu;nqo&tmQj3XH*)nd}XW(Exc~IOptO2pJ7)Jac7t zC3XNALPi6PTeL@dc|*u(z;V^{?nC3-&k%BFFwizM_F!P_4GO5L(ZJaoOpRPqOMhqJ z><#9{0eqTrFmNVAQR^Srey^(D5HJ~3r5b>vs(M4f-cS{&w8d!P>t!(y5A3g0B#xADl^?db3(Zht^ICwH( n$MA9%6!#0Q7h3Bv{+#~+aR)Z Date: Wed, 8 May 2024 18:56:50 +1000 Subject: [PATCH 012/212] Cleaning up new config system comments. --- code/_helpers/logging.dm | 19 +++-- code/datums/config/_config.dm | 22 ++++- code/datums/config/config_enum.dm | 40 ++++++--- .../config/config_types/config_admin.dm | 8 +- .../config/config_types/config_client.dm | 6 +- .../config/config_types/config_events.dm | 5 +- .../config/config_types/config_game_option.dm | 8 +- .../config/config_types/config_game_world.dm | 8 +- .../config/config_types/config_health.dm | 6 +- .../config/config_types/config_resources.dm | 2 +- .../config/config_types/config_server.dm | 20 ++--- .../config/config_types/config_voting.dm | 2 +- config/example/configuration.txt | 82 ++++++++++--------- 13 files changed, 134 insertions(+), 94 deletions(-) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 2ac38629b6..6d215c0c9b 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -120,13 +120,18 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" //pretty print a direction bitflag, can be useful for debugging. /proc/dir_text(var/dir) var/list/comps = list() - if(dir & NORTH) comps += "NORTH" - if(dir & SOUTH) comps += "SOUTH" - if(dir & EAST) comps += "EAST" - if(dir & WEST) comps += "WEST" - if(dir & UP) comps += "UP" - if(dir & DOWN) comps += "DOWN" - + if(dir & NORTH) + comps += "NORTH" + if(dir & SOUTH) + comps += "SOUTH" + if(dir & EAST) + comps += "EAST" + if(dir & WEST) + comps += "WEST" + if(dir & UP) + comps += "UP" + if(dir & DOWN) + comps += "DOWN" return english_list(comps, nothing_text="0", and_text="|", comma_text="|") //more or less a logging utility diff --git a/code/datums/config/_config.dm b/code/datums/config/_config.dm index 0ffc1891a8..8fb40f6caf 100644 --- a/code/datums/config/_config.dm +++ b/code/datums/config/_config.dm @@ -116,14 +116,15 @@ SHOULD_CALL_PARENT(TRUE) return -/decl/config/proc/get_config_file_text() - . = list() +/decl/config/proc/get_comment_desc_text() if(desc) if(islist(desc)) for(var/config_line in desc) - . += "## [config_line]" + LAZYADD(., "## [config_line]") else - . += "## [desc]" + LAZYADD(., "## [desc]") + +/decl/config/proc/get_comment_value_text() if(config_flags & CONFIG_FLAG_HAS_VALUE) if(compare_values(value, default_value)) . += "#[uppertext(uid)] [serialize_default_value()]" @@ -133,6 +134,19 @@ . += uppertext(uid) else . += "#[uppertext(uid)]" + +/decl/config/proc/get_config_file_text() + + . = list() + + var/add_desc = get_comment_desc_text() + if(!isnull(add_desc)) + . += add_desc + + var/add_value = get_comment_value_text() + if(!isnull(add_value)) + . += add_value + return jointext(., "\n") /decl/config/proc/serialize_value() diff --git a/code/datums/config/config_enum.dm b/code/datums/config/config_enum.dm index ba61b07b6d..8cfbd73f7f 100644 --- a/code/datums/config/config_enum.dm +++ b/code/datums/config/config_enum.dm @@ -2,31 +2,49 @@ abstract_type = /decl/config/enum default_value = 0 config_flags = CONFIG_FLAG_ENUM | CONFIG_FLAG_HAS_VALUE - -/decl/config/enum/proc/get_enum_map() - return + var/list/enum_map /decl/config/enum/validate() . = ..() - if(!length(get_enum_map())) - . += "enum config has zero-length return to get_enum_map()" + if(!length(enum_map)) + . += "enum config has zero-length enum_map" + +/decl/config/enum/serialize_value() + var/enum_val + for(var/val in enum_map) + if(value == enum_map[val]) + enum_val = val + break + if(isnull(enum_val)) + enum_val = handle_value_deconversion(value) + return "[enum_val]" + +/decl/config/enum/serialize_default_value() + var/enum_val + for(var/val in enum_map) + if(default_value == enum_map[val]) + enum_val = val + break + if(isnull(enum_val)) + enum_val = handle_value_deconversion(default_value) + return "[enum_val]" /decl/config/enum/Initialize() . = ..() - var/list/enum_map = get_enum_map() - if(length(enum_map)) - if(desc) + if(islist(enum_map) && length(enum_map)) + if(islist(desc)) + desc += "[desc] Valid values: [english_list(enum_map)]." + else if(desc) desc = "[desc] Valid values: [english_list(enum_map)]." else - desc = english_list(enum_map) + desc = "Valid values: [english_list(enum_map)]." /decl/config/enum/set_value(var/new_value) if(istext(new_value)) - var/list/enum_map = get_enum_map() new_value = trim(lowertext(new_value)) if(new_value in enum_map) new_value = enum_map[new_value] else - log_error("Invalid key '[new_value]' supplied to [type].") + log_error("Invalid key '[new_value]' supplied to [type]. [json_encode(enum_map)]") new_value = default_value return ..(new_value) diff --git a/code/datums/config/config_types/config_admin.dm b/code/datums/config/config_types/config_admin.dm index c7515d4ea5..f99d02e0f6 100644 --- a/code/datums/config/config_types/config_admin.dm +++ b/code/datums/config/config_types/config_admin.dm @@ -29,7 +29,7 @@ /decl/config/num/autostealth uid = "autostealth" default_value = 0 - desc = "Uncomment to enable auto-stealthing staff who are AFK for more than specified minutes." + desc = "Sets a value in minutes after which to auto-hide staff who are AFK." /decl/config/toggle/on/guest_jobban uid = "guest_jobban" @@ -68,12 +68,12 @@ /decl/config/toggle/allow_unsafe_narrates uid = "allow_unsafe_narrates" - desc = "Uncomment this to allow admins to narrate using HTML tags." + desc = "Determines if admins are allowed to narrate using HTML tags." /decl/config/toggle/visible_examine uid = "visible_examine" - desc = "Uncomment this to show a visible message when someone examines something ('Dave looks at you.')." + desc = "Determines if a visible message should be shown when someone examines something ('Dave looks at you.')." /decl/config/toggle/allow_loadout_customization uid = "loadout_customization" - desc = "Uncomment this to allow all loadout items to have name and desc customized by default." + desc = "Determines if all loadout items are allowed to have name and desc customized by default." diff --git a/code/datums/config/config_types/config_client.dm b/code/datums/config/config_types/config_client.dm index cb6e8a5a35..7219bc3189 100644 --- a/code/datums/config/config_types/config_client.dm +++ b/code/datums/config/config_types/config_client.dm @@ -19,12 +19,12 @@ /decl/config/num/clients/lock_client_view_x uid = "lock_client_view_x" default_value = 0 - desc = "Uncomment and set to an integer to lock the automatic client view scaling on the X axis." + desc = "Set to an integer to lock the automatic client view scaling on the X axis." /decl/config/num/clients/lock_client_view_y uid = "lock_client_view_y" default_value = 0 - desc = "Uncomment and set to an integer to lock the automatic client view scaling on the Y axis." + desc = "Set to an integer to lock the automatic client view scaling on the Y axis." /decl/config/num/clients/max_client_view_x uid = "max_client_view_x" @@ -57,4 +57,4 @@ /decl/config/toggle/aggressive_changelog uid = "aggressive_changelog" - desc = "Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog." + desc = "Determines if the changelog file should automatically open when a user connects and hasn't seen the latest changelog." diff --git a/code/datums/config/config_types/config_events.dm b/code/datums/config/config_types/config_events.dm index 0b83e38fb2..d8a103ac66 100644 --- a/code/datums/config/config_types/config_events.dm +++ b/code/datums/config/config_types/config_events.dm @@ -14,14 +14,11 @@ uid = "objectives_disabled" default_value = CONFIG_OBJECTIVE_NONE desc = "Determines if objectives are disabled." - -/decl/config/enum/objectives_disabled/get_enum_map() - var/static/list/obj_enum_map = list( + enum_map = list( "none" = CONFIG_OBJECTIVE_NONE, "verb" = CONFIG_OBJECTIVE_VERB, "all" = CONFIG_OBJECTIVE_ALL ) - return obj_enum_map // No custom time, no custom time, between 80 to 100 minutes respectively. /decl/config/lists/event_first_run diff --git a/code/datums/config/config_types/config_game_option.dm b/code/datums/config/config_types/config_game_option.dm index 51c956011d..3cc8895e0b 100644 --- a/code/datums/config/config_types/config_game_option.dm +++ b/code/datums/config/config_types/config_game_option.dm @@ -102,13 +102,13 @@ /decl/config/num/max_acts_per_interval uid = "max_acts_per_interval" default_value = 140 - desc = "Uncomment this to modify the number of actions permitted per interval before being kicked for spam." + desc = "Defines the number of actions permitted per interval before a user is kicked for spam." /decl/config/num/act_interval uid = "act_interval" default_value = 0.1 rounding = 0.01 - desc = "Uncomment this to modify the length of the spam kicking interval in seconds." + desc = "Determines the length of the spam kicking interval in seconds." /decl/config/num/dex_malus_brainloss_threshold uid = "dex_malus_brainloss_threshold" @@ -141,7 +141,7 @@ /decl/config/toggle/expanded_alt_interactions uid = "expanded_alt_interactions" - desc = "Uncomment this to enable expanded alt interactions with objects." + desc = "Determines if objects should provide expanded alt interactions when alt-clicked, such as use or grab." /decl/config/toggle/ert_admin_call_only uid = "ert_admin_call_only" @@ -149,7 +149,7 @@ /decl/config/toggle/ghosts_can_possess_animals uid = "ghosts_can_possess_animals" - desc = "Uncomment to allow ghosts to possess any animal." + desc = "Determines of ghosts are allowed to possess any animal." /decl/config/toggle/assistant_maint uid = "assistant_maint" diff --git a/code/datums/config/config_types/config_game_world.dm b/code/datums/config/config_types/config_game_world.dm index d81b963b1f..fe91d44250 100644 --- a/code/datums/config/config_types/config_game_world.dm +++ b/code/datums/config/config_types/config_game_world.dm @@ -96,19 +96,19 @@ /decl/config/toggle/on/welder_vision uid = "welder_vision" - desc = "Uncomment to disable the restrictive weldervision overlay." + desc = "Toggles the restrictive weldervision overlay when wearing welding goggles or a welding helmet." /decl/config/toggle/on/allow_ic_printing uid = "allow_ic_printing" - desc = "Uncomment this to prevent players from printing copy/pasted circuits." + desc = "Determines if players can print copy/pasted integrated circuits." /decl/config/toggle/on/cult_ghostwriter uid = "cult_ghostwriter" - desc = "Uncomment to allow ghosts to write in blood during Cult rounds." + desc = "Determines if ghosts are permitted to write in blood during cult rounds." /decl/config/toggle/allow_holidays uid = "allow_holidays" - desc = "Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR" + desc = "Determines if special 'Easter-egg' events are active on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR" /decl/config/toggle/allow_holidays/update_post_value_set() . = ..() diff --git a/code/datums/config/config_types/config_health.dm b/code/datums/config/config_types/config_health.dm index c5db9f04e7..1c9855d6fd 100644 --- a/code/datums/config/config_types/config_health.dm +++ b/code/datums/config/config_types/config_health.dm @@ -17,17 +17,17 @@ /decl/config/toggle/health_adjust_healing_from_stress uid = "adjust_healing_from_stress" config_flags = CONFIG_FLAG_BOOL - desc = "Uncomment to allow stressors to impact shock, healing and blood recovery." + desc = "Determines if allow stressors should impact shock, healing and blood recovery." /decl/config/toggle/health_show_human_death_message uid = "show_human_death_message" config_flags = CONFIG_FLAG_BOOL - desc = "Uncomment this line to enable humans showing a visible message upon death ('X seizes up then falls limp, eyes dead and lifeless')." + desc = "Determines if humans should show a visible message upon death ('X seizes up then falls limp, eyes dead and lifeless')." /decl/config/toggle/health_organs_decay uid = "organs_decay" config_flags = CONFIG_FLAG_BOOL - desc = "Uncomment to enable organ decay outside of a body or storage item." + desc = "Determines if organs should decay outside of a body or storage item." /decl/config/toggle/on/health_bones_can_break uid = "bones_can_break" diff --git a/code/datums/config/config_types/config_resources.dm b/code/datums/config/config_types/config_resources.dm index b1bfda325f..c6e8b6dba7 100644 --- a/code/datums/config/config_types/config_resources.dm +++ b/code/datums/config/config_types/config_resources.dm @@ -15,7 +15,7 @@ /decl/config/text/custom_icon_icon_location uid = "custom_icon_icon_location" default_value = "config/custom_icons/icons" - desc = "Uncomment this and set it to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '\[CUSTOM_ICON_ICON_LOCATION\]/\[custom icon path value\]'" + desc = "Set this to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '\[CUSTOM_ICON_ICON_LOCATION\]/\[custom icon path value\]'" /decl/config/lists/resource_urls uid = "resource_urls" diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 958fbf0607..9181d2862f 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -234,7 +234,7 @@ /decl/config/toggle/do_not_prevent_spam uid = "do_not_prevent_spam" - desc = "Uncomment this to DISABLE action spam kicking. Not recommended; this helps protect from spam attacks." + desc = "Determines if action spam kicking should be DISABLED. Not recommended; this helps protect from spam attacks." /decl/config/toggle/no_throttle_localhost uid = "no_throttle_localhost" @@ -307,11 +307,11 @@ /decl/config/toggle/use_alien_whitelist uid = "usealienwhitelist" - desc = "Uncomment to restrict non-admins from using humanoid alien races." + desc = "Determines if non-admins are restricted from using humanoid alien races." /decl/config/toggle/use_alien_whitelist_sql uid = "usealienwhitelist_sql" - desc = "Uncomment to use the alien whitelist system with SQL instead. (requires the above uncommented as well)." + desc = "Determines if the alien whitelist should use SQL instead of the legacy system. (requires the above uncommented as well)." /decl/config/toggle/forbid_singulo_possession uid = "forbid_singulo_possession" @@ -326,31 +326,31 @@ /decl/config/toggle/disable_webhook_embeds uid = "disable_webhook_embeds" - desc = "Uncomment to make Discord webhooks send in plaintext rather than as embeds." + desc = "Determines if Discord webhooks should be sent in plaintext rather than as embeds." /decl/config/toggle/delist_when_no_admins uid = "delist_when_no_admins" - desc = "Uncomment this to remove the server from the hub." + desc = "Determines if the server should hide itself from the hub when no admins are online.." /decl/config/toggle/wait_for_sigusr1_reboot uid = "wait_for_sigusr1_reboot" - desc = "Uncomment to make Dream Daemon refuse to reboot for any reason other than SIGUSR1." + desc = "Determines if Dream Daemon should refuse to reboot for any reason other than SIGUSR1." /decl/config/toggle/use_irc_bot uid = "use_irc_bot" - desc = "Uncomment to enable sending data to the IRC bot." + desc = "Determines if data is sent to the IRC bot. Generally requires MAIN_IRC and associated setup." /decl/config/toggle/show_typing_indicator_for_whispers uid = "show_typing_indicator_for_whispers" - desc = "Uncomment this to show a typing indicator for people writing whispers." + desc = "Determinese if a typing indicator shows overhead for people currently writing whispers." /decl/config/toggle/announce_shuttle_dock_to_irc uid = "announce_shuttle_dock_to_irc" - desc = "Uncomment this line to announce shuttle dock announcements to the main IRC channel, if MAIN_IRC has also been setup." + desc = "Determines if announce shuttle dock announcements are sent to the main IRC channel, if MAIN_IRC has also been setup." /decl/config/toggle/guests_allowed uid = "guests_allowed" - desc = "Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting)." + desc = "Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server." /decl/config/toggle/on/ban_legacy_system uid = "ban_legacy_system" diff --git a/code/datums/config/config_types/config_voting.dm b/code/datums/config/config_types/config_voting.dm index 32f59f4cee..de914b8f8f 100644 --- a/code/datums/config/config_types/config_voting.dm +++ b/code/datums/config/config_types/config_voting.dm @@ -76,4 +76,4 @@ /decl/config/toggle/auto_map_vote uid = "auto_map_vote" - desc = "Uncomment to enable an automatic map vote and switch at end of round. MAP_SWITCHING must also be enabled." + desc = "Determines if the automatic map vote and switch are called at end of round. MAP_SWITCHING must also be enabled." diff --git a/config/example/configuration.txt b/config/example/configuration.txt index 2bba71ef03..ae459e24fc 100644 --- a/config/example/configuration.txt +++ b/config/example/configuration.txt @@ -15,10 +15,10 @@ ## Allows admin item spawning. #ALLOW_ADMIN_SPAWNING 1 -## Uncomment this to allow admins to narrate using HTML tags. Uncomment to enable. +## Determines if admins are allowed to narrate using HTML tags. Uncomment to enable. #ALLOW_UNSAFE_NARRATES -## Uncomment to enable auto-stealthing staff who are AFK for more than specified minutes. +## Sets a value in minutes after which to auto-hide staff who are AFK. #AUTOSTEALTH 0 ## Set to 0/1 to disable/enable automatic admin rights for users connecting from the host the server is running on. @@ -82,15 +82,15 @@ ## If the first delay has a custom start time. Defined in minutes. #EVENT_FIRST_RUN [null,null,{"lower":80,"upper":100}] -## Determines if objectives are disabled. -#OBJECTIVES_DISABLED 2 +## Determines if objectives are disabled. Valid values: none, verb, and all. +OBJECTIVES_DISABLED all ## # GAME OPTIONS # Configuration options relating to gameplay, such as movement, health and stamina. ## -## Uncomment this to modify the length of the spam kicking interval in seconds. +## Determines the length of the spam kicking interval in seconds. #ACT_INTERVAL 0.1 ## Remove the # to let aliens spawn. Uncomment to enable. @@ -123,13 +123,13 @@ ## Restricted ERT to be only called by admins. Uncomment to enable. #ERT_ADMIN_CALL_ONLY -## Uncomment this to enable expanded alt interactions with objects. Uncomment to enable. +## Determines if objects should provide expanded alt interactions when alt-clicked, such as use or grab. Uncomment to enable. #EXPANDED_ALT_INTERACTIONS ## Expected round length in hours. #EXPECTED_ROUND_LENGTH 3 -## Uncomment to allow ghosts to possess any animal. Uncomment to enable. +## Determines of ghosts are allowed to possess any animal. Uncomment to enable. #GHOSTS_CAN_POSSESS_ANIMALS ## Remove the # to let ghosts spin chairs. Uncomment to enable. @@ -150,7 +150,7 @@ ## Maximum stamina recovered per tick when resting. #MAXIMUM_STAMINA_RECOVERY 3 -## Uncomment this to modify the number of actions permitted per interval before being kicked for spam. +## Defines the number of actions permitted per interval before a user is kicked for spam. #MAX_ACTS_PER_INTERVAL 140 ## How many loadout points are available. Use 0 to disable loadout, and any negative number to indicate infinite points. @@ -174,6 +174,12 @@ ## Determines the severity of athletics skill when applied to stamina cost. #SKILL_SPRINT_COST_RANGE 0.8 +## Enables or disables checking for specific tool types by some stack crafting recipes. Uncomment to enable. +#STACK_CRAFTING_USES_TOOLS + +## Enables or disables checking for specific stack types by some stack crafting recipes. +#STACK_CRAFTING_USES_TYPES 1 + ## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. #WALK_DELAY 4 @@ -182,13 +188,13 @@ # Configuration options relating to the game world and simulation. ## -## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR Uncomment to enable. +## Determines if special 'Easter-egg' events are active on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR Uncomment to enable. #ALLOW_HOLIDAYS -## Uncomment this to prevent players from printing copy/pasted circuits. +## Determines if players can print copy/pasted integrated circuits. #ALLOW_IC_PRINTING 1 -## Uncomment to allow ghosts to write in blood during Cult rounds. +## Determines if ghosts are permitted to write in blood during cult rounds. #CULT_GHOSTWRITER 1 ## The maximum duration of an exoplanet day, in minutes. @@ -233,12 +239,12 @@ #RADIATION_RESISTANCE_MULTIPLIER 1.25 ## Enable/Disable random level generation. Will behave strangely if turned off with a map that expects it on. Uncomment to enable. -#ROUNDSTART_LEVEL_GENERATION +ROUNDSTART_LEVEL_GENERATION ## Unhash this to use iterative explosions, keep it hashed to use circle explosions. Uncomment to enable. #USE_ITERATIVE_EXPLOSIONS -## Uncomment to disable the restrictive weldervision overlay. +## Toggles the restrictive weldervision overlay when wearing welding goggles or a welding helmet. #WELDER_VISION 1 ## @@ -371,20 +377,20 @@ ## ## Password used for authorizing external tools that can apply bans. -#BAN_COMMS_PASSWORD +#BAN_COMMS_PASSWORD ## Password used for authorizing ircbot and other external tools. -#COMMS_PASSWORD +#COMMS_PASSWORD ## Export address where external tools that monitor logins are located. -#LOGIN_EXPORT_ADDR +#LOGIN_EXPORT_ADDR ## # RESOURCES # Configuration options relating to server resources. ## -## Uncomment this and set it to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '[CUSTOM_ICON_ICON_LOCATION]/[custom icon path value]' +## Set this to a file path relative to the executing binary to prefix all custom icon locations with this location ie. '[CUSTOM_ICON_ICON_LOCATION]/[custom icon path value]' #CUSTOM_ICON_ICON_LOCATION config/custom_icons/icons ## Set this to a file path relative to the executing binary to prefix all custom item icon locations with this location ie. '[CUSTOM_ITEM_ICON_LOCATION]/[custom item icon path value]' @@ -407,7 +413,7 @@ #ABANDON_ALLOWED 1 ## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. -#ADMIN_IRC +#ADMIN_IRC ## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. #ADMIN_LEGACY_SYSTEM 1 @@ -418,14 +424,14 @@ ## Allow ghosts to join as maintenance drones. #ALLOW_DRONE_SPAWN 1 -## Uncomment this line to announce shuttle dock announcements to the main IRC channel, if MAIN_IRC has also been setup. Uncomment to enable. +## Determines if announce shuttle dock announcements are sent to the main IRC channel, if MAIN_IRC has also been setup. Uncomment to enable. #ANNOUNCE_SHUTTLE_DOCK_TO_IRC ## Comment to disable the AOOC channel by default. #AOOC_ALLOWED 1 ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -#BANAPPEALS +#BANAPPEALS ## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. #BAN_LEGACY_SYSTEM 1 @@ -436,22 +442,22 @@ ## Sets the minimum number of cultists needed for ghosts to write in blood. #CULT_GHOSTWRITER_REQ_CULTISTS 10 -## Uncomment this to remove the server from the hub. Uncomment to enable. +## Determines if the server should hide itself from the hub when no admins are online.. Uncomment to enable. #DELIST_WHEN_NO_ADMINS ## Uncomment to enable. #DISABLE_PLAYER_MICE -## Uncomment to make Discord webhooks send in plaintext rather than as embeds. Uncomment to enable. +## Determines if Discord webhooks should be sent in plaintext rather than as embeds. Uncomment to enable. #DISABLE_WEBHOOK_EMBEDS ## Discord server permanent invite address. -#DISCORDURL +#DISCORDURL ## Comment to disable the dead OOC channel by default. #DOOC_ALLOWED 1 -## Uncomment this to DISABLE action spam kicking. Not recommended; this helps protect from spam attacks. Uncomment to enable. +## Determines if action spam kicking should be DISABLED. Not recommended; this helps protect from spam attacks. Uncomment to enable. #DO_NOT_PREVENT_SPAM ## A drone will become available every X ticks since last drone spawn. Default is 2 minutes. @@ -467,20 +473,20 @@ #FORBID_SINGULO_POSSESSION ## Discussion forum address. -#FORUMURL +#FORUMURL ## Defines world FPS. Defaults to 20. ## Can also accept ticklag values (0.9, 0.5, etc) which will automatically be converted to FPS. #FPS 20 ## GitHub address. -#GITHUBURL +#GITHUBURL -## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting). Uncomment to enable. +## Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server. Uncomment to enable. #GUESTS_ALLOWED ## Set a hosted by name for UNIX platforms. -#HOSTEDBY +#HOSTEDBY ## Hub visibility: If you want to be visible on the hub, uncomment the below line and be sure that Dream Daemon is set to visible. This can be changed in-round as well with toggle-hub-visibility if Dream Daemon is set correctly. Uncomment to enable. #HUB_VISIBILITY @@ -489,7 +495,7 @@ #IRC_BOT_HOST localhost ## GitHub new issue address. -#ISSUEREPORTURL +#ISSUEREPORTURL ## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. #JOBS_HAVE_MINIMAL_ACCESS 1 @@ -545,16 +551,16 @@ #RESPAWN_DELAY 30 ## Set a server location for world reboot. Don't include the byond://, just give the address and port. -#SERVER +#SERVER ## Set a server URL for the IRC bot to use; like SERVER, don't include the byond:// ## Unlike SERVER, this one shouldn't break auto-reconnect. -#SERVERURL +#SERVERURL ## Server name: This appears at the top of the screen in-game. #SERVER_NAME Nebula 13 -## Uncomment this to show a typing indicator for people writing whispers. Uncomment to enable. +## Determinese if a typing indicator shows overhead for people currently writing whispers. Uncomment to enable. #SHOW_TYPING_INDICATOR_FOR_WHISPERS ## SSinitialization throttling. @@ -563,10 +569,10 @@ ## Set to 1 to prevent newly-spawned mice from understanding human speech. Uncomment to enable. #UNEDUCATED_MICE -## Uncomment to restrict non-admins from using humanoid alien races. Uncomment to enable. +## Determines if non-admins are restricted from using humanoid alien races. Uncomment to enable. #USEALIENWHITELIST -## Uncomment to use the alien whitelist system with SQL instead. (requires the above uncommented as well). Uncomment to enable. +## Determines if the alien whitelist should use SQL instead of the legacy system. (requires the above uncommented as well). Uncomment to enable. #USEALIENWHITELIST_SQL ## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. @@ -574,17 +580,17 @@ ## Uncomment to enable. #USEWHITELIST -## Uncomment to enable sending data to the IRC bot. Uncomment to enable. +## Determines if data is sent to the IRC bot. Generally requires MAIN_IRC and associated setup. Uncomment to enable. #USE_IRC_BOT ## Remove the # in front of this config option to have loyalty implants spawn by default on your server. Uncomment to enable. #USE_LOYALTY_IMPLANTS -## Uncomment to make Dream Daemon refuse to reboot for any reason other than SIGUSR1. Uncomment to enable. +## Determines if Dream Daemon should refuse to reboot for any reason other than SIGUSR1. Uncomment to enable. #WAIT_FOR_SIGUSR1_REBOOT ## Wiki address. -#WIKIURL +#WIKIURL ## # VOTING @@ -602,7 +608,7 @@ ## Allow players to initiate a restart vote. Uncomment to enable. #ALLOW_VOTE_RESTART -## Uncomment to enable an automatic map vote and switch at end of round. MAP_SWITCHING must also be enabled. Uncomment to enable. +## Determines if the automatic map vote and switch are called at end of round. MAP_SWITCHING must also be enabled. Uncomment to enable. #AUTO_MAP_VOTE ## Time left (seconds) before round start when automatic gamemote vote is called (default 160). From e99ffffbc340498316b945ba9cd43754d09ccf40 Mon Sep 17 00:00:00 2001 From: Greenjoe12345 Date: Fri, 10 May 2024 20:35:37 +0100 Subject: [PATCH 013/212] ground descriptions --- code/game/turfs/floors/natural/natural_grass.dm | 3 +++ code/game/turfs/floors/natural/natural_ice.dm | 1 + code/game/turfs/floors/natural/natural_lava.dm | 1 + code/game/turfs/floors/natural/natural_rock.dm | 1 + 4 files changed, 6 insertions(+) diff --git a/code/game/turfs/floors/natural/natural_grass.dm b/code/game/turfs/floors/natural/natural_grass.dm index e9372990cb..c12fa82dc1 100644 --- a/code/game/turfs/floors/natural/natural_grass.dm +++ b/code/game/turfs/floors/natural/natural_grass.dm @@ -1,5 +1,6 @@ /turf/floor/natural/grass name = "grass" + desc = "You see a patch of grass. The grass is wild and seems to like it here." possible_states = 1 icon = 'icons/turf/flooring/grass.dmi' footstep_type = /decl/footsteps/grass @@ -14,6 +15,7 @@ /turf/floor/natural/grass/wild name = "wild grass" + desc = "Tall, lush grass that reaches past your ankles." possible_states = null icon = 'icons/turf/flooring/wildgrass.dmi' icon_edge_layer = EXT_EDGE_GRASS_WILD @@ -73,6 +75,7 @@ . = ..() if(icon_state != "scorched") SetName("scorched ground") + desc = "What was once lush grass has been reduced to burnt, ashy wastes." icon_state = "scorched" icon_edge_layer = -1 footstep_type = /decl/footsteps/asteroid diff --git a/code/game/turfs/floors/natural/natural_ice.dm b/code/game/turfs/floors/natural/natural_ice.dm index 2d9ef3c7e9..fc02e588a3 100644 --- a/code/game/turfs/floors/natural/natural_ice.dm +++ b/code/game/turfs/floors/natural/natural_ice.dm @@ -1,5 +1,6 @@ /turf/floor/natural/ice name = "ice" + desc = "A sheet of smooth, slick ice. Be careful not to fall.." icon = 'icons/turf/flooring/ice.dmi' footstep_type = /decl/footsteps/plating base_color = COLOR_LIQUID_WATER diff --git a/code/game/turfs/floors/natural/natural_lava.dm b/code/game/turfs/floors/natural/natural_lava.dm index badfa1980b..6fadc2fe3e 100644 --- a/code/game/turfs/floors/natural/natural_lava.dm +++ b/code/game/turfs/floors/natural/natural_lava.dm @@ -1,5 +1,6 @@ /turf/floor/natural/lava name = "lava" + desc = "Incredibly hot molten rock, you can feel the heat radiating even from a distance.." icon = 'icons/turf/flooring/lava.dmi' movement_delay = 4 dirt_color = COLOR_GRAY20 diff --git a/code/game/turfs/floors/natural/natural_rock.dm b/code/game/turfs/floors/natural/natural_rock.dm index 1e58ee35d6..af6d10cd35 100644 --- a/code/game/turfs/floors/natural/natural_rock.dm +++ b/code/game/turfs/floors/natural/natural_rock.dm @@ -1,5 +1,6 @@ /turf/floor/natural/rock name = "rock floor" + desc = "A surface of rough, rocky ground." icon = 'icons/turf/flooring/rock.dmi' icon_edge_layer = EXT_EDGE_VOLCANIC is_fundament_turf = TRUE From 0d619163b7734709ee627c1d55899ea8ecc20629 Mon Sep 17 00:00:00 2001 From: Greenjoe12345 <33647525+Greenjoe12345@users.noreply.github.com> Date: Fri, 10 May 2024 20:43:53 +0100 Subject: [PATCH 014/212] no wurm Co-authored-by: Penelope Haze --- code/game/turfs/floors/natural/natural_grass.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/floors/natural/natural_grass.dm b/code/game/turfs/floors/natural/natural_grass.dm index c12fa82dc1..ae501d2689 100644 --- a/code/game/turfs/floors/natural/natural_grass.dm +++ b/code/game/turfs/floors/natural/natural_grass.dm @@ -1,6 +1,6 @@ /turf/floor/natural/grass name = "grass" - desc = "You see a patch of grass. The grass is wild and seems to like it here." + desc = "A patch of grass, growing steadily from the sun's nourishment." possible_states = 1 icon = 'icons/turf/flooring/grass.dmi' footstep_type = /decl/footsteps/grass From d99ce4f3f4f878d69f7ff8e7903a7936ba76ee17 Mon Sep 17 00:00:00 2001 From: Greenjoe12345 <33647525+Greenjoe12345@users.noreply.github.com> Date: Fri, 10 May 2024 20:44:05 +0100 Subject: [PATCH 015/212] Update code/game/turfs/floors/natural/natural_lava.dm Co-authored-by: Penelope Haze --- code/game/turfs/floors/natural/natural_lava.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/floors/natural/natural_lava.dm b/code/game/turfs/floors/natural/natural_lava.dm index 6fadc2fe3e..4fed7d097a 100644 --- a/code/game/turfs/floors/natural/natural_lava.dm +++ b/code/game/turfs/floors/natural/natural_lava.dm @@ -1,6 +1,6 @@ /turf/floor/natural/lava name = "lava" - desc = "Incredibly hot molten rock, you can feel the heat radiating even from a distance.." + desc = "Incredibly hot molten rock, you can feel the heat radiating even from a distance." icon = 'icons/turf/flooring/lava.dmi' movement_delay = 4 dirt_color = COLOR_GRAY20 From 1afebf507f65cece08a90a2d73f4add7199ce82a Mon Sep 17 00:00:00 2001 From: Greenjoe12345 <33647525+Greenjoe12345@users.noreply.github.com> Date: Fri, 10 May 2024 20:44:16 +0100 Subject: [PATCH 016/212] Update code/game/turfs/floors/natural/natural_ice.dm Co-authored-by: Penelope Haze --- code/game/turfs/floors/natural/natural_ice.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/floors/natural/natural_ice.dm b/code/game/turfs/floors/natural/natural_ice.dm index fc02e588a3..5243fd873e 100644 --- a/code/game/turfs/floors/natural/natural_ice.dm +++ b/code/game/turfs/floors/natural/natural_ice.dm @@ -1,6 +1,6 @@ /turf/floor/natural/ice name = "ice" - desc = "A sheet of smooth, slick ice. Be careful not to fall.." + desc = "A sheet of smooth, slick ice. Be careful not to slip..." icon = 'icons/turf/flooring/ice.dmi' footstep_type = /decl/footsteps/plating base_color = COLOR_LIQUID_WATER From ddc8f744aeba805a96cd5665a3aee5461886bdaa Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 May 2024 06:56:46 +1000 Subject: [PATCH 017/212] Applying changes to deer/fox PR. --- .../butchery/butchery_data_livestock.dm | 2 +- .../mob/living/simple_animal/passive/fox.dm | 4 +- maps/shaded_hills/levels/_levels.dm | 125 +++++++++--------- 3 files changed, 63 insertions(+), 68 deletions(-) diff --git a/code/modules/butchery/butchery_data_livestock.dm b/code/modules/butchery/butchery_data_livestock.dm index c78568d59d..74ddfdafc9 100644 --- a/code/modules/butchery/butchery_data_livestock.dm +++ b/code/modules/butchery/butchery_data_livestock.dm @@ -26,7 +26,7 @@ /decl/butchery_data/animal/ruminant/deer meat_name = "venison" - meat_type = /obj/item/chems/food/butchery/meat/ + meat_type = /obj/item/chems/food/butchery/meat meat_amount = 5 bone_amount = 9 skin_material = /decl/material/solid/organic/skin/deer diff --git a/code/modules/mob/living/simple_animal/passive/fox.dm b/code/modules/mob/living/simple_animal/passive/fox.dm index 972e48ab08..ae9ee47f9f 100644 --- a/code/modules/mob/living/simple_animal/passive/fox.dm +++ b/code/modules/mob/living/simple_animal/passive/fox.dm @@ -1,10 +1,11 @@ /datum/ai/passive/fox var/weakref/hunt_target + var/next_hunt = 0 /datum/ai/passive/fox/update_targets() // Fleeing takes precedence. . = ..() - if(!. && !hunt_target) // TODO: generalized nutrition process. && body.get_nutrition() < body.get_max_nutrition() * 0.5) + if(!. && !hunt_target && world.time >= next_hunt) // TODO: generalized nutrition process. && body.get_nutrition() < body.get_max_nutrition() * 0.5) for(var/mob/living/snack in view(body)) //search for a new target if(can_hunt(snack)) hunt_target = weakref(snack) @@ -57,6 +58,7 @@ var/obj/item/remains/remains = new remains_type(get_turf(hunt_mob)) remains.desc += "These look like they belonged to \a [hunt_mob.name]." body.adjust_nutrition(5 * hunt_mob.get_max_health()) + next_hunt = world.time + rand(15 MINUTES, 30 MINUTES) if(prob(5)) hunt_mob.gib() else diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 0b1ade8bae..43fc5f7757 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -9,9 +9,24 @@ /decl/material/gas/oxygen = MOLES_O2STANDARD, /decl/material/gas/nitrogen = MOLES_N2STANDARD ) + var/list/mobs_to_spawn = list() -/datum/level_data/player_level/shaded_hills/proc/place_mobs() - return +/datum/level_data/player_level/shaded_hills/after_generate_level() + . = ..() + if(length(mobs_to_spawn)) + for(var/list/mob_category in mobs_to_spawn) + var/list/mob_types = mob_category[1] + var/mob_turf = mob_category[2] + var/mob_count = mob_category[3] + var/sanity = 1000 + while(mob_count && sanity) + sanity-- + var/turf/place_mob_at = locate(rand(level_inner_min_x, level_inner_max_x), rand(level_inner_min_y, level_inner_max_y), level_z) + if(istype(place_mob_at, mob_turf) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(mob_types) + new mob_type(place_mob_at) + mob_count-- + CHECK_TICK /datum/level_data/player_level/shaded_hills/grassland name = "Shaded Hills - Grassland" @@ -26,31 +41,26 @@ "shaded_hills_swamp" = SOUTH, "shaded_hills_downlands" = EAST ) + mobs_to_spawn = list( + list( + list( + /mob/living/simple_animal/passive/mouse = 9, + /mob/living/simple_animal/passive/rabbit = 3, + /mob/living/simple_animal/passive/rabbit/brown = 3, + /mob/living/simple_animal/passive/rabbit/black = 3, + /mob/living/simple_animal/opossum = 5 + ), + /turf/floor/natural/grass, + 10 + ) + ) /datum/level_data/player_level/shaded_hills/grassland/after_generate_level() - . = ..() - // Neither of these procs handle laterally linked levels yet. SSweather.setup_weather_system(src) SSdaycycle.add_linked_levels(get_all_connected_level_ids() | level_id, start_at_night = FALSE, update_interval = 20 MINUTES) - var/sanity = 100 - var/mob_count = 0 - while(mob_count < 10 && sanity) - sanity-- - var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) - if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) - var/mob_type = pickweight(list( - /mob/living/simple_animal/passive/mouse = 9, - /mob/living/simple_animal/passive/rabbit = 3, - /mob/living/simple_animal/passive/rabbit/brown = 3, - /mob/living/simple_animal/passive/rabbit/black = 3, - /mob/living/simple_animal/opossum = 5 - )) - new mob_type(place_mob_at) - mob_count++ - /datum/level_data/player_level/shaded_hills/swamp name = "Shaded Hills - Swamp" level_id = "shaded_hills_swamp" @@ -61,16 +71,9 @@ /datum/random_map/noise/shaded_hills/swamp, /datum/random_map/noise/forage/shaded_hills/swamp ) - -/datum/level_data/player_level/shaded_hills/swamp/after_generate_level() - . = ..() - var/sanity = 100 - var/mob_count = 0 - while(mob_count < 5 && sanity) - sanity-- - var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) - if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) - var/mob_type = pickweight(list( + mobs_to_spawn = list( + list( + list( /mob/living/simple_animal/passive/mouse = 6, /mob/living/simple_animal/passive/rabbit = 2, /mob/living/simple_animal/passive/rabbit/brown = 2, @@ -79,24 +82,21 @@ /mob/living/simple_animal/frog/brown = 2, /mob/living/simple_animal/frog/yellow = 2, /mob/living/simple_animal/frog/purple = 1 - )) - new mob_type(place_mob_at) - mob_count++ - - sanity = 100 - mob_count = 0 - while(mob_count < 10 && sanity) - sanity-- - var/turf/floor/natural/mud/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) - if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) - var/mob_type = pickweight(list( + ), + /turf/floor/natural/grass, + 5 + ), + list( + list( /mob/living/simple_animal/frog = 3, /mob/living/simple_animal/frog/brown = 2, /mob/living/simple_animal/frog/yellow = 2, /mob/living/simple_animal/frog/purple = 1 - )) - new mob_type(place_mob_at) - mob_count++ + ), + /turf/floor/natural/mud, + 10 + ) + ) /datum/level_data/player_level/shaded_hills/woods name = "Shaded Hills - Woods" @@ -108,33 +108,26 @@ /datum/random_map/noise/shaded_hills/woods, /datum/random_map/noise/forage/shaded_hills/woods ) - -/datum/level_data/player_level/shaded_hills/woods/after_generate_level() - . = ..() - var/mob_count = 0 - var/sanity = 100 - while(mob_count < 10 && sanity) - sanity-- - var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) - if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) - var/mob_type = pickweight(list( + mobs_to_spawn = list( + list( + list( /mob/living/simple_animal/passive/mouse = 6, /mob/living/simple_animal/passive/rabbit = 2, /mob/living/simple_animal/passive/rabbit/brown = 2, /mob/living/simple_animal/passive/rabbit/black = 2, /mob/living/simple_animal/opossum = 2 - )) - new mob_type(place_mob_at) - mob_count++ - - sanity = 100 - mob_count = 0 - while(mob_count < 5 && sanity) - sanity-- - var/turf/floor/natural/grass/place_mob_at = locate(rand(10,world.maxx-10), rand(10,world.maxy-10), level_z) - if(istype(place_mob_at) && !(locate(/mob/living) in place_mob_at)) - new /mob/living/simple_animal/passive/deer(place_mob_at) - mob_count++ + ), + /turf/floor/natural/grass, + 10 + ), + list( + list( + /mob/living/simple_animal/passive/deer = 1 + ), + /turf/floor/natural/grass, + 5 + ) + ) /datum/level_data/player_level/shaded_hills/downlands name = "Shaded Hills - Downlands" From ae759a6c93c964f8c194ad74f044d32040130d02 Mon Sep 17 00:00:00 2001 From: Greenjoe12345 Date: Fri, 10 May 2024 22:11:46 +0100 Subject: [PATCH 018/212] changes --- code/game/turfs/floors/natural/natural_grass.dm | 4 ++-- code/game/turfs/floors/natural/natural_lava.dm | 2 +- code/game/turfs/floors/natural/natural_rock.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/floors/natural/natural_grass.dm b/code/game/turfs/floors/natural/natural_grass.dm index ae501d2689..89d8dbeff6 100644 --- a/code/game/turfs/floors/natural/natural_grass.dm +++ b/code/game/turfs/floors/natural/natural_grass.dm @@ -1,6 +1,6 @@ /turf/floor/natural/grass name = "grass" - desc = "A patch of grass, growing steadily from the sun's nourishment." + desc = "A patch of grass, growing steadily and healthily." possible_states = 1 icon = 'icons/turf/flooring/grass.dmi' footstep_type = /decl/footsteps/grass @@ -75,7 +75,7 @@ . = ..() if(icon_state != "scorched") SetName("scorched ground") - desc = "What was once lush grass has been reduced to burnt, ashy wastes." + desc = "What was once lush grass has been reduced to burnt ashes." icon_state = "scorched" icon_edge_layer = -1 footstep_type = /decl/footsteps/asteroid diff --git a/code/game/turfs/floors/natural/natural_lava.dm b/code/game/turfs/floors/natural/natural_lava.dm index 4fed7d097a..30889dec34 100644 --- a/code/game/turfs/floors/natural/natural_lava.dm +++ b/code/game/turfs/floors/natural/natural_lava.dm @@ -1,6 +1,6 @@ /turf/floor/natural/lava name = "lava" - desc = "Incredibly hot molten rock, you can feel the heat radiating even from a distance." + desc = "Incredibly hot molten rock. You can feel the heat radiating even from a distance." icon = 'icons/turf/flooring/lava.dmi' movement_delay = 4 dirt_color = COLOR_GRAY20 diff --git a/code/game/turfs/floors/natural/natural_rock.dm b/code/game/turfs/floors/natural/natural_rock.dm index af6d10cd35..e25763b50a 100644 --- a/code/game/turfs/floors/natural/natural_rock.dm +++ b/code/game/turfs/floors/natural/natural_rock.dm @@ -1,6 +1,6 @@ /turf/floor/natural/rock name = "rock floor" - desc = "A surface of rough, rocky ground." + desc = "A patch of rough, rocky ground." icon = 'icons/turf/flooring/rock.dmi' icon_edge_layer = EXT_EDGE_VOLCANIC is_fundament_turf = TRUE From db57c57a55e48b44a221d7ef2df52e27daadc670 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 13 May 2024 10:06:08 +1000 Subject: [PATCH 019/212] Automatic changelog generation for PR #3987 [ci skip] --- html/changelogs/AutoChangeLog-pr-3987.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3987.yml diff --git a/html/changelogs/AutoChangeLog-pr-3987.yml b/html/changelogs/AutoChangeLog-pr-3987.yml new file mode 100644 index 0000000000..f963fa871a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3987.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: Mice will now flee from harm.} +delete-after: true From dcd90558e74b35d8e3ac76360a47f68f7e924f2a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 13 May 2024 00:40:11 +0000 Subject: [PATCH 020/212] Automatic changelog generation [ci skip] --- html/changelog.html | 13 ++++++------- html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-3987.yml | 4 ---- 3 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3987.yml diff --git a/html/changelog.html b/html/changelog.html index 6701ce3dcd..196ffac05e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->

    +

    13 May 2024

    +

    MistakeNot4892 updated:

    +
      +
    • Mice will now flee from harm.
    • +
    +

    08 May 2024

    MistakeNot4892 updated:

      @@ -159,13 +165,6 @@

      MistakeNot4892 updated:

      • Atom temperature will equalize slower.
      - -

      11 March 2024

      -

      MistakeNot4892 updated:

      -
        -
      • You can now dry yourself or others off with a towel.
      • -
      • You will now drip contact reagents onto your turf if you get splashed or dunked.
      • -
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3d4080d525..b07ac90b90 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14725,3 +14725,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. MistakeNot4892: - admin: Build mode ladders have been removed, and build mode relocate and move have been merged. +2024-05-13: + MistakeNot4892: + - tweak: Mice will now flee from harm. diff --git a/html/changelogs/AutoChangeLog-pr-3987.yml b/html/changelogs/AutoChangeLog-pr-3987.yml deleted file mode 100644 index f963fa871a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3987.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: Mice will now flee from harm.} -delete-after: true From 42d8563f00800e54c14462bd969c67da6e5fceeb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 May 2024 22:53:38 +1000 Subject: [PATCH 021/212] Fixes radio not respecting voice changers. --- code/modules/mob/living/carbon/human/say.dm | 26 ------------------- code/modules/mob/living/say.dm | 25 +++++++++++++++++- .../networking/machinery/telecomms.dm | 2 +- 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index b36bf38379..c83237d385 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -58,32 +58,6 @@ /mob/living/carbon/human/say_understands(mob/speaker, decl/language/speaking) return (!speaking && (issilicon(speaker) || istype(speaker, /mob/announcer) || isbrain(speaker))) || ..() -/mob/living/carbon/human/GetVoice() - - var/voice_sub - var/obj/item/rig/rig = get_rig() - if(rig?.speech?.voice_holder?.active && rig.speech.voice_holder.voice) - voice_sub = rig.speech.voice_holder.voice - - if(!voice_sub) - - var/list/check_gear = list(get_equipped_item(slot_wear_mask_str), get_equipped_item(slot_head_str)) - if(rig) - var/datum/extension/armor/rig/armor_datum = get_extension(rig, /datum/extension/armor) - if(istype(armor_datum) && armor_datum.sealed && rig.helmet == get_equipped_item(slot_head_str)) - check_gear |= rig - - for(var/obj/item/gear in check_gear) - if(!gear) - continue - var/obj/item/voice_changer/changer = locate() in gear - if(changer && changer.active && changer.voice) - voice_sub = changer.voice - - if(voice_sub) - return voice_sub - return real_name - /mob/living/carbon/human/say_quote(var/message, var/decl/language/speaking = null) var/verb = "says" var/ending = copytext(message, length(message)) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 7a73535f77..bef1166912 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -317,4 +317,27 @@ return 1 /mob/proc/GetVoice() - return name + var/voice_sub + var/obj/item/rig/rig = get_rig() + if(rig?.speech?.voice_holder?.active && rig.speech.voice_holder.voice) + voice_sub = rig.speech.voice_holder.voice + + if(!voice_sub) + + var/list/check_gear = list(get_equipped_item(slot_wear_mask_str), get_equipped_item(slot_head_str)) + if(rig) + var/datum/extension/armor/rig/armor_datum = get_extension(rig, /datum/extension/armor) + if(istype(armor_datum) && armor_datum.sealed && rig.helmet == get_equipped_item(slot_head_str)) + check_gear |= rig + + for(var/obj/item/gear in check_gear) + if(!gear) + continue + var/obj/item/voice_changer/changer = locate() in gear + if(changer && changer.active && changer.voice) + voice_sub = changer.voice + + if(voice_sub) + return voice_sub + + return real_name diff --git a/code/modules/modular_computers/networking/machinery/telecomms.dm b/code/modules/modular_computers/networking/machinery/telecomms.dm index 87ef1cca4b..e1167e2a55 100644 --- a/code/modules/modular_computers/networking/machinery/telecomms.dm +++ b/code/modules/modular_computers/networking/machinery/telecomms.dm @@ -160,7 +160,7 @@ var/global/list/telecomms_hubs = list() encryption |= channel.secured var/formatted_msg = "\[[channel?.name || format_frequency(frequency)]\] " - var/send_name = istype(speaker) ? speaker.real_name : ("[speaker]" || "unknown") + var/send_name = istype(speaker) ? speaker.GetVoice() : ("[speaker]" || "unknown") var/list/listeners = list() // Dictionary of listener -> boolean (include overmap origin) // Broadcast to all radio devices in our network. for(var/weakref/W as anything in network.connected_radios) From 19989e8a524f98af0c9e75adec30cd630aa49d64 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 10 May 2024 17:41:59 -0400 Subject: [PATCH 022/212] Make area blurbs re-show after a cooldown --- code/game/area/areas.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 297c6ed0fb..5d4465e312 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -49,6 +49,7 @@ var/global/list/areas = list() var/sound_env = STANDARD_STATION var/description //A text-based description of what this area is for. var/area_blurb_category // Used to filter description showing across subareas + var/const/BLURB_COOLDOWN_TIME = 15 MINUTES var/base_turf // The base turf type of the area, which can be used to override the z-level's base turf var/open_turf // The base turf of the area if it has a turf below it in multizi. Overrides turf-specific open type @@ -346,7 +347,9 @@ var/global/list/mob/living/forced_ambiance_list = new L.update_floating() if(L.ckey) play_ambience(L) - do_area_blurb(L) + // If we haven't changed blurb categories, don't send a blurb. + if(oldarea?.area_blurb_category != area_blurb_category) + do_area_blurb(L) L.lastarea = src @@ -360,9 +363,10 @@ var/global/list/mob/living/forced_ambiance_list = new return if(L?.get_preference_value(/datum/client_preference/area_info_blurb) != PREF_YES) return - if(!(L.ckey in global.area_blurb_stated_to[area_blurb_category])) - LAZYADD(global.area_blurb_stated_to[area_blurb_category], L.ckey) - to_chat(L, SPAN_NOTICE(FONT_SMALL("[description]"))) + var/next_message_time = LAZYACCESS(global.area_blurb_stated_to[area_blurb_category], L.ckey) + if(isnull(next_message_time) || world.time > next_message_time) + LAZYSET(global.area_blurb_stated_to[area_blurb_category], L.ckey, world.time + BLURB_COOLDOWN_TIME) + to_chat(L, SPAN_NOTICE(FONT_SMALL(description))) /area/proc/play_ambience(var/mob/living/L) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch From 5ddd4b3f85cce63bd295eaf2093b30b62fc969b3 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 13 May 2024 11:32:46 +1000 Subject: [PATCH 023/212] Automatic changelog generation for PR #3994 [ci skip] --- html/changelogs/AutoChangeLog-pr-3994.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3994.yml diff --git a/html/changelogs/AutoChangeLog-pr-3994.yml b/html/changelogs/AutoChangeLog-pr-3994.yml new file mode 100644 index 0000000000..c73c0a8746 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3994.yml @@ -0,0 +1,5 @@ +author: Penelope Haze +changes: + - {tweak: 'Area on-enter flavortext blurbs will be able to be shown to a player + again after a 15 minute cooldown, rather than only once ever.'} +delete-after: true From 87f24ea8c4633e6a4a3077e85b3559bbda67ec6e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 11 May 2024 00:32:25 -0400 Subject: [PATCH 024/212] Improve natural floor descriptions --- code/__defines/lists.dm | 9 +++++++++ code/_helpers/text.dm | 5 +++++ code/game/turfs/floors/natural/_natural.dm | 1 + .../game/turfs/floors/natural/natural_rock.dm | 2 +- .../turfs/floors/natural/natural_seafloor.dm | 1 + code/game/turfs/floors/subtypes/floor_path.dm | 19 +++++++++++++++++++ 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/code/__defines/lists.dm b/code/__defines/lists.dm index 6805b26b7f..02f7162dc9 100644 --- a/code/__defines/lists.dm +++ b/code/__defines/lists.dm @@ -71,3 +71,12 @@ __BIN_LIST.Insert(__BIN_MID, INPUT);\ };\ } while(FALSE) + +#if DM_VERSION < 515 // legacy, remove once we make 515 mandatory +/proc/LIST_CLEAR_NULLS(L) + var/start_len = L.len + L -= new /list(L.len) + return start_len - L.len +#else +#define LIST_CLEAR_NULLS(L) L.RemoveAll(null) +#endif \ No newline at end of file diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 3f91476dd2..07329ec3ac 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -778,3 +778,8 @@ var/global/list/plural_words_unchanged = list( for(var/i = 1 to num) . += str . = JOINTEXT(.) + +/proc/jointext_no_nulls(list/L, Glue, Start = 1, End = 0) + var/list/temp = L.Copy() + LIST_CLEAR_NULLS(temp) + return jointext(temp, Glue, Start, End) \ No newline at end of file diff --git a/code/game/turfs/floors/natural/_natural.dm b/code/game/turfs/floors/natural/_natural.dm index 51d2546b8f..fc8112565c 100644 --- a/code/game/turfs/floors/natural/_natural.dm +++ b/code/game/turfs/floors/natural/_natural.dm @@ -1,6 +1,7 @@ /turf/floor/natural name = "ground" + gender = PLURAL icon = 'icons/turf/flooring/barren.dmi' desc = "Bare, barren sand." icon_state = "0" diff --git a/code/game/turfs/floors/natural/natural_rock.dm b/code/game/turfs/floors/natural/natural_rock.dm index e25763b50a..3df40650ea 100644 --- a/code/game/turfs/floors/natural/natural_rock.dm +++ b/code/game/turfs/floors/natural/natural_rock.dm @@ -1,5 +1,5 @@ /turf/floor/natural/rock - name = "rock floor" + name = "rock" desc = "A patch of rough, rocky ground." icon = 'icons/turf/flooring/rock.dmi' icon_edge_layer = EXT_EDGE_VOLCANIC diff --git a/code/game/turfs/floors/natural/natural_seafloor.dm b/code/game/turfs/floors/natural/natural_seafloor.dm index 0dc107158c..fcc4f47776 100644 --- a/code/game/turfs/floors/natural/natural_seafloor.dm +++ b/code/game/turfs/floors/natural/natural_seafloor.dm @@ -1,5 +1,6 @@ /turf/floor/natural/seafloor name = "sea floor" + gender = NEUTER desc = "A thick layer of silt and debris from above." icon = 'icons/turf/flooring/seafloor.dmi' icon_edge_layer = EXT_EDGE_SEAFLOOR diff --git a/code/game/turfs/floors/subtypes/floor_path.dm b/code/game/turfs/floors/subtypes/floor_path.dm index 101a2249f5..4c93e75d20 100644 --- a/code/game/turfs/floors/subtypes/floor_path.dm +++ b/code/game/turfs/floors/subtypes/floor_path.dm @@ -1,21 +1,40 @@ // These need conversion to flooring decls but I am leaving it till after this PR. /turf/floor/natural/path name = "path" + gender = NEUTER + desc = "A cobbled path made of loose stones." color = COLOR_GRAY base_color = COLOR_GRAY icon = 'icons/turf/flooring/legacy/cobblestone.dmi' icon_state = "0" material = /decl/material/solid/stone/sandstone // initial_flooring = /decl/flooring/path/cobblestone + // If null, this is just skipped. + var/paving_adjective = "cobbled" + var/paver_adjective = "loose" + // This one should never be null. + var/paver_noun = "stones" + +/turf/floor/natural/path/update_from_material() + SetName("[material.adjective_name] [initial(name)]") + ASSERT(material?.adjective_name) + ASSERT(paver_noun) + desc = "[jointext_no_nulls(list("A", paving_adjective, "path made of", paver_adjective, material?.adjective_name, paver_noun), " ")]." /turf/floor/natural/path/running_bond icon = 'icons/turf/flooring/legacy/running_bond.dmi' icon_edge_layer = -1 + paving_adjective = null + paver_adjective = "staggered" + paver_noun = "bricks" // initial_flooring = /decl/flooring/path/running_bond /turf/floor/natural/path/herringbone icon = 'icons/turf/flooring/legacy/herringbone.dmi' icon_edge_layer = -1 + paving_adjective = "herringbone" + paver_adjective = null + paver_noun = "bricks" // initial_flooring = /decl/flooring/path/herringbone // Material subtypes. From 2634c86777275f7ed4174f2eb2c9a10159b20c3f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 May 2024 07:43:21 +1000 Subject: [PATCH 025/212] Cherrypicking dexterity fixes from dev. --- code/modules/mob/mob.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f2a3a63512..28d9cc0d63 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1100,10 +1100,11 @@ // Work out if we have any brain damage impacting our dexterity. var/dex_malus = 0 - if(getBrainLoss()) + var/braindamage = getBrainLoss() + if(braindamage) var/brainloss_threshold = get_config_value(/decl/config/num/dex_malus_brainloss_threshold) - if(getBrainLoss() > brainloss_threshold) ///brainloss shouldn't instantly cripple you, so the effects only start once past the threshold and escalate from there. - dex_malus = clamp(CEILING((getBrainLoss()-brainloss_threshold)/10), 0, length(global.dexterity_levels)) + if(braindamage > brainloss_threshold) ///brainloss shouldn't instantly cripple you, so the effects only start once past the threshold and escalate from there. + dex_malus = clamp(CEILING((braindamage-brainloss_threshold)/10), 0, length(global.dexterity_levels)) if(dex_malus > 0) dex_malus = global.dexterity_levels[dex_malus] @@ -1116,6 +1117,7 @@ return gripper.get_dexterity(silent) // If this slot requires an organ, do the appropriate organ checks. + check_slot = gripper.requires_organ_tag var/obj/item/organ/external/active_hand = GET_EXTERNAL_ORGAN(src, check_slot) if(!active_hand) if(!silent) @@ -1133,7 +1135,6 @@ return (active_hand.get_manual_dexterity() & ~dex_malus) return active_hand.get_manual_dexterity() - /mob/proc/check_dexterity(var/dex_level = DEXTERITY_FULL, var/silent = FALSE) . = (get_dexterity(silent) & dex_level) == dex_level if(!. && !silent) From e74eb64a199cb3a5dc815cb39c94141eff0ddeb4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 May 2024 18:08:04 +1000 Subject: [PATCH 026/212] Cherrypicked silicon dexterity fix from dev. --- code/modules/mob/living/silicon/silicon.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d0958ccfa3..4debeb58aa 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -464,3 +464,5 @@ /mob/living/silicon/get_total_life_damage() return (getBruteLoss() + getFireLoss()) +/mob/living/silicon/get_dexterity(var/silent) + return dexterity From 0103a94ed01b1d1ed6ceb3b728c0253790d67494 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 May 2024 00:04:24 +1000 Subject: [PATCH 027/212] Fixes long range holopads. --- code/game/machinery/hologram.dm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index a9cf896a8a..a9f3f07644 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -114,25 +114,31 @@ var/global/list/holopads = list() else to_chat(user, "A request for AI presence was already sent recently.") if("Holocomms") + if(user.loc != src.loc) to_chat(user, "Please step onto the holopad.") return + if(last_request + 200 < world.time) //don't spam other people with requests either, you jerk! + last_request = world.time var/list/holopadlist = list() var/zlevels = SSmapping.get_connected_levels(z) - var/zlevels_long = list() + var/list/zlevels_long = list() + if(holopadType == HOLOPAD_LONG_RANGE && length(reachable_overmaps)) for(var/zlevel in global.overmap_sectors) - var/obj/effect/overmap/visitable/O = global.overmap_sectors[num2text(zlevel)] - if(!isnull(O) && (O.overmap_id in reachable_overmaps)) + var/obj/effect/overmap/visitable/O = global.overmap_sectors[zlevel] + if(!isnull(O) && (O.overmap_id in reachable_overmaps) && LAZYLEN(O.map_z)) zlevels_long |= O.map_z + for(var/obj/machinery/hologram/holopad/H in SSmachines.machinery) if (H.operable()) if(H.z in zlevels) holopadlist["[H.holopad_id]"] = H //Define a list and fill it with the area of every holopad in the world if (H.holopadType == HOLOPAD_LONG_RANGE && (H.z in zlevels_long)) holopadlist["[H.holopad_id]"] = H + holopadlist = sortTim(holopadlist, /proc/cmp_text_asc) var/temppad = input(user, "Which holopad would you like to contact?", "holopad list") as null|anything in holopadlist targetpad = holopadlist["[temppad]"] From 56778f9f769fef91a1885ce4a65c0a9e6f3477e6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 May 2024 15:30:34 +1000 Subject: [PATCH 028/212] Lightening the tree shadows on Shaded Hills. --- maps/shaded_hills/areas/_areas.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maps/shaded_hills/areas/_areas.dm b/maps/shaded_hills/areas/_areas.dm index 822650e8b9..78f8da274e 100644 --- a/maps/shaded_hills/areas/_areas.dm +++ b/maps/shaded_hills/areas/_areas.dm @@ -38,6 +38,6 @@ ) description = "Birds and insects call from the grasses, and a cool wind gusts from across the river." area_blurb_category = /area/shaded_hills/outside - interior_ambient_light_level = 0.2 + interior_ambient_light_level = 0.4 interior_ambient_light_color = "#f3e6ca" From 2cd58c6f2e9ac9a809a8aadc7627dd0caa12b76d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 May 2024 16:15:24 +1000 Subject: [PATCH 029/212] Ripping out and replacing SSdaycycle. --- code/_helpers/unsorted.dm | 3 +- code/controllers/subsystems/ambience.dm | 24 +-- code/controllers/subsystems/daycycle.dm | 163 ++++-------------- code/datums/daycycle/daycycle.dm | 71 ++++++++ code/datums/daycycle/time_of_day.dm | 40 +++++ code/game/area/areas.dm | 9 +- code/modules/admin/verbs/debug.dm | 3 +- .../random_exoplanet/planetoid_data.dm | 20 +-- code/modules/multiz/level_data.dm | 28 ++- code/modules/multiz/movement.dm | 64 +++++-- code/modules/weather/_weather.dm | 2 +- code/modules/weather/weather_wind.dm | 4 +- maps/planets/test_planet/test_planet.dm | 5 +- maps/shaded_hills/areas/_areas.dm | 3 +- maps/shaded_hills/levels/_levels.dm | 10 +- nebula.dme | 4 +- 16 files changed, 267 insertions(+), 186 deletions(-) create mode 100644 code/datums/daycycle/daycycle.dm create mode 100644 code/datums/daycycle/time_of_day.dm diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 1d1291dfae..104b04ab4b 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -768,8 +768,7 @@ var/global/list/WALLITEMS = list( /proc/get_random_colour(var/simple = FALSE, var/lower = 0, var/upper = 255) if(simple) return pick(list("#ff0000","#ff7f00","#ffff00","#00ff00","#0000ff","#4b0082","#8f00ff")) - else - return rgb(rand(lower, upper), rand(lower, upper), rand(lower, upper)) + return rgb(rand(lower, upper), rand(lower, upper), rand(lower, upper)) // call to generate a stack trace and print to runtime logs /proc/get_stack_trace(msg, file, line) diff --git a/code/controllers/subsystems/ambience.dm b/code/controllers/subsystems/ambience.dm index f7c1ad84de..9ebec71930 100644 --- a/code/controllers/subsystems/ambience.dm +++ b/code/controllers/subsystems/ambience.dm @@ -27,16 +27,14 @@ SUBSYSTEM_DEF(ambience) // If we're not outside, we don't show ambient light. clear_ambient_light() // TODO: fix the delta issues resulting in burn-in so this can be run only when needed - var/override_light_power - var/override_light_color + var/ambient_light_modifier // If we're indoors because of our area, OR we're outdoors and not exposed to the weather, get interior ambience. var/outsideness = is_outside() if((!outsideness && is_outside == OUTSIDE_AREA) || (outsideness && get_weather_exposure() != WEATHER_EXPOSED)) var/area/A = get_area(src) - if(!A || !A.interior_ambient_light_level) + if(isnull(A?.interior_ambient_light_modifier)) return FALSE - override_light_power = A.interior_ambient_light_level - override_light_color = A.interior_ambient_light_color || COLOR_WHITE + ambient_light_modifier = A.interior_ambient_light_modifier // If we're dynamically lit, we want ambient light regardless of neighbors. var/lit = TURF_IS_DYNAMICALLY_LIT_UNSAFE(src) @@ -50,15 +48,19 @@ SUBSYSTEM_DEF(ambience) if(lit) - // If we're using area lighting, we're indoors, so shouldn't use level data ambience. - if(override_light_power) - set_ambient_light(override_light_color || COLOR_WHITE, override_light_power) - return TRUE - // Grab what we need to set ambient light from our level handler. var/datum/level_data/level_data = SSmapping.levels_by_z[z] + + // Check for daycycle ambience. + if(level_data.daycycle_id) + var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(level_data.daycycle_id) + if(daycycle?.current_period?.power) + set_ambient_light(daycycle.current_period.color, clamp(daycycle.current_period.power + ambient_light_modifier, 0, 1)) + return TRUE + + // Apply general level ambience. if(level_data?.ambient_light_level) - set_ambient_light(level_data.ambient_light_color, level_data.ambient_light_level) + set_ambient_light(level_data.ambient_light_color, clamp(level_data.ambient_light_level + ambient_light_modifier, 0, 1)) return TRUE return FALSE diff --git a/code/controllers/subsystems/daycycle.dm b/code/controllers/subsystems/daycycle.dm index 87cb258a12..e4e98c3b56 100644 --- a/code/controllers/subsystems/daycycle.dm +++ b/code/controllers/subsystems/daycycle.dm @@ -2,147 +2,52 @@ SUBSYSTEM_DEF(daycycle) name = "Day Cycle" priority = SS_PRIORITY_DAYCYCLE - wait = 2 SECONDS + wait = 10 SECONDS // 1 MINUTE flags = SS_BACKGROUND | SS_POST_FIRE_TIMING | SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME init_order = SS_INIT_TICKER - ///List of the topmost level_ids associated with their /datum/ssdaycycle_registered that contains the current daystate for that set of levels. - var/list/registered_levels - ///List of /datum/ssdaycycle_registered currently being processed this tick + var/list/daycycles = list() var/list/current_run -///Adds a set of levels that should all be updated at the same time and share the same day state -/datum/controller/subsystem/daycycle/proc/add_linked_levels(var/list/level_ids, var/start_at_night = FALSE, var/update_interval = 5 MINUTES) +/datum/controller/subsystem/daycycle/proc/remove_level(level_z, daycycle_id) + var/datum/daycycle/daycycle = get_daycycle(daycycle_id) + if(!daycycle) + return + if(islist(level_z)) + for(var/linked_level in level_z) + daycycle.remove_level(linked_level) + else + daycycle.remove_level(level_z) + +/datum/controller/subsystem/daycycle/proc/register_level(level_z, daycycle_id, daycycle_type = /datum/daycycle/exoplanet) + var/datum/daycycle/daycycle = get_daycycle(daycycle_id, daycycle_type, create_if_missing = TRUE) + if(islist(level_z)) + for(var/linked_level in level_z) + daycycle.add_level(linked_level) + else + daycycle.add_level(level_z) + +/datum/controller/subsystem/daycycle/proc/get_daycycle(daycycle_id, daycycle_type = /datum/daycycle/exoplanet, create_if_missing) if(get_config_value(/decl/config/toggle/disable_daycycle)) return //If disabled, we don't add anything - var/topmost_level_id = level_ids[1] - if(LAZYISIN(registered_levels, topmost_level_id)) - CRASH("Tried to add a set of level ids that was already registered! ('[topmost_level_id]')") - LAZYSET(registered_levels, topmost_level_id, new /datum/ssdaycycle_registered(level_ids, start_at_night, update_interval)) - -/datum/controller/subsystem/daycycle/proc/remove_linked_levels(var/topmost_level_id) - if(!LAZYISIN(registered_levels, topmost_level_id)) - return - LAZYREMOVE(registered_levels, topmost_level_id) + var/datum/daycycle/daycycle = daycycles[daycycle_id] + if(!daycycle && create_if_missing) + daycycle = new daycycle_type(daycycle_id) + daycycles[daycycle_id] = daycycle + return daycycle /datum/controller/subsystem/daycycle/fire(resumed = 0) if(get_config_value(/decl/config/toggle/disable_daycycle)) disable() LAZYCLEARLIST(current_run) - return //If disabled, we shouldn't fire + return if(!resumed) - current_run = registered_levels?.Copy() + current_run = daycycles?.Copy() while(length(current_run)) - var/datum/ssdaycycle_registered/levels = current_run[current_run.len] - levels = current_run[levels] + var/cycle_id = current_run[current_run.len] + var/datum/daycycle/cycle = current_run[cycle_id] current_run.len-- - //Make sure it's time to run it, otherwise skip - if(REALTIMEOFDAY >= (levels.time_last_column_update + round(levels.update_interval / (max(levels.x_max) - max(levels.x_min))))) - levels.update_all_daycolumns() - if (MC_TICK_CHECK) - return - -/////////////////////////////////////////////////////////////////////////// -// Day Cycle Entry -/////////////////////////////////////////////////////////////////////////// - -///Data on a set of z-levels getting daylight updates -/datum/ssdaycycle_registered - ///level_id strings for all the linked levels sharing a daycycle state. - var/list/level_ids - ///Is this current cycle turning turfs to night, or day. - var/is_applying_night = FALSE - ///Time between updating all turfs in the current column. - var/update_interval = 5 MINUTES - ///X position of the column currently having its lighting changed to day or night. - var/daycolumn_x = 1 - ///Time we last updated a column. - var/time_last_column_update - - ///Cached minimum inner area's X coordinate for each registered levels. - var/list/x_min - ///Cached maximum inner area's X coordinate for each registered levels. - var/list/x_max - ///Cached minimum inner area's Y coordinate for each registered levels. - var/list/y_min - ///Cached maximum inner area's Y coordinate for each registered levels. - var/list/y_max - ///Cached Z index for each registered levels. - var/list/level_z - -/datum/ssdaycycle_registered/New(var/list/_level_ids, var/_start_at_night = is_applying_night, var/_update_interval = update_interval) - . = ..() - level_ids = _level_ids - is_applying_night = _start_at_night - update_interval = _update_interval - for(var/ID in _level_ids) - add_level(ID) - daycolumn_x = world.maxx - -///Add the level with the specified level_id string to the levels managed by the this ssdaycycle_registered datum. -/datum/ssdaycycle_registered/proc/add_level(var/level_id) - var/datum/level_data/LD = SSmapping.levels_by_id[level_id] - LAZYADD(x_min, (LD.level_inner_min_x || 1)) - LAZYADD(y_min, (LD.level_inner_min_y || 1)) - LAZYADD(x_max, (LD.level_inner_min_x? LD.level_inner_max_x : world.maxx)) - LAZYADD(y_max, (LD.level_inner_min_y? LD.level_inner_max_y : world.maxy)) - LAZYADD(level_z, LD.level_z) - -///Remove the level with the specified level_id string from the levels managed by the this ssdaycycle_registered datum. -/datum/ssdaycycle_registered/proc/remove_level(var/level_id) - if(!level_ids) - return - var/level_index - for(var/i = 1 to length(level_ids)) - if(level_ids[i] == level_id) - level_index = i - break - if(!level_index) - return - - //Remove the thing from all list and make sure they all match by index - level_ids.Cut(level_index, level_index) - x_min.Cut(level_index, level_index) - x_max.Cut(level_index, level_index) - y_min.Cut(level_index, level_index) - y_max.Cut(level_index, level_index) - level_z.Cut(level_index, level_index) - ASSERT(length(level_ids) == length(x_min) == length(x_max) == length(y_min) == length(y_max) == length(level_z)) - -///Returns the list of turfs on the level with the index specified from our managed level lists. -/datum/ssdaycycle_registered/proc/get_level_column(var/level_index) - if(daycolumn_x < x_min[level_index] || daycolumn_x >= x_max[level_index]) - return //Don't add turfs until daycolumn is within the actual level - . = list() - for(var/turf/turf in block(locate(daycolumn_x, y_min[level_index], level_z[level_index]), locate(daycolumn_x, y_max[level_index], level_z[level_index]))) - if(turf.is_outside()) - . += turf - -///Increment the column we're currently updating for our set of managed z-level. -/datum/ssdaycycle_registered/proc/increment_column() - if(daycolumn_x >= world.maxx) - is_applying_night = !is_applying_night - daycolumn_x = 1 - else - daycolumn_x++ - time_last_column_update = REALTIMEOFDAY - return daycolumn_x - -///Update the daystate for all the turfs within the current column for each managed z-levels. -/datum/ssdaycycle_registered/proc/update_all_daycolumns() - for(var/i = 1 to length(level_ids)) - update_level_daycolumn(i) - increment_column() - -///Updates the day columns on a specific level we got -/datum/ssdaycycle_registered/proc/update_level_daycolumn(var/level_index) - var/list/turfs = get_level_column(level_index) - var/datum/level_data/LD = SSmapping.levels_by_id[level_ids[level_index]] - var/light_color = LD.ambient_light_color - var/light_intensity = is_applying_night? 0.1 : LD.ambient_light_level - - for(var/turf/T in turfs) - if (light_intensity) - T.set_ambient_light(light_color, light_intensity) - else - T.clear_ambient_light() \ No newline at end of file + if(istype(cycle)) + cycle.tick() + if (MC_TICK_CHECK) + return diff --git a/code/datums/daycycle/daycycle.dm b/code/datums/daycycle/daycycle.dm new file mode 100644 index 0000000000..b818fa7963 --- /dev/null +++ b/code/datums/daycycle/daycycle.dm @@ -0,0 +1,71 @@ +/datum/daycycle + abstract_type = /datum/daycycle + /// Unique string ID used to register a level with a daycycle. + var/daycycle_id + /// How long is a full day and night cycle? + var/day_duration = 2 MINUTES //30 MINUTES + /// How far are we into the current cycle? + var/time_of_day = 0 + /// What world.time did we last update? Used to calculate time progression between ticks. + var/last_update = 0 + /// What z-levels are affected by this daycycle? Used for mass updating ambience. + var/list/levels_affected = list() + /// What period of day are we sitting in as of our last update? + var/datum/time_of_day/current_period + /// Mappings of colour and power to % progression points throughout the cycle. + /// Each entry must be arranged in order of earliest to latest. + /// Null values on periods use the general level ambience instead. + var/list/cycle_periods = list( + new /datum/time_of_day/sunrise, + new /datum/time_of_day/daytime, + new /datum/time_of_day/sunset, + new /datum/time_of_day/night + ) + +/datum/daycycle/New(_cycle_id) + daycycle_id = _cycle_id + last_update = world.time + transition_daylight() // pre-populate our values. + +/datum/daycycle/proc/add_level(level_z) + levels_affected |= level_z + var/datum/level_data/level = SSmapping.levels_by_z[level_z] + if(level) + level.update_turf_ambience() + +/datum/daycycle/proc/remove_level(level_z) + levels_affected -= level_z + var/datum/level_data/level = SSmapping.levels_by_z[level_z] + if(level) + level.update_turf_ambience() + +/datum/daycycle/proc/transition_daylight() + + time_of_day += world.time - last_update + if(time_of_day >= day_duration) + time_of_day -= day_duration + + var/datum/time_of_day/last_period = current_period + var/progression_percentage = time_of_day / day_duration + for(var/datum/time_of_day/period in cycle_periods) + if(progression_percentage <= period.period) + current_period = period + break + + . = current_period != last_period && (current_period.color != last_period.color || current_period.power != last_period.power) + if(. && current_period.announcement) + for(var/mob/player in global.player_list) + var/turf/T = get_turf(player) + if((T.z in levels_affected) && T.is_outside()) + to_chat(player, SPAN_NOTICE(FONT_SMALL(current_period.announcement))) + +/datum/daycycle/proc/tick() + if(transition_daylight()) + for(var/level_z in levels_affected) + var/datum/level_data/level = SSmapping.levels_by_z[level_z] + if(level) + level.update_turf_ambience() + +/datum/daycycle/exoplanet/New() + day_duration = rand(get_config_value(/decl/config/num/exoplanet_min_day_duration), get_config_value(/decl/config/num/exoplanet_max_day_duration)) MINUTES + ..() diff --git a/code/datums/daycycle/time_of_day.dm b/code/datums/daycycle/time_of_day.dm new file mode 100644 index 0000000000..e70be85aba --- /dev/null +++ b/code/datums/daycycle/time_of_day.dm @@ -0,0 +1,40 @@ +/datum/time_of_day + abstract_type = /datum/time_of_day + /// In-character descriptor (ie. 'sunrise') + var/name + /// Message shown to outdoors players when the daycycle moves to this period. + var/announcement + /// 0-1 value to indicate where in the total day/night progression this falls. + var/period + /// Ambient light colour during this time of day. + var/color + /// Ambient light power during this time of day. + var/power + /// Ambient temperature modifier during this time of day. + var/temperature + +/datum/time_of_day/sunrise + name = "sunrise" + announcement = "The sun peeks over the horizon, bathing the world in rosy light." + period = 0.1 + color = COLOR_ORANGE + power = 0.2 + +/datum/time_of_day/daytime + name = "daytime" + announcement = "The sun rises over the horizon, beginning another day." + period = 0.4 + +/datum/time_of_day/sunset + name = "sunset" + announcement = "The sun begins to dip below the horizon, and the daylight fades." + period = 0.6 + color = COLOR_RED + power = 0.5 + +/datum/time_of_day/night + name = "night" + announcement = "Night falls, blanketing the world in darkness." + period = 1 + color = COLOR_NAVY_BLUE + power = 0.3 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 5d4465e312..6f60bb0bf5 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -13,10 +13,9 @@ var/global/list/areas = list() luminosity = 0 mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - // If set, will apply ambient light of this power to turfs under a ceiling. - var/interior_ambient_light_level + // If set, will modify ambient light of ambiently lit turfs under a ceiling. + var/interior_ambient_light_modifier // If set, will apply ambient light of this colour to turfs under a ceiling. - var/interior_ambient_light_color var/proper_name /// Automatically set by SetName and Initialize; cached result of strip_improper(name). var/holomap_color // Color of this area on the holomap. Must be a hex color (as string) or null. @@ -118,7 +117,7 @@ var/global/list/areas = list() if(old_area == A) return - var/old_area_ambience = old_area?.interior_ambient_light_level + var/old_area_ambience = old_area?.interior_ambient_light_modifier A.contents.Add(T) if(old_area) @@ -144,7 +143,7 @@ var/global/list/areas = list() T.update_weather() T.update_external_atmos_participation() - if(A.interior_ambient_light_level != old_area_ambience || outside_changed) + if(A.interior_ambient_light_modifier != old_area_ambience || outside_changed) SSambience.queued |= T /turf/proc/update_registrations_on_adjacent_area_change() diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 555538ced7..2990dcf61c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -508,8 +508,7 @@ PD._theme_forced = theme planet_template.load_new_z(gen_data = PD) if(!daycycle) - PD.day_duration = null - SSdaycycle.remove_linked_levels(PD.topmost_level_id) + SSdaycycle.remove_level(PD.get_linked_level_ids(), PD.daycycle_id) /client/proc/display_del_log() set category = "Debug" diff --git a/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm b/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm index c6190dd2c7..7f22fe2dfc 100644 --- a/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm +++ b/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm @@ -70,8 +70,10 @@ // Day/night cycle tracking. var/starts_at_night = FALSE ///How often do we change day and night. Null means it will stay either night or day forever. - /// Ensure that the minimum is larger than [maxx * daycycle_column_delay]. Otherwise the right side of the exoplanet can get stuck in a forever day. - var/day_duration + /// ID used for registering/deregistering with a daycycle. + var/daycycle_id + /// Type of daycycle to use. + var/daycycle_type = /datum/daycycle/exoplanet ///Ambient lighting level across the surface. All surface height levels will be set to this. var/surface_light_level ///Lighjting color used for the entire surface. @@ -102,6 +104,8 @@ ///Generate and sets the planetary id for this planetoid if it doesn't have one yet. Called on instantiation. /datum/planetoid_data/proc/generate_planetoid_id() + if(isnull(daycycle_id)) + daycycle_id = "daycycle_[sequential_id(/datum/planetoid_data)]" if(length(id)) return return id = "planetoid_[sequential_id(/datum/planetoid_data)]" @@ -243,12 +247,13 @@ ///Registers to neccessary processors and begin running all processing needed by the planet /datum/planetoid_data/proc/begin_processing() - if(day_duration) - SSdaycycle.add_linked_levels(get_linked_level_ids(), starts_at_night, day_duration) + if(daycycle_id) + SSdaycycle.register_level(get_linked_level_ids(), daycycle_id, daycycle_type) ///Stop running any processing needed by the planet, and unregister from processors. /datum/planetoid_data/proc/end_processing() - SSdaycycle.remove_linked_levels(topmost_level_id) + if(daycycle_id) + SSdaycycle.remove_level(get_linked_level_ids(), daycycle_id) //#TODO: Move this into some SS for planet processing stuff or something? /datum/planetoid_data/Process(wait, tick) @@ -376,13 +381,8 @@ generate_planet_materials() generate_planetoid_rings() generate_ambient_lighting() - generate_daycycle_data() generate_weather() -/datum/planetoid_data/random/proc/generate_daycycle_data() - starts_at_night = (surface_light_level > 0.1) - day_duration = rand(get_config_value(/decl/config/num/exoplanet_min_day_duration), get_config_value(/decl/config/num/exoplanet_max_day_duration)) MINUTES - ///If the planet doesn't have a name defined, a name will be randomly generated for it. (Named this way because a global proc generate_planet_name already exists) /datum/planetoid_data/random/proc/make_planet_name() if(length(name)) diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index 972b0de423..e5b380fdb0 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -152,6 +152,11 @@ VAR_PROTECTED/UT_turf_exceptions_by_door_type // An associate list of door types/list of allowed turfs ///Determines if edge turfs should be centered on the map dimensions. var/origin_is_world_center = TRUE + /// If not null, this level will register with a daycycle id/type on New(). + var/daycycle_id + /// Type provided to the above. + var/daycycle_type = /datum/daycycle/exoplanet + /datum/level_data/New(var/_z_level, var/defer_level_setup = FALSE) . = ..() level_z = _z_level @@ -340,6 +345,8 @@ ///Called during level setup. Run anything that should happen only after the map is fully generated. /datum/level_data/proc/after_generate_level() build_border() + if(daycycle_id && daycycle_type) + SSdaycycle.register_level(level_z, daycycle_id, daycycle_type) ///Changes anything named we may need to rename accordingly to the parent location name. For instance, exoplanets levels. /datum/level_data/proc/adapt_location_name(var/location_name) @@ -430,10 +437,17 @@ // Accessors // /datum/level_data/proc/get_exterior_atmosphere() - if(exterior_atmosphere) - var/datum/gas_mixture/gas = new - gas.copy_from(exterior_atmosphere) - return gas + if(!exterior_atmosphere) + return + var/datum/gas_mixture/gas = new + gas.copy_from(exterior_atmosphere) + if(daycycle_id) + var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(daycycle_id) + var/temp_mod = daycycle?.current_period?.temperature + if(!isnull(temp_mod)) + gas.temperature = max(1, gas.temperature + temp_mod) + gas.update_values() + return gas /datum/level_data/proc/get_display_name() if(!name) @@ -693,3 +707,9 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) qdel(monster) template.load(central_turf, centered = TRUE) return TRUE + +/datum/level_data/proc/update_turf_ambience() + if(SSatoms.atom_init_stage >= INITIALIZATION_INNEW_REGULAR) + for(var/turf/level_turf as anything in block(locate(1, 1, level_z), locate(world.maxx, world.maxy, level_z))) + level_turf.update_ambient_light_from_z_or_area() // SSambience.queued |= level_turf - seems to be less consistent + CHECK_TICK diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 11da77c623..b25a5c78af 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -290,21 +290,59 @@ set desc = "If you want to know what's above." set category = "IC" - if(client && !is_physically_disabled()) - if(z_eye) - reset_view(null) - qdel(z_eye) - z_eye = null - return - var/turf/above = GetAbove(src) - if(istype(above) && TURF_IS_MIMICKING(above)) - z_eye = new /atom/movable/z_observer/z_up(src, src) - to_chat(src, "You look up.") - reset_view(z_eye) + if(!client || is_physically_disabled()) + to_chat(src, SPAN_WARNING("You can't look up right now.")) + return + + if(z_eye) + reset_view(null) + qdel(z_eye) + z_eye = null + return + + var/turf/above = GetAbove(src) + if(istype(above) && TURF_IS_MIMICKING(above)) + z_eye = new /atom/movable/z_observer/z_up(src, src) + to_chat(src, SPAN_NOTICE("You look up.")) + reset_view(z_eye) + return + + if(above) + to_chat(src, SPAN_NOTICE("You can see \the [above].")) + return + + check_sky() + +/mob/living/verb/check_sky() + set name = "Check Sky" + if(!client || is_physically_disabled() || !isturf(loc)) + to_chat(src, SPAN_WARNING("You can't check the sky right now.")) + return + + var/turf/my_turf = loc + if(!my_turf.is_outside()) + var/cannot_see_outside = TRUE + for(var/turf/neighbor in view(3, src)) + if(neighbor.is_outside()) + cannot_see_outside = FALSE + break + if(cannot_see_outside) + to_chat(src, SPAN_WARNING("You are indoors, and cannot see the sky from here.")) return - to_chat(src, "You can see \the [above ? above : "ceiling"].") + + var/obj/abstract/weather_system/weather = SSweather.weather_by_z[my_turf.z] + var/decl/state/weather/current_weather = weather?.weather_system?.current_state + if(istype(current_weather) && current_weather.descriptor) + to_chat(src, SPAN_NOTICE(current_weather.descriptor)) + else + to_chat(src, SPAN_NOTICE("The weather is indeterminate.")) + + var/datum/level_data/level = SSmapping.levels_by_z[my_turf.z] + var/datum/daycycle/daycycle = level?.daycycle_id && SSdaycycle.get_daycycle(level.daycycle_id) + if(daycycle?.current_period?.name) + to_chat(src, SPAN_NOTICE("It is currently [daycycle.current_period.name].")) else - to_chat(src, "You can't look up right now.") + to_chat(src, SPAN_NOTICE("The time of day is indeterminate.")) /mob/living/verb/lookdown() set name = "Look Down" diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index 53a1ed5476..420c6b755f 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -74,7 +74,7 @@ SHOULD_CALL_PARENT(FALSE) var/decl/state/weather/weather_state = weather_system.current_state if(istype(weather_state)) - to_chat(user, weather_state.descriptor) + to_chat(user, SPAN_NOTICE(FONT_SMALL(weather_state.descriptor))) show_wind(user, force = TRUE) // Called by /decl/state/weather to assess validity of a state in the weather FSM. diff --git a/code/modules/weather/weather_wind.dm b/code/modules/weather/weather_wind.dm index f685489d94..72f3591bb6 100644 --- a/code/modules/weather/weather_wind.dm +++ b/code/modules/weather/weather_wind.dm @@ -33,6 +33,6 @@ if(environment && environment.return_pressure() >= MIN_WIND_PRESSURE) // Arbitrary low pressure bound. var/absolute_strength = abs(wind_strength) if(absolute_strength <= 0.5 || !wind_direction) - to_chat(M, SPAN_NOTICE("The wind is calm.")) + to_chat(M, SPAN_NOTICE(FONT_SMALL("The wind is calm."))) else - to_chat(M, SPAN_NOTICE("The wind is blowing[absolute_strength > 2 ? " strongly" : ""] towards the [dir2text(wind_direction)].")) + to_chat(M, SPAN_NOTICE(FONT_SMALL("The wind is blowing[absolute_strength > 2 ? " strongly" : ""] towards the [dir2text(wind_direction)]."))) diff --git a/maps/planets/test_planet/test_planet.dm b/maps/planets/test_planet/test_planet.dm index 270ac35e88..3c324b8f17 100644 --- a/maps/planets/test_planet/test_planet.dm +++ b/maps/planets/test_planet/test_planet.dm @@ -68,12 +68,15 @@ ring_type_name = SKYBOX_PLANET_RING_TYPE_SPARSE strata = /decl/strata/sedimentary engraving_generator = /datum/xenoarch_engraving_flavor - day_duration = 12 MINUTES + daycycle_type = /datum/daycycle/exoplanet/neutralia surface_light_level = 0.5 surface_light_color = COLOR_OFF_WHITE flora = /datum/planet_flora/random/neutralia fauna = /datum/fauna_generator/neutralia +/datum/daycycle/exoplanet/neutralia + day_duration = 12 MINUTES + //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Neutralia Template //////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/maps/shaded_hills/areas/_areas.dm b/maps/shaded_hills/areas/_areas.dm index 78f8da274e..a9e162d4de 100644 --- a/maps/shaded_hills/areas/_areas.dm +++ b/maps/shaded_hills/areas/_areas.dm @@ -38,6 +38,5 @@ ) description = "Birds and insects call from the grasses, and a cool wind gusts from across the river." area_blurb_category = /area/shaded_hills/outside - interior_ambient_light_level = 0.4 - interior_ambient_light_color = "#f3e6ca" + interior_ambient_light_modifier = -0.3 diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 43fc5f7757..6a44787bbf 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -9,8 +9,15 @@ /decl/material/gas/oxygen = MOLES_O2STANDARD, /decl/material/gas/nitrogen = MOLES_N2STANDARD ) + daycycle_type = /datum/daycycle/shaded_hills + daycycle_id = "daycycle_shaded_hills" + var/list/mobs_to_spawn = list() + +// Placeholder for more customised values. +/datum/daycycle/shaded_hills + /datum/level_data/player_level/shaded_hills/after_generate_level() . = ..() if(length(mobs_to_spawn)) @@ -59,8 +66,6 @@ . = ..() // Neither of these procs handle laterally linked levels yet. SSweather.setup_weather_system(src) - SSdaycycle.add_linked_levels(get_all_connected_level_ids() | level_id, start_at_night = FALSE, update_interval = 20 MINUTES) - /datum/level_data/player_level/shaded_hills/swamp name = "Shaded Hills - Swamp" level_id = "shaded_hills_swamp" @@ -143,7 +148,6 @@ . = ..() // Neither of these procs handle laterally linked levels yet. SSweather.setup_weather_system(src) - SSdaycycle.add_linked_levels(get_all_connected_level_ids() | level_id, start_at_night = FALSE, update_interval = 20 MINUTES) /obj/abstract/level_data_spawner/shaded_hills_grassland level_data_type = /datum/level_data/player_level/shaded_hills/grassland diff --git a/nebula.dme b/nebula.dme index e51049dc8f..5d7772dfa0 100644 --- a/nebula.dme +++ b/nebula.dme @@ -393,6 +393,8 @@ #include "code\datums\config\config_types\config_resources.dm" #include "code\datums\config\config_types\config_server.dm" #include "code\datums\config\config_types\config_voting.dm" +#include "code\datums\daycycle\daycycle.dm" +#include "code\datums\daycycle\time_of_day.dm" #include "code\datums\extensions\_defines.dm" #include "code\datums\extensions\access_provider.dm" #include "code\datums\extensions\deity_be_near.dm" @@ -3985,8 +3987,8 @@ #include "maps\random_ruins\exoplanet_ruins\spider_nest\spider_nest.dm" #include "maps\random_ruins\exoplanet_ruins\tar_anomaly\tar_anomaly.dm" #include "maps\random_ruins\space_ruins\space_ruins.dm" +#include "maps\shaded_hills\shaded_hills.dm" #include "maps\shaded_hills\shaded_hills_define.dm" -#include "maps\tradeship\tradeship.dm" #include "maps\tradeship\tradeship_define.dm" #include "maps\~mapsystem\map_preferences.dm" #include "maps\~mapsystem\map_ranks.dm" From 5651fd7ec01ab16f5e8ee0d4ca394452974a74db Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 May 2024 18:38:31 +1000 Subject: [PATCH 030/212] Moved the sun onto SSdaycycle. --- code/_global_vars/lists/objects.dm | 1 - code/controllers/subsystems/daycycle.dm | 2 +- code/controllers/subsystems/sun.dm | 11 --- code/controllers/verbs.dm | 3 - code/datums/daycycle/daycycle.dm | 10 ++- code/datums/sun.dm | 4 -- code/modules/admin/verbs/debug.dm | 2 +- .../random_exoplanet/planetoid_data.dm | 9 ++- code/modules/power/solar.dm | 68 +++++++++++++------ nebula.dme | 1 - 10 files changed, 66 insertions(+), 45 deletions(-) delete mode 100644 code/controllers/subsystems/sun.dm diff --git a/code/_global_vars/lists/objects.dm b/code/_global_vars/lists/objects.dm index 23d3b3c78c..c050b547ab 100644 --- a/code/_global_vars/lists/objects.dm +++ b/code/_global_vars/lists/objects.dm @@ -6,7 +6,6 @@ var/global/list/listening_objects = list() // List of objects that need to be ab var/global/list/global_map = list() var/global/host = null //only here until check @ code\modules\ghosttrap\trap.dm:112 is fixed -var/global/datum/sun/sun = new var/global/datum/universal_state/universe = new /// Vowels. diff --git a/code/controllers/subsystems/daycycle.dm b/code/controllers/subsystems/daycycle.dm index e4e98c3b56..be89594adc 100644 --- a/code/controllers/subsystems/daycycle.dm +++ b/code/controllers/subsystems/daycycle.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(daycycle) name = "Day Cycle" priority = SS_PRIORITY_DAYCYCLE - wait = 10 SECONDS // 1 MINUTE + wait = 10 SECONDS flags = SS_BACKGROUND | SS_POST_FIRE_TIMING | SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME init_order = SS_INIT_TICKER diff --git a/code/controllers/subsystems/sun.dm b/code/controllers/subsystems/sun.dm deleted file mode 100644 index 1ec4463c4a..0000000000 --- a/code/controllers/subsystems/sun.dm +++ /dev/null @@ -1,11 +0,0 @@ -SUBSYSTEM_DEF(sun) - name = "Sun" - flags = SS_KEEP_TIMING|SS_BACKGROUND|SS_NO_INIT - runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME - wait = 10 SECONDS - -/datum/controller/subsystem/sun/fire() - global.sun.calc_position() - -/datum/controller/subsystem/sun/stat_entry() - ..("Angle:[global.sun.angle]") diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 429ecfd060..7bdb23ec96 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -19,9 +19,6 @@ return switch(controller) - if("Sun") - debug_variables(global.sun) - SSstatistics.add_field_details("admin_verb","DSun") if("Radio") debug_variables(radio_controller) SSstatistics.add_field_details("admin_verb","DRadio") diff --git a/code/datums/daycycle/daycycle.dm b/code/datums/daycycle/daycycle.dm index b818fa7963..b9b2762c97 100644 --- a/code/datums/daycycle/daycycle.dm +++ b/code/datums/daycycle/daycycle.dm @@ -1,9 +1,12 @@ /datum/daycycle abstract_type = /datum/daycycle + var/list/suns = list( + new /datum/sun + ) /// Unique string ID used to register a level with a daycycle. var/daycycle_id /// How long is a full day and night cycle? - var/day_duration = 2 MINUTES //30 MINUTES + var/day_duration = 30 MINUTES /// How far are we into the current cycle? var/time_of_day = 0 /// What world.time did we last update? Used to calculate time progression between ticks. @@ -25,6 +28,7 @@ /datum/daycycle/New(_cycle_id) daycycle_id = _cycle_id last_update = world.time + current_period = cycle_periods[1] transition_daylight() // pre-populate our values. /datum/daycycle/proc/add_level(level_z) @@ -60,6 +64,10 @@ to_chat(player, SPAN_NOTICE(FONT_SMALL(current_period.announcement))) /datum/daycycle/proc/tick() + + for(var/datum/sun/sun in suns) + sun.calc_position() + if(transition_daylight()) for(var/level_z in levels_affected) var/datum/level_data/level = SSmapping.levels_by_z[level_z] diff --git a/code/datums/sun.dm b/code/datums/sun.dm index de10a953be..b571ae6873 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -17,10 +17,6 @@ solar_next_update = world.time // init the timer angle = rand (0,359) // the station position to the sun is randomised at round start -/*/hook/startup/proc/createSun() // handled in scheduler - sun = new /datum/sun() - return 1*/ - // calculate the sun's position given the time of day // at the standard rate (100%) the angle is increase/decreased by 6 degrees every minute. // a full rotation thus take a game hour in that case diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 2990dcf61c..9502e8c2cc 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -508,7 +508,7 @@ PD._theme_forced = theme planet_template.load_new_z(gen_data = PD) if(!daycycle) - SSdaycycle.remove_level(PD.get_linked_level_ids(), PD.daycycle_id) + SSdaycycle.remove_level(PD.get_linked_level_zs(), PD.daycycle_id) /client/proc/display_del_log() set category = "Debug" diff --git a/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm b/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm index 7f22fe2dfc..488c93b08b 100644 --- a/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm +++ b/code/modules/maps/template_types/random_exoplanet/planetoid_data.dm @@ -248,12 +248,12 @@ ///Registers to neccessary processors and begin running all processing needed by the planet /datum/planetoid_data/proc/begin_processing() if(daycycle_id) - SSdaycycle.register_level(get_linked_level_ids(), daycycle_id, daycycle_type) + SSdaycycle.register_level(get_linked_level_zs(), daycycle_id, daycycle_type) ///Stop running any processing needed by the planet, and unregister from processors. /datum/planetoid_data/proc/end_processing() if(daycycle_id) - SSdaycycle.remove_level(get_linked_level_ids(), daycycle_id) + SSdaycycle.remove_level(get_linked_level_zs(), daycycle_id) //#TODO: Move this into some SS for planet processing stuff or something? /datum/planetoid_data/Process(wait, tick) @@ -274,6 +274,11 @@ return "alien creature" return fauna.get_random_species_name() +/datum/planetoid_data/proc/get_linked_level_zs() + for(var/linked_level_id in get_linked_level_ids()) + var/datum/level_data/LD = SSmapping.levels_by_id[topmost_level_id] + LAZYDISTINCTADD(., LD.level_z) + ///Returns a list of all the level id of the levels associated to this planet /datum/planetoid_data/proc/get_linked_level_ids() var/datum/level_data/LD = SSmapping.levels_by_id[topmost_level_id] diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 28718c4d00..d6b41eab2b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -1,3 +1,16 @@ +/obj/machinery/proc/get_best_sun() + var/turf/my_turf = get_turf(src) + if(!istype(my_turf)) + return + var/datum/level_data/level = SSmapping.levels_by_z[my_turf.z] + if(!level?.daycycle_id) + return + var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(level.daycycle_id) + if(!length(daycycle?.suns)) + return + //TODO: iterate list and return best sun for this solar panel + return daycycle.suns[1] + #define SOLAR_MAX_DIST 40 var/global/solar_gen_rate = 1500 @@ -97,14 +110,16 @@ var/global/list/solars_list = list() //calculates the fraction of the sunlight that the panel recieves /obj/machinery/power/solar/proc/update_solar_exposure() - if(!global.sun) + + var/datum/sun/sun = get_best_sun() + if(!sun) return if(obscured) sunfrac = 0 return //find the smaller angle between the direction the panel is facing and the direction of the sun (the sign is not important here) - var/p_angle = min(abs(adir - global.sun.angle), 360 - abs(adir - global.sun.angle)) + var/p_angle = min(abs(adir - sun.angle), 360 - abs(adir - sun.angle)) if(p_angle > 90) // if facing more than 90deg from sun, zero output sunfrac = 0 @@ -116,7 +131,9 @@ var/global/list/solars_list = list() /obj/machinery/power/solar/Process() if(stat & BROKEN) return - if(!global.sun || !control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed + + var/datum/sun/sun = get_best_sun() + if(!sun || !control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed return if(powernet) @@ -170,27 +187,33 @@ var/global/list/solars_list = list() var/ay = y var/turf/T = null + var/datum/sun/sun = get_best_sun() + if(!sun) + obscured = TRUE + return + // On planets, we take fewer steps because the light is mostly up // Also, many planets barely have any spots with enough clear space around if(isturf(loc)) - var/obj/effect/overmap/visitable/sector/planetoid/E = global.overmap_sectors[num2text(loc.z)] + var/obj/effect/overmap/visitable/sector/planetoid/E = overmap_sectors[num2text(loc.z)] if(istype(E)) steps = 5 + for(var/i = 1 to steps) - ax += global.sun.dx - ay += global.sun.dy + ax += sun.dx + ay += sun.dy T = locate( round(ax,0.5),round(ay,0.5),z) - if(!T || T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) // not obscured if we reach the edge + if(!T || T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) // not obscured if we reach the edge break - if(T.opacity) // if we hit a solid turf, panel is obscured - obscured = 1 + if(T.opacity) // if we hit a solid turf, panel is obscured + obscured = TRUE return - obscured = 0 // if hit the edge or stepped max times, not obscured + obscured = FALSE // if hit the edge or stepped max times, not obscured update_solar_exposure() @@ -339,8 +362,9 @@ var/global/list/solars_list = list() if(trackrate) //we're manual tracking. If we set a rotation speed... cdir = targetdir //...the current direction is the targetted one (and rotates panels to it) if(2) // auto-tracking - if(connected_tracker) - connected_tracker.set_angle(global.sun.angle) + var/datum/sun/sun = get_best_sun() + if(connected_tracker && sun) + connected_tracker.set_angle(sun.angle) set_panels(cdir) updateDialog() @@ -365,8 +389,9 @@ var/global/list/solars_list = list() /obj/machinery/power/solar_control/interact(mob/user) + var/datum/sun/sun = get_best_sun() var/t = "Generated power : [round(lastgen)] W
    " - t += "Star Orientation: [global.sun.angle]° ([angle2text(global.sun.angle)])
    " + t += "Star Orientation: [sun?.angle || 0]° ([angle2text(sun?.angle || 0)])
    " t += "Array Orientation: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])
    " t += "Tracking:
    From 89826b001e6a94c15f3a8e75e3df92598fb7ad9a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 21 May 2024 12:57:48 +1000 Subject: [PATCH 160/212] Automatic changelog generation for PR #4034 [ci skip] --- html/changelogs/AutoChangeLog-pr-4034.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4034.yml diff --git a/html/changelogs/AutoChangeLog-pr-4034.yml b/html/changelogs/AutoChangeLog-pr-4034.yml new file mode 100644 index 0000000000..fb02cf4465 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4034.yml @@ -0,0 +1,4 @@ +author: Penelope Haze +changes: + - {soundadd: 'added lobby music for Shaded Hills, by Kevin Macleod.'} +delete-after: true From 4206528310da7a660026dfd63f9f55262096dc4a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 20 May 2024 18:35:36 +1000 Subject: [PATCH 161/212] Fixing glass window recipes. --- code/game/objects/items/stacks/stack.dm | 8 +++++++- code/modules/crafting/stack_recipes/_recipe.dm | 2 +- .../crafting/stack_recipes/recipes_opacity.dm | 17 +++++++++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 6f0ab5f6e4..f48fc26922 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -152,8 +152,14 @@ /obj/item/stack/proc/produce_recipe(decl/stack_recipe/recipe, var/quantity, mob/user) + + quantity = max(quantity, 1) + var/required = quantity*recipe.req_amount - var/produced = min(quantity*recipe.res_amount, recipe.max_res_amount) + var/produced = quantity*recipe.res_amount + if(!isnull(recipe.max_res_amount)) + produced = min(produced, recipe.max_res_amount) + var/decl/material/mat = get_material() var/decl/material/reinf_mat = get_reinforced_material() diff --git a/code/modules/crafting/stack_recipes/_recipe.dm b/code/modules/crafting/stack_recipes/_recipe.dm index 9f601232e5..edcf812b48 100644 --- a/code/modules/crafting/stack_recipes/_recipe.dm +++ b/code/modules/crafting/stack_recipes/_recipe.dm @@ -296,7 +296,7 @@ LAZYDISTINCTADD(material_strings, reinf_mat.use_name) if(LAZYLEN(material_strings)) material_strings = "[english_list(material_strings)]" - if(amount != 1) + if(amount > 1) . = jointext(list("[amount]x", material_strings, name_plural), " ") else . = jointext(list(material_strings, name), " ") diff --git a/code/modules/crafting/stack_recipes/recipes_opacity.dm b/code/modules/crafting/stack_recipes/recipes_opacity.dm index ef0824ac93..36263ab9ec 100644 --- a/code/modules/crafting/stack_recipes/recipes_opacity.dm +++ b/code/modules/crafting/stack_recipes/recipes_opacity.dm @@ -1,12 +1,19 @@ /decl/stack_recipe/opacity - abstract_type = /decl/stack_recipe/opacity - required_max_opacity = 0.5 - on_floor = TRUE - difficulty = MAT_VALUE_HARD_DIY + abstract_type = /decl/stack_recipe/opacity + required_max_opacity = 0.5 + on_floor = TRUE + difficulty = MAT_VALUE_HARD_DIY + required_reinforce_material = MATERIAL_ALLOWED + craft_stack_types = list( + /obj/item/stack/material/pane, + /obj/item/stack/material/sheet, + /obj/item/stack/material/panel + ) /decl/stack_recipe/opacity/fullwindow name = "full-tile window" result_type = /obj/structure/window + max_res_amount = 1 /decl/stack_recipe/opacity/fullwindow/can_make(mob/user) . = ..() @@ -23,6 +30,7 @@ name = "border window" result_type = /obj/structure/window one_per_turf = 0 + max_res_amount = 1 /decl/stack_recipe/opacity/borderwindow/can_make(mob/user) . = ..() @@ -37,6 +45,7 @@ /decl/stack_recipe/opacity/windoor result_type = /obj/structure/windoor_assembly + max_res_amount = 1 /decl/stack_recipe/opacity/windoor/can_make(mob/user) . = ..() From 789284499d53c7acab4c9aab931d3adae617ac1c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 20 May 2024 18:37:02 +1000 Subject: [PATCH 162/212] Removing ANFO from C4 due to melting at room temperature. --- code/game/objects/items/weapons/explosives.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index b3f92b4735..a89e688e6f 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -10,8 +10,7 @@ origin_tech = @'{"esoteric":2}' material = /decl/material/solid/organic/plastic matter = list( - /decl/material/solid/silicon = MATTER_AMOUNT_TRACE, - /decl/material/liquid/anfo = MATTER_AMOUNT_REINFORCEMENT, //#TODO: Slap RDX in here + /decl/material/solid/silicon = MATTER_AMOUNT_TRACE ) var/datum/wires/explosive/c4/wires = null var/timer = 10 From 252b7c688188315d8465a9d80abb679a2e2b6633 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 20 May 2024 18:49:34 +1000 Subject: [PATCH 163/212] Fixing various robot issues. --- code/_onclick/hud/robot.dm | 6 +++--- code/_onclick/hud/screen/screen_robot_modules.dm | 5 +++-- code/modules/mob/living/living_grabs.dm | 13 +++++++++---- code/modules/mob/living/silicon/robot/robot.dm | 6 ++++++ .../screen/styles/robot/modules_background.dmi | Bin 0 -> 308 bytes 5 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 icons/mob/screen/styles/robot/modules_background.dmi diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 03cc1bfe9c..e05cbf23b9 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -54,13 +54,13 @@ var/global/obj/screen/robot_inventory action_intent = new /obj/screen/intent/robot(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) action_intent.icon_state = R.a_intent adding += action_intent + adding += new /obj/screen/robot_panel(null, mymob) + adding += new /obj/screen/robot_store(null, mymob) - adding += new /obj/screen/robot_panel( null, mymob) R.hands = new /obj/screen/robot_module/select(null, mymob) robot_inventory = new /obj/screen/robot_inventory( null, mymob) R.cells = new /obj/screen/robot_charge( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_CHARGE) R.healths = new /obj/screen/robot_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) - R.throw_icon = new /obj/screen/robot_store( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTERACTION) R.bodytemp = new /obj/screen/bodytemp( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_STATUS) R.oxygen = new /obj/screen/robot_oxygen( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_STATUS) R.fire = new /obj/screen/robot_fire( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_STATUS_FIRE) @@ -71,7 +71,7 @@ var/global/obj/screen/robot_inventory R.gun_move_icon = new /obj/screen/gun/move( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_FIRE_INTENT) R.radio_use_icon = new /obj/screen/gun/radio( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_FIRE_INTENT) - hud_elements = list(R.throw_icon, R.zone_sel, R.oxygen, R.fire, R.up_hint, R.hands, R.healths, R.cells, robot_inventory, R.gun_setting_icon) + hud_elements = list(R.zone_sel, R.oxygen, R.fire, R.up_hint, R.hands, R.healths, R.cells, robot_inventory, R.gun_setting_icon) ..() /datum/hud/proc/toggle_show_robot_modules() diff --git a/code/_onclick/hud/screen/screen_robot_modules.dm b/code/_onclick/hud/screen/screen_robot_modules.dm index 7c84758d11..12d82511fe 100644 --- a/code/_onclick/hud/screen/screen_robot_modules.dm +++ b/code/_onclick/hud/screen/screen_robot_modules.dm @@ -1,6 +1,7 @@ /obj/screen/robot_modules_background - icon_state = "block" - icon = 'icons/mob/screen/effects.dmi' + name = "module" + icon_state = "block" + icon = 'icons/mob/screen/styles/robot/modules_background.dmi' requires_ui_style = FALSE /obj/screen/robot_module diff --git a/code/modules/mob/living/living_grabs.dm b/code/modules/mob/living/living_grabs.dm index d190fec7cc..b94afb4f0f 100644 --- a/code/modules/mob/living/living_grabs.dm +++ b/code/modules/mob/living/living_grabs.dm @@ -1,7 +1,4 @@ -/mob/living/proc/can_grab(var/atom/movable/target, var/target_zone, var/defer_hand = FALSE) - if(!ismob(target) && target.anchored) - to_chat(src, SPAN_WARNING("\The [target] won't budge!")) - return FALSE +/mob/living/proc/check_grab_hand(defer_hand) if(defer_hand) if(!get_empty_hand_slot()) to_chat(src, SPAN_WARNING("Your hands are full!")) @@ -9,6 +6,14 @@ else if(get_active_hand()) to_chat(src, SPAN_WARNING("Your [parse_zone(get_active_held_item_slot())] is full!")) return FALSE + return TRUE + +/mob/living/proc/can_grab(var/atom/movable/target, var/target_zone, var/defer_hand = FALSE) + if(!ismob(target) && target.anchored) + to_chat(src, SPAN_WARNING("\The [target] won't budge!")) + return FALSE + if(!check_grab_hand(defer_hand)) + return FALSE if(LAZYLEN(grabbed_by)) to_chat(src, SPAN_WARNING("You cannot start grappling while already being grappled!")) return FALSE diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ae8f8e22f7..906a7f7bae 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1127,3 +1127,9 @@ /decl/emote/audible/synth/security/halt ) return default_emotes + +/mob/living/silicon/robot/check_grab_hand() + if(locate(/obj/item/grab) in contents) + to_chat(src, SPAN_WARNING("You have already grabbed something!")) + return FALSE + return TRUE diff --git a/icons/mob/screen/styles/robot/modules_background.dmi b/icons/mob/screen/styles/robot/modules_background.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8c9e1bb82d81490308177fe4e5024d674f8e549e GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(i*8>L*7#kahx-vCpFfD3i zNJ~qTk&%&)t`Pt#U@Qsp3ubV5b|VeQ$*c;AC~-+GPAM56C74hRQml( zaKXo~Pqe&swa%S6AG{&d;G*$^M>^+yG*2=V_4MwrFb*=lZ0w~l=h37ilR^}NH8s`k zEu%ZTja4_VkT_xfB_Q#>8MYUrH=4>*#%;r4gPkjv*QolM_T- z7 Date: Mon, 20 May 2024 19:35:42 +1000 Subject: [PATCH 164/212] Attempting to make ore not fly off when mined. --- code/_onclick/hud/robot.dm | 1 + code/game/turfs/exterior/_exterior_wall.dm | 2 +- maps/ministation/ministation_objects.dm | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index e05cbf23b9..4cdea225b2 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -53,6 +53,7 @@ var/global/obj/screen/robot_inventory //Intent action_intent = new /obj/screen/intent/robot(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) action_intent.icon_state = R.a_intent + adding += action_intent adding += new /obj/screen/robot_panel(null, mymob) adding += new /obj/screen/robot_store(null, mymob) diff --git a/code/game/turfs/exterior/_exterior_wall.dm b/code/game/turfs/exterior/_exterior_wall.dm index f8a6dc3ee8..a6f6c368a7 100644 --- a/code/game/turfs/exterior/_exterior_wall.dm +++ b/code/game/turfs/exterior/_exterior_wall.dm @@ -381,7 +381,7 @@ var/global/list/natural_walls = list() ramp_slope_direction = null playsound(src, 'sound/items/Welder.ogg', 100, 1) - return ChangeTurf(floor_type || get_base_turf_by_area(src)) + return ChangeTurf(floor_type || get_base_turf_by_area(src), keep_air = TRUE) /turf/exterior/wall/proc/pass_geodata_to(obj/O) var/datum/extension/geological_data/ours = get_extension(src, /datum/extension/geological_data) diff --git a/maps/ministation/ministation_objects.dm b/maps/ministation/ministation_objects.dm index 5acbedc536..3edfab7890 100644 --- a/maps/ministation/ministation_objects.dm +++ b/maps/ministation/ministation_objects.dm @@ -1,3 +1,6 @@ +/turf/exterior/wall/random/ministation + initial_gas = null + /turf/exterior/wall/random/ministation/get_weighted_mineral_list() if(prob(80)) . = list() From a76632969c503c1fe7462de311ae1dce8346871c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 21 May 2024 13:43:42 +1000 Subject: [PATCH 165/212] Fixing bad proc ref in timers. --- code/controllers/subsystems/timer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm index 587c989867..9a8a0850a9 100644 --- a/code/controllers/subsystems/timer.dm +++ b/code/controllers/subsystems/timer.dm @@ -273,7 +273,7 @@ SUBSYSTEM_DEF(timer) return // Sort all timers by time to run - sortTim(alltimers, PROC_REF(cmp_timer)) + sortTim(alltimers, /proc/cmp_timer) // Get the earliest timer, and if the TTR is earlier than the current world.time, // then set the head offset appropriately to be the earliest time tracked by the From a8b166d2f6116f09bbb05a8ccfd77ac96ee54140 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 21 May 2024 13:55:39 +1000 Subject: [PATCH 166/212] Gnolls don't get a magic buzzcut. --- mods/content/fantasy/datum/hnoll/markings.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/content/fantasy/datum/hnoll/markings.dm b/mods/content/fantasy/datum/hnoll/markings.dm index a11cc45dc1..7480fe13b2 100644 --- a/mods/content/fantasy/datum/hnoll/markings.dm +++ b/mods/content/fantasy/datum/hnoll/markings.dm @@ -7,6 +7,11 @@ color_blend = ICON_MULTIPLY uid = "acc_hair_hnoll_rattail" +/decl/sprite_accessory/hair/hnoll/get_hidden_substitute() + if(accessory_flags & VERY_SHORT) + return src + return GET_DECL(/decl/sprite_accessory/hair/bald) + /decl/sprite_accessory/hair/hnoll/straight name = "Hnoll Straight Hair" icon_state = "hair_straight" From aa67e6429f21e4b2b82e295f68a0985b5efd2209 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 21 May 2024 14:12:36 +1000 Subject: [PATCH 167/212] Reskins the Arrival spawnpoint for Shaded Hills. --- maps/shaded_hills/shaded_hills_map.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/maps/shaded_hills/shaded_hills_map.dm b/maps/shaded_hills/shaded_hills_map.dm index ed158e4a3e..175833afc6 100644 --- a/maps/shaded_hills/shaded_hills_map.dm +++ b/maps/shaded_hills/shaded_hills_map.dm @@ -5,3 +5,7 @@ /decl/loadout_category/fantasy/clothing, /decl/loadout_category/fantasy/utility ) + +/decl/spawnpoint/arrivals + name = "Queens' Road" + spawn_announcement = null From bf532a69c83499cb51188d4d1b6af88d665097aa Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 May 2024 13:13:13 -0400 Subject: [PATCH 168/212] Update Tether to May 21 Nebula dev branch --- maps/tether/atoms/closets.dm | 4 ++-- tether_migration.txt | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/maps/tether/atoms/closets.dm b/maps/tether/atoms/closets.dm index b4d034ed78..81f0d7485c 100644 --- a/maps/tether/atoms/closets.dm +++ b/maps/tether/atoms/closets.dm @@ -35,7 +35,7 @@ /obj/item/clothing/suit/toggle/explorer, /obj/item/clothing/mask/gas/explorer, /obj/item/clothing/shoes/winterboots/explorer, - /obj/item/clothing/gloves/color/black, + /obj/item/clothing/gloves/black, // /obj/item/gun/energy/frontier/locked/holdout, // todo: frontier weapons with extra simplemob damage // or maybe not // /obj/item/radio/headset/explorer, /obj/item/flashlight, @@ -148,7 +148,7 @@ /obj/item/clothing/suit/toggle/explorer, /obj/item/clothing/mask/gas/explorer, /obj/item/clothing/shoes/winterboots/explorer, - /obj/item/clothing/gloves/color/black, + /obj/item/clothing/gloves/black, // /obj/item/radio/headset/pathfinder, // /obj/item/radio/headset/pathfinder/alt, // /obj/item/clothing/armor_attachment/helmetcamera/exploration, diff --git a/tether_migration.txt b/tether_migration.txt index d2c9d354bb..47656efcea 100644 --- a/tether_migration.txt +++ b/tether_migration.txt @@ -757,13 +757,6 @@ /obj/item/firstaid_arm_assembly : @DELETE /obj/item/bucket_sensor : @DELETE /obj/item/broken_device : @DELETE -/obj/item/clothing/gloves/blue : /obj/item/clothing/gloves/color/blue -/obj/item/clothing/gloves/brown : /obj/item/clothing/gloves/color/brown -/obj/item/clothing/gloves/green : /obj/item/clothing/gloves/color/green -/obj/item/clothing/gloves/grey : /obj/item/clothing/gloves/color/grey -/obj/item/clothing/gloves/light_brown : /obj/item/clothing/gloves/color/light_brown -/obj/item/clothing/gloves/purple : /obj/item/clothing/gloves/color/purple -/obj/item/clothing/gloves/white : /obj/item/clothing/gloves/color/white /obj/item/spacecash/@SUBTYPES : /obj/item/cash/@SUBTYPES{@OLD} From 8860382d31dbfd3ea68e4e345fef1ca252f2300f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 May 2024 13:13:25 -0400 Subject: [PATCH 169/212] Update genemodding modpack to May 21 Nebula dev branch --- mods/content/genemodding/tail_organ.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/mods/content/genemodding/tail_organ.dm b/mods/content/genemodding/tail_organ.dm index 2341f64882..6ff4786585 100644 --- a/mods/content/genemodding/tail_organ.dm +++ b/mods/content/genemodding/tail_organ.dm @@ -4,6 +4,3 @@ /obj/item/organ/external/tail/proc/get_tail_colour() return tail_colour || ((bodytype.appearance_flags & HAS_SKIN_COLOR) ? skin_colour : null) - -/obj/item/organ/external/tail/proc/get_tail_hair_colour() - return tail_hair_colour || hair_colour From 4763bf1a53dbec37fe685112d41e8fb4d7f28526 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 20 May 2024 19:22:13 -0400 Subject: [PATCH 170/212] Fix flint striker being colorable in loadout --- mods/content/fantasy/items/clothing/_loadout.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index b907babc7c..e251ceb77d 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -141,9 +141,10 @@ ) /decl/loadout_option/fantasy/utility/striker - name = "striker" + name = "flint striker" path = /obj/item/rock/flint/striker available_materials = null + loadout_flags = null /decl/loadout_option/fantasy/utility/knife name = "knife, belt" From ac368c250aeae576aec15eb0e9b29d54290e71bb Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 20 May 2024 19:24:39 -0400 Subject: [PATCH 171/212] Fix being able to create sparks inside walls and dense objects --- code/game/objects/items/rock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/rock.dm b/code/game/objects/items/rock.dm index beb379d9ce..c5f001d8ff 100644 --- a/code/game/objects/items/rock.dm +++ b/code/game/objects/items/rock.dm @@ -23,7 +23,7 @@ var/turf/spark_turf = get_turf(src) if(loc == user) // held in inventory var/turf/front_spark_turf = get_step_resolving_mimic(spark_turf, user.dir) - if(istype(front_spark_turf) && user.Adjacent(front_spark_turf)) + if(istype(front_spark_turf) && !front_spark_turf.contains_dense_objects() && user.Adjacent(front_spark_turf)) spark_turf = front_spark_turf if(spark_turf) spark_at(spark_turf, amount = 2, spark_type = /datum/effect/effect/system/spark_spread/non_electrical) From 3dce9ec8e8bc00a0a1b59c38bc3bb322eba6d709 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 May 2024 15:05:48 -0400 Subject: [PATCH 172/212] Make flint strikers small and blunt --- code/game/objects/items/rock.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/rock.dm b/code/game/objects/items/rock.dm index c5f001d8ff..11ac63ebc3 100644 --- a/code/game/objects/items/rock.dm +++ b/code/game/objects/items/rock.dm @@ -23,7 +23,7 @@ var/turf/spark_turf = get_turf(src) if(loc == user) // held in inventory var/turf/front_spark_turf = get_step_resolving_mimic(spark_turf, user.dir) - if(istype(front_spark_turf) && !front_spark_turf.contains_dense_objects() && user.Adjacent(front_spark_turf)) + if(istype(front_spark_turf) && !front_spark_turf.density && front_spark_turf.ClickCross(global.reverse_dir[user.dir]) && user.Adjacent(front_spark_turf)) spark_turf = front_spark_turf if(spark_turf) spark_at(spark_turf, amount = 2, spark_type = /datum/effect/effect/system/spark_spread/non_electrical) @@ -41,6 +41,9 @@ material = /decl/material/solid/stone/flint /obj/item/rock/flint/striker - name = "striker" - desc = "A squared-off, rather worn-down piece of stone." - icon = 'icons/obj/items/striker.dmi' \ No newline at end of file + name = "striker" + desc = "A squared-off, rather worn-down piece of stone." + icon = 'icons/obj/items/striker.dmi' + sharp = FALSE + edge = FALSE + w_class = ITEM_SIZE_TINY \ No newline at end of file From 9a31c99d4c566d5dc193bb440c92945d53ebf228 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 May 2024 19:01:34 -0400 Subject: [PATCH 173/212] Hide the folding blade inhand sprite when not open --- code/game/objects/items/blades/folding.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/blades/folding.dm b/code/game/objects/items/blades/folding.dm index 4b0f33aae1..026c8cdfc2 100644 --- a/code/game/objects/items/blades/folding.dm +++ b/code/game/objects/items/blades/folding.dm @@ -49,5 +49,6 @@ attack_verb = closed_attack_verbs ..() -/obj/item/knife/folding/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_adjustment = FALSE) +// Only show the inhand sprite when open. +/obj/item/bladed/folding/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_adjustment = FALSE) . = open ? ..() : new /image From f70f869cb4cdefa7e11749d2db3eca3dabcb7c41 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 May 2024 19:51:02 -0400 Subject: [PATCH 174/212] Prevent firestarting with certain folding knives when closed --- code/game/objects/items/_item_materials.dm | 10 ++++++++++ code/game/objects/items/blades/folding.dm | 4 ++++ code/game/objects/items/rock.dm | 4 +++- code/game/objects/items/weapons/material/folding.dm | 8 +++++++- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 49d16dc783..b08317f90a 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -56,6 +56,16 @@ /obj/item/get_material() . = material +// TODO: Refactor more code to use this where necessary, and then make this use +// some sort of generalized system for hitting with different parts of an item +// e.g. pommel vs blade, rifle butt vs bayonet, knife hilt vs blade +/// What material are we using when we hit things? +/// Params: +/// mob/user (the mob striking something with src) +/// atom/target (the atom being struck with src) +/obj/item/proc/get_striking_material(mob/user, atom/target) + return get_material() + /obj/item/proc/update_force() var/new_force if(!max_force) diff --git a/code/game/objects/items/blades/folding.dm b/code/game/objects/items/blades/folding.dm index 026c8cdfc2..b15c57fcf6 100644 --- a/code/game/objects/items/blades/folding.dm +++ b/code/game/objects/items/blades/folding.dm @@ -52,3 +52,7 @@ // Only show the inhand sprite when open. /obj/item/bladed/folding/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_adjustment = FALSE) . = open ? ..() : new /image + +// TODO: Select hilt, guard, etc. as striking material based on dynamic intents +/obj/item/bladed/folding/get_striking_material(mob/user, atom/target) + . = open ? ..() : hilt_material \ No newline at end of file diff --git a/code/game/objects/items/rock.dm b/code/game/objects/items/rock.dm index 11ac63ebc3..ec1e74370e 100644 --- a/code/game/objects/items/rock.dm +++ b/code/game/objects/items/rock.dm @@ -19,7 +19,9 @@ // TODO: craft a flint striker from a flint and a piece of metal /obj/item/rock/attackby(obj/item/W, mob/user) - if((W.material?.ferrous && material?.type == /decl/material/solid/stone/flint) || (material?.ferrous && W.material?.type == /decl/material/solid/stone/flint)) + var/decl/material/weapon_material = W.get_striking_material() + var/decl/material/our_material = get_material() + if((weapon_material?.ferrous && our_material?.type == /decl/material/solid/stone/flint) || (our_material?.ferrous && weapon_material?.type == /decl/material/solid/stone/flint)) var/turf/spark_turf = get_turf(src) if(loc == user) // held in inventory var/turf/front_spark_turf = get_step_resolving_mimic(spark_turf, user.dir) diff --git a/code/game/objects/items/weapons/material/folding.dm b/code/game/objects/items/weapons/material/folding.dm index f103f58dee..b79f558240 100644 --- a/code/game/objects/items/weapons/material/folding.dm +++ b/code/game/objects/items/weapons/material/folding.dm @@ -1,5 +1,5 @@ - // folding/locking knives +// TODO: Replace these with or merge these into /obj/item/bladed/folding /obj/item/knife/folding name = "pocketknife" desc = "A small folding knife." @@ -58,12 +58,18 @@ icon = 'icons/obj/items/weapon/knives/folding/peasant.dmi' valid_handle_colors = list(WOOD_COLOR_GENERIC, WOOD_COLOR_RICH, WOOD_COLOR_BLACK, WOOD_COLOR_CHOCOLATE, WOOD_COLOR_PALE) +/obj/item/knife/folding/wood/get_striking_material(mob/user, atom/target) + . = open ? ..() : GET_DECL(/decl/material/solid/organic/wood) // todo: different handle colors -> different material + /obj/item/knife/folding/tacticool name = "folding knife" desc = "A small folding knife with a polymer handle and a blackened steel blade. These are typically marketed for self defense purposes." icon = 'icons/obj/items/weapon/knives/folding/tacticool.dmi' valid_handle_colors = list("#0f0f2a", "#2a0f0f", "#0f2a0f", COLOR_GRAY20, COLOR_DARK_GUNMETAL) +/obj/item/knife/folding/tacticool/get_striking_material(mob/user, atom/target) + . = open ? ..() : GET_DECL(/decl/material/solid/organic/plastic) + /obj/item/knife/folding/combat //master obj name = "switchblade" desc = "This is a master item - berate the admin or mapper who spawned this" From bc44b0b4ea02108a8920770bfb6091026ee3f819 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 16 May 2024 04:03:27 -0400 Subject: [PATCH 175/212] Replace ebony walls, floors, and doors with walnut --- code/game/objects/structures/doors/_door.dm | 11 ++++++++++- code/game/turfs/flooring/flooring_wood.dm | 14 +++++++------- code/game/turfs/floors/subtypes/floor_wood.dm | 14 +++++++------- code/game/turfs/walls/wall_log.dm | 19 +++++++++++++++---- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 042168765f..3fed9c481c 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -219,10 +219,19 @@ /obj/structure/door/wood/ebony material = /decl/material/solid/organic/wood/ebony - color = WOOD_COLOR_BLACK + color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) /obj/structure/door/wood/saloon/ebony material = /decl/material/solid/organic/wood/ebony + color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + +/obj/structure/door/wood/walnut + material = /decl/material/solid/organic/wood/walnut + color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + +/obj/structure/door/wood/saloon/walnut + material = /decl/material/solid/organic/wood/walnut + color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) /obj/structure/door/glass material = /decl/material/solid/glass diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index cb169bc771..aa598e0c0d 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -8,28 +8,28 @@ build_type = /obj/item/stack/tile/wood flags = TURF_CAN_BREAK | TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER footstep_type = /decl/footsteps/wood - color = WOOD_COLOR_GENERIC + color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) /decl/flooring/wood/mahogany - color = WOOD_COLOR_RICH + color = TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) build_type = /obj/item/stack/tile/mahogany /decl/flooring/wood/maple - color = WOOD_COLOR_PALE + color = TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) build_type = /obj/item/stack/tile/maple /decl/flooring/wood/ebony - color = WOOD_COLOR_BLACK + color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) build_type = /obj/item/stack/tile/ebony /decl/flooring/wood/walnut - color = WOOD_COLOR_CHOCOLATE + color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) build_type = /obj/item/stack/tile/walnut /decl/flooring/wood/bamboo - color = WOOD_COLOR_PALE2 + color = TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) build_type = /obj/item/stack/tile/bamboo /decl/flooring/wood/yew - color = WOOD_COLOR_YELLOW + color = TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) build_type = /obj/item/stack/tile/yew diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index 5108692a8b..b332886596 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -2,29 +2,29 @@ name = "wooden floor" icon = 'icons/turf/flooring/wood.dmi' icon_state = "wood" - color = WOOD_COLOR_GENERIC + color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) initial_flooring = /decl/flooring/wood /turf/floor/wood/mahogany - color = WOOD_COLOR_RICH + color = TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) initial_flooring = /decl/flooring/wood/mahogany /turf/floor/wood/maple - color = WOOD_COLOR_PALE + color = TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) initial_flooring = /decl/flooring/wood/maple /turf/floor/wood/ebony - color = WOOD_COLOR_BLACK + color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) initial_flooring = /decl/flooring/wood/ebony /turf/floor/wood/walnut - color = WOOD_COLOR_CHOCOLATE + color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) initial_flooring = /decl/flooring/wood/walnut /turf/floor/wood/bamboo - color = WOOD_COLOR_PALE2 + color = TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) initial_flooring = /decl/flooring/wood/bamboo /turf/floor/wood/yew - color = WOOD_COLOR_YELLOW + color = TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) initial_flooring = /decl/flooring/wood/yew diff --git a/code/game/turfs/walls/wall_log.dm b/code/game/turfs/walls/wall_log.dm index 33630fa72f..bf870d0180 100644 --- a/code/game/turfs/walls/wall_log.dm +++ b/code/game/turfs/walls/wall_log.dm @@ -1,6 +1,7 @@ /turf/wall/log icon_state = "log" material = /decl/material/solid/organic/wood + color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) girder_material = null /turf/wall/log/get_dismantle_stack_type() @@ -21,7 +22,17 @@ desc = "A log wall made of [material.solid_name]." // Subtypes. -/turf/wall/log/ebony - icon_state = "wood" - material = /decl/material/solid/organic/wood/ebony - color = WOOD_COLOR_BLACK +#define LOG_WALL_SUBTYPE(material_name) \ +/turf/wall/log/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = TYPE_INITIAL(/decl/material/solid/organic/wood/##material_name, color); \ +} + +LOG_WALL_SUBTYPE(fungal) +LOG_WALL_SUBTYPE(ebony) +LOG_WALL_SUBTYPE(walnut) +LOG_WALL_SUBTYPE(maple) +LOG_WALL_SUBTYPE(bamboo) +LOG_WALL_SUBTYPE(yew) + +#undef LOG_WALL_SUBTYPE \ No newline at end of file From a7cc56bea2acbaf622945693bb114f12d31cb3e9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 21 May 2024 20:15:10 -0400 Subject: [PATCH 176/212] Comment out 515 wood/stone subtype macros --- code/game/objects/structures/doors/_door.dm | 8 ++--- code/game/objects/structures/fires.dm | 2 ++ code/game/turfs/flooring/flooring_wood.dm | 14 ++++---- code/game/turfs/floors/subtypes/floor_wood.dm | 14 ++++---- code/game/turfs/walls/wall_log.dm | 33 ++++++++++++++++++- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 3fed9c481c..d52596e057 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -219,19 +219,19 @@ /obj/structure/door/wood/ebony material = /decl/material/solid/organic/wood/ebony - color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) /obj/structure/door/wood/saloon/ebony material = /decl/material/solid/organic/wood/ebony - color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) /obj/structure/door/wood/walnut material = /decl/material/solid/organic/wood/walnut - color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) /obj/structure/door/wood/saloon/walnut material = /decl/material/solid/organic/wood/walnut - color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) /obj/structure/door/glass material = /decl/material/solid/glass diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index 7bbeda342c..c1a39fbdb6 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -443,11 +443,13 @@ /obj/structure/fire_source/fireplace/grab_attack(obj/item/grab/G) return FALSE +/* Uncomment when 515 is the minimum version. #define MATERIAL_FIREPLACE(material_name) \ /obj/structure/fire_source/fireplace/##material_name { \ color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ material = /decl/material/solid/stone/##material_name; \ } +*/ /obj/structure/fire_source/fireplace/basalt material = /decl/material/solid/stone/basalt diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index aa598e0c0d..f51c1c346c 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -8,28 +8,28 @@ build_type = /obj/item/stack/tile/wood flags = TURF_CAN_BREAK | TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER footstep_type = /decl/footsteps/wood - color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) + color = WOOD_COLOR_GENERIC // TYPE_INITIAL(/decl/material/solid/organic/wood, color) /decl/flooring/wood/mahogany - color = TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) + color = WOOD_COLOR_RICH // TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) build_type = /obj/item/stack/tile/mahogany /decl/flooring/wood/maple - color = TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) + color = WOOD_COLOR_PALE // TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) build_type = /obj/item/stack/tile/maple /decl/flooring/wood/ebony - color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) build_type = /obj/item/stack/tile/ebony /decl/flooring/wood/walnut - color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) build_type = /obj/item/stack/tile/walnut /decl/flooring/wood/bamboo - color = TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) + color = WOOD_COLOR_PALE2 // TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) build_type = /obj/item/stack/tile/bamboo /decl/flooring/wood/yew - color = TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) + color = WOOD_COLOR_YELLOW // TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) build_type = /obj/item/stack/tile/yew diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index b332886596..c607fa6e07 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -2,29 +2,29 @@ name = "wooden floor" icon = 'icons/turf/flooring/wood.dmi' icon_state = "wood" - color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) + color = WOOD_COLOR_GENERIC // TYPE_INITIAL(/decl/material/solid/organic/wood, color) initial_flooring = /decl/flooring/wood /turf/floor/wood/mahogany - color = TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) + color = WOOD_COLOR_RICH // TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) initial_flooring = /decl/flooring/wood/mahogany /turf/floor/wood/maple - color = TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) + color = WOOD_COLOR_PALE // TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) initial_flooring = /decl/flooring/wood/maple /turf/floor/wood/ebony - color = TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) initial_flooring = /decl/flooring/wood/ebony /turf/floor/wood/walnut - color = TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) initial_flooring = /decl/flooring/wood/walnut /turf/floor/wood/bamboo - color = TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) + color = WOOD_COLOR_PALE2 // TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) initial_flooring = /decl/flooring/wood/bamboo /turf/floor/wood/yew - color = TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) + color = WOOD_COLOR_YELLOW // TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) initial_flooring = /decl/flooring/wood/yew diff --git a/code/game/turfs/walls/wall_log.dm b/code/game/turfs/walls/wall_log.dm index bf870d0180..b67a4da218 100644 --- a/code/game/turfs/walls/wall_log.dm +++ b/code/game/turfs/walls/wall_log.dm @@ -22,6 +22,7 @@ desc = "A log wall made of [material.solid_name]." // Subtypes. +/* Uncomment when 515 is the minimum version. #define LOG_WALL_SUBTYPE(material_name) \ /turf/wall/log/##material_name { \ material = /decl/material/solid/organic/wood/##material_name; \ @@ -32,7 +33,37 @@ LOG_WALL_SUBTYPE(fungal) LOG_WALL_SUBTYPE(ebony) LOG_WALL_SUBTYPE(walnut) LOG_WALL_SUBTYPE(maple) +LOG_WALL_SUBTYPE(mahogany) LOG_WALL_SUBTYPE(bamboo) LOG_WALL_SUBTYPE(yew) -#undef LOG_WALL_SUBTYPE \ No newline at end of file +#undef LOG_WALL_SUBTYPE +*/ + +/turf/wall/log/fungal + material = /decl/material/solid/organic/wood/fungal + color = "#e6d8dd" + +/turf/wall/log/ebony + material = /decl/material/solid/organic/wood/ebony + color = WOOD_COLOR_BLACK + +/turf/wall/log/walnut + material = /decl/material/solid/organic/wood/walnut + color = WOOD_COLOR_CHOCOLATE + +/turf/wall/log/maple + material = /decl/material/solid/organic/wood/maple + color = WOOD_COLOR_PALE + +/turf/wall/log/mahogany + material = /decl/material/solid/organic/wood/mahogany + color = WOOD_COLOR_RICH + +/turf/wall/log/bamboo + material = /decl/material/solid/organic/wood/bamboo + color = WOOD_COLOR_PALE2 + +/turf/wall/log/yew + material = /decl/material/solid/organic/wood/yew + color = WOOD_COLOR_YELLOW \ No newline at end of file From 938fc174630aa5f0c60e0ecae30eebe2e0276211 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 22 May 2024 00:39:07 +0000 Subject: [PATCH 177/212] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-4034.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4034.yml diff --git a/html/changelog.html b/html/changelog.html index f3ca993cec..3aa6a35896 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    22 May 2024

    +

    Penelope Haze updated:

    +
      +
    • added lobby music for Shaded Hills, by Kevin Macleod.
    • +
    +

    14 May 2024

    Penelope Haze updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 0556cbf053..0bc071ed37 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14732,3 +14732,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Penelope Haze: - tweak: Area on-enter flavortext blurbs will be able to be shown to a player again after a 15 minute cooldown, rather than only once ever. +2024-05-22: + Penelope Haze: + - soundadd: added lobby music for Shaded Hills, by Kevin Macleod. diff --git a/html/changelogs/AutoChangeLog-pr-4034.yml b/html/changelogs/AutoChangeLog-pr-4034.yml deleted file mode 100644 index fb02cf4465..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4034.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Penelope Haze -changes: - - {soundadd: 'added lobby music for Shaded Hills, by Kevin Macleod.'} -delete-after: true From 258a1d842c37c3c14f48ada81488cca4574446ba Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 21 May 2024 23:57:17 +1000 Subject: [PATCH 178/212] Fixing some issues with printing tape from a fabricator. --- code/game/objects/items/weapons/tape.dm | 21 ++++++++++--------- code/modules/fabrication/designs/_design.dm | 7 ++++++- .../designs/general/designs_general.dm | 1 + 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 6f843e7088..0f5284abc3 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -3,16 +3,17 @@ /////////////////////////////////////////////// /**Base class for all things tape, with a limit amount of uses. */ /obj/item/stack/tape_roll - name = "roll of tape" - gender = NEUTER - singular_name = "length of tape" - plural_name = "lengths of tape" - amount = 32 - max_amount = 32 - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/organic/plastic - current_health = 10 - max_health = 10 + name = "roll of tape" + gender = NEUTER + singular_name = "length of tape" + plural_name = "lengths of tape" + amount = 32 + max_amount = 32 + w_class = ITEM_SIZE_SMALL + material = /decl/material/solid/organic/plastic + current_health = 10 + max_health = 10 + matter_multiplier = 0.25 /obj/item/stack/tape_roll/can_split() return FALSE diff --git a/code/modules/fabrication/designs/_design.dm b/code/modules/fabrication/designs/_design.dm index 8d381868fe..2b9256b049 100644 --- a/code/modules/fabrication/designs/_design.dm +++ b/code/modules/fabrication/designs/_design.dm @@ -11,6 +11,9 @@ var/max_amount = 1 // How many instances can be queued at once var/list/required_technology var/list/species_locked + /// Set to explicit FALSE to cause n stacks to be created instead of 1 stack of n amount. + /// Does not work for non-stacks being created as stacks, do not set to explicit TRUE for non-stacks. + var/pass_multiplier_to_product_new // Populate name and resources from the product type. /datum/fabricator_recipe/proc/get_product_name() @@ -20,6 +23,8 @@ ..() if(!path) return + if(isnull(pass_multiplier_to_product_new)) + pass_multiplier_to_product_new = ispath(path, /obj/item/stack) if(!name) name = get_product_name() if(required_technology == TRUE) @@ -57,7 +62,7 @@ /datum/fabricator_recipe/proc/build(var/turf/location, var/datum/fabricator_build_order/order) . = list() - if(ispath(path, /obj/item/stack)) + if(ispath(path, /obj/item/stack) && pass_multiplier_to_product_new) . += new path(location, order.multiplier) else for(var/i = 1, i <= order.multiplier, i++) diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index f4efc417a2..052907b6ae 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -174,3 +174,4 @@ /datum/fabricator_recipe/duct_tape path = /obj/item/stack/tape_roll/duct_tape + pass_multiplier_to_product_new = FALSE // they are printed as single items with 32 uses From d47a62d6755bba210c63d213846dcf8ab0a8e663 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 14:30:24 +1000 Subject: [PATCH 179/212] Converting various clothes to a /dress type. --- code/datums/extensions/holster/holster.dm | 2 +- code/datums/inventory_slots/slots/slot_id.dm | 4 +- code/datums/supplypacks/medical.dm | 3 +- code/datums/supplypacks/nonessent.dm | 28 ++-- code/datums/trading/traders/goods.dm | 3 +- .../gamemodes/wizard/servant_items/fiend.dm | 5 - .../wizard/servant_items/infiltrator.dm | 6 - code/game/objects/effects/landmarks.dm | 2 +- .../crates_lockers/closets/job_closets.dm | 4 +- .../crates_lockers/closets/secure/medical.dm | 3 +- .../crates_lockers/closets/secure/security.dm | 6 +- .../crates_lockers/closets/wardrobe.dm | 8 +- .../loadout/lists/headwear.dm | 4 + .../loadout/lists/uniforms.dm | 24 ++-- code/modules/clothing/dresses/_dress.dm | 40 ++++++ code/modules/clothing/dresses/job.dm | 9 ++ code/modules/clothing/dresses/misc.dm | 53 +++++++ code/modules/clothing/dresses/plaid.dm | 14 ++ code/modules/clothing/dresses/role.dm | 12 ++ code/modules/clothing/dresses/sundress.dm | 9 ++ code/modules/clothing/dresses/wedding.dm | 30 ++++ code/modules/clothing/suits/robes.dm | 8 +- code/modules/clothing/under/_under.dm | 1 - code/modules/clothing/under/jobs/medsci.dm | 20 --- code/modules/clothing/under/miscellaneous.dm | 130 ------------------ .../fabrication/designs/textile/job.dm | 5 +- .../spells/artifacts/spellbound_servants.dm | 4 +- icons/clothing/under/abaya.dmi | Bin 1240 -> 1235 bytes maps/exodus/outfits/medical.dm | 14 +- nebula.dme | 7 + 30 files changed, 234 insertions(+), 224 deletions(-) create mode 100644 code/modules/clothing/dresses/_dress.dm create mode 100644 code/modules/clothing/dresses/job.dm create mode 100644 code/modules/clothing/dresses/misc.dm create mode 100644 code/modules/clothing/dresses/plaid.dm create mode 100644 code/modules/clothing/dresses/role.dm create mode 100644 code/modules/clothing/dresses/sundress.dm create mode 100644 code/modules/clothing/dresses/wedding.dm diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index 8c95da6d79..3875959bf0 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -140,7 +140,7 @@ if(has_extension(src, /datum/extension/holster)) .[name] = get_extension(src, /datum/extension/holster) -/obj/item/clothing/under/get_holsters() +/obj/item/clothing/get_holsters() . = ..() var/holster_accessories_by_name = list() for(var/obj/accessory in accessories) diff --git a/code/datums/inventory_slots/slots/slot_id.dm b/code/datums/inventory_slots/slots/slot_id.dm index af503a6c7e..35d80c2c5a 100644 --- a/code/datums/inventory_slots/slots/slot_id.dm +++ b/code/datums/inventory_slots/slots/slot_id.dm @@ -8,8 +8,8 @@ quick_equip_priority = 13 /datum/inventory_slot/id/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) - var/obj/item/clothing/under = user.get_equipped_item(slot_w_uniform_str) - if(istype(under) && under.should_show_id()) + var/obj/item/clothing/clothes = user.get_equipped_item(slot_w_uniform_str) + if(istype(clothes) && clothes.should_show_id()) user.set_current_mob_overlay(HO_ID_LAYER, null, redraw_mob) else ..() diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index a5a5fdc1b7..9f3ecd35a8 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -235,8 +235,7 @@ /obj/item/clothing/under/chief_medical_officer, /obj/item/clothing/under/geneticist, /obj/item/clothing/under/virologist, - /obj/item/clothing/under/nursesuit, - /obj/item/clothing/under/nurse, + /obj/item/clothing/dress/nurse = 2, /obj/item/clothing/under/orderly, /obj/item/clothing/under/medical = 3, /obj/item/clothing/under/medical/paramedic = 3, diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 74a72661bb..42fb263809 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -93,7 +93,7 @@ /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit, /obj/item/clothing/under/lawyer/purpsuit, /obj/item/clothing/under/mailman, - /obj/item/clothing/under/dress/dress_saloon, + /obj/item/clothing/dress/saloon, /obj/item/clothing/suspenders, /obj/item/clothing/suit/toggle/labcoat/mad, /obj/item/clothing/suit/bio_suit/plaguedoctorsuit, @@ -103,7 +103,7 @@ /obj/item/clothing/under/gladiator, /obj/item/clothing/under/soviet, /obj/item/clothing/under/scratch, - /obj/item/clothing/under/wedding/bride_white, + /obj/item/clothing/dress/wedding/bride_white, /obj/item/clothing/suit/chef, /obj/item/clothing/suit/apron/overalls, /obj/item/clothing/under/redcoat, @@ -193,17 +193,17 @@ /decl/hierarchy/supply_pack/nonessent/dresses name = "Costume - Womens formal dress locker" - contains = list(/obj/item/clothing/under/wedding/bride_orange, - /obj/item/clothing/under/wedding/bride_purple, - /obj/item/clothing/under/wedding/bride_blue, - /obj/item/clothing/under/wedding/bride_red, - /obj/item/clothing/under/wedding/bride_white, - /obj/item/clothing/under/sundress, - /obj/item/clothing/under/dress/dress_green, - /obj/item/clothing/under/dress/dress_pink, - /obj/item/clothing/under/dress/dress_orange, - /obj/item/clothing/under/dress/dress_yellow, - /obj/item/clothing/under/dress/dress_saloon) + contains = list(/obj/item/clothing/dress/wedding/bride_orange, + /obj/item/clothing/dress/wedding/bride_purple, + /obj/item/clothing/dress/wedding/bride_blue, + /obj/item/clothing/dress/wedding/bride_red, + /obj/item/clothing/dress/wedding/bride_white, + /obj/item/clothing/dress/sun, + /obj/item/clothing/dress/green, + /obj/item/clothing/dress/pink, + /obj/item/clothing/dress/orange, + /obj/item/clothing/dress/yellow, + /obj/item/clothing/dress/saloon) containername = "pretty dress locker" containertype = /obj/structure/closet num_contained = 1 @@ -228,7 +228,7 @@ /obj/item/clothing/suit/chaplain_hoodie, /obj/item/clothing/head/chaplain_hood, /obj/item/clothing/suit/holidaypriest, - /obj/item/clothing/under/wedding/bride_white, + /obj/item/clothing/dress/wedding/bride_white, /obj/item/box/candles = 3) containername = "chaplain equipment crate" diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index 7902e528bf..3b28b095d3 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -132,7 +132,6 @@ /obj/item/clothing/under = TRADER_SUBTYPES_ONLY, /obj/item/clothing/under/chameleon = TRADER_BLACKLIST, /obj/item/clothing/under/color = TRADER_BLACKLIST, - /obj/item/clothing/under/dress = TRADER_BLACKLIST, /obj/item/clothing/under/gimmick = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/lawyer = TRADER_BLACKLIST, /obj/item/clothing/under/pj = TRADER_BLACKLIST, @@ -142,7 +141,7 @@ /obj/item/clothing/under/syndicate = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/tactical = TRADER_BLACKLIST, /obj/item/clothing/under/waiter/monke = TRADER_BLACKLIST, - /obj/item/clothing/under/wedding = TRADER_BLACKLIST, + /obj/item/clothing/dress/wedding = TRADER_BLACKLIST, /obj/item/clothing/pants/casual/mustangjeans/monke = TRADER_BLACKLIST ) diff --git a/code/game/gamemodes/wizard/servant_items/fiend.dm b/code/game/gamemodes/wizard/servant_items/fiend.dm index 6bd819340c..316d969707 100644 --- a/code/game/gamemodes/wizard/servant_items/fiend.dm +++ b/code/game/gamemodes/wizard/servant_items/fiend.dm @@ -47,8 +47,3 @@ name = "fiend's robe" icon = 'icons/clothing/suit/wizard/servant/fiend_robe.dmi' desc = "A tattered, black and red robe. Nothing is visible through the holes in its fabric, except for a strange, inky blackness. It looks as if it was stitched together with other clothing..." - -/obj/item/clothing/under/devildress - name = "old dress" - desc = "An elegant - if tattered - black and red dress. There's nothing visible through the holes in the fabric; nothing but darkness." - icon = 'icons/clothing/under/dresses/dress_fiend.dmi' diff --git a/code/game/gamemodes/wizard/servant_items/infiltrator.dm b/code/game/gamemodes/wizard/servant_items/infiltrator.dm index a7cb8b7a74..30778b2aa8 100644 --- a/code/game/gamemodes/wizard/servant_items/infiltrator.dm +++ b/code/game/gamemodes/wizard/servant_items/infiltrator.dm @@ -46,9 +46,3 @@ name = "maid's uniform" desc = "The uniform of someone you'd expect to see dusting off the Antique Gun's display case." icon = 'icons/clothing/suit/wizard/servant/inf_dress.dmi' - -/obj/item/clothing/under/lawyer/infil/fem - name = "white dress" - desc = "It's a simple, sleeveless white dress with black trim." - icon = 'icons/clothing/under/dresses/dress_white.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET \ No newline at end of file diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 6b6946ea88..c114eccc3c 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -129,7 +129,7 @@ new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc) /obj/abstract/landmark/costume/cutewitch/make_costumes() - new /obj/item/clothing/under/sundress(src.loc) + new /obj/item/clothing/dress/sun(src.loc) new /obj/item/clothing/head/witchwig(src.loc) new /obj/item/staff/broom(src.loc) diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 4f839fe792..e2438aa3fa 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -23,7 +23,7 @@ /obj/item/clothing/head/hairflower/blue = 1, /obj/item/clothing/under/sl_suit = 2, /obj/item/clothing/under/bartender = 2, - /obj/item/clothing/under/dress/dress_saloon = 1, + /obj/item/clothing/dress/saloon = 1, /obj/item/clothing/suit/jacket/waistcoat/black = 2, /obj/item/clothing/shoes/color/black = 2 ) @@ -38,7 +38,7 @@ /obj/structure/closet/chefcloset/WillContain() return list( - /obj/item/clothing/under/sundress, + /obj/item/clothing/dress/sun, /obj/item/clothing/under/waiter = 2, /obj/item/radio/headset/headset_service = 2, /obj/item/box/mousetraps = 2, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 7849c56d50..a9a8eb08fc 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -39,10 +39,9 @@ return list( new/datum/atom_creator/weighted(list(/obj/item/backpack/medic, /obj/item/backpack/satchel/med)), new/datum/atom_creator/simple(/obj/item/backpack/dufflebag/med, 50), - /obj/item/clothing/under/nursesuit, /obj/item/clothing/head/nursehat, /obj/item/clothing/under/medical, - /obj/item/clothing/under/nurse, + /obj/item/clothing/dress/nurse = 2, /obj/item/clothing/under/orderly, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/suit/jacket/first_responder, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 0c1a04c28d..462ac3e2a0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -17,7 +17,7 @@ /obj/item/clothing/gloves/captain, /obj/item/gun/energy/gun, /obj/item/telebaton, - /obj/item/clothing/under/dress/dress_cap, + /obj/item/clothing/dress/cap, /obj/item/clothing/head/caphat/formal, /obj/item/clothing/under/captainformal, ) @@ -44,8 +44,8 @@ /obj/structure/closet/secure_closet/hop2/WillContain() return list( /obj/item/clothing/under/head_of_personnel, - /obj/item/clothing/under/dress/dress_hop, - /obj/item/clothing/under/dress/dress_hr, + /obj/item/clothing/dress/hop, + /obj/item/clothing/dress/hr, /obj/item/clothing/under/lawyer/female, /obj/item/clothing/under/lawyer, /obj/item/clothing/under/lawyer/red, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index f70df33d58..6bddc57124 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -53,7 +53,7 @@ /obj/item/clothing/suit/chaplain_hoodie, /obj/item/clothing/head/chaplain_hood, /obj/item/clothing/suit/holidaypriest, - /obj/item/clothing/under/wedding/bride_white, + /obj/item/clothing/dress/wedding/bride_white, /obj/item/backpack/cultpack, /obj/item/deck/tarot, ) @@ -245,9 +245,9 @@ /obj/item/clothing/under/color/green, /obj/item/clothing/under/color/orange, /obj/item/clothing/under/color/pink, - /obj/item/clothing/under/dress/plaid_blue, - /obj/item/clothing/under/dress/plaid_red, - /obj/item/clothing/under/dress/plaid_purple, + /obj/item/clothing/dress/plaid_blue, + /obj/item/clothing/dress/plaid_red, + /obj/item/clothing/dress/plaid_purple, /obj/item/clothing/shoes/color/blue, /obj/item/clothing/shoes/color/yellow, /obj/item/clothing/shoes/color/green, diff --git a/code/modules/client/preference_setup/loadout/lists/headwear.dm b/code/modules/client/preference_setup/loadout/lists/headwear.dm index 5fca5f8753..5c986b48f7 100644 --- a/code/modules/client/preference_setup/loadout/lists/headwear.dm +++ b/code/modules/client/preference_setup/loadout/lists/headwear.dm @@ -150,3 +150,7 @@ /decl/loadout_option/head/balaclava name = "balaclava" path = /obj/item/clothing/mask/balaclava + +/decl/loadout_option/head/nurse + name = "nurse's hat" + path = /obj/item/clothing/head/nursehat diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 9641768485..11a94bdd26 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -65,7 +65,7 @@ /obj/item/clothing/under/blazer, /obj/item/clothing/under/blackjumpskirt, /obj/item/clothing/under/kilt, - /obj/item/clothing/under/dress/dress_hr, + /obj/item/clothing/dress/hr, /obj/item/clothing/under/det, /obj/item/clothing/under/det/black, /obj/item/clothing/under/det/grey @@ -79,23 +79,23 @@ . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( - /obj/item/clothing/under/sundress_white, - /obj/item/clothing/under/dress, - /obj/item/clothing/under/dress/dress_green, - /obj/item/clothing/under/dress/dress_orange, - /obj/item/clothing/under/dress/dress_pink, - /obj/item/clothing/under/dress/dress_purple, - /obj/item/clothing/under/sundress + /obj/item/clothing/dress, + /obj/item/clothing/dress/green, + /obj/item/clothing/dress/orange, + /obj/item/clothing/dress/pink, + /obj/item/clothing/dress/purple, + /obj/item/clothing/dress/sun, + /obj/item/clothing/dress/sun/white ) /decl/loadout_option/uniform/cheongsam name = "cheongsam, colour select" - path = /obj/item/clothing/under/cheongsam + path = /obj/item/clothing/dress/cheongsam loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/abaya name = "abaya, colour select" - path = /obj/item/clothing/under/abaya + path = /obj/item/clothing/suit/robe/abaya loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/skirt @@ -151,3 +151,7 @@ /decl/loadout_option/uniform/frontier name = "frontier clothes" path = /obj/item/clothing/under/frontier + +/decl/loadout_option/uniform/nurse + name = "dress, nurse" + path = /obj/item/clothing/dress/nurse diff --git a/code/modules/clothing/dresses/_dress.dm b/code/modules/clothing/dresses/_dress.dm new file mode 100644 index 0000000000..7da2251319 --- /dev/null +++ b/code/modules/clothing/dresses/_dress.dm @@ -0,0 +1,40 @@ +/obj/item/clothing/dress + name = "flame dress" + desc = "A small black dress with blue flames print on it." + icon = 'icons/clothing/under/dresses/dress_fire.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY + permeability_coefficient = 0.90 + slot_flags = SLOT_UPPER_BODY + w_class = ITEM_SIZE_NORMAL + force = 0 + + valid_accessory_slots = list( + ACCESSORY_SLOT_SENSORS, + ACCESSORY_SLOT_UTILITY, + ACCESSORY_SLOT_HOLSTER, + ACCESSORY_SLOT_ARMBAND, + ACCESSORY_SLOT_RANK, + ACCESSORY_SLOT_DEPT, + ACCESSORY_SLOT_DECOR, + ACCESSORY_SLOT_NECK, + ACCESSORY_SLOT_MEDAL, + ACCESSORY_SLOT_INSIGNIA, + ACCESSORY_SLOT_OVER + ) + + restricted_accessory_slots = list( + ACCESSORY_SLOT_UTILITY, + ACCESSORY_SLOT_HOLSTER, + ACCESSORY_SLOT_ARMBAND, + ACCESSORY_SLOT_RANK, + ACCESSORY_SLOT_DEPT, + ACCESSORY_SLOT_OVER + ) + +/obj/item/clothing/dress/get_associated_equipment_slots() + . = ..() + var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) + LAZYDISTINCTADD(., under_slots) + +/obj/item/clothing/dress/get_fallback_slot(slot) + return slot_w_uniform_str diff --git a/code/modules/clothing/dresses/job.dm b/code/modules/clothing/dresses/job.dm new file mode 100644 index 0000000000..cfcb3be5bc --- /dev/null +++ b/code/modules/clothing/dresses/job.dm @@ -0,0 +1,9 @@ +/obj/item/clothing/dress/nurse + desc = "A dress commonly worn by the nursing staff in the medical department." + name = "nurse's dress" + icon = 'icons/clothing/under/nurse.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY diff --git a/code/modules/clothing/dresses/misc.dm b/code/modules/clothing/dresses/misc.dm new file mode 100644 index 0000000000..2569fd9d18 --- /dev/null +++ b/code/modules/clothing/dresses/misc.dm @@ -0,0 +1,53 @@ +/obj/item/clothing/dress/green + name = "green dress" + desc = "A simple, tight fitting green dress." + icon = 'icons/clothing/under/dresses/dress_green.dmi' + +/obj/item/clothing/dress/yellow + name = "green dress" + desc = "A simple yellow dress." + icon = 'icons/clothing/under/dresses/dress_yellow.dmi' + +/obj/item/clothing/dress/orange + name = "orange dress" + desc = "A fancy orange gown for those who like to show leg." + icon = 'icons/clothing/under/dresses/dress_orange.dmi' + +/obj/item/clothing/dress/pink + name = "pink dress" + desc = "A simple, tight fitting pink dress." + icon = 'icons/clothing/under/dresses/dress_pink.dmi' + +/obj/item/clothing/dress/purple + name = "purple dress" + desc= "A simple, tight fitting purple dress." + icon = 'icons/clothing/under/dresses/dress_purple.dmi' + +/obj/item/clothing/dress/saloon + name = "saloon girl dress" + desc = "A old western inspired gown for the girl who likes to drink." + icon = 'icons/clothing/under/dresses/dress_saloon.dmi' + +/obj/item/clothing/dress/cap + name = "captain's dress uniform" + desc = "Feminine fashion for the style concious captain." + icon = 'icons/clothing/under/uniform_captain_dress.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS + +/obj/item/clothing/dress/hop + name = "head of personnel dress uniform" + desc = "Feminine fashion for the style concious HoP." + icon = 'icons/clothing/under/dresses/dress_hop.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS + +/obj/item/clothing/dress/hr + name = "human resources director uniform" + desc = "Superior class for the nosy H.R. Director." + icon = 'icons/clothing/under/dresses/dress_hr.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS + +/obj/item/clothing/dress/cheongsam + name = "cheongsam" + desc = "It is a cheongsam dress." + icon = 'icons/clothing/under/dresses/dress_cheongsam.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS diff --git a/code/modules/clothing/dresses/plaid.dm b/code/modules/clothing/dresses/plaid.dm new file mode 100644 index 0000000000..c750edd120 --- /dev/null +++ b/code/modules/clothing/dresses/plaid.dm @@ -0,0 +1,14 @@ +/obj/item/clothing/dress/plaid_blue + name = "blue plaid skirt" + desc = "A preppy blue skirt with a white blouse." + icon = 'icons/clothing/under/dresses/dress_plaid_blue.dmi' + +/obj/item/clothing/dress/plaid_red + name = "red plaid skirt" + desc = "A preppy red skirt with a white blouse." + icon = 'icons/clothing/under/dresses/dress_plaid_red.dmi' + +/obj/item/clothing/dress/plaid_purple + name = "blue purple skirt" + desc = "A preppy purple skirt with a white blouse." + icon = 'icons/clothing/under/dresses/dress_plaid_purple.dmi' diff --git a/code/modules/clothing/dresses/role.dm b/code/modules/clothing/dresses/role.dm new file mode 100644 index 0000000000..159e21d45f --- /dev/null +++ b/code/modules/clothing/dresses/role.dm @@ -0,0 +1,12 @@ +// Used in the fiend outfit. +/obj/item/clothing/dress/devil + name = "old dress" + desc = "An elegant - if tattered - black and red dress. There's nothing visible through the holes in the fabric; nothing but darkness." + icon = 'icons/clothing/under/dresses/dress_fiend.dmi' + +// Used in the infiltrator outfit. +/obj/item/clothing/dress/white + name = "white dress" + desc = "It's a simple, sleeveless white dress with black trim." + icon = 'icons/clothing/under/dresses/dress_white.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET diff --git a/code/modules/clothing/dresses/sundress.dm b/code/modules/clothing/dresses/sundress.dm new file mode 100644 index 0000000000..cd7b9cea0e --- /dev/null +++ b/code/modules/clothing/dresses/sundress.dm @@ -0,0 +1,9 @@ +/obj/item/clothing/dress/sun + name = "sundress" + desc = "Makes you want to frolic in a field of daisies." + icon = 'icons/clothing/under/dresses/dress_sundress.dmi' + +/obj/item/clothing/dress/sun/white + name = "white sundress" + desc = "A white sundress decorated with purple lilies." + icon = 'icons/clothing/under/dresses/dress_sundress_white.dmi' diff --git a/code/modules/clothing/dresses/wedding.dm b/code/modules/clothing/dresses/wedding.dm new file mode 100644 index 0000000000..85580fa4c5 --- /dev/null +++ b/code/modules/clothing/dresses/wedding.dm @@ -0,0 +1,30 @@ +/obj/item/clothing/dress/wedding + abstract_type = /obj/item/clothing/dress/wedding + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS + flags_inv = HIDESHOES + +/obj/item/clothing/dress/wedding/bride_orange + name = "orange wedding dress" + desc = "A big and puffy orange dress." + icon = 'icons/clothing/under/dresses/dress_bridal_orange.dmi' + +/obj/item/clothing/dress/wedding/bride_purple + name = "purple wedding dress" + desc = "A big and puffy purple dress." + icon = 'icons/clothing/under/dresses/dress_bridal_purple.dmi' + +/obj/item/clothing/dress/wedding/bride_blue + name = "blue wedding dress" + desc = "A big and puffy blue dress." + icon = 'icons/clothing/under/dresses/dress_bridal_blue.dmi' + +/obj/item/clothing/dress/wedding/bride_red + name = "red wedding dress" + desc = "A big and puffy red dress." + icon = 'icons/clothing/under/dresses/dress_bridal_red.dmi' + +/obj/item/clothing/dress/wedding/bride_white + name = "silky wedding dress" + desc = "A white wedding gown made from the finest silk." + icon = 'icons/clothing/under/dresses/dress_bridal_white.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY diff --git a/code/modules/clothing/suits/robes.dm b/code/modules/clothing/suits/robes.dm index b946cea021..82543bd8a4 100644 --- a/code/modules/clothing/suits/robes.dm +++ b/code/modules/clothing/suits/robes.dm @@ -4,7 +4,7 @@ icon = 'icons/clothing/suit/rough_robe.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - slot_flags = SLOT_OVER_BODY + slot_flags = SLOT_UPPER_BODY | SLOT_OVER_BODY accessory_slot = ACCESSORY_SLOT_DECOR /obj/item/clothing/suit/robe/thawb @@ -19,3 +19,9 @@ /obj/item/clothing/suit/robe/yellowed paint_color = "#e1cf98" + +/obj/item/clothing/suit/robe/abaya + name = "abaya" + desc = "A loose-fitting, robe-like dress." + icon = 'icons/clothing/under/abaya.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 01f23cc008..a80a0c9e73 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -1,7 +1,6 @@ /obj/item/clothing/under name = "under" icon = 'icons/clothing/under/jumpsuits/jumpsuit.dmi' - icon_state = ICON_STATE_WORLD body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS permeability_coefficient = 0.90 slot_flags = SLOT_UPPER_BODY diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index df42d0dcad..6875f1bb35 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -65,26 +65,6 @@ ARMOR_BIO = ARMOR_BIO_MINOR ) -/obj/item/clothing/under/nursesuit - desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." - name = "nurse's suit" - icon = 'icons/clothing/under/nurse.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/nurse - desc = "A dress commonly worn by the nursing staff in the medical department." - name = "nurse's dress" - icon = 'icons/clothing/under/nurse.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - /obj/item/clothing/under/orderly desc = "A white suit to be worn by medical attendants." name = "orderly's uniform" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 7068f856c0..3bd1953dc5 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -152,123 +152,6 @@ icon = 'icons/clothing/under/gladiator.dmi' body_parts_covered = SLOT_LOWER_BODY -//dress -/obj/item/clothing/under/dress - name = "flame dress" - desc = "A small black dress with blue flames print on it." - icon = 'icons/clothing/under/dresses/dress_fire.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/dress/dress_green - name = "green dress" - desc = "A simple, tight fitting green dress." - icon = 'icons/clothing/under/dresses/dress_green.dmi' - -/obj/item/clothing/under/dress/dress_yellow - name = "green dress" - desc = "A simple yellow dress." - icon = 'icons/clothing/under/dresses/dress_yellow.dmi' - -/obj/item/clothing/under/dress/dress_orange - name = "orange dress" - desc = "A fancy orange gown for those who like to show leg." - icon = 'icons/clothing/under/dresses/dress_orange.dmi' - -/obj/item/clothing/under/dress/dress_pink - name = "pink dress" - desc = "A simple, tight fitting pink dress." - icon = 'icons/clothing/under/dresses/dress_pink.dmi' - -/obj/item/clothing/under/dress/dress_purple - name = "purple dress" - desc= "A simple, tight fitting purple dress." - icon = 'icons/clothing/under/dresses/dress_purple.dmi' - -/obj/item/clothing/under/dress/dress_saloon - name = "saloon girl dress" - desc = "A old western inspired gown for the girl who likes to drink." - icon = 'icons/clothing/under/dresses/dress_saloon.dmi' - -/obj/item/clothing/under/dress/dress_cap - name = "captain's dress uniform" - desc = "Feminine fashion for the style concious captain." - icon = 'icons/clothing/under/uniform_captain_dress.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/under/dress/dress_hop - name = "head of personnel dress uniform" - desc = "Feminine fashion for the style concious HoP." - icon = 'icons/clothing/under/dresses/dress_hop.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/under/dress/dress_hr - name = "human resources director uniform" - desc = "Superior class for the nosy H.R. Director." - icon = 'icons/clothing/under/dresses/dress_hr.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/under/dress/plaid_blue - name = "blue plaid skirt" - desc = "A preppy blue skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_blue.dmi' - -/obj/item/clothing/under/dress/plaid_red - name = "red plaid skirt" - desc = "A preppy red skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_red.dmi' - -/obj/item/clothing/under/dress/plaid_purple - name = "blue purple skirt" - desc = "A preppy purple skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_purple.dmi' - -//wedding stuff -/obj/item/clothing/under/wedding - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS - -/obj/item/clothing/under/wedding/bride_orange - name = "orange wedding dress" - desc = "A big and puffy orange dress." - icon = 'icons/clothing/under/dresses/dress_bridal_orange.dmi' - flags_inv = HIDESHOES - -/obj/item/clothing/under/wedding/bride_purple - name = "purple wedding dress" - desc = "A big and puffy purple dress." - icon = 'icons/clothing/under/dresses/dress_bridal_purple.dmi' - flags_inv = HIDESHOES - -/obj/item/clothing/under/wedding/bride_blue - name = "blue wedding dress" - desc = "A big and puffy blue dress." - icon = 'icons/clothing/under/dresses/dress_bridal_blue.dmi' - flags_inv = HIDESHOES - -/obj/item/clothing/under/wedding/bride_red - name = "red wedding dress" - desc = "A big and puffy red dress." - icon = 'icons/clothing/under/dresses/dress_bridal_red.dmi' - flags_inv = HIDESHOES - -/obj/item/clothing/under/wedding/bride_white - name = "silky wedding dress" - desc = "A white wedding gown made from the finest silk." - icon = 'icons/clothing/under/dresses/dress_bridal_white.dmi' - flags_inv = HIDESHOES - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/sundress - name = "sundress" - desc = "Makes you want to frolic in a field of daisies." - icon = 'icons/clothing/under/dresses/dress_sundress.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/sundress_white - name = "white sundress" - desc = "A white sundress decorated with purple lilies." - icon = 'icons/clothing/under/dresses/dress_sundress_white.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - /obj/item/clothing/under/blackjumpskirt name = "black jumpskirt" desc = "A black jumpskirt, with a pink undershirt." @@ -299,19 +182,6 @@ desc = "The very image of a working man. Not that you're probably doing work." icon = 'icons/clothing/under/uniform_mechanic.dmi' -/obj/item/clothing/under/cheongsam - name = "cheongsam" - desc = "It is a cheongsam dress." - icon = 'icons/clothing/under/dresses/dress_cheongsam.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS - -/obj/item/clothing/under/abaya - name = "abaya" - desc = "A loose-fitting, robe-like dress." - icon = 'icons/clothing/under/abaya.dmi' - - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS - /obj/item/clothing/under/blazer name = "blue blazer" desc = "A bold but yet conservative outfit, red corduroys, navy blazer and a tie." diff --git a/code/modules/fabrication/designs/textile/job.dm b/code/modules/fabrication/designs/textile/job.dm index be96939941..66f311b318 100644 --- a/code/modules/fabrication/designs/textile/job.dm +++ b/code/modules/fabrication/designs/textile/job.dm @@ -42,11 +42,8 @@ /datum/fabricator_recipe/textiles/job/medical/virologist path = /obj/item/clothing/under/virologist -/datum/fabricator_recipe/textiles/job/medical/nursesuit - path = /obj/item/clothing/under/nursesuit - /datum/fabricator_recipe/textiles/job/medical/nurse - path = /obj/item/clothing/under/nurse + path = /obj/item/clothing/dress/nurse /datum/fabricator_recipe/textiles/job/medical/medical path = /obj/item/clothing/under/medical diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 49338f38b1..9ec832ff1c 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -158,7 +158,7 @@ /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) spells += /spell/toggle_armor/fiend else - equipment = list(/obj/item/clothing/under/devildress = slot_w_uniform_str, + equipment = list(/obj/item/clothing/dress/devil = slot_w_uniform_str, /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) spells += /spell/toggle_armor/fiend/fem ..() @@ -177,7 +177,7 @@ /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) spells += /spell/toggle_armor/infiltrator else - equipment = list(/obj/item/clothing/under/lawyer/infil/fem = slot_w_uniform_str, + equipment = list(/obj/item/clothing/dress/white = slot_w_uniform_str, /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) spells += /spell/toggle_armor/infiltrator/fem ..() diff --git a/icons/clothing/under/abaya.dmi b/icons/clothing/under/abaya.dmi index de562308a76ba4c761a4985ae689b3c8b999dec4..9ebec9ef59ed0b5975bd3f5ea01f1662e17dc78a 100644 GIT binary patch delta 55 zcmV-70LcH?3DXIX#{rX($aN-*OEXIl`b>z{mlL0nn3qD1&LX@zl@(n5T);s90Fobi)|?Zck(if4j?N;yI+Yb%{anD| S004qrQxTLdh5EB&0dNDMyBx0o diff --git a/maps/exodus/outfits/medical.dm b/maps/exodus/outfits/medical.dm index 47844278ba..40098369eb 100644 --- a/maps/exodus/outfits/medical.dm +++ b/maps/exodus/outfits/medical.dm @@ -50,18 +50,8 @@ /decl/hierarchy/outfit/job/medical/doctor/nurse name = "Job - Nurse" suit = null - -/decl/hierarchy/outfit/job/medical/doctor/nurse/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - if(prob(50)) - uniform = /obj/item/clothing/under/nursesuit - else - uniform = /obj/item/clothing/under/nurse - head = /obj/item/clothing/head/nursehat - else - uniform = /obj/item/clothing/under/medical/scrubs/purple - head = null + uniform = /obj/item/clothing/under/medical/scrubs/purple + head = null /decl/hierarchy/outfit/job/medical/chemist name = "Job - Chemist" diff --git a/nebula.dme b/nebula.dme index c48db0b9d7..4f229b0282 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1913,6 +1913,13 @@ #include "code\modules\clothing\clothing_state\clothing_state_sleeves.dm" #include "code\modules\clothing\clothing_state\clothing_state_tucked.dm" #include "code\modules\clothing\clothing_state\clothing_state_untied.dm" +#include "code\modules\clothing\dresses\_dress.dm" +#include "code\modules\clothing\dresses\job.dm" +#include "code\modules\clothing\dresses\misc.dm" +#include "code\modules\clothing\dresses\plaid.dm" +#include "code\modules\clothing\dresses\role.dm" +#include "code\modules\clothing\dresses\sundress.dm" +#include "code\modules\clothing\dresses\wedding.dm" #include "code\modules\clothing\ears\_ears.dm" #include "code\modules\clothing\ears\earrings.dm" #include "code\modules\clothing\glasses\_glasses.dm" From e544ecc427aa3f9c15f6088754c739c09a51f41d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 15:20:09 +1000 Subject: [PATCH 180/212] Implementing /skirt and /blouse types. --- code/__defines/items_clothing.dm | 14 +++ code/game/objects/effects/landmarks.dm | 4 +- .../crates_lockers/closets/wardrobe.dm | 9 +- .../loadout/lists/uniforms.dm | 10 +-- code/modules/clothing/_clothing.dm | 15 +++- code/modules/clothing/dresses/_dress.dm | 28 +----- code/modules/clothing/dresses/maxi.dm | 18 ++++ code/modules/clothing/dresses/misc.dm | 5 ++ code/modules/clothing/dresses/plaid.dm | 14 --- code/modules/clothing/dresses/short.dm | 19 ++++ code/modules/clothing/neck/ties.dm | 4 + code/modules/clothing/pants/_pants.dm | 22 +---- code/modules/clothing/shirts/_shirts.dm | 1 - code/modules/clothing/shirts/blouse.dm | 13 +++ code/modules/clothing/skirts/_skirt.dm | 15 ++++ code/modules/clothing/skirts/job.dm | 15 ++++ code/modules/clothing/skirts/misc.dm | 27 ++++++ code/modules/clothing/skirts/plaid.dm | 29 +++++++ code/modules/clothing/suits/jackets/job.dm | 4 + code/modules/clothing/under/_under.dm | 24 +---- code/modules/clothing/under/jobs/medsci.dm | 9 -- code/modules/clothing/under/miscellaneous.dm | 6 -- code/modules/clothing/under/skirts.dm | 82 ------------------ .../fabrication/designs/textile/job.dm | 2 +- icons/clothing/shirts/blouse.dmi | Bin 0 -> 516 bytes icons/clothing/shirts/blouse_blue.dmi | Bin 0 -> 541 bytes icons/clothing/shirts/blouse_purple.dmi | Bin 0 -> 546 bytes icons/clothing/shirts/blouse_red.dmi | Bin 0 -> 531 bytes icons/clothing/suit/jackets/brown_suit.dmi | Bin 0 -> 632 bytes .../under/dresses/dress_plaid_blue.dmi | Bin 813 -> 586 bytes .../under/dresses/dress_plaid_purple.dmi | Bin 813 -> 577 bytes .../under/dresses/dress_plaid_red.dmi | Bin 813 -> 584 bytes icons/clothing/under/dresses/dress_rd.dmi | Bin 804 -> 514 bytes icons/clothing/under/skirts/skirt_black.dmi | Bin 1067 -> 654 bytes nebula.dme | 10 ++- 35 files changed, 202 insertions(+), 197 deletions(-) create mode 100644 code/modules/clothing/dresses/maxi.dm delete mode 100644 code/modules/clothing/dresses/plaid.dm create mode 100644 code/modules/clothing/dresses/short.dm create mode 100644 code/modules/clothing/shirts/blouse.dm create mode 100644 code/modules/clothing/skirts/_skirt.dm create mode 100644 code/modules/clothing/skirts/job.dm create mode 100644 code/modules/clothing/skirts/misc.dm create mode 100644 code/modules/clothing/skirts/plaid.dm create mode 100644 code/modules/clothing/suits/jackets/job.dm delete mode 100644 code/modules/clothing/under/skirts.dm create mode 100644 icons/clothing/shirts/blouse.dmi create mode 100644 icons/clothing/shirts/blouse_blue.dmi create mode 100644 icons/clothing/shirts/blouse_purple.dmi create mode 100644 icons/clothing/shirts/blouse_red.dmi create mode 100644 icons/clothing/suit/jackets/brown_suit.dmi diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 68ecc57cc8..b9d70eeca7 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -27,6 +27,20 @@ // Accessory will only be shown on 'view accessories'. #define ACCESSORY_VISIBILITY_HIDDEN 2 +#define UNIFORM_DEFAULT_ACCESSORIES list( \ + ACCESSORY_SLOT_SENSORS, \ + ACCESSORY_SLOT_UTILITY, \ + ACCESSORY_SLOT_HOLSTER, \ + ACCESSORY_SLOT_ARMBAND, \ + ACCESSORY_SLOT_RANK, \ + ACCESSORY_SLOT_DEPT, \ + ACCESSORY_SLOT_DECOR, \ + ACCESSORY_SLOT_NECK, \ + ACCESSORY_SLOT_MEDAL, \ + ACCESSORY_SLOT_INSIGNIA, \ + ACCESSORY_SLOT_OVER \ +) + // Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // WARNING: The following flags apply only to the external suit! #define HIDEGLOVES BITFLAG(0) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index c114eccc3c..17bc432805 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -72,8 +72,8 @@ new /obj/item/clothing/head/kitty(src.loc) /obj/abstract/landmark/costume/maid/make_costumes() - new /obj/item/clothing/under/blackskirt(src.loc) - var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears ) + new /obj/item/clothing/skirt/red/blouse(src.loc) + var/CHOICE = pick(/obj/item/clothing/head/beret, /obj/item/clothing/head/rabbitears) new CHOICE(src.loc) new /obj/item/clothing/glasses/blindfold(src.loc) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 6bddc57124..d24fdb4f25 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -245,9 +245,12 @@ /obj/item/clothing/under/color/green, /obj/item/clothing/under/color/orange, /obj/item/clothing/under/color/pink, - /obj/item/clothing/dress/plaid_blue, - /obj/item/clothing/dress/plaid_red, - /obj/item/clothing/dress/plaid_purple, + /obj/item/clothing/skirt/plaid_blue, + /obj/item/clothing/shirt/blouse/blue, + /obj/item/clothing/skirt/plaid_red, + /obj/item/clothing/shirt/blouse/red, + /obj/item/clothing/skirt/plaid_purple, + /obj/item/clothing/shirt/blouse/purple, /obj/item/clothing/shoes/color/blue, /obj/item/clothing/shoes/color/yellow, /obj/item/clothing/shoes/color/green, diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 11a94bdd26..291ce045d7 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -100,17 +100,17 @@ /decl/loadout_option/uniform/skirt name = "skirt selection" - path = /obj/item/clothing/under/skirt + path = /obj/item/clothing/skirt loadout_flags = GEAR_HAS_TYPE_SELECTION -/decl/loadout_option/uniform/skirt_c +/decl/loadout_option/uniform/skirt/short name = "short skirt, colour select" - path = /obj/item/clothing/under/skirt_c + path = /obj/item/clothing/skirt/short loadout_flags = GEAR_HAS_COLOR_SELECTION -/decl/loadout_option/uniform/skirt_c/dress +/decl/loadout_option/uniform/dress name = "simple dress, colour select" - path = /obj/item/clothing/under/skirt_c/dress + path = /obj/item/clothing/dress/short loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/casual_pants diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index ce9fb4edbb..52e3541767 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -13,9 +13,20 @@ var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection. var/tint = TINT_NONE // Sets the item's level of visual impairment tint. var/bodytype_equip_flags // Bitfields; if null, checking is skipped. Determine if a given mob can equip this item or not. - var/list/accessories = list() + + var/list/accessories + var/list/valid_accessory_slots - var/list/restricted_accessory_slots + + var/list/restricted_accessory_slots = list( + ACCESSORY_SLOT_UTILITY, + ACCESSORY_SLOT_HOLSTER, + ACCESSORY_SLOT_ARMBAND, + ACCESSORY_SLOT_RANK, + ACCESSORY_SLOT_DEPT, + ACCESSORY_SLOT_OVER + ) + var/list/starting_accessories var/blood_overlay_type = "uniformblood" var/visible_name = "Unknown" diff --git a/code/modules/clothing/dresses/_dress.dm b/code/modules/clothing/dresses/_dress.dm index 7da2251319..cea01ebd19 100644 --- a/code/modules/clothing/dresses/_dress.dm +++ b/code/modules/clothing/dresses/_dress.dm @@ -7,34 +7,10 @@ slot_flags = SLOT_UPPER_BODY w_class = ITEM_SIZE_NORMAL force = 0 - - valid_accessory_slots = list( - ACCESSORY_SLOT_SENSORS, - ACCESSORY_SLOT_UTILITY, - ACCESSORY_SLOT_HOLSTER, - ACCESSORY_SLOT_ARMBAND, - ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, - ACCESSORY_SLOT_DECOR, - ACCESSORY_SLOT_NECK, - ACCESSORY_SLOT_MEDAL, - ACCESSORY_SLOT_INSIGNIA, - ACCESSORY_SLOT_OVER - ) - - restricted_accessory_slots = list( - ACCESSORY_SLOT_UTILITY, - ACCESSORY_SLOT_HOLSTER, - ACCESSORY_SLOT_ARMBAND, - ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, - ACCESSORY_SLOT_OVER - ) + valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES + fallback_slot = slot_w_uniform_str /obj/item/clothing/dress/get_associated_equipment_slots() . = ..() var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) LAZYDISTINCTADD(., under_slots) - -/obj/item/clothing/dress/get_fallback_slot(slot) - return slot_w_uniform_str diff --git a/code/modules/clothing/dresses/maxi.dm b/code/modules/clothing/dresses/maxi.dm new file mode 100644 index 0000000000..ed31fcc4ae --- /dev/null +++ b/code/modules/clothing/dresses/maxi.dm @@ -0,0 +1,18 @@ +/obj/item/clothing/dress/maxi + name = "maxi dress" + desc = "A sleeveless dress that reaches the wearer's ankles." + icon = 'icons/clothing/under/dresses/dress_long.dmi' + flags_inv = HIDESHOES + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET + +/obj/item/clothing/dress/maxi/eggshell + name = "eggshell maxi dress" + color = "#f0ead6" + +/obj/item/clothing/dress/maxi/mintcream + name = "mint maxi dress" + color = "#dcffed" + +/obj/item/clothing/dress/maxi/black + name = "black maxi dress" + color = "#181818" diff --git a/code/modules/clothing/dresses/misc.dm b/code/modules/clothing/dresses/misc.dm index 2569fd9d18..ecb429950a 100644 --- a/code/modules/clothing/dresses/misc.dm +++ b/code/modules/clothing/dresses/misc.dm @@ -51,3 +51,8 @@ desc = "It is a cheongsam dress." icon = 'icons/clothing/under/dresses/dress_cheongsam.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS + +/obj/item/clothing/dress/gown + name = "silk gown" + desc = "A long silky sleeveless gown with a flared hem." + icon = 'icons/clothing/under/dresses/dress_gown.dmi' diff --git a/code/modules/clothing/dresses/plaid.dm b/code/modules/clothing/dresses/plaid.dm deleted file mode 100644 index c750edd120..0000000000 --- a/code/modules/clothing/dresses/plaid.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/clothing/dress/plaid_blue - name = "blue plaid skirt" - desc = "A preppy blue skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_blue.dmi' - -/obj/item/clothing/dress/plaid_red - name = "red plaid skirt" - desc = "A preppy red skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_red.dmi' - -/obj/item/clothing/dress/plaid_purple - name = "blue purple skirt" - desc = "A preppy purple skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_purple.dmi' diff --git a/code/modules/clothing/dresses/short.dm b/code/modules/clothing/dresses/short.dm new file mode 100644 index 0000000000..b8c68a9a83 --- /dev/null +++ b/code/modules/clothing/dresses/short.dm @@ -0,0 +1,19 @@ +// dresses +/obj/item/clothing/dress/short + name = "short dress" + desc = "A short plain sleeveless dress." + icon = 'icons/clothing/under/dresses/dress_short.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY + +// some preset dresses for uniform vendors +/obj/item/clothing/dress/short/black + name = "black short dress" + color = "#181818" + +/obj/item/clothing/dress/short/eggshell + name = "eggshell short dress" + color = "#f0ead6" + +/obj/item/clothing/dress/short/mintcream + name = "mint short dress" + color = "#dcffed" diff --git a/code/modules/clothing/neck/ties.dm b/code/modules/clothing/neck/ties.dm index 0a00bc2655..2d25065164 100644 --- a/code/modules/clothing/neck/ties.dm +++ b/code/modules/clothing/neck/ties.dm @@ -22,6 +22,10 @@ name = "blue tie" color = "#123c5a" +/obj/item/clothing/neck/tie/green + name = "green tie" + color = "#009100" + /obj/item/clothing/neck/tie/blue_clip name = "blue tie with a clip" icon = 'icons/clothing/accessories/ties/tie_clip.dmi' diff --git a/code/modules/clothing/pants/_pants.dm b/code/modules/clothing/pants/_pants.dm index e3ffc3d8ce..6a8ff810b1 100644 --- a/code/modules/clothing/pants/_pants.dm +++ b/code/modules/clothing/pants/_pants.dm @@ -8,27 +8,7 @@ slot_flags = SLOT_UPPER_BODY // SLOT_LOWER_BODY when pants slot exists w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str - valid_accessory_slots = list( - ACCESSORY_SLOT_SENSORS, - ACCESSORY_SLOT_UTILITY, - ACCESSORY_SLOT_HOLSTER, - ACCESSORY_SLOT_ARMBAND, - ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, - ACCESSORY_SLOT_DECOR, - ACCESSORY_SLOT_NECK, - ACCESSORY_SLOT_MEDAL, - ACCESSORY_SLOT_INSIGNIA, - ACCESSORY_SLOT_OVER - ) - restricted_accessory_slots = list( - ACCESSORY_SLOT_UTILITY, - ACCESSORY_SLOT_HOLSTER, - ACCESSORY_SLOT_ARMBAND, - ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, - ACCESSORY_SLOT_OVER - ) + valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES /obj/item/clothing/pants/get_associated_equipment_slots() . = ..() diff --git a/code/modules/clothing/shirts/_shirts.dm b/code/modules/clothing/shirts/_shirts.dm index fd4f2ee09d..b7b15f3ecc 100644 --- a/code/modules/clothing/shirts/_shirts.dm +++ b/code/modules/clothing/shirts/_shirts.dm @@ -11,4 +11,3 @@ . = ..() var/static/list/shirt_slots = list(slot_w_uniform_str, slot_wear_id_str) LAZYDISTINCTADD(., shirt_slots) - diff --git a/code/modules/clothing/shirts/blouse.dm b/code/modules/clothing/shirts/blouse.dm new file mode 100644 index 0000000000..5c06045e30 --- /dev/null +++ b/code/modules/clothing/shirts/blouse.dm @@ -0,0 +1,13 @@ +/obj/item/clothing/shirt/blouse + name = "blouse" + desc = "A crisp white button-up blouse." + icon = 'icons/clothing/shirts/blouse.dmi' + +/obj/item/clothing/shirt/blouse/blue + icon = 'icons/clothing/shirts/blouse_blue.dmi' + +/obj/item/clothing/shirt/blouse/red + icon = 'icons/clothing/shirts/blouse_red.dmi' + +/obj/item/clothing/shirt/blouse/purple + icon = 'icons/clothing/shirts/blouse_purple.dmi' diff --git a/code/modules/clothing/skirts/_skirt.dm b/code/modules/clothing/skirts/_skirt.dm new file mode 100644 index 0000000000..af006322be --- /dev/null +++ b/code/modules/clothing/skirts/_skirt.dm @@ -0,0 +1,15 @@ +/obj/item/clothing/skirt + name = "black skirt" + desc = "A black skirt, very fancy!" + icon = 'icons/clothing/under/skirts/skirt_black.dmi' + body_parts_covered = SLOT_LOWER_BODY + permeability_coefficient = 0.90 + slot_flags = SLOT_UPPER_BODY + w_class = ITEM_SIZE_NORMAL + valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES + fallback_slot = slot_w_uniform_str + +/obj/item/clothing/skirt/get_associated_equipment_slots() + . = ..() + var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) + LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/skirts/job.dm b/code/modules/clothing/skirts/job.dm new file mode 100644 index 0000000000..35de521eea --- /dev/null +++ b/code/modules/clothing/skirts/job.dm @@ -0,0 +1,15 @@ +/obj/item/clothing/skirt/research_director + name = "chief science officer dress uniform" + desc = "Feminine fashion for the style concious CSO. Its fabric provides minor protection from biological contaminants." + icon = 'icons/clothing/under/dresses/dress_rd.dmi' + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS + +/obj/item/clothing/skirt/research_director/outfit + starting_accessories = list( + /obj/item/clothing/shirt/blouse, + /obj/item/clothing/neck/tie/green, + /obj/item/clothing/suit/jacket/research_director + ) diff --git a/code/modules/clothing/skirts/misc.dm b/code/modules/clothing/skirts/misc.dm new file mode 100644 index 0000000000..70deb1bbe2 --- /dev/null +++ b/code/modules/clothing/skirts/misc.dm @@ -0,0 +1,27 @@ +/obj/item/clothing/skirt/short + name = "short skirt" + desc = "A short skirt, made of some semi-gloss material." + icon = 'icons/clothing/under/skirts/skirt_short.dmi' + body_parts_covered = SLOT_LOWER_BODY + +/obj/item/clothing/skirt/short/khaki + name = "khaki skirt" + desc = "A khaki skirt with a flare at the hem." + icon = 'icons/clothing/under/skirts/skirt_khaki.dmi' + +/obj/item/clothing/skirt/short/swept + name = "swept skirt" + desc = "A skirt that is swept to one side." + icon = 'icons/clothing/under/skirts/skirt_swept.dmi' + +/obj/item/clothing/skirt/red + name = "red skirt" + desc = "A black skirt, very fancy!" + icon = 'icons/clothing/under/skirts/skirt_black.dmi' + +/obj/item/clothing/skirt/red/blouse + starting_accessories = list( + /obj/item/clothing/shirt/blouse, + /obj/item/clothing/neck/tie/red, + /obj/item/clothing/suit/jacket/black, + ) diff --git a/code/modules/clothing/skirts/plaid.dm b/code/modules/clothing/skirts/plaid.dm new file mode 100644 index 0000000000..19f91f4abc --- /dev/null +++ b/code/modules/clothing/skirts/plaid.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/skirt/plaid_blue + name = "blue plaid skirt" + desc = "A blue plaid skirt." + icon = 'icons/clothing/under/dresses/dress_plaid_blue.dmi' + +/obj/item/clothing/skirt/plaid_blue/blouse + starting_accessories = list( + /obj/item/clothing/shirt/blouse/blue + ) + +/obj/item/clothing/skirt/plaid_red + name = "red plaid skirt" + desc = "A red plaid skirt." + icon = 'icons/clothing/under/dresses/dress_plaid_red.dmi' + +/obj/item/clothing/skirt/plaid_red/blouse + starting_accessories = list( + /obj/item/clothing/shirt/blouse/red + ) + +/obj/item/clothing/skirt/plaid_purple + name = "blue purple skirt" + desc = "A purple plaid skirt." + icon = 'icons/clothing/under/dresses/dress_plaid_purple.dmi' + +/obj/item/clothing/skirt/plaid_purple/blouse + starting_accessories = list( + /obj/item/clothing/shirt/blouse/purple + ) diff --git a/code/modules/clothing/suits/jackets/job.dm b/code/modules/clothing/suits/jackets/job.dm new file mode 100644 index 0000000000..2339b81e88 --- /dev/null +++ b/code/modules/clothing/suits/jackets/job.dm @@ -0,0 +1,4 @@ +/obj/item/clothing/suit/jacket/research_director + name = "brown suit jacket" + desc = "A neat brown suit jacket coat." + icon = 'icons/clothing/suit/jackets/brown_suit.dmi' diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index a80a0c9e73..b3a8f22180 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -6,29 +6,7 @@ slot_flags = SLOT_UPPER_BODY w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str - - valid_accessory_slots = list( - ACCESSORY_SLOT_SENSORS, - ACCESSORY_SLOT_UTILITY, - ACCESSORY_SLOT_HOLSTER, - ACCESSORY_SLOT_ARMBAND, - ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, - ACCESSORY_SLOT_DECOR, - ACCESSORY_SLOT_NECK, - ACCESSORY_SLOT_MEDAL, - ACCESSORY_SLOT_INSIGNIA, - ACCESSORY_SLOT_OVER - ) - - restricted_accessory_slots = list( - ACCESSORY_SLOT_UTILITY, - ACCESSORY_SLOT_HOLSTER, - ACCESSORY_SLOT_ARMBAND, - ACCESSORY_SLOT_RANK, - ACCESSORY_SLOT_DEPT, - ACCESSORY_SLOT_OVER - ) + valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES /obj/item/clothing/under/get_associated_equipment_slots() . = ..() diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 6875f1bb35..7125904c25 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -18,15 +18,6 @@ ARMOR_BIO = ARMOR_BIO_MINOR ) -/obj/item/clothing/under/research_director/dress_rd - name = "chief science officer dress uniform" - desc = "Feminine fashion for the style concious CSO. Its fabric provides minor protection from biological contaminants." - icon = 'icons/clothing/under/dresses/dress_rd.dmi' - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - /obj/item/clothing/under/chemist desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." name = "pharmacist's jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 3bd1953dc5..734cf886b7 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -101,12 +101,6 @@ desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." icon = 'icons/clothing/under/suits/suit_teal.dmi' -/obj/item/clothing/under/blackskirt - name = "black skirt" - desc = "A black skirt, very fancy!" - icon = 'icons/clothing/under/skirts/skirt_black.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - /obj/item/clothing/under/schoolgirl name = "schoolgirl uniform" desc = "It's just like one of my Japanese animes!" diff --git a/code/modules/clothing/under/skirts.dm b/code/modules/clothing/under/skirts.dm deleted file mode 100644 index ddc38e66c1..0000000000 --- a/code/modules/clothing/under/skirts.dm +++ /dev/null @@ -1,82 +0,0 @@ -/obj/item/clothing/under/skirt - name = "black skirt" - desc = "A black skirt, very fancy!" - icon = 'icons/clothing/under/skirts/skirt_black.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/under/skirt/plaid_blue - name = "blue plaid skirt" - desc = "A preppy blue skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_blue.dmi' - -/obj/item/clothing/under/skirt/plaid_red - name = "red plaid skirt" - desc = "A preppy red skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_red.dmi' - -/obj/item/clothing/under/skirt/plaid_purple - name = "blue purple skirt" - desc = "A preppy purple skirt with a white blouse." - icon = 'icons/clothing/under/dresses/dress_plaid_purple.dmi' - -/obj/item/clothing/under/skirt/khaki - name = "khaki skirt" - desc = "A khaki skirt with a flare at the hem." - icon = 'icons/clothing/under/skirts/skirt_khaki.dmi' - body_parts_covered = SLOT_LOWER_BODY - -/obj/item/clothing/under/skirt/swept - name = "swept skirt" - desc = "A skirt that is swept to one side." - icon = 'icons/clothing/under/skirts/skirt_swept.dmi' - body_parts_covered = SLOT_LOWER_BODY - -/obj/item/clothing/under/skirt_c - name = "short skirt" - desc = "A short skirt, made of some semi-gloss material." - icon = 'icons/clothing/under/skirts/skirt_short.dmi' - body_parts_covered = SLOT_LOWER_BODY - -// dresses -/obj/item/clothing/under/skirt_c/dress - name = "short dress" - desc = "A short plain sleeveless dress." - icon = 'icons/clothing/under/dresses/dress_short.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/skirt_c/dress/long - name = "maxi dress" - desc = "A sleeveless dress that reaches the wearer's ankles." - icon = 'icons/clothing/under/dresses/dress_long.dmi' - flags_inv = HIDESHOES - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/under/skirt_c/dress/long/gown - name = "silk gown" - desc = "A long silky sleeveless gown with a flared hem." - icon = 'icons/clothing/under/dresses/dress_gown.dmi' - -// some preset dresses for uniform vendors -/obj/item/clothing/under/skirt_c/dress/black - name = "black short dress" - color = "#181818" - -/obj/item/clothing/under/skirt_c/dress/long/black - name = "black maxi dress" - color = "#181818" - -/obj/item/clothing/under/skirt_c/dress/eggshell - name = "eggshell short dress" - color = "#f0ead6" - -/obj/item/clothing/under/skirt_c/dress/long/eggshell - name = "eggshell maxi dress" - color = "#f0ead6" - -/obj/item/clothing/under/skirt_c/dress/mintcream - name = "mint short dress" - color = "#dcffed" - -/obj/item/clothing/under/skirt_c/dress/long/mintcream - name = "mint maxi dress" - color = "#dcffed" \ No newline at end of file diff --git a/code/modules/fabrication/designs/textile/job.dm b/code/modules/fabrication/designs/textile/job.dm index 66f311b318..eeb16aab4e 100644 --- a/code/modules/fabrication/designs/textile/job.dm +++ b/code/modules/fabrication/designs/textile/job.dm @@ -28,7 +28,7 @@ path = /obj/item/clothing/under/research_director/rdalt /datum/fabricator_recipe/textiles/job/medical/dress_rd - path = /obj/item/clothing/under/research_director/dress_rd + path = /obj/item/clothing/skirt/research_director /datum/fabricator_recipe/textiles/job/medical/chemist path = /obj/item/clothing/under/chemist diff --git a/icons/clothing/shirts/blouse.dmi b/icons/clothing/shirts/blouse.dmi new file mode 100644 index 0000000000000000000000000000000000000000..dcabb3a8c4467f57fe1009134cededc76c9a8953 GIT binary patch literal 516 zcmV+f0{i`mP)o!{WzmX?V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`;i@u9a})FOGgB0j@>42x zi*xcz;>+Vp^D@)&i*gZ~O;9u|E4cc(fZYTDSIsUP6S;w}00030NklUU@VCm8D+Y~V!D6*_d9uy5!CCqko+fOT~U zyZ}sr6Ty$@FZ3UU28eho$ln2!TLj9fFkJCWc}1KABM4Qh=m-YK_()q}8>tlcIVUG4 zXD{iJk?dZPIQ^Vx;qBWXx2WW5)r}TD)iSaTof$PPoY!e)S7A{NGvyBI1LymW6(|nl zjxUPEQ9Rnc2GPa0G(YqHBK=E5BMbiu>@7VivbU6zv&|h(;wgNxCaa$S0000o!{WzmX?-Ce8g~?(f|Md#m2i?^C?`dUi!&v&s2IpMKl)p~HFc63BR$^g^6RCKtQ&sI)Qc(O1%!nc;m^wG7_Ohl?l@}>HkBBFHiQ)19 z__uxM?=1h3PKcQQ9GM8A7!C^Q!^?A#5YC~>lfMPII4lhq!X@C=b0FvfXLptT*+E;^ zU_A#ymf{hsjIe7cJO@IqRwp#++;a=icn$=&#p9OVQDgu;9tv^=XecibD2GCMz=Oo-}fUN_JL#(!!f+Yqnvn z>lrP4bj_I^g_E?rP<{n7=X}@Eoha_>5noK&BgLH^YY^)VrRkZsrTd95TDWz;z`oLN fMfR0qVutw!`hhiNsJzdO00000NkvXXu0mjf52o@J literal 0 HcmV?d00001 diff --git a/icons/clothing/shirts/blouse_purple.dmi b/icons/clothing/shirts/blouse_purple.dmi new file mode 100644 index 0000000000000000000000000000000000000000..397b01e2a29fa2f0dcb106e2a4cd8d3ed39394ad GIT binary patch literal 546 zcmV+-0^R+IP)o!{WzmX?-LBXDmqnE(I(#m2V=-0C=2JR&a84_w-Y6@%7{?OD!tS z%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u| z;!G<_%uR)`;i@u9a})FOGgB0j@>42xi*xcz;>+Vp^D@)&i*gZ~O;9u|E4cc(fZYTD zSIsUP6S;w}00036NklvG3&9LI4S$8oN*FT9DCzGFES z=d&yH{kr^G`;PUM?-VHLeS2@C2_WNGCJU^kl)Q~6*fLB5$GE_fqdh^)%X9$@U{8?m kOmJ*{$7z@?;5c*q0JK*Ke+(DW$p8QV07*qoM6N<$f{yLXP)o!{WzmX?-@6#=y!0{{R2#m2i?^C?`dUi!&v&s2IpMKm9b94Fc60Cip0WVr&7sSr$X%rDJXshW<(JaOw7%xy{u`3@*=SFh?prC(OlHI z{!uKjlX8jLJ+nF19z0oZ8=aAXuo?S8@_J*kL{O^p1wYbv}C+ayaiJj&PCf5rTTfWo0Wv*oatg%M( zl&hYPg4T{NMIw>NF!o>TpxP_Q_1BvmTt23(H5azte#^nDZPcp6Ra(vD;JvL6YBx@j z;#2wyxw*C<6762Vn!lV&G%i?^C?`dUi!&v&s2IpMd%PSWF39T;@R^x$btEcFx`i_ zrZFI!!CilMd8AH7+bRQb7f!HJK#M7r=Gl|Ln~2c zA1iu>|Sr>Ut_Q`@xp?v7wvwqkr(ZLkj8(M1|P+FdOyf{Aq^}H z&3=&bVkZs9fQDv2NO`eH!zGYRQMDg9qdTYxul9rV@$Mpy0qcx-2 SqQ+DJ00006(5QSk&VajgN_kUc++6zOV)2$+!{l7*pIs=jun>e0M004ZD!8teTYv^?VA7qM? z1mEibgN*SfjzR+eI03(2wR#w%UZGldOM=y>$SrSAJY-fvJ~*wrYJE9?OveMZz9Uxs z7M(VP8s=006-E_?^?7Qg$=xy>}g8KI=8-H}&2N z_8#1QhTm+uG)%xxVjrMs0y@0j{t4M^N=*}pqC@=l{MtGJo$t2~&^iI>n!q~3cRK(8 z004mELX3gc+`u^s}m`fiWPoO(EckWx7HJ4lK`;Bql{rOjJd{z`$KyU7eks-{9VsmX=6-#BiF?|NsBR#>Cs(+caXJ zku@X)L@Rk}kzKTZ@<~KNRCt{2m*H}QAP|HF6flam+P?p*_CRNvu^dn+h3}-(_O1%e22U)rBQ}nd50-)w7(IulfuM16zIwr|HC>o z#)`hxOnAQib?n|U44_3q@ zpm)x9(0+e)~UWN$yn>eeJ%G{#g z29#kFpaU4X$Jirebvm8#cY4Brcfe{7`kZQdK2Ga4^ylf5tYXUBvz_33m=@}US0002s-;f^S zE2G=q4;QyN==w0>re~{~=rF$9`vwYBFIbNh|7Z`YK-vQ~H@Uvn9!{qV?swO~x!z;ax$)dGt0<)tbo}XVmwG*KE zK5d|O0`ArX_7VOz0{{R30001h=;Zy%{iFZ#mo0sUE#>#$iB8^SOAp2IQhxtzo9xnO z&L6-GJ>E0X8HugTluNGYz zCg4WV8)%w98eVVzbgUM|rU?W|L;U*u+B$(W->)~&IsxgLz%s&jYXATM06=l_{^a?^ zpZwdlKB|`1&tDWL?`>PN;&N&IeD!10t&jF6P@FrrZOw|yrS&rN)sIoPX2m41Gl6=+ odlGo+lokyD00000001bs0zuCbDMjF0H~;_u07*qoM6N<$g7OQYUjP6A delta 580 zcmV-K0=xae1g!>;Bql{rOjJd{z`$KyU7eks-{9VsmX=W?aBne~|NsBR#>Cs(+dLXm zku@X)2etb)kzKTZ@<~KNRCt{2m*H}QAP|HF6flam+P?p*_CRNvu^dn+h3}-(_O1%e22U)rBQ}nd50-)w7(IulfuM16zIwr|HC>o z#)`hxOnAQib?n|U44_3q@ zpm)x9(0+e)~UWN$yn>eeJ%G{#g z29#kFpaU4X$Jirebvm8#cY4Brcfe{7`kZQdK2Ga4^ylf5tYXUBvz_33m=@}US0002s-;f^S zE2G=q4;QyN==w0>re~{~=rF$9`vwYBFIbNh|7Z`YK-vQ~H@Uvn9!{qV?swO~x!z;ax$)dGt0<)tbo}XVmwG*KE zK5d|O0`ArX_7VOz0{{R30001h=;Zy%{iFZ#mo0sUE#>#$iB8^SOAp2IQhxtzo9xnO z&L%LiE4M=?hm_WEU3{8JPo=d=bN{qTu1^@s6@OOMJdC9rBnf2bg4zPUbwUjsY-V642 z{yxL+Hhp(YAk1PPplbp;yx#ul*lo&P6G);%{QmsfI{}^V_YcrJ0U4UWHo^}(00000 zfa>J^&i$)D`HwAq)NF0NTig4aA7d^p vnn~bf0_}#^B=DnMdK>@%0000006@hRkkJw$t%FxK00000NkvXXu0mjf7&N3w delta 580 zcmV-K0=xal1g!>;Bql{rOjJd{z`$KyU7eks-{9VsmX?VX0ks_h|NsBR#>Cs(+i(&A zku@X)UndT!kzKTZ@<~KNRCt{2m*H}QAP|HF6flam+P?p*_CRNvu^dn+h3}-(_O1%e22U)rBQ}nd50-)w7(IulfuM16zIwr|HC>o z#)`hxOnAQib?n|U44_3q@ zpm)x9(0+e)~UWN$yn>eeJ%G{#g z29#kFpaU4X$Jirebvm8#cY4Brcfe{7`kZQdK2Ga4^ylf5tYXUBvz_33m=@}US0002s-;f^S zE2G=q4;QyN==w0>re~{~=rF$9`vwYBFIbNh|7Z`YK-vQ~H@Uvn9!{qV?swO~x!z;ax$)dGt0<)tbo}XVmwG*KE zK5d|O0`ArX_7VOz0{{R30001h=;Zy%{iFZ#mo0sUE#>#$iB8^SOAp2IQhxtzo9xnO z&L3KoCV|O%!6Ko&ezn;0@RV z*l-40I-#S(8*l`#DF#AhR*-QuLGxd=vorhh6N-Td0PsPSABB4>L7-y@Yz5nz5h1Ua zM9D^y=!xK9B~ac%+X?)@PC&cp+XDVoSWR^~DgXcg@OPZbOM7z5;vGSrpWAsrdYz_2V0(+t4i3I{X|1P}uNP8h(z>_$h zkx{dM0qIFZK~#90?U?J5f-nq)TMAT^OBZ(E|5Z1Qpe{6&WvKY$e2(b!B+Y5W8KY7F z005q7ozXSZdbh5PFy`R^!tf_RjeF|LuiB(r zK_6py3)ui=*U}xdMSmEO0_bV1+<}H1w)AXv>xSz~IvbPIX@jnH&b6IbAgcQ&Yf)!^ z1FcJGAf_wTxl;{vKH@wBKH$R*OeE4(LKQDQB6KAjF zaCu?2ehWALbK^tTC&Vs|C^8V2>(bQM=cOW=-ZcCj7hePH4qh+G0 zvtV>!X9whfV>0R&H;)`1hC^Bza8u#aKn@lrq5G0Wqj zn>)&}LVU?AUoO-fyBw>`Wy1_PR+;x2$gyT)e|9l%{%_=1We$7Zx?hOm4lZ7eNf7x2?%J|g3~9?)hs&(a!RrFV3$K_ChfkLo}O z6!<;CdO{I3zz|lkiTkz?u5Bic4w+3n*&qWP9VX-*ooisxqKHm$#qD_$(K)tld&o#p ze-!0k;H0=VfiK~GSJtf5+0NCp*wp+$dPciIsA+M{52R-V@=knwrwUy51L+yT$B%iw zBvs(DA7E9aFjuv>;s;nY+5vgVq(Rvauxj3bDR5cN(<%lMc7iGJ4;suU-a)FsWk0~G z&)bF%{(GXpWk0~G*SI`CW9c-#YMHVhA5fQ|D2k#e%3tvT|BW{@Ib) delta 884 zcmV-)1B?8Q1*-^<7=H)@0002=;F0+N003rCOjJd{z`!*%HI|l^Sy@?BR8(FgBCI_~ zOG`^nPfy$1+w=4DKR-XaySu+oO*=a~U|?W8JUn4xVLCcGHa0dcE-pt$M@mXcWo2b@ za&k~mP(?*W7#J8H9v)_9W~ivBnE*2&ARxfNz$HFPegFUf0g*$me*(`*L_t(|ob6bF zR--TwWJ{AkvD%(guA+zk|CR0%>RG!>5-7*J_jas7GfQ@|0iUy3rcfvpioXEZ;J5*p z%tM~%Ao9WdTi6(DHh7)JJ6B-#!nqNJWtoZWb_=_m+3o0uX*{CHX%rMz$iRb<_D47F z?ViGz6{2_);4f?re++TpptOPjaG1dC0i)Oi0X|3G3t)LK0M$D%Ea~uoFu>9PaC3}7 zzMm~nK;a&NS3o& z3vBQUeo6cgBvt@lF`$nqAi%@kL#hD%1)`W|as3PU40HLf0C9tM2(UtenS4k9-A_wc zVTHLo1$bT*X!;O~*G2g3i|6TKjWK$0UZGGZ6bgj`|8XwM=?#WEjH)aN&y}1`V5I$K$J3Te^^&C~EnJXY<;C-$J6`XLa zN9Pt4fQf!%!Ycu{bCdFi47|^V`#s}c>%iP31z`hEf7xC!*^eh4>wj)uXTJq;2EG^Y zBN;ch6xz4*`=9soTN{{LPC$)kjo)oxZZUN2N7r>9Z5NnZP=QBqPN7gJ6bgkxF$tXW zz2D+Aj9X~V`Q9&ogoWmu@4(Oy*#HpA7-6Ahmz&Z65Xu;1p=Fnw(f|<37-gX)mz&Z6 z5M!e(YBcA3W7P*^V=T1fa#I=rVr+zkmR)X213)NajD?n6Zb}0{h>fw(qRUNb07$V> z7Fu$-DGdNIc8-NkX#gzKEJ#tW%>so&p-?Ck3WY+UP$(4t7d`>4^GHMl$F7qA0000< KMNUMnLSTZjQizxU diff --git a/nebula.dme b/nebula.dme index 4f229b0282..9a72f064cd 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1915,9 +1915,10 @@ #include "code\modules\clothing\clothing_state\clothing_state_untied.dm" #include "code\modules\clothing\dresses\_dress.dm" #include "code\modules\clothing\dresses\job.dm" +#include "code\modules\clothing\dresses\maxi.dm" #include "code\modules\clothing\dresses\misc.dm" -#include "code\modules\clothing\dresses\plaid.dm" #include "code\modules\clothing\dresses\role.dm" +#include "code\modules\clothing\dresses\short.dm" #include "code\modules\clothing\dresses\sundress.dm" #include "code\modules\clothing\dresses\wedding.dm" #include "code\modules\clothing\ears\_ears.dm" @@ -1982,6 +1983,7 @@ #include "code\modules\clothing\sensors\buddytag.dm" #include "code\modules\clothing\sensors\vitals_sensor.dm" #include "code\modules\clothing\shirts\_shirts.dm" +#include "code\modules\clothing\shirts\blouse.dm" #include "code\modules\clothing\shirts\flannel.dm" #include "code\modules\clothing\shirts\hawaii.dm" #include "code\modules\clothing\shirts\misc.dm" @@ -1997,6 +1999,10 @@ #include "code\modules\clothing\shoes\misc.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" #include "code\modules\clothing\shoes\winterboots.dm" +#include "code\modules\clothing\skirts\_skirt.dm" +#include "code\modules\clothing\skirts\job.dm" +#include "code\modules\clothing\skirts\misc.dm" +#include "code\modules\clothing\skirts\plaid.dm" #include "code\modules\clothing\spacesuits\breaches.dm" #include "code\modules\clothing\spacesuits\miscellaneous.dm" #include "code\modules\clothing\spacesuits\spacesuits.dm" @@ -2052,6 +2058,7 @@ #include "code\modules\clothing\suits\armor\forged\banded.dm" #include "code\modules\clothing\suits\jackets\_jacket.dm" #include "code\modules\clothing\suits\jackets\hoodies.dm" +#include "code\modules\clothing\suits\jackets\job.dm" #include "code\modules\clothing\suits\jackets\letterman.dm" #include "code\modules\clothing\suits\jackets\medical.dm" #include "code\modules\clothing\suits\jackets\misc.dm" @@ -2064,7 +2071,6 @@ #include "code\modules\clothing\under\formalwear.dm" #include "code\modules\clothing\under\miscellaneous.dm" #include "code\modules\clothing\under\monkey.dm" -#include "code\modules\clothing\under\skirts.dm" #include "code\modules\clothing\under\syndicate.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" From fec00ec76661317e8f8de52c64973907e541da4c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 16:22:08 +1000 Subject: [PATCH 181/212] Converting several items to costumes or other types. --- code/datums/outfits/horror_killers.dm | 2 +- code/datums/outfits/misc.dm | 4 +- code/datums/outfits/pirates.dm | 2 +- code/datums/supplypacks/nonessent.dm | 16 ++--- code/datums/trading/traders/misc.dm | 10 +-- code/game/objects/effects/landmarks.dm | 18 ++--- .../crates_lockers/closets/gimmick.dm | 2 +- .../loadout/lists/uniforms.dm | 2 +- code/modules/clothing/costumes/_costume.dm | 13 ++++ code/modules/clothing/costumes/misc.dm | 66 +++++++++++++++++ code/modules/clothing/dresses/_dress.dm | 1 - code/modules/clothing/dresses/misc.dm | 6 ++ code/modules/clothing/shirts/_shirts.dm | 1 - code/modules/clothing/shoes/miscellaneous.dm | 1 - code/modules/clothing/under/jobs/civilian.dm | 5 -- code/modules/clothing/under/miscellaneous.dm | 71 +------------------ code/modules/mining/abandonedcrates.dm | 2 +- maps/antag_spawn/heist/heist_outfit.dm | 6 +- maps/away/slavers/slavers_base.dm | 4 +- maps/ministation/ministation-1.dmm | 2 +- .../crashed_pod/crashed_pod.dmm | 4 +- .../exoplanet_ruins/playablecolony/colony.dmm | 4 +- maps/tradeship/tradeship-1.dmm | 2 +- nebula.dme | 2 + 24 files changed, 128 insertions(+), 118 deletions(-) create mode 100644 code/modules/clothing/costumes/_costume.dm create mode 100644 code/modules/clothing/costumes/misc.dm diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index ec569fd6b6..ee87c93d3d 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/tunnel_clown name = "Tunnel clown" - uniform = /obj/item/clothing/under/clown + uniform = /obj/item/clothing/costume/clown shoes = /obj/item/clothing/shoes/clown_shoes gloves = /obj/item/clothing/gloves/thick mask = /obj/item/clothing/mask/gas/clown_hat diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index a44836b932..b8ed828604 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -10,7 +10,7 @@ /decl/hierarchy/outfit/soviet_soldier name = "Soviet soldier" - uniform = /obj/item/clothing/under/soviet + uniform = /obj/item/clothing/costume/soviet shoes = /obj/item/clothing/shoes/jackboots/swat/combat head = /obj/item/clothing/head/ushanka gloves = /obj/item/clothing/gloves/thick/combat @@ -33,7 +33,7 @@ shoes = /obj/item/clothing/shoes/clown_shoes mask = /obj/item/clothing/mask/gas/clown_hat l_ear = /obj/item/radio/headset - uniform = /obj/item/clothing/under/clown + uniform = /obj/item/clothing/costume/clown l_pocket = /obj/item/bikehorn outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_RESET_EQUIPMENT | OUTFIT_HAS_VITALS_SENSOR diff --git a/code/datums/outfits/pirates.dm b/code/datums/outfits/pirates.dm index b30b4f9525..c80531a27e 100644 --- a/code/datums/outfits/pirates.dm +++ b/code/datums/outfits/pirates.dm @@ -1,7 +1,7 @@ /decl/hierarchy/outfit/pirate abstract_type = /decl/hierarchy/outfit/pirate name = "Pirate" - uniform = /obj/item/clothing/under/pirate + uniform = /obj/item/clothing/costume/pirate shoes = /obj/item/clothing/shoes/jackboots glasses = /obj/item/clothing/glasses/eyepatch hands = list(/obj/item/energy_blade/cutlass) diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 42fb263809..5645e9bd10 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -97,19 +97,19 @@ /obj/item/clothing/suspenders, /obj/item/clothing/suit/toggle/labcoat/mad, /obj/item/clothing/suit/bio_suit/plaguedoctorsuit, - /obj/item/clothing/under/schoolgirl, - /obj/item/clothing/under/owl, + /obj/item/clothing/costume/schoolgirl, + /obj/item/clothing/costume/owl, /obj/item/clothing/under/waiter, - /obj/item/clothing/under/gladiator, - /obj/item/clothing/under/soviet, + /obj/item/clothing/costume/gladiator, + /obj/item/clothing/costume/soviet, /obj/item/clothing/under/scratch, /obj/item/clothing/dress/wedding/bride_white, /obj/item/clothing/suit/chef, /obj/item/clothing/suit/apron/overalls, - /obj/item/clothing/under/redcoat, - /obj/item/clothing/under/kilt, - /obj/item/clothing/under/savage_hunter, - /obj/item/clothing/under/savage_hunter/female, + /obj/item/clothing/costume/redcoat, + /obj/item/clothing/costume/kilt, + /obj/item/clothing/costume/savage_hunter, + /obj/item/clothing/costume/savage_hunter/female, /obj/item/clothing/under/wetsuit) name = "Costume - Random" containername = "actor costumes crate" diff --git a/code/datums/trading/traders/misc.dm b/code/datums/trading/traders/misc.dm index f2ca4e57a0..f0d7470c81 100644 --- a/code/datums/trading/traders/misc.dm +++ b/code/datums/trading/traders/misc.dm @@ -109,7 +109,7 @@ /obj/item/clothing/mask/gas/clown_hat = TRADER_THIS_TYPE, /obj/item/clothing/mask/gas/mime = TRADER_THIS_TYPE, /obj/item/clothing/shoes/clown_shoes = TRADER_THIS_TYPE, - /obj/item/clothing/under/clown = TRADER_THIS_TYPE, + /obj/item/clothing/costume/clown = TRADER_THIS_TYPE, /obj/item/stamp/clown = TRADER_THIS_TYPE, /obj/item/backpack/clown = TRADER_THIS_TYPE, /obj/item/bananapeel = TRADER_THIS_TYPE, @@ -169,10 +169,10 @@ /obj/item/clothing/suit/judgerobe = TRADER_THIS_TYPE, /obj/item/clothing/suit/wizrobe/magusred = TRADER_THIS_TYPE, /obj/item/clothing/suit/wizrobe/magusblue = TRADER_THIS_TYPE, - /obj/item/clothing/under/gladiator = TRADER_THIS_TYPE, - /obj/item/clothing/under/kilt = TRADER_THIS_TYPE, - /obj/item/clothing/under/redcoat = TRADER_THIS_TYPE, - /obj/item/clothing/under/soviet = TRADER_THIS_TYPE, + /obj/item/clothing/costume/gladiator = TRADER_THIS_TYPE, + /obj/item/clothing/costume/kilt = TRADER_THIS_TYPE, + /obj/item/clothing/costume/redcoat = TRADER_THIS_TYPE, + /obj/item/clothing/costume/soviet = TRADER_THIS_TYPE, /obj/item/harpoon = TRADER_THIS_TYPE, /obj/item/sword = TRADER_ALL, /obj/item/scythe = TRADER_THIS_TYPE, diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 17bc432805..e01b2d43c8 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -52,7 +52,7 @@ new /obj/item/backpack/chameleon(src.loc) /obj/abstract/landmark/costume/gladiator/make_costumes() - new /obj/item/clothing/under/gladiator(src.loc) + new /obj/item/clothing/costume/gladiator(src.loc) new /obj/item/clothing/head/helmet/gladiator(src.loc) /obj/abstract/landmark/costume/madscientist/make_costumes() @@ -68,7 +68,7 @@ new /obj/item/clothing/shoes/jackboots(src.loc) /obj/abstract/landmark/costume/nyangirl/make_costumes() - new /obj/item/clothing/under/schoolgirl(src.loc) + new /obj/item/clothing/costume/schoolgirl(src.loc) new /obj/item/clothing/head/kitty(src.loc) /obj/abstract/landmark/costume/maid/make_costumes() @@ -96,7 +96,7 @@ new /obj/item/clothing/head/plaguedoctorhat(src.loc) /obj/abstract/landmark/costume/nightowl/make_costumes() - new /obj/item/clothing/under/owl(src.loc) + new /obj/item/clothing/costume/owl(src.loc) new /obj/item/clothing/mask/gas/owl_mask(src.loc) /obj/abstract/landmark/costume/waiter/make_costumes() @@ -106,14 +106,14 @@ new /obj/item/clothing/suit/apron(src.loc) /obj/abstract/landmark/costume/pirate/make_costumes() - new /obj/item/clothing/under/pirate(src.loc) + new /obj/item/clothing/costume/pirate(src.loc) new /obj/item/clothing/suit/pirate(src.loc) var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/mask/bandana/red) new CHOICE(src.loc) new /obj/item/clothing/glasses/eyepatch(src.loc) /obj/abstract/landmark/costume/commie/make_costumes() - new /obj/item/clothing/under/soviet(src.loc) + new /obj/item/clothing/costume/soviet(src.loc) new /obj/item/clothing/head/ushanka(src.loc) /obj/abstract/landmark/costume/imperium_monk/make_costumes() @@ -140,16 +140,16 @@ /obj/abstract/landmark/costume/sexyclown/make_costumes() new /obj/item/clothing/mask/gas/sexyclown(src.loc) - new /obj/item/clothing/under/sexyclown(src.loc) + new /obj/item/clothing/costume/sexyclown(src.loc) /obj/abstract/landmark/costume/sexymime/make_costumes() new /obj/item/clothing/mask/gas/sexymime(src.loc) - new /obj/item/clothing/under/sexymime(src.loc) + new /obj/item/clothing/costume/sexymime(src.loc) /obj/abstract/landmark/costume/savagehunter/make_costumes() new /obj/item/clothing/mask/spirit(src.loc) - new /obj/item/clothing/under/savage_hunter(src.loc) + new /obj/item/clothing/costume/savage_hunter(src.loc) /obj/abstract/landmark/costume/savagehuntress/make_costumes() new /obj/item/clothing/mask/spirit(src.loc) - new /obj/item/clothing/under/savage_hunter/female(src.loc) + new /obj/item/clothing/costume/savage_hunter/female(src.loc) diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index ad7b8397e1..6a3dd44630 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -31,7 +31,7 @@ /obj/structure/closet/gimmick/russian/WillContain() return list( /obj/item/clothing/head/ushanka = 5, - /obj/item/clothing/under/soviet = 5) + /obj/item/clothing/costume/soviet = 5) /obj/structure/closet/gimmick/tacticool name = "tacticool gear closet" diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 291ce045d7..8956abb0a1 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -64,7 +64,7 @@ /obj/item/clothing/under/internalaffairs/plain, /obj/item/clothing/under/blazer, /obj/item/clothing/under/blackjumpskirt, - /obj/item/clothing/under/kilt, + /obj/item/clothing/costume/kilt, /obj/item/clothing/dress/hr, /obj/item/clothing/under/det, /obj/item/clothing/under/det/black, diff --git a/code/modules/clothing/costumes/_costume.dm b/code/modules/clothing/costumes/_costume.dm new file mode 100644 index 0000000000..1afd7a2643 --- /dev/null +++ b/code/modules/clothing/costumes/_costume.dm @@ -0,0 +1,13 @@ +/obj/item/clothing/costume + abstract_type = /obj/item/clothing/costume + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_UPPER_BODY + w_class = ITEM_SIZE_NORMAL + fallback_slot = slot_w_uniform_str + valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES + +/obj/item/clothing/costume/get_associated_equipment_slots() + . = ..() + var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) + LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/costumes/misc.dm b/code/modules/clothing/costumes/misc.dm new file mode 100644 index 0000000000..abb6e9683d --- /dev/null +++ b/code/modules/clothing/costumes/misc.dm @@ -0,0 +1,66 @@ +/obj/item/clothing/costume/clown + name = "clown costume" + desc = "'HONK!'" + icon = 'icons/clothing/under/uniform_clown.dmi' + +/obj/item/clothing/costume/owl + name = "owl costume" + desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_owl.dmi' + +/obj/item/clothing/costume/schoolgirl + name = "schoolgirl costume" + desc = "It's just like one of my Japanese animes!" + icon = 'icons/clothing/under/uniform_schoolgirl.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY + +/obj/item/clothing/costume/sexyclown + name = "sexy clown costume" + desc = "It makes you look HONKable!" + icon = 'icons/clothing/under/sexyclown.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY + +/obj/item/clothing/costume/soviet + name = "soviet costume" + desc = "For the Motherland!" + icon = 'icons/clothing/under/soviet.dmi' + +/obj/item/clothing/costume/redcoat + name = "redcoat costume" + desc = "Looks old." + icon = 'icons/clothing/under/redcoat.dmi' + +/obj/item/clothing/costume/savage_hunter + name = "savage hunter costume" + desc = "Makeshift hides bound together with the sinew, packwax, and leather of some alien creature." + icon = 'icons/clothing/under/hides_hunter.dmi' + body_parts_covered = SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS + +/obj/item/clothing/costume/savage_hunter/female + name = "savage huntress costume" + desc = "Makeshift hides bound together with the sinew, packwax, and leather of some alien creature. Includes a chestwrap so as not to leave one topless." + icon = 'icons/clothing/under/hides_huntress.dmi' + +/obj/item/clothing/costume/sexymime + name = "sexy mime costume" + desc = "The only time when you DON'T enjoy looking at someone's rack." + icon = 'icons/clothing/under/sexymime.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY + +/obj/item/clothing/costume/gladiator + name = "gladiator costume" + desc = "Are you not entertained? Is that not why you are here?" + icon = 'icons/clothing/under/gladiator.dmi' + body_parts_covered = SLOT_LOWER_BODY + +/obj/item/clothing/costume/kilt + name = "kilt costume" + desc = "Includes shoes and plaid." + icon = 'icons/clothing/under/kilt.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_FEET + +/obj/item/clothing/costume/pirate + name = "pirate costume" + desc = "Yarr." + icon = 'icons/clothing/under/pirate.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS diff --git a/code/modules/clothing/dresses/_dress.dm b/code/modules/clothing/dresses/_dress.dm index cea01ebd19..5bce1b6739 100644 --- a/code/modules/clothing/dresses/_dress.dm +++ b/code/modules/clothing/dresses/_dress.dm @@ -6,7 +6,6 @@ permeability_coefficient = 0.90 slot_flags = SLOT_UPPER_BODY w_class = ITEM_SIZE_NORMAL - force = 0 valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str diff --git a/code/modules/clothing/dresses/misc.dm b/code/modules/clothing/dresses/misc.dm index ecb429950a..6c3f0c4940 100644 --- a/code/modules/clothing/dresses/misc.dm +++ b/code/modules/clothing/dresses/misc.dm @@ -52,6 +52,12 @@ icon = 'icons/clothing/under/dresses/dress_cheongsam.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS +/obj/item/clothing/dress/kimono + name = "kimono" + desc = "A traditional robe with remarkably long sleeves." + icon = 'icons/clothing/under/kimono.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS + /obj/item/clothing/dress/gown name = "silk gown" desc = "A long silky sleeveless gown with a flared hem." diff --git a/code/modules/clothing/shirts/_shirts.dm b/code/modules/clothing/shirts/_shirts.dm index b7b15f3ecc..ff3eeb0805 100644 --- a/code/modules/clothing/shirts/_shirts.dm +++ b/code/modules/clothing/shirts/_shirts.dm @@ -3,7 +3,6 @@ body_parts_covered = SLOT_UPPER_BODY|SLOT_ARMS permeability_coefficient = 0.90 slot_flags = SLOT_UPPER_BODY - w_class = ITEM_SIZE_SMALL accessory_slot = ACCESSORY_SLOT_DECOR fallback_slot = slot_w_uniform_str diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 60e88bf9d7..e35c22837c 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -100,7 +100,6 @@ desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" name = "clown shoes" icon = 'icons/clothing/feet/clown.dmi' - force = 0 bodytype_equip_flags = null can_add_hidden_item = FALSE var/footstep = 1 //used for squeeks whilst walking diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 9993a0f727..ab9015eee3 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -33,11 +33,6 @@ name = "chef's uniform" icon = 'icons/clothing/under/uniform_chef.dmi' -/obj/item/clothing/under/clown - name = "clown suit" - desc = "'HONK!'" - icon = 'icons/clothing/under/uniform_clown.dmi' - /obj/item/clothing/under/head_of_personnel desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." name = "head of personnel's jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 734cf886b7..8478679604 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -33,12 +33,6 @@ desc = "'Special delivery!'" icon = 'icons/clothing/under/jumpsuits/jumpsuit_mailman.dmi' -/obj/item/clothing/under/sexyclown - name = "sexy-clown suit" - desc = "It makes you look HONKable!" - icon = 'icons/clothing/under/sexyclown.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - /obj/item/clothing/under/vice name = "vice officer's jumpsuit" desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision." @@ -63,11 +57,6 @@ icon = 'icons/clothing/under/uniform_officer_dress.dmi' should_display_id = FALSE -/obj/item/clothing/under/owl - name = "owl uniform" - desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_owl.dmi' - /obj/item/clothing/under/johnny name = "brown jumpsuit" desc = "A label on the inside of the collar reads, 'johnny~~~'." @@ -101,51 +90,11 @@ desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." icon = 'icons/clothing/under/suits/suit_teal.dmi' -/obj/item/clothing/under/schoolgirl - name = "schoolgirl uniform" - desc = "It's just like one of my Japanese animes!" - icon = 'icons/clothing/under/uniform_schoolgirl.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - /obj/item/clothing/under/overalls name = "laborer's overalls" desc = "A set of durable overalls for getting the job done." icon = 'icons/clothing/under/overalls.dmi' -/obj/item/clothing/under/pirate - name = "pirate outfit" - desc = "Yarr." - icon = 'icons/clothing/under/pirate.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS - -/obj/item/clothing/under/soviet - name = "soviet uniform" - desc = "For the Motherland!" - icon = 'icons/clothing/under/soviet.dmi' - -/obj/item/clothing/under/redcoat - name = "redcoat uniform" - desc = "Looks old." - icon = 'icons/clothing/under/redcoat.dmi' - -/obj/item/clothing/under/kilt - name = "kilt" - desc = "Includes shoes and plaid." - icon = 'icons/clothing/under/kilt.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_FEET - -/obj/item/clothing/under/sexymime - name = "sexy mime outfit" - desc = "The only time when you DON'T enjoy looking at someone's rack." - icon = 'icons/clothing/under/sexymime.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/gladiator - name = "gladiator uniform" - desc = "Are you not entertained? Is that not why you are here?" - icon = 'icons/clothing/under/gladiator.dmi' - body_parts_covered = SLOT_LOWER_BODY - /obj/item/clothing/under/blackjumpskirt name = "black jumpskirt" desc = "A black jumpskirt, with a pink undershirt." @@ -198,18 +147,6 @@ desc = "A warm looking sweater and a pair of dark blue slacks." icon = 'icons/clothing/under/uniform_turtleneck.dmi' -/obj/item/clothing/under/savage_hunter - name = "savage hunter's hides" - desc = "Makeshift hides bound together with the sinew, packwax, and leather of some alien creature." - icon = 'icons/clothing/under/hides_hunter.dmi' - body_parts_covered = SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS - -/obj/item/clothing/under/savage_hunter/female - name = "savage huntress's hides" - desc = "Makeshift hides bound together with the sinew, packwax, and leather of some alien creature. Includes a chestwrap so as not to leave one topless." - icon = 'icons/clothing/under/hides_huntress.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS - /obj/item/clothing/under/wetsuit name = "tactical wetsuit" desc = "For when you want to scuba dive your way into an enemy base but still want to show off a little skin." @@ -234,10 +171,4 @@ permeability_coefficient = 0.50 armor = list( ARMOR_BIO = ARMOR_BIO_SMALL - ) - -/obj/item/clothing/under/kimono - desc = "A traditional robe with remarkably long sleeves, mostly worn by women. Sugoi." - name = "kimono" - icon = 'icons/clothing/under/kimono.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS + ) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index fecc3e1313..e5e5724fa5 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -107,7 +107,7 @@ new /obj/item/firstaid/combat(src) // Probably the least OP if(94) // Why the hell not new /obj/item/backpack/clown(src) - new /obj/item/clothing/under/clown(src) + new /obj/item/clothing/costume/clown(src) new /obj/item/clothing/shoes/clown_shoes(src) new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/bikehorn(src) diff --git a/maps/antag_spawn/heist/heist_outfit.dm b/maps/antag_spawn/heist/heist_outfit.dm index ea5367344d..8bd56aa12e 100644 --- a/maps/antag_spawn/heist/heist_outfit.dm +++ b/maps/antag_spawn/heist/heist_outfit.dm @@ -3,9 +3,9 @@ l_ear = /obj/item/radio/headset/raider id_type = /obj/item/card/id/syndicate var/list/raider_uniforms = list( - /obj/item/clothing/under/soviet, - /obj/item/clothing/under/pirate, - /obj/item/clothing/under/redcoat, + /obj/item/clothing/costume/soviet, + /obj/item/clothing/costume/pirate, + /obj/item/clothing/costume/redcoat, /obj/item/clothing/under/serviceoveralls, /obj/item/clothing/under/captain_fly, /obj/item/clothing/under/det, diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm index 3a916181f0..3c6aaeb53f 100644 --- a/maps/away/slavers/slavers_base.dm +++ b/maps/away/slavers/slavers_base.dm @@ -89,7 +89,7 @@ /decl/hierarchy/outfit/corpse/slavers_base/slaver3 name = "Dead Slaver 3" - uniform = /obj/item/clothing/under/pirate + uniform = /obj/item/clothing/costume/pirate shoes = /obj/item/clothing/shoes/color/brown /obj/abstract/landmark/corpse/slavers_base/slaver4 @@ -98,7 +98,7 @@ /decl/hierarchy/outfit/corpse/slavers_base/slaver4 name = "Dead Slaver 4" - uniform = /obj/item/clothing/under/redcoat + uniform = /obj/item/clothing/costume/redcoat shoes = /obj/item/clothing/shoes/color/brown /obj/abstract/landmark/corpse/slavers_base/slaver5 diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index fb7bec6335..d52e81955d 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -7226,7 +7226,7 @@ /obj/structure/closet, /obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/shoes/clown_shoes, -/obj/item/clothing/under/clown, +/obj/item/clothing/costume/clown, /obj/item/stamp/clown, /obj/item/backpack/clown, /obj/item/bikehorn, diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 0c8e1e821a..507a85757f 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -281,8 +281,8 @@ /obj/item/stack/material/puck/mapped/uranium/ten, /obj/item/stack/material/puck/mapped/uranium/ten, /obj/item/stack/material/puck/mapped/uranium/ten, -/obj/item/clothing/under/savage_hunter, -/obj/item/clothing/under/savage_hunter/female, +/obj/item/clothing/costume/savage_hunter, +/obj/item/clothing/costume/savage_hunter/female, /obj/item/clothing/under/wetsuit, /obj/effect/decal/cleanable/dirt, /obj/item/trash/candy/proteinbar, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index bd3513b904..a1024971f5 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -1547,8 +1547,8 @@ /obj/structure/closet, /obj/item/clothing/under/wetsuit, /obj/item/clothing/under/wetsuit, -/obj/item/clothing/under/savage_hunter, -/obj/item/clothing/under/savage_hunter/female, +/obj/item/clothing/costume/savage_hunter, +/obj/item/clothing/costume/savage_hunter/female, /obj/item/clothing/under/harness, /obj/item/clothing/under/harness, /obj/item/clothing/head/cowboy_hat, diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 72c69d63b0..5a243a3e4c 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -1101,7 +1101,7 @@ /obj/random/clothing, /obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/shoes/clown_shoes, -/obj/item/clothing/under/clown, +/obj/item/clothing/costume/clown, /obj/item/stamp/clown, /obj/item/backpack/clown, /obj/item/bikehorn, diff --git a/nebula.dme b/nebula.dme index 9a72f064cd..e0b7c2ec2f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1913,6 +1913,8 @@ #include "code\modules\clothing\clothing_state\clothing_state_sleeves.dm" #include "code\modules\clothing\clothing_state\clothing_state_tucked.dm" #include "code\modules\clothing\clothing_state\clothing_state_untied.dm" +#include "code\modules\clothing\costumes\_costume.dm" +#include "code\modules\clothing\costumes\misc.dm" #include "code\modules\clothing\dresses\_dress.dm" #include "code\modules\clothing\dresses\job.dm" #include "code\modules\clothing\dresses\maxi.dm" From 96507437d9227d0228afeb0fd990ab66bdd94f3c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 16:34:11 +1000 Subject: [PATCH 182/212] Converted pjs into shirt/pants. --- code/datums/trading/traders/goods.dm | 16 +++++++++------ .../crates_lockers/closets/wardrobe.dm | 6 ++++-- .../loadout/lists/uniforms.dm | 2 +- code/modules/clothing/pants/pajamas.dm | 19 ++++++++++++++++++ code/modules/clothing/shirts/pajamas.dm | 9 +++++++++ code/modules/clothing/under/miscellaneous.dm | 10 --------- icons/clothing/pants/pjs_blue.dmi | Bin 0 -> 744 bytes icons/clothing/pants/pjs_red.dmi | Bin 0 -> 773 bytes icons/clothing/shirts/pjs_blue.dmi | Bin 0 -> 1051 bytes icons/clothing/shirts/pjs_red.dmi | Bin 0 -> 1055 bytes icons/clothing/under/pjs_blue.dmi | Bin 1137 -> 0 bytes icons/clothing/under/pjs_red.dmi | Bin 1138 -> 0 bytes maps/away/slavers/slavers_base.dmm | 3 ++- maps/away/unishi/unishi-2.dmm | 3 ++- nebula.dme | 2 ++ 15 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 code/modules/clothing/pants/pajamas.dm create mode 100644 code/modules/clothing/shirts/pajamas.dm create mode 100644 icons/clothing/pants/pjs_blue.dmi create mode 100644 icons/clothing/pants/pjs_red.dmi create mode 100644 icons/clothing/shirts/pjs_blue.dmi create mode 100644 icons/clothing/shirts/pjs_red.dmi delete mode 100644 icons/clothing/under/pjs_blue.dmi delete mode 100644 icons/clothing/under/pjs_red.dmi diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index 3b28b095d3..e1ca26ee88 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -129,20 +129,24 @@ ) possible_trading_items = list( + /obj/item/clothing/pants = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/pants/pj = TRADER_BLACKLIST, + /obj/item/clothing/pants/shorts = TRADER_BLACKLIST, + /obj/item/clothing/pants/casual/mustangjeans/monke = TRADER_BLACKLIST, + /obj/item/clothing/shirt = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/shirt/pj = TRADER_BLACKLIST, + /obj/item/clothing/skirt = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/dress = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/dress/wedding = TRADER_BLACKLIST, /obj/item/clothing/under = TRADER_SUBTYPES_ONLY, /obj/item/clothing/under/chameleon = TRADER_BLACKLIST, /obj/item/clothing/under/color = TRADER_BLACKLIST, /obj/item/clothing/under/gimmick = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/lawyer = TRADER_BLACKLIST, - /obj/item/clothing/under/pj = TRADER_BLACKLIST, - /obj/item/clothing/under = TRADER_BLACKLIST, - /obj/item/clothing/pants/shorts = TRADER_BLACKLIST, /obj/item/clothing/under/mankini = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/syndicate = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/tactical = TRADER_BLACKLIST, - /obj/item/clothing/under/waiter/monke = TRADER_BLACKLIST, - /obj/item/clothing/dress/wedding = TRADER_BLACKLIST, - /obj/item/clothing/pants/casual/mustangjeans/monke = TRADER_BLACKLIST + /obj/item/clothing/under/waiter/monke = TRADER_BLACKLIST ) /datum/trader/ship/clothingshop/shoes diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index d24fdb4f25..f243a0d09d 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -138,8 +138,10 @@ /obj/structure/closet/wardrobe/pjs/WillContain() return list( - /obj/item/clothing/under/pj = 2, - /obj/item/clothing/under/pj/blue = 2, + /obj/item/clothing/pants/pj = 1, + /obj/item/clothing/pants/pj/blue = 1, + /obj/item/clothing/shirt/pj = 1, + /obj/item/clothing/shirt/pj/blue = 1, /obj/item/clothing/shoes/color/white = 2, /obj/item/clothing/shoes/slippers = 2, ) diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 8956abb0a1..abc1dbcd76 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -145,7 +145,7 @@ /decl/loadout_option/uniform/kimono name = "kimono, colour select" - path = /obj/item/clothing/under/kimono + path = /obj/item/clothing/dress/kimono loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/frontier diff --git a/code/modules/clothing/pants/pajamas.dm b/code/modules/clothing/pants/pajamas.dm new file mode 100644 index 0000000000..a62c53830b --- /dev/null +++ b/code/modules/clothing/pants/pajamas.dm @@ -0,0 +1,19 @@ +/obj/item/clothing/pants/pj + name = "red pajama pants" + desc = "Red-striped sleepwear." + icon = 'icons/clothing/pants/pjs_red.dmi' + +/obj/item/clothing/pants/pj/outfit + starting_accessories = list( + /obj/item/clothing/shirt/pj + ) + +/obj/item/clothing/pants/pj/blue + name = "blue pajama pants" + desc = "Blue-striped sleepwear." + icon = 'icons/clothing/pants/pjs_blue.dmi' + +/obj/item/clothing/pants/pj/blue/outfit + starting_accessories = list( + /obj/item/clothing/shirt/pj/blue + ) diff --git a/code/modules/clothing/shirts/pajamas.dm b/code/modules/clothing/shirts/pajamas.dm new file mode 100644 index 0000000000..dd9bc5a389 --- /dev/null +++ b/code/modules/clothing/shirts/pajamas.dm @@ -0,0 +1,9 @@ +/obj/item/clothing/shirt/pj + name = "red pajama shirt" + desc = "Red-striped sleepwear." + icon = 'icons/clothing/shirts/pjs_red.dmi' + +/obj/item/clothing/shirt/pj/blue + name = "blue pajama shirt" + desc = "Blue-striped sleepwear." + icon = 'icons/clothing/shirts/pjs_blue.dmi' diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 8478679604..eeca9a7e36 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -1,13 +1,3 @@ -/obj/item/clothing/under/pj - name = "red pj's" - desc = "Sleepwear." - icon = 'icons/clothing/under/pjs_red.dmi' - -/obj/item/clothing/under/pj/blue - name = "blue pj's" - desc = "Sleepwear." - icon = 'icons/clothing/under/pjs_blue.dmi' - /obj/item/clothing/under/captain_fly name = "rogue's uniform" desc = "For the man who doesn't care because he's still free." diff --git a/icons/clothing/pants/pjs_blue.dmi b/icons/clothing/pants/pjs_blue.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ee69a93854806a017c9b8b9f1e1bef67c259d669 GIT binary patch literal 744 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&*$4Q9xE?rgVDbD(M-ObfedGMD zEsNR~pL_H2;e_>fDkkmRwQW^aR@Tg!GYbm~|Ns9FRQcn_kNfxUFIlprv$J#e?%hC< zS@~Bs0gYlT3GxeOaCmkj4ak{M6%tY6l3JWxlvz-cnV-kNP%$Sste~j$`@@tfq>_{Ea#Akb$8oHdt_qUh6NQdpCQ!IEGZrc{}57-ysD7H%%Q~ z*OfPF|CirwtlAjWHs37g`y*>NpJSfSI+8vqvH(5xp<0Tko`3|Hr)Gs5-->R4YKu;3nzbGtz?pXQ)&J#`;Muz zIL=0Fd-DIv--BlR)trKV_(wu`Ve30C94v|~o2L77{`<9^7cO3Us}udHe%W?4Cu5M< z+qK;ndQ!drJ+A^AHtGM(d#k`k)$fBU`Tr!AG5O}C|ApaTtHH#DWBk+7l%h1|Ue^He NJzf1=);T3K0RSIPUUvWh literal 0 HcmV?d00001 diff --git a/icons/clothing/pants/pjs_red.dmi b/icons/clothing/pants/pjs_red.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ae11352d5adc4511098d80588f4b56a4dd9042b1 GIT binary patch literal 773 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&g#`G7xE?rgVDbD(M-ObfedGMD zEsIW8m%VxU@LFrbw%qis*=f7BtvXRza;>>;ZARjWyo^1$=~-D>GiS~$EG)cGUH1R~ zf1vgsKYrZ5e}Bo6C7qp}yLayfieySCL;%faED7=pW^j0RBMr!zQ56zV;*wgNT$EW* zl9`{!z)&$KIIN(k^!u0Kf{$OHXnE^uojY?rctfbcMdJsLbk6%|o@6NM>D^&r9Atdi z*h^u~qe(|5g(w8CwArtr?%LUHth#xH#0m2!k9@Sf&iJ-&c(}^Qt62E+C*xp|NuPqX zO1q0cc|SV+*!#25zBNgH)PqyrE+Y`K8GwH;rI4sK*xF5K=$h6 zCcd-cPD(+X!2Qq2iT!uFYsRrnE_NmL540@>XKmCu`G4W>=AHF^Ez3U0Z-VmX2`-%b z)Iv|k`;+~Cb9JX`@68*4G86YgHN3gEhvRI-v?uj>`C%<-AXU4~wVjNoss5aQf41;K q$C0001KP)t-sz`($F zlDWmewyB|wXMUfLuH1y8&g|*oc$2$^q|w{h&zFyQc#^q>qt1}8+`6=)i-vhrXM)(& z$hx+waf+{_pOSZ$#8zm6YHDhknVE5MasU7Sz`(%x`1s%7-=w6ZiHV83ySu=^z`7XW zK>z>%0d!JMQvg8b*k%9#0GN7ISad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1D@x2wg|OkOGD>q3^YSxO6q52&Ds_u<@=M~&<4f~0)AEaQ5t>bi)|?Zck(if4 zj?N;yI+Yb%{anD|004qrQxTLdh57&h0=!8?K~#90?U)a5+At8s`+Dzbwp+)fy{3Zx8#l^MVtf=RA1_TLSp zmjK2X>uTJk_0^p~Vg<@5s$+}l`MXL?pqjoK(5Zef&^U_?0%HI+e+5zt1PF()4+j9_ zO#)4Qj0TYUI<*DXAYfx0XTaP9Ou_&yDhRYepc>Br9Qu0bWAYSD*a6eDX#=^@h0(`%n>FbGp+!n|0K$gIy!RsYt4TQm=`}z)mrc0{% zZ^DDd4eA5ekN3iY<#%94pmG)rSjV-i=H;+Cyfj=J=$&*0z_K53RB!}!Wc&2~Bm40~ z|1j0Bk?x@7zNjM){E`TQAP9mW2>%PXr4YZK{1)LyLm750{TE?5wsMXu->kB1p8nBU|X+cfOa4xPndX=wk&%J@8NaYKzEAc$66RpU1D|- ztsSECv96n`E$E;pvA&zFEk%Fn1DAfLwxEIEflmg;wFM2t^ZsOD zTw9LI<o^atO(7xEHR&Yeh@1;5t?yXlK)fB4+j052uS(5)J=H^6b#$`$VXXoZcXvSqp{^#aq zMQFxlN&aW&W<_YmWl8?$=jKFc#$`$VfACoWC0001NP)t-sz`($@ zYi7m3wyB|wqgqeagMP?)bnNNjylrRDdv@E{&zFyQwryw0dv?}^fV#Azi-viGOGMbz z$hx+wt!7}zZfK*QlEi9dgiJ+hYHFF8nQ?J(|NsBMz`*$U_}|~(q@<*YiHWi?^C?`dUi!&v& zs2IpMj+V6mFySRa> zz6!)npdJPGqrha!M_)00kFnr)pxrYDZUp##H`7;%e%Kbv??9G7(%|J1vIhKM(SCmi zK+z>t{FCsYaD(c=^~1d|VE7%F5vZ&I4aRcqs(m_a4o@xD2Kpvl0eEJA;Ar3o=E(Nx z`$zWY$NnMJZ;AP9mW2!ik*fLjXj>&b5sezlZg*V5l%V-1D))wW<~ z9)F{;?Ro|%IZ}kzs~tf{!3mq~dPlJL1^~9rS_WtbeDZ|EtF&d=Q+W5EX#@RB7(dti z@X|+S7tvj^Y4Q&AFRv4|(bMbQ4xWK70X>e=2HeRzaGwk~uYYoPZvhy(g_yj9y>o9v zHN3eSwODO2diUCCR z;k>^XnAVo#d_MQ|KU)(7K@bE%5QGW;C_;Z#T$bej#N3<+&A2Sd|Lokn2+g=G z$^YEktO(7xEXn`u+^h)AxGc&4{M?)f&A2Sd|98GCU|g2ue|c9R2!bF8f*=TjAP9m` Z#$U+~N`7zaVB7!z002ovPDHLkV1j)?3$*|M literal 0 HcmV?d00001 diff --git a/icons/clothing/under/pjs_blue.dmi b/icons/clothing/under/pjs_blue.dmi deleted file mode 100644 index 2f00d10ff3885d2078ac8dd14cc8ac8bb2c7038f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1137 zcmV-%1djWOP)C0001NP)t-sz`($F zlDWmewyB|wXMUfLuH1y8&g|*oc$2$^q|w{h&zFyQc#^q>qt1}8+`6=)i-vhrXM)(& z$hx+wqo0y-im!5uuXmQjR%n81YHFF8nQ?J(|NsBMz`*$U_}|~(q@<*YiHWi?^C?`dUi!&v& zs2IpM`$s&bFb^0^0O;5r3x~>4X8Gz9s1rTOt0e1*CImcN4 z07y>(thLTpxJ&!%D}%%gwAIv)d(@9Vbz%VZnGwLG>H(nk4r>Gk05<;&QWFFSn{Wsl z0MkVRLv@S*NOhB10%sAhww?p97XzCBph*RTeK1hd5r9M840TNIq75rx>wOwP>5D;X z2lQZY7z`#uKI(?42RRR61?mF>aAm;P_cL{qsmEpU{0b~G$O4WhAqx;1kDglrxEL@u z5)Fn(*8<<{iCU7Bu)9ok^(47K7_X(g2{-^Hd zB>+cfA!g6Pw(H({)xULDZmGU+ilQ6;eql6w@4CLDw$1jf2B6wDnzijr-)aD=?a8cf zXZzLy=+Ax7xu5A<5#UeI7l3KsHjX;Tl&oQi9{liNF)-8L=*j| z2>pHkMG=~zEP+qGKZrd`A~Zu;lK)fh4+j4w5t_n(in1jCr`{h7{R<*=pgf%>lqLC} zAG;(%N6KzOS(5)VW0yo|hO#98vtyS%Hx7e#1>vLyfWW0yo| zhO#98-}tV8p)AS&@~%K65{X12kw_#Gi9{lis7!wWX%tZaLC0001QP)t-sz`($@ zYi7m3wyB|wqgqeagMP?)bnNNjylrRDdv@E{&zFyQwryw0dv?}^fV#Azi-viGOGMbz z$hx+wqo0zkW?;x}Xsu{r#A;=POhsyHYMGgtadC0~|Np?i!1(z1-{0S)q@;<7iMzYI zz`(%Ek~#hW0004WQchCV=-0C=2JR&a84_w-Y6 z@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>i zGbOXA7|1u|;!G<_%uR)`;i@u9a})FOGgB0j@>42xi*xcz;>+Vp^D@)&i*gZ~O^DW< z6Q7ZomqL!tBD^}46e!MEM33>G{W*r2Y=-wpBIAovf*=UOatbIeEmME`@x<5f6@U$B zx@fvGb+dsYw2T0huti>fMxdY@quyyGiI_#I(?^Fk{s`7pRSCFF7#Ia&2KUyYSbQO)C0aMj+ z1FE=0#F~rcJ8(H{n6!2K9lfhud1P+zd1qfrhz(vtWQ$k`t(24x7VE#nzotv<2Xm zGk}eS1}t4U0aG>p4y=Hw4)inQ>Z(NAgO)8@dPmR%(MGkb0p~^d8NfGqL$)3)TEkXV z)7U0_c>${|FECf1H86)502c%jzk;<5&=&Q-W7fb-eHY`gBGSN%tKr55YE5sGg7`NAmnr|bHT+BVs@ngP|eL9A_O`c^Zb z+MdMvcD8RV1O2)8oco!+6%G9Ld^0fZyOCtPAH~9Ye={)cTaWYk+|qZpPY?t_5ClOG zCj6%eeY^gm2+g?6F&{fW2t7+8G~+TS|HsY`2K^-wn!^c1eV0T;}9|cI>hU&A80T|J>L`5t?zClmFSViy}1RGAIA@ zW0yo|#$`_azw@ksaha3<<*Yyu1VIo4K@bE%5CkEQe|;fSgxAyrKL7v#07*qoM6N<$ Ef-B7(;s5{u diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index 01b0a5d20d..f3c3c34d4e 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -3293,7 +3293,8 @@ /turf/floor/tiled/airless, /area/slavers_base/demo) "jb" = ( -/obj/item/clothing/under/pj/blue, +/obj/item/clothing/pants/pj/blue, +/obj/item/clothing/shirt/pj/blue, /obj/effect/decal/cleanable/dirt, /turf/floor/tiled/airless, /area/slavers_base/demo) diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 02c008e0cc..c5da6e6c58 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -2501,7 +2501,8 @@ /obj/effect/decal/cleanable/blood, /obj/item/remains, /obj/random/shoes, -/obj/item/clothing/under/pj/blue, +/obj/item/clothing/pants/pj/blue, +/obj/item/clothing/shirt/pj/blue, /turf/floor/tiled/techfloor, /area/unishi/smresearch) "gN" = ( diff --git a/nebula.dme b/nebula.dme index e0b7c2ec2f..a30473d00e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1978,6 +1978,7 @@ #include "code\modules\clothing\neck\ties.dm" #include "code\modules\clothing\pants\_pants.dm" #include "code\modules\clothing\pants\misc.dm" +#include "code\modules\clothing\pants\pajamas.dm" #include "code\modules\clothing\pants\pants_casual.dm" #include "code\modules\clothing\pants\pants_formal.dm" #include "code\modules\clothing\pants\shorts.dm" @@ -1989,6 +1990,7 @@ #include "code\modules\clothing\shirts\flannel.dm" #include "code\modules\clothing\shirts\hawaii.dm" #include "code\modules\clothing\shirts\misc.dm" +#include "code\modules\clothing\shirts\pajamas.dm" #include "code\modules\clothing\shirts\toga.dm" #include "code\modules\clothing\shirts\tunics.dm" #include "code\modules\clothing\shirts\ubac.dm" From 8312f333c530d4c38056097de3a5167d7d7ded17 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 17:15:45 +1000 Subject: [PATCH 183/212] Converted many jumpsuits and scrubs. --- code/datums/outfits/jobs/generic.dm | 6 +- code/datums/outfits/jobs/job.dm | 2 +- code/datums/outfits/misc.dm | 2 +- code/datums/outfits/tournament.dm | 6 +- code/datums/outfits/wizardry.dm | 2 +- code/datums/supplypacks/medical.dm | 42 ++-- code/datums/supplypacks/nonessent.dm | 4 +- code/datums/supplypacks/science.dm | 2 +- code/datums/supplypacks/security.dm | 2 +- code/datums/trading/traders/goods.dm | 4 +- code/game/antagonist/outsider/ninja.dm | 2 +- .../wizard/servant_items/caretaker.dm | 6 - code/game/objects/random/subtypes/clothing.dm | 8 +- .../objects/random/subtypes/maintenance.dm | 4 +- .../crates_lockers/closets/job_closets.dm | 2 +- .../crates_lockers/closets/secure/cargo.dm | 4 +- .../closets/secure/engineering.dm | 2 +- .../closets/secure/hydroponics.dm | 2 +- .../crates_lockers/closets/secure/medical.dm | 36 +-- .../closets/secure/scientist.dm | 4 +- .../crates_lockers/closets/secure/security.dm | 14 +- .../crates_lockers/closets/secure/service.dm | 2 +- .../crates_lockers/closets/utility_closets.dm | 4 +- .../crates_lockers/closets/wardrobe.dm | 63 ++--- code/modules/admin/quantum_mechanic.dm | 6 +- .../loadout/lists/uniforms.dm | 6 +- code/modules/clothing/jumpsuits/_jumpsuit.dm | 22 ++ code/modules/clothing/jumpsuits/color.dm | 60 +++++ code/modules/clothing/jumpsuits/job.dm | 221 ++++++++++++++++++ code/modules/clothing/jumpsuits/misc.dm | 24 ++ code/modules/clothing/jumpsuits/role.dm | 5 + code/modules/clothing/pants/scrubs.dm | 46 ++++ code/modules/clothing/shirts/scrubs.dm | 36 +++ code/modules/clothing/under/color.dm | 80 ------- code/modules/clothing/under/jobs/civilian.dm | 49 +--- .../clothing/under/jobs/engineering.dm | 27 +-- code/modules/clothing/under/jobs/medsci.dm | 115 +-------- code/modules/clothing/under/jobs/security.dm | 56 +---- code/modules/clothing/under/miscellaneous.dm | 46 +--- .../fabrication/designs/textile/_textile.dm | 2 +- .../fabrication/designs/textile/job.dm | 97 +++++--- code/modules/mining/mine_items.dm | 2 +- code/modules/mob/living/carbon/human/npcs.dm | 4 +- code/modules/species/station/human.dm | 2 +- .../spells/artifacts/spellbound_servants.dm | 4 +- code/modules/spells/general/toggle_armor.dm | 2 +- code/modules/xenoarcheaology/tools/misc.dm | 2 +- icons/clothing/pants/scrubs.dmi | Bin 0 -> 797 bytes icons/clothing/shirts/scrubs.dmi | Bin 0 -> 900 bytes icons/clothing/under/uniform_scrubs.dmi | Bin 1047 -> 0 bytes maps/antag_spawn/ert/ert_base.dmm | 6 +- maps/antag_spawn/heist/heist_base.dmm | 5 +- maps/antag_spawn/heist/heist_outfit.dm | 4 +- maps/away/errant_pisces/errant_pisces.dm | 2 +- maps/away/errant_pisces/errant_pisces.dmm | 17 +- maps/away/liberia/liberia.dmm | 4 +- maps/away/magshield/magshield.dmm | 2 +- maps/away/slavers/slavers_base.dm | 8 +- maps/away/unishi/unishi-2.dmm | 2 +- maps/away/unishi/unishi_jobs.dm | 2 +- maps/exodus/exodus-2.dmm | 20 +- maps/exodus/exodus-admin.dmm | 12 +- maps/exodus/outfits/cargo.dm | 6 +- maps/exodus/outfits/civilian.dm | 6 +- maps/exodus/outfits/command.dm | 4 +- maps/exodus/outfits/engineering.dm | 6 +- maps/exodus/outfits/medical.dm | 15 +- maps/exodus/outfits/science.dm | 6 +- maps/exodus/outfits/security.dm | 6 +- maps/ministation/ministation-0.dmm | 22 +- maps/ministation/ministation-1.dmm | 14 +- maps/ministation/ministation_antagonists.dm | 2 +- maps/ministation/outfits/civilian.dm | 4 +- maps/ministation/outfits/command.dm | 4 +- maps/ministation/outfits/engineering.dm | 4 +- maps/ministation/outfits/medical.dm | 2 +- maps/ministation/outfits/science.dm | 2 +- maps/ministation/outfits/security.dm | 4 +- .../crashed_pod/crashed_pod.dmm | 24 +- .../datacapsule/datacapsule.dm | 2 +- .../exoplanet_ruins/lodge/lodge.dmm | 2 +- .../exoplanet_ruins/playablecolony/colony.dmm | 30 +-- maps/tradeship/outfits/_outfits.dm | 8 +- maps/tradeship/outfits/engineering.dm | 2 +- maps/~mapsystem/maps_antagonism.dm | 12 +- mods/content/corporate/_corporate.dme | 1 + .../away_sites/lar_maria/lar_maria-1.dmm | 14 +- .../away_sites/lar_maria/lar_maria-2.dmm | 6 +- .../away_sites/lar_maria/lar_maria.dm | 8 +- .../corporate/clothing/under/jumpsuits.dm | 19 ++ .../corporate/clothing/under/security.dm | 6 +- .../corporate/clothing/under/uniforms.dm | 20 -- .../corporate/datum/antagonists/deathsquad.dm | 2 +- mods/content/corporate/datum/loadout.dm | 8 +- mods/content/corporate/structures/lockers.dm | 6 +- mods/content/dungeon_loot/subtypes/maint.dm | 4 +- .../government/away_sites/icarus/icarus-1.dmm | 2 +- nebula.dme | 8 +- 98 files changed, 806 insertions(+), 708 deletions(-) create mode 100644 code/modules/clothing/jumpsuits/_jumpsuit.dm create mode 100644 code/modules/clothing/jumpsuits/color.dm create mode 100644 code/modules/clothing/jumpsuits/job.dm create mode 100644 code/modules/clothing/jumpsuits/misc.dm create mode 100644 code/modules/clothing/jumpsuits/role.dm create mode 100644 code/modules/clothing/pants/scrubs.dm create mode 100644 code/modules/clothing/shirts/scrubs.dm delete mode 100644 code/modules/clothing/under/color.dm create mode 100644 icons/clothing/pants/scrubs.dmi create mode 100644 icons/clothing/shirts/scrubs.dmi delete mode 100644 icons/clothing/under/uniform_scrubs.dmi create mode 100644 mods/content/corporate/clothing/under/jumpsuits.dm diff --git a/code/datums/outfits/jobs/generic.dm b/code/datums/outfits/jobs/generic.dm index 9be7e3c041..8c2766d04b 100644 --- a/code/datums/outfits/jobs/generic.dm +++ b/code/datums/outfits/jobs/generic.dm @@ -11,12 +11,12 @@ suit = /obj/item/clothing/suit/toggle/labcoat/science shoes = /obj/item/clothing/shoes/color/white pda_type = /obj/item/modular_computer/pda/science - uniform = /obj/item/clothing/under/color/white + uniform = /obj/item/clothing/jumpsuit/white /decl/hierarchy/outfit/job/generic/engineer name = "Job - Default Engineer" head = /obj/item/clothing/head/hardhat - uniform = /obj/item/clothing/under/engineer + uniform = /obj/item/clothing/jumpsuit/engineer r_pocket = /obj/item/t_scanner belt = /obj/item/belt/utility/full l_ear = /obj/item/radio/headset/headset_eng @@ -31,7 +31,7 @@ /decl/hierarchy/outfit/job/generic/doctor name = "Job - Default Doctor" - uniform = /obj/item/clothing/under/medical + uniform = /obj/item/clothing/jumpsuit/medical suit = /obj/item/clothing/suit/toggle/labcoat hands = list(/obj/item/firstaid/adv) r_pocket = /obj/item/flashlight/pen diff --git a/code/datums/outfits/jobs/job.dm b/code/datums/outfits/jobs/job.dm index 80311b8a23..0120a3f5b6 100644 --- a/code/datums/outfits/jobs/job.dm +++ b/code/datums/outfits/jobs/job.dm @@ -2,7 +2,7 @@ name = "Standard Gear" abstract_type = /decl/hierarchy/outfit/job - uniform = /obj/item/clothing/under/color/grey + uniform = /obj/item/clothing/jumpsuit/grey l_ear = /obj/item/radio/headset shoes = /obj/item/clothing/shoes/color/black diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index b8ed828604..af13c63d40 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -3,7 +3,7 @@ shoes = /obj/item/clothing/shoes/color/black head = /obj/item/clothing/head/helmet/space suit = /obj/item/clothing/suit/space - uniform = /obj/item/clothing/under/color/grey + uniform = /obj/item/clothing/jumpsuit/grey back = /obj/item/tank/jetpack/oxygen mask = /obj/item/clothing/mask/breath outfit_flags = OUTFIT_HAS_JETPACK|OUTFIT_RESET_EQUIPMENT diff --git a/code/datums/outfits/tournament.dm b/code/datums/outfits/tournament.dm index 82fb87a665..998393a073 100644 --- a/code/datums/outfits/tournament.dm +++ b/code/datums/outfits/tournament.dm @@ -11,11 +11,11 @@ /decl/hierarchy/outfit/tournament_gear/red name = "Tournament - Red" - uniform = /obj/item/clothing/under/color/red + uniform = /obj/item/clothing/jumpsuit/red /decl/hierarchy/outfit/tournament_gear/green name = "Tournament gear - Green" - uniform = /obj/item/clothing/under/color/green + uniform = /obj/item/clothing/jumpsuit/green /decl/hierarchy/outfit/tournament_gear/gangster name = "Tournament gear - Gangster" @@ -43,7 +43,7 @@ /decl/hierarchy/outfit/tournament_gear/janitor name = "Tournament gear - Janitor" - uniform = /obj/item/clothing/under/janitor + uniform = /obj/item/clothing/jumpsuit/janitor back = /obj/item/backpack hands = list( /obj/item/mop, diff --git a/code/datums/outfits/wizardry.dm b/code/datums/outfits/wizardry.dm index 4414261774..a8a22fbcae 100644 --- a/code/datums/outfits/wizardry.dm +++ b/code/datums/outfits/wizardry.dm @@ -1,5 +1,5 @@ /decl/hierarchy/outfit/wizard - uniform = /obj/item/clothing/under/color/lightpurple + uniform = /obj/item/clothing/jumpsuit/lightpurple shoes = /obj/item/clothing/shoes/sandal l_ear = /obj/item/radio/headset r_pocket = /obj/item/teleportation_scroll diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 9f3ecd35a8..1a2df6f693 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -101,7 +101,7 @@ name = "Gear - Chief medical officer equipment" contains = list(/obj/item/belt/medical, /obj/item/radio/headset/heads/cmo, - /obj/item/clothing/under/chief_medical_officer, + /obj/item/clothing/jumpsuit/chief_medical_officer, /obj/item/chems/hypospray/vial, /obj/item/clothing/neck/stethoscope, /obj/item/clothing/glasses/hud/health, @@ -122,7 +122,7 @@ name = "Gear - Medical Doctor equipment" contains = list(/obj/item/belt/medical, /obj/item/radio/headset/headset_med, - /obj/item/clothing/under/medical, + /obj/item/clothing/jumpsuit/medical, /obj/item/clothing/neck/stethoscope, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/suit/toggle/labcoat, @@ -143,7 +143,7 @@ contains = list(/obj/item/box/beakers, /obj/item/radio/headset/headset_med, /obj/item/box/autoinjectors, - /obj/item/clothing/under/chemist, + /obj/item/clothing/jumpsuit/chemist, /obj/item/clothing/glasses/science, /obj/item/clothing/suit/toggle/labcoat/chemist, /obj/item/clothing/mask/surgical, @@ -162,14 +162,15 @@ name = "Gear - Paramedic equipment" contains = list(/obj/item/belt/medical/emt, /obj/item/radio/headset/headset_med, - /obj/item/clothing/under/medical/scrubs/black, + /obj/item/clothing/pants/scrubs/black, + /obj/item/clothing/shirt/scrubs/black, /obj/item/clothing/armband/medgreen, /obj/item/clothing/glasses/hud/health, /obj/item/clothing/suit/toggle/labcoat, - /obj/item/clothing/under/medical, + /obj/item/clothing/jumpsuit/medical, /obj/item/clothing/suit/jacket/first_responder, /obj/item/clothing/mask/gas, - /obj/item/clothing/under/medical/paramedic, + /obj/item/clothing/jumpsuit/medical/paramedic, /obj/item/clothing/neck/stethoscope, /obj/item/firstaid/adv, /obj/item/clothing/shoes/jackboots, @@ -185,9 +186,9 @@ /decl/hierarchy/supply_pack/medical/psychiatristgear name = "Gear - Psychiatrist equipment" - contains = list(/obj/item/clothing/under/psych, + contains = list(/obj/item/clothing/jumpsuit/psych, /obj/item/radio/headset/headset_med, - /obj/item/clothing/under/psych/turtleneck, + /obj/item/clothing/jumpsuit/psych/turtleneck, /obj/item/clothing/shoes/dress, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, @@ -201,10 +202,14 @@ /decl/hierarchy/supply_pack/medical/medicalscrubs name = "Gear - Medical scrubs" contains = list(/obj/item/clothing/shoes/color/white = 4, - /obj/item/clothing/under/medical/scrubs/blue, - /obj/item/clothing/under/medical/scrubs/green, - /obj/item/clothing/under/medical/scrubs/purple, - /obj/item/clothing/under/medical/scrubs/black, + /obj/item/clothing/pants/scrubs/blue, + /obj/item/clothing/pants/scrubs/green, + /obj/item/clothing/pants/scrubs/purple, + /obj/item/clothing/pants/scrubs/black, + /obj/item/clothing/shirt/scrubs/blue, + /obj/item/clothing/shirt/scrubs/green, + /obj/item/clothing/shirt/scrubs/purple, + /obj/item/clothing/shirt/scrubs/black, /obj/item/clothing/head/surgery/black, /obj/item/clothing/head/surgery/purple, /obj/item/clothing/head/surgery/blue, @@ -232,13 +237,13 @@ /decl/hierarchy/supply_pack/medical/medicaluniforms name = "Gear - Medical uniforms" contains = list(/obj/item/clothing/shoes/color/white = 3, - /obj/item/clothing/under/chief_medical_officer, - /obj/item/clothing/under/geneticist, - /obj/item/clothing/under/virologist, + /obj/item/clothing/jumpsuit/chief_medical_officer, + /obj/item/clothing/jumpsuit/geneticist, + /obj/item/clothing/jumpsuit/virologist, /obj/item/clothing/dress/nurse = 2, /obj/item/clothing/under/orderly, - /obj/item/clothing/under/medical = 3, - /obj/item/clothing/under/medical/paramedic = 3, + /obj/item/clothing/jumpsuit/medical = 3, + /obj/item/clothing/jumpsuit/medical/paramedic = 3, /obj/item/clothing/suit/toggle/labcoat = 3, /obj/item/clothing/suit/toggle/labcoat/cmo, /obj/item/clothing/suit/toggle/labcoat/cmoalt, @@ -290,7 +295,8 @@ /decl/hierarchy/supply_pack/medical/sterile name = "Gear - Sterile clothes" - contains = list(/obj/item/clothing/under/medical/scrubs/green = 2, + contains = list(/obj/item/clothing/pants/scrubs/green = 2, + /obj/item/clothing/shirt/scrubs/green = 2, /obj/item/clothing/head/surgery/green = 2, /obj/item/box/masks, /obj/item/box/gloves, diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 5645e9bd10..a1a8232078 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -92,7 +92,7 @@ /obj/item/clothing/under/gimmick/rank/captain/suit, /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit, /obj/item/clothing/under/lawyer/purpsuit, - /obj/item/clothing/under/mailman, + /obj/item/clothing/jumpsuit/mailman, /obj/item/clothing/dress/saloon, /obj/item/clothing/suspenders, /obj/item/clothing/suit/toggle/labcoat/mad, @@ -221,7 +221,7 @@ /decl/hierarchy/supply_pack/nonessent/chaplaingear name = "Costume - Chaplain" - contains = list(/obj/item/clothing/under/chaplain, + contains = list(/obj/item/clothing/jumpsuit/chaplain, /obj/item/clothing/shoes/color/black, /obj/item/clothing/suit/nun, /obj/item/clothing/head/nun_hood, diff --git a/code/datums/supplypacks/science.dm b/code/datums/supplypacks/science.dm index c416da41df..f7d7f99910 100644 --- a/code/datums/supplypacks/science.dm +++ b/code/datums/supplypacks/science.dm @@ -39,7 +39,7 @@ contains = list(/obj/item/backpack/industrial, /obj/item/backpack/satchel/eng, /obj/item/radio/headset/headset_cargo, - /obj/item/clothing/under/miner, + /obj/item/clothing/jumpsuit/miner, /obj/item/clothing/gloves/thick, /obj/item/clothing/shoes/color/black, /obj/item/scanner/gas, diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 354578665e..ca7486c81a 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -27,7 +27,7 @@ /decl/hierarchy/supply_pack/security/tacticalarmor name = "Armor - Tactical" - contains = list(/obj/item/clothing/under/tactical, + contains = list(/obj/item/clothing/jumpsuit/tactical, /obj/item/clothing/suit/armor/pcarrier/tactical, /obj/item/clothing/head/helmet/tactical, /obj/item/clothing/mask/balaclava/tactical, diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index e1ca26ee88..0b4c00dc7a 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -140,12 +140,12 @@ /obj/item/clothing/dress/wedding = TRADER_BLACKLIST, /obj/item/clothing/under = TRADER_SUBTYPES_ONLY, /obj/item/clothing/under/chameleon = TRADER_BLACKLIST, - /obj/item/clothing/under/color = TRADER_BLACKLIST, + /obj/item/clothing/jumpsuit = TRADER_BLACKLIST, /obj/item/clothing/under/gimmick = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/lawyer = TRADER_BLACKLIST, /obj/item/clothing/under/mankini = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/syndicate = TRADER_BLACKLIST_ALL, - /obj/item/clothing/under/tactical = TRADER_BLACKLIST, + /obj/item/clothing/jumpsuit/tactical = TRADER_BLACKLIST, /obj/item/clothing/under/waiter/monke = TRADER_BLACKLIST ) diff --git a/code/game/antagonist/outsider/ninja.dm b/code/game/antagonist/outsider/ninja.dm index a11cfa5ae1..74b041352d 100644 --- a/code/game/antagonist/outsider/ninja.dm +++ b/code/game/antagonist/outsider/ninja.dm @@ -93,7 +93,7 @@ /decl/hierarchy/outfit/ninja name = "Special Role - Ninja" l_ear = /obj/item/radio/headset - uniform = /obj/item/clothing/under/color/black + uniform = /obj/item/clothing/jumpsuit/black belt = /obj/item/flashlight hands = list(/obj/item/modular_computer/pda/ninja) id_type = /obj/item/card/id/syndicate diff --git a/code/game/gamemodes/wizard/servant_items/caretaker.dm b/code/game/gamemodes/wizard/servant_items/caretaker.dm index 5191c84d2c..cde9e13c47 100644 --- a/code/game/gamemodes/wizard/servant_items/caretaker.dm +++ b/code/game/gamemodes/wizard/servant_items/caretaker.dm @@ -24,12 +24,6 @@ ARMOR_RAD = ARMOR_RAD_SHIELDED ) -/obj/item/clothing/under/caretaker - name = "caretaker's jumpsuit" - desc = "A holy jumpsuit. Treat it well." - icon = 'icons/clothing/under/caretaker.dmi' - bodytype_equip_flags = BODY_FLAG_HUMANOID - /obj/item/clothing/shoes/dress/caretakershoes name = "black leather shoes" desc = "Dress shoes. These aren't as shiny as usual." diff --git a/code/game/objects/random/subtypes/clothing.dm b/code/game/objects/random/subtypes/clothing.dm index bfb6364653..317788bdfe 100644 --- a/code/game/objects/random/subtypes/clothing.dm +++ b/code/game/objects/random/subtypes/clothing.dm @@ -156,15 +156,15 @@ var/static/list/spawnable_choices = list( /obj/item/clothing/under/syndicate/tacticool = 2, /obj/item/clothing/under/syndicate/combat = 1, - /obj/item/clothing/under/hazard = 4, - /obj/item/clothing/under/sterile = 4, + /obj/item/clothing/jumpsuit/hazard = 4, + /obj/item/clothing/jumpsuit/sterile = 4, /obj/item/clothing/pants/casual/camo = 2, /obj/item/clothing/under/frontier = 2, /obj/item/clothing/under/harness = 2, - /obj/item/clothing/under/medical/paramedic = 2, + /obj/item/clothing/jumpsuit/medical/paramedic = 2, /obj/item/clothing/under/overalls = 2, /obj/item/clothing/head/earmuffs = 2, - /obj/item/clothing/under/tactical = 1 + /obj/item/clothing/jumpsuit/tactical = 1 ) return spawnable_choices diff --git a/code/game/objects/random/subtypes/maintenance.dm b/code/game/objects/random/subtypes/maintenance.dm index 70817ec994..b5a7a5dc72 100644 --- a/code/game/objects/random/subtypes/maintenance.dm +++ b/code/game/objects/random/subtypes/maintenance.dm @@ -68,7 +68,7 @@ something, make sure it's not in one of the other lists.*/ /obj/item/clothing/glasses/science = 4, /obj/item/clothing/suit/toggle/labcoat = 4, /obj/item/clothing/suit/toggle/labcoat/science = 4, - /obj/item/clothing/under/color/white = 4, + /obj/item/clothing/jumpsuit/white = 4, /obj/item/clothing/glasses/material = 3, /obj/item/scanner/plant = 3, /obj/item/box/beakers = 3, @@ -185,7 +185,7 @@ something, make sure it's not in one of the other lists.*/ /obj/item/clothing/gloves/latex/nitrile = 2, /obj/item/belt/medical/emt = 2, /obj/item/belt/medical = 2, - /obj/item/clothing/under/medical/paramedic = 2, + /obj/item/clothing/jumpsuit/medical/paramedic = 2, /obj/item/clothing/webbing/vest/black = 2, /obj/item/clothing/webbing/vest = 2, /obj/item/clothing/neck/stethoscope = 2, diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index e2438aa3fa..1c63021688 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -56,7 +56,7 @@ /obj/structure/closet/jcloset/WillContain() return list( - /obj/item/clothing/under/janitor, + /obj/item/clothing/jumpsuit/janitor, /obj/item/radio/headset/headset_service, /obj/item/clothing/gloves/thick, /obj/item/clothing/head/soft/purple, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 08f883a462..77b5a65f63 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -7,7 +7,7 @@ return list( new/datum/atom_creator/weighted(list(/obj/item/backpack = 75, /obj/item/backpack/satchel/grey = 25)), new/datum/atom_creator/simple(/obj/item/backpack/dufflebag, 25), - /obj/item/clothing/under/cargotech, + /obj/item/clothing/jumpsuit/cargotech, /obj/item/clothing/shoes/color/black, /obj/item/radio/headset/headset_cargo, /obj/item/clothing/gloves/thick, @@ -24,7 +24,7 @@ return list( new/datum/atom_creator/weighted(list(/obj/item/backpack = 75, /obj/item/backpack/satchel/grey = 25)), new/datum/atom_creator/simple(/obj/item/backpack/dufflebag, 25), - /obj/item/clothing/under/cargotech, + /obj/item/clothing/jumpsuit/cargotech, /obj/item/clothing/shoes/color/brown, /obj/item/radio/headset/headset_cargo, /obj/item/clothing/gloves/thick, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 61381206fc..afd5a3a3b9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -15,7 +15,7 @@ )), new/datum/atom_creator/simple(/obj/item/backpack/dufflebag/eng, 50), /obj/item/blueprints, - /obj/item/clothing/under/chief_engineer, + /obj/item/clothing/jumpsuit/chief_engineer, /obj/item/clothing/head/welding, /obj/item/clothing/gloves/insulated, /obj/item/clothing/shoes/color/brown, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm index 057608a9af..f8a63b9501 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm @@ -7,7 +7,7 @@ return list( new /datum/atom_creator/weighted(list(/obj/item/clothing/suit/apron, /obj/item/clothing/suit/apron/overalls)), /obj/item/plants, - /obj/item/clothing/under/hydroponics, + /obj/item/clothing/jumpsuit/hydroponics, /obj/item/scanner/plant, /obj/item/radio/headset/headset_service, /obj/item/clothing/mask/bandana/botany, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a9a8eb08fc..61242e8488 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -1,14 +1,14 @@ -#define RANDOM_SCRUBS new/datum/atom_creator/weighted(list( \ - list(/obj/item/clothing/under/medical/scrubs, /obj/item/clothing/head/surgery), \ - list(/obj/item/clothing/under/medical/scrubs/blue, /obj/item/clothing/head/surgery/blue), \ - list(/obj/item/clothing/under/medical/scrubs/green, /obj/item/clothing/head/surgery/green), \ - list(/obj/item/clothing/under/medical/scrubs/purple, /obj/item/clothing/head/surgery/purple), \ - list(/obj/item/clothing/under/medical/scrubs/black, /obj/item/clothing/head/surgery/black), \ - list(/obj/item/clothing/under/medical/scrubs/lilac, /obj/item/clothing/head/surgery/lilac), \ - list(/obj/item/clothing/under/medical/scrubs/teal, /obj/item/clothing/head/surgery/teal), \ - list(/obj/item/clothing/under/medical/scrubs/heliodor, /obj/item/clothing/head/surgery/heliodor), \ - list(/obj/item/clothing/under/medical/scrubs/navyblue, /obj/item/clothing/head/surgery/navyblue)\ - ) \ +#define RANDOM_SCRUBS new/datum/atom_creator/weighted(list( \ + list(/obj/item/clothing/shirt/scrubs, /obj/item/clothing/pants/scrubs, /obj/item/clothing/head/surgery), \ + list(/obj/item/clothing/shirt/scrubs/blue, /obj/item/clothing/pants/scrubs/blue, /obj/item/clothing/head/surgery/blue), \ + list(/obj/item/clothing/shirt/scrubs/green, /obj/item/clothing/pants/scrubs/green, /obj/item/clothing/head/surgery/green), \ + list(/obj/item/clothing/shirt/scrubs/purple, /obj/item/clothing/pants/scrubs/purple, /obj/item/clothing/head/surgery/purple), \ + list(/obj/item/clothing/shirt/scrubs/black, /obj/item/clothing/pants/scrubs/black, /obj/item/clothing/head/surgery/black), \ + list(/obj/item/clothing/shirt/scrubs/lilac, /obj/item/clothing/pants/scrubs/lilac, /obj/item/clothing/head/surgery/lilac), \ + list(/obj/item/clothing/shirt/scrubs/teal, /obj/item/clothing/pants/scrubs/teal, /obj/item/clothing/head/surgery/teal), \ + list(/obj/item/clothing/shirt/scrubs/heliodor, /obj/item/clothing/pants/scrubs/heliodor, /obj/item/clothing/head/surgery/heliodor), \ + list(/obj/item/clothing/shirt/scrubs/navyblue, /obj/item/clothing/pants/scrubs/navyblue, /obj/item/clothing/head/surgery/navyblue) \ + ) \ ) /obj/structure/closet/secure_closet/medical1 @@ -40,7 +40,7 @@ new/datum/atom_creator/weighted(list(/obj/item/backpack/medic, /obj/item/backpack/satchel/med)), new/datum/atom_creator/simple(/obj/item/backpack/dufflebag/med, 50), /obj/item/clothing/head/nursehat, - /obj/item/clothing/under/medical, + /obj/item/clothing/jumpsuit/medical, /obj/item/clothing/dress/nurse = 2, /obj/item/clothing/under/orderly, /obj/item/clothing/suit/toggle/labcoat, @@ -95,7 +95,7 @@ /obj/item/clothing/suit/bio_suit/cmo, /obj/item/clothing/head/bio_hood/cmo, /obj/item/clothing/shoes/color/white, - /obj/item/clothing/under/chief_medical_officer, + /obj/item/clothing/jumpsuit/chief_medical_officer, /obj/item/clothing/suit/toggle/labcoat/cmo, /obj/item/clothing/suit/toggle/labcoat/cmoalt, /obj/item/clothing/gloves/latex, @@ -151,8 +151,8 @@ /obj/structure/closet/secure_closet/counselor/WillContain() return list( - /obj/item/clothing/under/psych, - /obj/item/clothing/under/psych/turtleneck, + /obj/item/clothing/jumpsuit/psych, + /obj/item/clothing/jumpsuit/psych/turtleneck, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, /obj/item/chems/glass/bottle/sedatives, @@ -186,7 +186,7 @@ /obj/item/chems/glass/bottle/antitoxin, /obj/item/box/masks, /obj/item/box/gloves, - /obj/item/clothing/under/virologist, + /obj/item/clothing/jumpsuit/virologist, /obj/item/clothing/shoes/color/white, /obj/item/clothing/suit/toggle/labcoat/virologist, /obj/item/clothing/mask/surgical, @@ -208,6 +208,6 @@ /obj/item/chems/syringe, /obj/item/pill_bottle/antidepressants, /obj/item/pill_bottle/stimulants, - /obj/item/clothing/under/psych/turtleneck, - /obj/item/clothing/under/psych + /obj/item/clothing/jumpsuit/psych/turtleneck, + /obj/item/clothing/jumpsuit/psych ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 9bff295aa3..71969ecf0c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -5,7 +5,7 @@ /obj/structure/closet/secure_closet/scientist/WillContain() return list( - /obj/item/clothing/under/color/white, + /obj/item/clothing/jumpsuit/white, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, /obj/item/radio/headset/headset_sci, @@ -20,7 +20,7 @@ /obj/structure/closet/secure_closet/xenobio/WillContain() return list( - /obj/item/clothing/under/color/white, + /obj/item/clothing/jumpsuit/white, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, /obj/item/radio/headset/headset_sci, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 462ac3e2a0..9b319d50dd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -10,7 +10,7 @@ /obj/item/clothing/shirt/tunic/captain, /obj/item/clothing/suit/jacket/captain, /obj/item/clothing/head/caphat/cap, - /obj/item/clothing/under/captain, + /obj/item/clothing/jumpsuit/captain, /obj/item/clothing/head/helmet, /obj/item/clothing/shoes/color/brown, /obj/item/radio/headset/heads/captain, @@ -19,7 +19,7 @@ /obj/item/telebaton, /obj/item/clothing/dress/cap, /obj/item/clothing/head/caphat/formal, - /obj/item/clothing/under/captainformal, + /obj/item/clothing/jumpsuit/captainformal, ) /obj/structure/closet/secure_closet/hop @@ -43,7 +43,7 @@ /obj/structure/closet/secure_closet/hop2/WillContain() return list( - /obj/item/clothing/under/head_of_personnel, + /obj/item/clothing/jumpsuit/head_of_personnel, /obj/item/clothing/dress/hop, /obj/item/clothing/dress/hr, /obj/item/clothing/under/lawyer/female, @@ -54,7 +54,7 @@ /obj/item/clothing/shoes/color/black, /obj/item/clothing/shoes/craftable, /obj/item/clothing/shoes/color/white, - /obj/item/clothing/under/head_of_personnel_whimsy, + /obj/item/clothing/jumpsuit/head_of_personnel_whimsy, /obj/item/clothing/head/caphat/hop ) @@ -68,7 +68,7 @@ new/datum/atom_creator/weighted(list(/obj/item/backpack/security, /obj/item/backpack/satchel/sec)), /obj/item/clothing/head/HoS, /obj/item/clothing/suit/armor/vest/heavy/hos, - /obj/item/clothing/under/head_of_security/jensen, + /obj/item/clothing/jumpsuit/head_of_security/jensen, /obj/item/clothing/suit/armor/hos/jensen, /obj/item/clothing/suit/armor/hos, /obj/item/radio/headset/heads/hos, @@ -95,7 +95,7 @@ new/datum/atom_creator/weighted(list(/obj/item/backpack/security, /obj/item/backpack/satchel/sec)), new/datum/atom_creator/simple(/obj/item/backpack/dufflebag/sec, 50), /obj/item/clothing/suit/armor/vest/heavy/warden, - /obj/item/clothing/under/warden, + /obj/item/clothing/jumpsuit/warden, /obj/item/clothing/suit/armor/warden, /obj/item/clothing/head/warden, /obj/item/radio/headset/headset_sec, @@ -183,7 +183,7 @@ /obj/structure/closet/secure_closet/brig/WillContain() return list( - /obj/item/clothing/under/color/orange, + /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/shoes/color/orange ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/service.dm b/code/game/objects/structures/crates_lockers/closets/secure/service.dm index edf809eafe..692080eda2 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/service.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/service.dm @@ -5,7 +5,7 @@ /obj/structure/closet/secure_closet/chaplain/WillContain() return list( - /obj/item/clothing/under/chaplain, + /obj/item/clothing/jumpsuit/chaplain, /obj/item/clothing/shoes/color/black, /obj/item/clothing/suit/chaplain_hoodie, /obj/item/box/candles = 2, diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 5a4f1f707a..909998d0bc 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -111,7 +111,7 @@ /obj/structure/closet/bombcloset/WillContain() return list( /obj/item/clothing/suit/bomb_suit, - /obj/item/clothing/under/color/black, + /obj/item/clothing/jumpsuit/black, /obj/item/clothing/shoes/color/black, /obj/item/clothing/head/bomb_hood) @@ -124,7 +124,7 @@ /obj/structure/closet/bombclosetsecurity/WillContain() return list( /obj/item/clothing/suit/bomb_suit/security, - /obj/item/clothing/under/security, + /obj/item/clothing/jumpsuit/security, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/head/bomb_hood/security) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index f243a0d09d..8bc71e913a 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -9,8 +9,8 @@ /obj/structure/closet/wardrobe/red/WillContain() return list( - /obj/item/clothing/under/security = 3, - /obj/item/clothing/under/security2 = 3, + /obj/item/clothing/jumpsuit/security = 3, + /obj/item/clothing/jumpsuit/security2 = 3, /obj/item/clothing/shoes/jackboots = 3, /obj/item/clothing/head/soft/sec = 3, ) @@ -22,7 +22,7 @@ /obj/structure/closet/wardrobe/pink/WillContain() return list( - /obj/item/clothing/under/color/pink = 3, + /obj/item/clothing/jumpsuit/pink = 3, /obj/item/clothing/shoes/color/brown = 3, ) @@ -32,7 +32,7 @@ /obj/structure/closet/wardrobe/black/WillContain() return list( - /obj/item/clothing/under/color/black = 3, + /obj/item/clothing/jumpsuit/black = 3, /obj/item/clothing/shoes/color/black = 3, /obj/item/clothing/head/that = 3, /obj/item/clothing/head/soft/black = 3, @@ -46,7 +46,7 @@ /obj/structure/closet/wardrobe/chaplain_black/WillContain() return list( /obj/item/box/candles = 2, - /obj/item/clothing/under/chaplain, + /obj/item/clothing/jumpsuit/chaplain, /obj/item/clothing/shoes/color/black, /obj/item/clothing/suit/nun, /obj/item/clothing/head/nun_hood, @@ -64,7 +64,7 @@ /obj/structure/closet/wardrobe/green/WillContain() return list( - /obj/item/clothing/under/color/green = 3, + /obj/item/clothing/jumpsuit/green = 3, /obj/item/clothing/shoes/color/black = 3, ) @@ -85,7 +85,7 @@ /obj/structure/closet/wardrobe/orange/WillContain() return list( - /obj/item/clothing/under/color/orange = 3, + /obj/item/clothing/jumpsuit/orange = 3, /obj/item/clothing/shoes/color/orange = 3, /obj/item/radio/headset = 3, ) @@ -96,7 +96,7 @@ /obj/structure/closet/wardrobe/yellow/WillContain() return list( - /obj/item/clothing/under/color/yellow = 3, + /obj/item/clothing/jumpsuit/yellow = 3, /obj/item/clothing/shoes/color/orange = 3, ) @@ -106,7 +106,7 @@ /obj/structure/closet/wardrobe/atmospherics_yellow/WillContain() return list( - /obj/item/clothing/under/atmospheric_technician = 3, + /obj/item/clothing/jumpsuit/atmospheric_technician = 3, /obj/item/clothing/shoes/workboots = 3, /obj/item/clothing/head/hardhat/red = 3, ) @@ -117,7 +117,7 @@ /obj/structure/closet/wardrobe/engineering_yellow/WillContain() return list( - /obj/item/clothing/under/engineer = 3, + /obj/item/clothing/jumpsuit/engineer = 3, /obj/item/clothing/shoes/workboots = 3, /obj/item/clothing/head/hardhat = 3, ) @@ -128,7 +128,7 @@ /obj/structure/closet/wardrobe/white/WillContain() return list( - /obj/item/clothing/under/color/white = 3, + /obj/item/clothing/jumpsuit/white = 3, /obj/item/clothing/shoes/color/white = 3, ) @@ -152,7 +152,7 @@ /obj/structure/closet/wardrobe/science_white/WillContain() return list( - /obj/item/clothing/under/color/white = 3, + /obj/item/clothing/jumpsuit/white = 3, /obj/item/clothing/suit/toggle/labcoat = 3, /obj/item/clothing/shoes/color/white = 3, ) @@ -163,7 +163,7 @@ /obj/structure/closet/wardrobe/robotics_black/WillContain() return list( - /obj/item/clothing/under/roboticist = 2, + /obj/item/clothing/jumpsuit/roboticist = 2, /obj/item/clothing/suit/toggle/labcoat = 2, /obj/item/clothing/shoes/color/black = 2, /obj/item/clothing/gloves/thick = 2, @@ -175,7 +175,7 @@ /obj/structure/closet/wardrobe/chemistry_white/WillContain() return list( - /obj/item/clothing/under/chemist = 2, + /obj/item/clothing/jumpsuit/chemist = 2, /obj/item/clothing/shoes/color/white = 2, /obj/item/clothing/suit/toggle/labcoat/chemist = 2, ) @@ -186,7 +186,7 @@ /obj/structure/closet/wardrobe/genetics_white/WillContain() return list( - /obj/item/clothing/under/geneticist = 2, + /obj/item/clothing/jumpsuit/geneticist = 2, /obj/item/clothing/shoes/color/white = 2, /obj/item/clothing/suit/toggle/labcoat/genetics = 2, ) @@ -197,7 +197,7 @@ /obj/structure/closet/wardrobe/virology_white/WillContain() return list( - /obj/item/clothing/under/virologist = 2, + /obj/item/clothing/jumpsuit/virologist = 2, /obj/item/clothing/shoes/color/white = 2, /obj/item/clothing/suit/toggle/labcoat/virologist = 2, /obj/item/clothing/mask/surgical = 2, @@ -209,15 +209,20 @@ /obj/structure/closet/wardrobe/medic_white/WillContain() return list( - /obj/item/clothing/under/medical = 2, + /obj/item/clothing/jumpsuit/medical = 2, /obj/item/clothing/shoes/color/white = 3, /obj/item/clothing/suit/toggle/labcoat = 2, /obj/item/clothing/mask/surgical = 2, - /obj/item/clothing/under/medical/scrubs/blue, - /obj/item/clothing/under/medical/scrubs/green, - /obj/item/clothing/under/medical/scrubs/purple, - /obj/item/clothing/under/medical/scrubs/black, - /obj/item/clothing/under/medical/scrubs/navyblue, + /obj/item/clothing/pants/scrubs/blue, + /obj/item/clothing/pants/scrubs/green, + /obj/item/clothing/pants/scrubs/purple, + /obj/item/clothing/pants/scrubs/black, + /obj/item/clothing/pants/scrubs/navyblue, + /obj/item/clothing/shirt/scrubs/blue, + /obj/item/clothing/shirt/scrubs/green, + /obj/item/clothing/shirt/scrubs/purple, + /obj/item/clothing/shirt/scrubs/black, + /obj/item/clothing/shirt/scrubs/navyblue, /obj/item/clothing/head/surgery/navyblue, /obj/item/clothing/head/surgery/purple, /obj/item/clothing/head/surgery/blue, @@ -231,7 +236,7 @@ /obj/structure/closet/wardrobe/grey/WillContain() return list( - /obj/item/clothing/under/color/grey = 3, + /obj/item/clothing/jumpsuit/grey = 3, /obj/item/clothing/shoes/color/black = 3, /obj/item/clothing/head/soft/grey = 3, ) @@ -242,11 +247,11 @@ /obj/structure/closet/wardrobe/mixed/WillContain() return list( - /obj/item/clothing/under/color/blue, - /obj/item/clothing/under/color/yellow, - /obj/item/clothing/under/color/green, - /obj/item/clothing/under/color/orange, - /obj/item/clothing/under/color/pink, + /obj/item/clothing/jumpsuit/blue, + /obj/item/clothing/jumpsuit/yellow, + /obj/item/clothing/jumpsuit/green, + /obj/item/clothing/jumpsuit/orange, + /obj/item/clothing/jumpsuit/pink, /obj/item/clothing/skirt/plaid_blue, /obj/item/clothing/shirt/blouse/blue, /obj/item/clothing/skirt/plaid_red, @@ -269,7 +274,7 @@ /obj/structure/closet/wardrobe/tactical/WillContain() return list( - /obj/item/clothing/under/tactical, + /obj/item/clothing/jumpsuit/tactical, /obj/item/clothing/suit/armor/pcarrier/tactical, /obj/item/clothing/head/helmet/tactical, /obj/item/clothing/mask/balaclava/tactical, diff --git a/code/modules/admin/quantum_mechanic.dm b/code/modules/admin/quantum_mechanic.dm index cf377263fb..5cb96a389f 100644 --- a/code/modules/admin/quantum_mechanic.dm +++ b/code/modules/admin/quantum_mechanic.dm @@ -48,7 +48,7 @@ /decl/hierarchy/outfit/quantum name = "Quantum Mechanic" glasses = /obj/item/clothing/glasses/sunglasses/quantum - uniform = /obj/item/clothing/under/color/quantum + uniform = /obj/item/clothing/jumpsuit/quantum shoes = /obj/item/clothing/shoes/color/black/quantum l_ear = /obj/item/radio/headset/ert/quantum back = /obj/item/backpack/holding/quantum @@ -184,7 +184,7 @@ return ..() // Clothes -/obj/item/clothing/under/color/quantum +/obj/item/clothing/jumpsuit/quantum name = "quantum mechanic's uniform" desc = "A quantum mechanic's uniform. There is a letter on front that reads 'Q'." icon = 'icons/clothing/under/uniform_quantum.dmi' @@ -192,7 +192,7 @@ heat_protection = SLOT_FULL_BODY siemens_coefficient = 0 -/obj/item/clothing/under/color/quantum/attack_hand(mob/user) +/obj/item/clothing/jumpsuit/quantum/attack_hand(mob/user) if(!user) return TRUE diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index abc1dbcd76..8f8c031ec3 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -8,7 +8,7 @@ /decl/loadout_option/uniform/jumpsuit name = "jumpsuit, colour select" - path = /obj/item/clothing/under/color + path = /obj/item/clothing/jumpsuit loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/shortjumpskirt @@ -18,7 +18,7 @@ /decl/loadout_option/uniform/blackjumpshorts name = "black jumpsuit shorts" - path = /obj/item/clothing/under/color/blackjumpshorts + path = /obj/item/clothing/jumpsuit/blackjumpshorts /decl/loadout_option/uniform/shirt name = "shirt selection" @@ -140,7 +140,7 @@ /decl/loadout_option/uniform/turtleneck name = "sweater, colour select" - path = /obj/item/clothing/under/psych/turtleneck/sweater + path = /obj/item/clothing/jumpsuit/psych/turtleneck/sweater loadout_flags = GEAR_HAS_COLOR_SELECTION /decl/loadout_option/uniform/kimono diff --git a/code/modules/clothing/jumpsuits/_jumpsuit.dm b/code/modules/clothing/jumpsuits/_jumpsuit.dm new file mode 100644 index 0000000000..b129652518 --- /dev/null +++ b/code/modules/clothing/jumpsuits/_jumpsuit.dm @@ -0,0 +1,22 @@ +/obj/item/clothing/jumpsuit + name = "jumpsuit" + desc = "The latest in space fashion." + icon = 'icons/clothing/under/jumpsuits/jumpsuit.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_UPPER_BODY | SLOT_OVER_BODY + w_class = ITEM_SIZE_NORMAL + fallback_slot = slot_w_uniform_str + valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES + +/obj/item/clothing/jumpsuit/get_assumed_clothing_state_modifiers() + var/static/list/expected_state_modifiers = list( + GET_DECL(/decl/clothing_state_modifier/rolled_down), + GET_DECL(/decl/clothing_state_modifier/rolled_sleeves) + ) + return expected_state_modifiers + +/obj/item/clothing/costume/get_associated_equipment_slots() + . = ..() + var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) + LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/jumpsuits/color.dm b/code/modules/clothing/jumpsuits/color.dm new file mode 100644 index 0000000000..91eaa2ab21 --- /dev/null +++ b/code/modules/clothing/jumpsuits/color.dm @@ -0,0 +1,60 @@ +/obj/item/clothing/jumpsuit/orange + name = "orange jumpsuit" + desc = "It's standardised prisoner-wear. Its suit sensor controls are permanently set to the \"Fully On\" position." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_prisoner.dmi' + +/obj/item/clothing/jumpsuit/orange/Initialize() + . = ..() + var/obj/item/clothing/sensor/vitals/sensor = new(src) + sensor.set_sensors_locked(TRUE) + sensor.set_sensor_mode(VITALS_SENSOR_TRACKING) + attach_accessory(null, sensor) + +/obj/item/clothing/jumpsuit/blackjumpshorts + name = "black jumpsuit shorts" + desc = "The latest in space fashion, in a ladies' cut with shorts." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_shorts.dmi' + +/obj/item/clothing/jumpsuit/white + name = "white jumpsuit" + color = "#ffffff" + +/obj/item/clothing/jumpsuit/black + name = "black jumpsuit" + color = "#3d3d3d" + +/obj/item/clothing/jumpsuit/grey + name = "grey jumpsuit" + color = "#c4c4c4" + +/obj/item/clothing/jumpsuit/blue + name = "blue jumpsuit" + color = "#0066ff" + +/obj/item/clothing/jumpsuit/lightblue + name = "light blue jumpsuit" + color = COLOR_LIGHT_CYAN + +/obj/item/clothing/jumpsuit/pink + name = "pink jumpsuit" + color = "#df20a6" + +/obj/item/clothing/jumpsuit/red + name = "red jumpsuit" + color = "#ee1511" + +/obj/item/clothing/jumpsuit/green + name = "green jumpsuit" + color = "#42a345" + +/obj/item/clothing/jumpsuit/yellow + name = "yellow jumpsuit" + color = "#ffee00" + +/obj/item/clothing/jumpsuit/lightpurple + name = "light purple jumpsuit" + color = "#c600fc" + +/obj/item/clothing/jumpsuit/brown + name = "brown jumpsuit" + color = "#c08720" diff --git a/code/modules/clothing/jumpsuits/job.dm b/code/modules/clothing/jumpsuits/job.dm new file mode 100644 index 0000000000..674ec0ced6 --- /dev/null +++ b/code/modules/clothing/jumpsuits/job.dm @@ -0,0 +1,221 @@ + +/obj/item/clothing/jumpsuit/hazard + name = "hazard jumpsuit" + desc = "A high visibility jumpsuit made from heat and radiation resistant materials." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_hazard.dmi' + siemens_coefficient = 0.8 + armor = list( + ARMOR_ENERGY = ARMOR_ENERGY_SMALL, + ARMOR_RAD = ARMOR_RAD_MINOR + ) + max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE + +/obj/item/clothing/jumpsuit/sterile + name = "sterile jumpsuit" + desc = "A sterile white jumpsuit with medical markings. Protects against all manner of biohazards." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_sterile.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_SMALL + ) + + +/obj/item/clothing/jumpsuit/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. + desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"." + name = "captain's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_captain.dmi' + +/obj/item/clothing/jumpsuit/cargo + name = "quartermaster's jumpsuit" + desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_qm.dmi' + + +/obj/item/clothing/jumpsuit/cargotech + name = "cargo technician's jumpsuit" + desc = "Shooooorts! They're comfy and easy to wear!" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_cargo.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS + + +/obj/item/clothing/jumpsuit/chaplain + desc = "It's a black jumpsuit, often worn by religious folk." + name = "chaplain's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_chaplain.dmi' + +/obj/item/clothing/jumpsuit/head_of_personnel + desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." + name = "head of personnel's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_hop.dmi' + +/obj/item/clothing/jumpsuit/hydroponics + desc = "It's a jumpsuit designed to protect against minor plant-related hazards." + name = "botanist's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_hydroponics.dmi' + permeability_coefficient = 0.50 + +/obj/item/clothing/jumpsuit/janitor + desc = "It's the official uniform of the janitor. It has minor protection from biohazards." + name = "janitor's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_janitor.dmi' + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/miner + desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." + name = "shaft miner's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_miner.dmi' +/obj/item/clothing/jumpsuit/chief_engineer + desc = "It's a high visibility jumpsuit given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding." + name = "chief engineer's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_ce.dmi' + armor = list( + ARMOR_RAD = ARMOR_RAD_MINOR + ) + +/obj/item/clothing/jumpsuit/atmospheric_technician + desc = "It's a jumpsuit worn by atmospheric technicians." + name = "atmospheric technician's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_atmos.dmi' + +/obj/item/clothing/jumpsuit/engineer + desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." + name = "engineer's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_engineer.dmi' + armor = list( + ARMOR_RAD = ARMOR_RAD_MINOR + ) + +/obj/item/clothing/jumpsuit/roboticist + desc = "It's a slimming black jumpsuit with reinforced seams; great for industrial work." + name = "roboticist's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_robotics.dmi' + +/obj/item/clothing/jumpsuit/research_director + desc = "It's a jumpsuit worn by those with the know-how to achieve the position of \"Chief Science Officer\". Its fabric provides minor protection from biological contaminants." + name = "chief science officer's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_rd.dmi' + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/research_director/rdalt + desc = "A dress suit and slacks stained with hard work and dedication to science. Perhaps other things as well, but mostly hard work and dedication." + name = "head researcher uniform" + icon = 'icons/clothing/under/uniform_rd_alt.dmi' + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/chemist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." + name = "pharmacist's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_chemist.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) +/* + * Medical + */ +/obj/item/clothing/jumpsuit/chief_medical_officer + desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." + name = "chief medical officer's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_cmo.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/geneticist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." + name = "geneticist's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_genetics.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/virologist + desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." + name = "virologist's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_virology.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/psych + desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." + name = "psychiatrist's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_psych.dmi' + +/obj/item/clothing/jumpsuit/medical + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." + name = "medical doctor's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_medical.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/jumpsuit/medical/paramedic + name = "short sleeve medical jumpsuit" + desc = "It's made of a special fiber that provides minor protection against biohazards. This one has a cross on the chest denoting that the wearer is trained medical personnel." + +/obj/item/clothing/jumpsuit/head_of_security + desc = "It's a jumpsuit worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer." + name = "head of security's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_hos.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_SMALL + ) + siemens_coefficient = 0.8 + material = /decl/material/solid/organic/leather + matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) + origin_tech = @'{"materials":1,"engineering":1, "combat":1}' + +/obj/item/clothing/jumpsuit/warden + desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. It has the word \"Warden\" written on the shoulders." + name = "warden's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_warden.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_SMALL + ) + siemens_coefficient = 0.9 + matter = list( + /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE + ) + +/obj/item/clothing/jumpsuit/security + name = "security officer's jumpsuit" + desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_sec.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_SMALL + ) + siemens_coefficient = 0.9 + matter = list( + /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE + ) + +/obj/item/clothing/jumpsuit/head_of_security/jensen + desc = "You never asked for anything that stylish." + name = "head of security's jumpsuit" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_hos_alt.dmi' + siemens_coefficient = 0.6 + matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) + origin_tech = @'{"materials":3,"engineering":1, "combat":2}' + +/obj/item/clothing/jumpsuit/tactical + name = "tactical jumpsuit" + desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." + icon = 'icons/clothing/under/uniform_swat.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_SMALL + ) + siemens_coefficient = 0.9 + matter = list( + /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE + ) diff --git a/code/modules/clothing/jumpsuits/misc.dm b/code/modules/clothing/jumpsuits/misc.dm new file mode 100644 index 0000000000..4ba6fff0aa --- /dev/null +++ b/code/modules/clothing/jumpsuits/misc.dm @@ -0,0 +1,24 @@ +/obj/item/clothing/jumpsuit/mailman + name = "mailman's jumpsuit" + desc = "'Special delivery!'" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_mailman.dmi' + +/obj/item/clothing/jumpsuit/vice + name = "vice officer's jumpsuit" + desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision." + icon = 'icons/clothing/under/uniform_vice.dmi' + +/obj/item/clothing/jumpsuit/johnny + name = "brown jumpsuit" + desc = "A label on the inside of the collar reads, 'johnny~~~'." + icon = 'icons/clothing/under/jumpsuits/jumpsuit_johnny.dmi' + +/obj/item/clothing/jumpsuit/rainbow + name = "rainbow" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_rainbow.dmi' + +/obj/item/clothing/jumpsuit/psyche + name = "psychedelic jumpsuit" + desc = "Groovy!" + icon = 'icons/clothing/under/jumpsuits/jumpsuit_psychadelic.dmi' + diff --git a/code/modules/clothing/jumpsuits/role.dm b/code/modules/clothing/jumpsuits/role.dm new file mode 100644 index 0000000000..22362d3423 --- /dev/null +++ b/code/modules/clothing/jumpsuits/role.dm @@ -0,0 +1,5 @@ +/obj/item/clothing/jumpsuit/caretaker + name = "caretaker's jumpsuit" + desc = "A holy jumpsuit. Treat it well." + icon = 'icons/clothing/under/caretaker.dmi' + bodytype_equip_flags = BODY_FLAG_HUMANOID \ No newline at end of file diff --git a/code/modules/clothing/pants/scrubs.dm b/code/modules/clothing/pants/scrubs.dm new file mode 100644 index 0000000000..ef5e399576 --- /dev/null +++ b/code/modules/clothing/pants/scrubs.dm @@ -0,0 +1,46 @@ +/obj/item/clothing/pants/scrubs + name = "scrub pants" + desc = "A loose-fitting garment designed to provide minor protection against biohazards." + icon = 'icons/clothing/pants/scrubs.dmi' + +/obj/item/clothing/pants/scrubs/blue + name = "blue scrub pants" + color = "#4891e1" + +/obj/item/clothing/pants/scrubs/green + name = "green scrub pants" + color = "#255a3e" + +/obj/item/clothing/pants/scrubs/purple + name = "purple scrub pants" + color = "#7a1b3f" + +/obj/item/clothing/pants/scrubs/black + name = "black scrub pants" + color = "#242424" + +/obj/item/clothing/pants/scrubs/navyblue + name = "navy blue scrub pants" + color = "#1f3a69" + +/obj/item/clothing/pants/scrubs/lilac + name = "lilac scrub pants" + color = "#c8a2c8" + +/obj/item/clothing/pants/scrubs/teal + name = "teal scrub pants" + color = "#008080" + +/obj/item/clothing/pants/scrubs/heliodor + name = "heliodor scrub pants" + color = "#aad539" + +/obj/item/clothing/pants/scrubs/blue/outfit + starting_accessories = list( + /obj/item/clothing/shirt/scrubs/blue + ) + +/obj/item/clothing/pants/scrubs/purple/outfit + starting_accessories = list( + /obj/item/clothing/shirt/scrubs/purple + ) diff --git a/code/modules/clothing/shirts/scrubs.dm b/code/modules/clothing/shirts/scrubs.dm new file mode 100644 index 0000000000..c05a44e00a --- /dev/null +++ b/code/modules/clothing/shirts/scrubs.dm @@ -0,0 +1,36 @@ +/obj/item/clothing/shirt/scrubs + name = "scrubs" + desc = "A loose-fitting garment designed to provide minor protection against biohazards." + icon = 'icons/clothing/shirts/scrubs.dmi' + +/obj/item/clothing/shirt/scrubs/blue + name = "blue scrub shirt" + color = "#4891e1" + +/obj/item/clothing/shirt/scrubs/green + name = "green scrub shirt" + color = "#255a3e" + +/obj/item/clothing/shirt/scrubs/purple + name = "purple scrub shirt" + color = "#7a1b3f" + +/obj/item/clothing/shirt/scrubs/black + name = "black scrub shirt" + color = "#242424" + +/obj/item/clothing/shirt/scrubs/navyblue + name = "navy blue scrub shirt" + color = "#1f3a69" + +/obj/item/clothing/shirt/scrubs/lilac + name = "lilac scrub shirt" + color = "#c8a2c8" + +/obj/item/clothing/shirt/scrubs/teal + name = "teal scrub shirt" + color = "#008080" + +/obj/item/clothing/shirt/scrubs/heliodor + name = "heliodor scrub shirt" + color = "#aad539" diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm deleted file mode 100644 index c16edd5cea..0000000000 --- a/code/modules/clothing/under/color.dm +++ /dev/null @@ -1,80 +0,0 @@ -// items not part of the colour changing system - -/obj/item/clothing/under/psyche - name = "psychedelic jumpsuit" - desc = "Groovy!" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_psychadelic.dmi' - - -/obj/item/clothing/under/color - name = "jumpsuit" - desc = "The latest in space fashion." - icon = 'icons/clothing/under/jumpsuits/jumpsuit.dmi' - -/obj/item/clothing/under/color/get_assumed_clothing_state_modifiers() - var/static/list/expected_state_modifiers = list( - GET_DECL(/decl/clothing_state_modifier/rolled_down), - GET_DECL(/decl/clothing_state_modifier/rolled_sleeves) - ) - return expected_state_modifiers - -/obj/item/clothing/under/color/orange - name = "orange jumpsuit" - desc = "It's standardised prisoner-wear. Its suit sensor controls are permanently set to the \"Fully On\" position." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_prisoner.dmi' - -/obj/item/clothing/under/color/orange/Initialize() - . = ..() - var/obj/item/clothing/sensor/vitals/sensor = new(src) - sensor.set_sensors_locked(TRUE) - sensor.set_sensor_mode(VITALS_SENSOR_TRACKING) - attach_accessory(null, sensor) - -/obj/item/clothing/under/color/blackjumpshorts - name = "black jumpsuit shorts" - desc = "The latest in space fashion, in a ladies' cut with shorts." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_shorts.dmi' - -/obj/item/clothing/under/color/white - name = "white jumpsuit" - color = "#ffffff" - -/obj/item/clothing/under/color/black - name = "black jumpsuit" - color = "#3d3d3d" - -/obj/item/clothing/under/color/grey - name = "grey jumpsuit" - color = "#c4c4c4" - -/obj/item/clothing/under/color/blue - name = "blue jumpsuit" - color = "#0066ff" - -/obj/item/clothing/under/color/lightblue - name = "light blue jumpsuit" - color = COLOR_LIGHT_CYAN - -/obj/item/clothing/under/color/pink - name = "pink jumpsuit" - color = "#df20a6" - -/obj/item/clothing/under/color/red - name = "red jumpsuit" - color = "#ee1511" - -/obj/item/clothing/under/color/green - name = "green jumpsuit" - color = "#42a345" - -/obj/item/clothing/under/color/yellow - name = "yellow jumpsuit" - color = "#ffee00" - -/obj/item/clothing/under/color/lightpurple - name = "light purple jumpsuit" - color = "#c600fc" - -/obj/item/clothing/under/color/brown - name = "brown jumpsuit" - color = "#c08720" diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index ab9015eee3..0a348db982 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -5,50 +5,16 @@ name = "bartender's uniform" icon = 'icons/clothing/under/uniform_bartender.dmi' -/obj/item/clothing/under/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. - desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"." - name = "captain's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_captain.dmi' - -/obj/item/clothing/under/cargo - name = "quartermaster's jumpsuit" - desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_qm.dmi' - - -/obj/item/clothing/under/cargotech - name = "cargo technician's jumpsuit" - desc = "Shooooorts! They're comfy and easy to wear!" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_cargo.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - - -/obj/item/clothing/under/chaplain - desc = "It's a black jumpsuit, often worn by religious folk." - name = "chaplain's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_chaplain.dmi' - /obj/item/clothing/under/chef desc = "It's an apron which is given only to the most hardcore chefs in space." name = "chef's uniform" icon = 'icons/clothing/under/uniform_chef.dmi' -/obj/item/clothing/under/head_of_personnel - desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." - name = "head of personnel's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_hop.dmi' - -/obj/item/clothing/under/head_of_personnel_whimsy +/obj/item/clothing/jumpsuit/head_of_personnel_whimsy desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does." name = "head of personnel's suit" icon = 'icons/clothing/under/uniform_hop_whimsy.dmi' -/obj/item/clothing/under/hydroponics - desc = "It's a jumpsuit designed to protect against minor plant-related hazards." - name = "botanist's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_hydroponics.dmi' - permeability_coefficient = 0.50 - /obj/item/clothing/under/internalaffairs desc = "The plain, professional attire of an Internal Affairs Agent. The collar is immaculately starched." name = "Internal Affairs uniform" @@ -69,14 +35,6 @@ /obj/item/clothing/neck/tie/long/red ) -/obj/item/clothing/under/janitor - desc = "It's the official uniform of the janitor. It has minor protection from biohazards." - name = "janitor's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_janitor.dmi' - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - /obj/item/clothing/under/lawyer name = "black lawyer suit" desc = "Slick threads." @@ -120,8 +78,3 @@ name = "mime's outfit" desc = "It's not very colourful." icon = 'icons/clothing/under/uniform_mime.dmi' - -/obj/item/clothing/under/miner - desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." - name = "shaft miner's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_miner.dmi' diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 6feaea86a7..a1d8750a1a 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -1,31 +1,6 @@ //Contains: Engineering department jumpsuits -/obj/item/clothing/under/chief_engineer - desc = "It's a high visibility jumpsuit given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding." - name = "chief engineer's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_ce.dmi' - armor = list( - ARMOR_RAD = ARMOR_RAD_MINOR - ) -/obj/item/clothing/under/atmospheric_technician - desc = "It's a jumpsuit worn by atmospheric technicians." - name = "atmospheric technician's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_atmos.dmi' - -/obj/item/clothing/under/engineer - desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." - name = "engineer's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_engineer.dmi' - armor = list( - ARMOR_RAD = ARMOR_RAD_MINOR - ) - -/obj/item/clothing/under/roboticist - desc = "It's a slimming black jumpsuit with reinforced seams; great for industrial work." - name = "roboticist's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_robotics.dmi' - -/obj/item/clothing/under/roboticist/skirt +/obj/item/clothing/jumpsuit/roboticist/skirt name = "roboticist's jumpskirt" desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work." icon = 'icons/clothing/under/jumpsuits/jumpsuit_robotics_skirt.dmi' diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 7125904c25..f385c0e705 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -1,61 +1,3 @@ -/* - * Science - */ - -/obj/item/clothing/under/research_director - desc = "It's a jumpsuit worn by those with the know-how to achieve the position of \"Chief Science Officer\". Its fabric provides minor protection from biological contaminants." - name = "chief science officer's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_rd.dmi' - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/under/research_director/rdalt - desc = "A dress suit and slacks stained with hard work and dedication to science. Perhaps other things as well, but mostly hard work and dedication." - name = "head researcher uniform" - icon = 'icons/clothing/under/uniform_rd_alt.dmi' - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/under/chemist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it." - name = "pharmacist's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_chemist.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) -/* - * Medical - */ -/obj/item/clothing/under/chief_medical_officer - desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection." - name = "chief medical officer's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_cmo.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/under/geneticist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it." - name = "geneticist's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_genetics.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/under/virologist - desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it." - name = "virologist's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_virology.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - /obj/item/clothing/under/orderly desc = "A white suit to be worn by medical attendants." name = "orderly's uniform" @@ -65,62 +7,7 @@ ARMOR_BIO = ARMOR_BIO_MINOR ) -/obj/item/clothing/under/medical - desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." - name = "medical doctor's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_medical.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/under/medical/paramedic - name = "short sleeve medical jumpsuit" - desc = "It's made of a special fiber that provides minor protection against biohazards. This one has a cross on the chest denoting that the wearer is trained medical personnel." - -/obj/item/clothing/under/medical/scrubs - name = "scrubs" - desc = "A loose-fitting garment designed to provide minor protection against biohazards." - icon = 'icons/clothing/under/uniform_scrubs.dmi' - -/obj/item/clothing/under/medical/scrubs/blue - name = "blue scrubs" - color = "#4891e1" - -/obj/item/clothing/under/medical/scrubs/green - name = "green scrubs" - color = "#255a3e" - -/obj/item/clothing/under/medical/scrubs/purple - name = "purple scrubs" - color = "#7a1b3f" - -/obj/item/clothing/under/medical/scrubs/black - name = "black scrubs" - color = "#242424" - -/obj/item/clothing/under/medical/scrubs/navyblue - name = "navy blue scrubs" - color = "#1f3a69" - -/obj/item/clothing/under/medical/scrubs/lilac - name = "lilac scrubs" - color = "#c8a2c8" - -/obj/item/clothing/under/medical/scrubs/teal - name = "teal scrubs" - color = "#008080" - -/obj/item/clothing/under/medical/scrubs/heliodor - name = "heliodor scrubs" - color = "#aad539" - -/obj/item/clothing/under/psych - desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." - name = "psychiatrist's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_psych.dmi' - -/obj/item/clothing/under/psych/turtleneck +/obj/item/clothing/jumpsuit/psych/turtleneck desc = "A turqouise sweater and a pair of dark blue slacks." name = "turqouise turtleneck" icon = 'icons/clothing/under/uniform_turtleneck_blue.dmi' diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 26f74af9da..5aeebf9198 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -8,17 +8,6 @@ /* * Security */ -/obj/item/clothing/under/warden - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for more robust protection. It has the word \"Warden\" written on the shoulders." - name = "warden's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_warden.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SMALL - ) - siemens_coefficient = 0.9 - matter = list( - /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE - ) /obj/item/clothing/head/warden name = "warden's hat" @@ -26,17 +15,6 @@ icon = 'icons/clothing/head/warden.dmi' body_parts_covered = 0 -/obj/item/clothing/under/security - name = "security officer's jumpsuit" - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_sec.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SMALL - ) - siemens_coefficient = 0.9 - matter = list( - /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE - ) /obj/item/clothing/under/dispatch name = "dispatcher's uniform" @@ -51,7 +29,7 @@ /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE ) -/obj/item/clothing/under/security2 +/obj/item/clothing/jumpsuit/security2 name = "security officer's uniform" desc = "It's made of a slightly sturdier material, to allow for robust protection." icon = 'icons/clothing/under/uniform_redshirt.dmi' @@ -63,18 +41,6 @@ /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE ) -/obj/item/clothing/under/tactical - name = "tactical jumpsuit" - desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection." - icon = 'icons/clothing/under/uniform_swat.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SMALL - ) - siemens_coefficient = 0.9 - matter = list( - /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE - ) - /* * Detective */ @@ -138,17 +104,6 @@ /* * Head of Security */ -/obj/item/clothing/under/head_of_security - desc = "It's a jumpsuit worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer." - name = "head of security's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_hos.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SMALL - ) - siemens_coefficient = 0.8 - material = /decl/material/solid/organic/leather - matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - origin_tech = @'{"materials":1,"engineering":1, "combat":1}' /obj/item/clothing/head/HoS name = "Head of Security hat" @@ -179,15 +134,6 @@ ) origin_tech = @'{"materials":3,"engineering":1, "combat":2}' -//Jensen cosplay gear -/obj/item/clothing/under/head_of_security/jensen - desc = "You never asked for anything that stylish." - name = "head of security's jumpsuit" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_hos_alt.dmi' - siemens_coefficient = 0.6 - matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - origin_tech = @'{"materials":3,"engineering":1, "combat":2}' - /obj/item/clothing/suit/armor/hos/jensen name = "armored trenchcoat" desc = "A trenchcoat augmented with a special alloy for some protection and style." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index eeca9a7e36..76c315063c 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -1,4 +1,4 @@ -/obj/item/clothing/under/captain_fly +/obj/item/clothing/jumpsuit/captain_fly name = "rogue's uniform" desc = "For the man who doesn't care because he's still free." icon = 'icons/clothing/under/rogue_captain.dmi' @@ -18,16 +18,6 @@ desc = "It's a very smart uniform with a special pocket for tips." icon = 'icons/clothing/under/uniform_waiter.dmi' -/obj/item/clothing/under/mailman - name = "mailman's jumpsuit" - desc = "'Special delivery!'" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_mailman.dmi' - -/obj/item/clothing/under/vice - name = "vice officer's jumpsuit" - desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision." - icon = 'icons/clothing/under/uniform_vice.dmi' - //This set of uniforms looks fairly fancy and is generally used for high-ranking personnel from what I've seen, so lets give them appropriate ranks. /obj/item/clothing/under/centcom name = "\improper Officer's Dress Uniform" @@ -46,16 +36,6 @@ name = "\improper Officer's Dress Uniform" icon = 'icons/clothing/under/uniform_officer_dress.dmi' should_display_id = FALSE - -/obj/item/clothing/under/johnny - name = "brown jumpsuit" - desc = "A label on the inside of the collar reads, 'johnny~~~'." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_johnny.dmi' - -/obj/item/clothing/under/color/rainbow - name = "rainbow" - icon = 'icons/clothing/under/jumpsuits/jumpsuit_rainbow.dmi' - /obj/item/clothing/under/psysuit name = "dark undersuit" desc = "A thick, layered grey undersuit lined with power cables. Feels a little like wearing an electrical storm." @@ -95,7 +75,7 @@ desc = "A slimming, short jumpskirt." icon = 'icons/clothing/under/jumpsuits/jumpsuit_skirt_short.dmi' -/obj/item/clothing/under/captainformal +/obj/item/clothing/jumpsuit/captainformal name = "captain's formal uniform" desc = "A captain's formal-wear, for special occasions." icon = 'icons/clothing/under/uniform_captain_formal.dmi' @@ -132,7 +112,7 @@ desc = "A rugged flannel shirt and denim overalls. A popular style among frontier colonists." icon = 'icons/clothing/under/frontier.dmi' -/obj/item/clothing/under/psych/turtleneck/sweater +/obj/item/clothing/jumpsuit/psych/turtleneck/sweater name = "sweater" desc = "A warm looking sweater and a pair of dark blue slacks." icon = 'icons/clothing/under/uniform_turtleneck.dmi' @@ -142,23 +122,3 @@ desc = "For when you want to scuba dive your way into an enemy base but still want to show off a little skin." icon = 'icons/clothing/under/wetsuit.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/under/hazard - name = "hazard jumpsuit" - desc = "A high visibility jumpsuit made from heat and radiation resistant materials." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_hazard.dmi' - siemens_coefficient = 0.8 - armor = list( - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_MINOR - ) - max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE - -/obj/item/clothing/under/sterile - name = "sterile jumpsuit" - desc = "A sterile white jumpsuit with medical markings. Protects against all manner of biohazards." - icon = 'icons/clothing/under/jumpsuits/jumpsuit_sterile.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_SMALL - ) diff --git a/code/modules/fabrication/designs/textile/_textile.dm b/code/modules/fabrication/designs/textile/_textile.dm index 02a2590a14..bfddaec64f 100644 --- a/code/modules/fabrication/designs/textile/_textile.dm +++ b/code/modules/fabrication/designs/textile/_textile.dm @@ -1,5 +1,5 @@ /datum/fabricator_recipe/textiles - path = /obj/item/clothing/under/color/grey + path = /obj/item/clothing/jumpsuit/grey category = "Textiles" fabricator_types = list(FABRICATOR_CLASS_TEXTILE) diff --git a/code/modules/fabrication/designs/textile/job.dm b/code/modules/fabrication/designs/textile/job.dm index eeb16aab4e..ed03f48be3 100644 --- a/code/modules/fabrication/designs/textile/job.dm +++ b/code/modules/fabrication/designs/textile/job.dm @@ -19,70 +19,97 @@ // Medical (Science barely has enough for a category) /datum/fabricator_recipe/textiles/job/medical category = "Medical & Science Clothing" - path = /obj/item/clothing/under/medical + path = /obj/item/clothing/jumpsuit/medical /datum/fabricator_recipe/textiles/job/medical/research_director - path = /obj/item/clothing/under/research_director + path = /obj/item/clothing/jumpsuit/research_director /datum/fabricator_recipe/textiles/job/medical/rdalt - path = /obj/item/clothing/under/research_director/rdalt + path = /obj/item/clothing/jumpsuit/research_director/rdalt /datum/fabricator_recipe/textiles/job/medical/dress_rd path = /obj/item/clothing/skirt/research_director /datum/fabricator_recipe/textiles/job/medical/chemist - path = /obj/item/clothing/under/chemist + path = /obj/item/clothing/jumpsuit/chemist /datum/fabricator_recipe/textiles/job/medical/chief_medical_officer - path = /obj/item/clothing/under/chief_medical_officer + path = /obj/item/clothing/jumpsuit/chief_medical_officer /datum/fabricator_recipe/textiles/job/medical/geneticist - path = /obj/item/clothing/under/geneticist + path = /obj/item/clothing/jumpsuit/geneticist /datum/fabricator_recipe/textiles/job/medical/virologist - path = /obj/item/clothing/under/virologist + path = /obj/item/clothing/jumpsuit/virologist /datum/fabricator_recipe/textiles/job/medical/nurse path = /obj/item/clothing/dress/nurse /datum/fabricator_recipe/textiles/job/medical/medical - path = /obj/item/clothing/under/medical + path = /obj/item/clothing/jumpsuit/medical /datum/fabricator_recipe/textiles/job/medical/paramedic - path = /obj/item/clothing/under/medical/paramedic + path = /obj/item/clothing/jumpsuit/medical/paramedic -/datum/fabricator_recipe/textiles/job/medical/scrubs - path = /obj/item/clothing/under/medical/scrubs +/datum/fabricator_recipe/textiles/job/medical/scrubs_pants + path = /obj/item/clothing/pants/scrubs -/datum/fabricator_recipe/textiles/job/medical/blue - path = /obj/item/clothing/under/medical/scrubs/blue +/datum/fabricator_recipe/textiles/job/medical/blue_pants + path = /obj/item/clothing/pants/scrubs/blue -/datum/fabricator_recipe/textiles/job/medical/green - path = /obj/item/clothing/under/medical/scrubs/green +/datum/fabricator_recipe/textiles/job/medical/green_pants + path = /obj/item/clothing/pants/scrubs/green -/datum/fabricator_recipe/textiles/job/medical/purple - path = /obj/item/clothing/under/medical/scrubs/purple +/datum/fabricator_recipe/textiles/job/medical/purple_pants + path = /obj/item/clothing/pants/scrubs/purple -/datum/fabricator_recipe/textiles/job/medical/black - path = /obj/item/clothing/under/medical/scrubs/black +/datum/fabricator_recipe/textiles/job/medical/black_pants + path = /obj/item/clothing/pants/scrubs/black -/datum/fabricator_recipe/textiles/job/medical/navyblue - path = /obj/item/clothing/under/medical/scrubs/navyblue +/datum/fabricator_recipe/textiles/job/medical/navyblue_pants + path = /obj/item/clothing/pants/scrubs/navyblue -/datum/fabricator_recipe/textiles/job/medical/lilac - path = /obj/item/clothing/under/medical/scrubs/lilac +/datum/fabricator_recipe/textiles/job/medical/lilac_pants + path = /obj/item/clothing/pants/scrubs/lilac -/datum/fabricator_recipe/textiles/job/medical/teal - path = /obj/item/clothing/under/medical/scrubs/teal +/datum/fabricator_recipe/textiles/job/medical/teal_pants + path = /obj/item/clothing/pants/scrubs/teal -/datum/fabricator_recipe/textiles/job/medical/heliodor - path = /obj/item/clothing/under/medical/scrubs/heliodor +/datum/fabricator_recipe/textiles/job/medical/heliodor_pants + path = /obj/item/clothing/pants/scrubs/heliodor + +/datum/fabricator_recipe/textiles/job/medical/scrubs_shirt + path = /obj/item/clothing/shirt/scrubs + +/datum/fabricator_recipe/textiles/job/medical/blue_shirt + path = /obj/item/clothing/shirt/scrubs/blue + +/datum/fabricator_recipe/textiles/job/medical/green_shirt + path = /obj/item/clothing/shirt/scrubs/green + +/datum/fabricator_recipe/textiles/job/medical/purple_shirt + path = /obj/item/clothing/shirt/scrubs/purple + +/datum/fabricator_recipe/textiles/job/medical/black_shirt + path = /obj/item/clothing/shirt/scrubs/black + +/datum/fabricator_recipe/textiles/job/medical/navyblue_shirt + path = /obj/item/clothing/shirt/scrubs/navyblue + +/datum/fabricator_recipe/textiles/job/medical/lilac_shirt + path = /obj/item/clothing/shirt/scrubs/lilac + +/datum/fabricator_recipe/textiles/job/medical/teal_shirt + path = /obj/item/clothing/shirt/scrubs/teal + +/datum/fabricator_recipe/textiles/job/medical/heliodor_shirt + path = /obj/item/clothing/shirt/scrubs/heliodor /datum/fabricator_recipe/textiles/job/medical/psych - path = /obj/item/clothing/under/psych + path = /obj/item/clothing/jumpsuit/psych /datum/fabricator_recipe/textiles/job/medical/turtleneck - path = /obj/item/clothing/under/psych/turtleneck + path = /obj/item/clothing/jumpsuit/psych/turtleneck // Suits /datum/fabricator_recipe/textiles/job/medical/surgicalapron @@ -121,7 +148,7 @@ // Security /datum/fabricator_recipe/textiles/job/security category = "Security Clothing" - path = /obj/item/clothing/under/security + path = /obj/item/clothing/jumpsuit/security /datum/fabricator_recipe/textiles/job/security/forensics path = /obj/item/clothing/suit/forensics @@ -133,25 +160,25 @@ path = /obj/item/clothing/suit/det_trench/reinforced /datum/fabricator_recipe/textiles/job/security/warden - path = /obj/item/clothing/under/warden + path = /obj/item/clothing/jumpsuit/warden /datum/fabricator_recipe/textiles/job/security/dispatch path = /obj/item/clothing/under/dispatch /datum/fabricator_recipe/textiles/job/security/alt - path = /obj/item/clothing/under/security2 + path = /obj/item/clothing/jumpsuit/security2 /datum/fabricator_recipe/textiles/job/security/tacticalofficer - path = /obj/item/clothing/under/tactical + path = /obj/item/clothing/jumpsuit/tactical /datum/fabricator_recipe/textiles/job/security/hos path = /obj/item/clothing/head/HoS /datum/fabricator_recipe/textiles/job/security/securityjensen - path = /obj/item/clothing/under/head_of_security/jensen + path = /obj/item/clothing/jumpsuit/head_of_security/jensen /datum/fabricator_recipe/textiles/job/security/securityhos - path = /obj/item/clothing/under/head_of_security + path = /obj/item/clothing/jumpsuit/head_of_security // Tacticool /datum/fabricator_recipe/textiles/job/security/tactical diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index de60e0764c..7621e897fc 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -12,7 +12,7 @@ /obj/item/backpack/satchel/eng )), /obj/item/radio/headset/headset_cargo, - /obj/item/clothing/under/miner, + /obj/item/clothing/jumpsuit/miner, /obj/item/clothing/gloves/thick, /obj/item/clothing/shoes/color/black, /obj/item/scanner/gas, diff --git a/code/modules/mob/living/carbon/human/npcs.dm b/code/modules/mob/living/carbon/human/npcs.dm index 8a7222afac..1eefd37217 100644 --- a/code/modules/mob/living/carbon/human/npcs.dm +++ b/code/modules/mob/living/carbon/human/npcs.dm @@ -19,13 +19,13 @@ /decl/hierarchy/outfit/blank_subject name = "Test Subject" - uniform = /obj/item/clothing/under/color/white/blank + uniform = /obj/item/clothing/jumpsuit/white/blank shoes = /obj/item/clothing/shoes/color/white head = /obj/item/clothing/head/helmet/facecover mask = /obj/item/clothing/mask/muzzle suit = /obj/item/clothing/suit/straight_jacket -/obj/item/clothing/under/color/white/blank/Initialize() +/obj/item/clothing/jumpsuit/white/blank/Initialize() . = ..() var/obj/item/clothing/sensor/vitals/sensor = new(src) sensor.set_sensors_locked(TRUE) diff --git a/code/modules/species/station/human.dm b/code/modules/species/station/human.dm index 11962d6f9b..39088dd7d9 100644 --- a/code/modules/species/station/human.dm +++ b/code/modules/species/station/human.dm @@ -40,4 +40,4 @@ /decl/species/human/equip_default_fallback_uniform(var/mob/living/carbon/human/H) if(istype(H)) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey, slot_w_uniform_str) + H.equip_to_slot_or_del(new /obj/item/clothing/jumpsuit/grey, slot_w_uniform_str) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 9ec832ff1c..9252f63aa2 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -49,7 +49,7 @@ name = "Apprentice" desc = "Summon your trusty apprentice, equipped with their very own spellbook." equipment = list(/obj/item/clothing/head/wizard = slot_head_str, - /obj/item/clothing/under/color/lightpurple = slot_w_uniform_str, + /obj/item/clothing/jumpsuit/lightpurple = slot_w_uniform_str, /obj/item/clothing/shoes/sandal = slot_shoes_str, /obj/item/staff = BP_R_HAND, /obj/item/spellbook/apprentice = BP_L_HAND, @@ -71,7 +71,7 @@ name = "Caretaker" desc = "A healer, a medic, a shoulder to cry on. This servant will heal you, even from near death." spiel = "'The last enemy that will be destroyed is death.' You can perceive any injuries with simple sight, and heal them with the Trance spell; potentially even reversing death itself! However, this comes at a price; Trance will become increasingly harder to use as you use it, until you can use it no longer. Be cautious, and aid your Master in any way possible!" - equipment = list(/obj/item/clothing/under/caretaker = slot_w_uniform_str, + equipment = list(/obj/item/clothing/jumpsuit/caretaker = slot_w_uniform_str, /obj/item/clothing/shoes/dress/caretakershoes = slot_shoes_str) spells = list(/spell/toggle_armor/caretaker, /spell/targeted/heal_target/touch, diff --git a/code/modules/spells/general/toggle_armor.dm b/code/modules/spells/general/toggle_armor.dm index f931bea21b..5da3bf537f 100644 --- a/code/modules/spells/general/toggle_armor.dm +++ b/code/modules/spells/general/toggle_armor.dm @@ -43,7 +43,7 @@ name = "Greytide Worldwide" invocation_type = SpI_EMOTE invocation = "screams incoherently!" - armor_pieces = list(/obj/item/clothing/under/color/grey = slot_w_uniform_str, + armor_pieces = list(/obj/item/clothing/jumpsuit/grey = slot_w_uniform_str, /obj/item/clothing/gloves/insulated/cheap = slot_gloves_str, /obj/item/clothing/mask/gas = slot_wear_mask_str, /obj/item/clothing/shoes/color/black = slot_shoes_str, diff --git a/code/modules/xenoarcheaology/tools/misc.dm b/code/modules/xenoarcheaology/tools/misc.dm index 0acb5ee17d..ac4007676b 100644 --- a/code/modules/xenoarcheaology/tools/misc.dm +++ b/code/modules/xenoarcheaology/tools/misc.dm @@ -20,7 +20,7 @@ return list( new /datum/atom_creator/simple(/obj/item/backpack/toxins, 50), new /datum/atom_creator/simple(/obj/item/backpack/dufflebag, 50), - /obj/item/clothing/under/color/white, + /obj/item/clothing/jumpsuit/white, /obj/item/clothing/suit/toggle/labcoat, /obj/item/clothing/shoes/color/white, /obj/item/clothing/glasses/science, diff --git a/icons/clothing/pants/scrubs.dmi b/icons/clothing/pants/scrubs.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fe312c6668d9e023eb5b072dada86cbed2c9e044 GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&c?9@`xE?rgVCKx3|NsAg{rdIJ zojadBd)D0CeE$6Tr%#`rJ$rV^k|j%*E?u^4*|~G)va+%Y3kw%7UJTT7=FFKNKYrZ5 zf4{S{bNBAuK#?3rwc|iD8B2ovf*Bm1-ADs+W>kell(?i8Cl_TFlw{`TF)&oj2@WeL zD*gT?xZva0CtBXRTIbH358e=JaMAd|Bc1a;nkN~GdU|(Q7zY_&Huh4O^JvnMNg)cs zD{b~`sJnJ{8>?DQ@+ubo{K+_2WYVW#tD)fj%#y-=TDq5-Kp=K(jKd+qA`DC4m@OFXo?LMoTAtI3+Ueao-U3d6?5Ls zxZBrcAmEn0eL=vAhSdB21IweF%S4ye?|6B(TxjQvzH^*yZR?$Yo?_S^W44O(gns)P z%>`3dX*+!1zo}t`)`g13Ws4e=7()XcDj7rl59Bg7)-JfK5qp1@7i)B7sYls?wXc7z z+r9C16vx`qk2UHBJk9|N-dD#p@NAJg&w1f5H%E!=+RLr~S#A5Ce%{;A!O=0}K&Q0A ztz+CK>MX}5Gcof@FfrM#{hrwPDZOEzT}9)=o(4PB2XYTj*a_5~bKcDYav1}Ig6!kR zyDQi3JbhHABz@!Ft?co4&pzEZ`&-Gb`U45G)D)L(XqYp%u|{x0-aj3Cg$)y&QuftE zB+7p}zh!aM%7dF)o?qS&=cWBJt7&Ucqo$fd&&R_(omaY8r$tnmOlyl2UOSa@OCaO! zsN-46AO(6K-c|_TxbDTei1FUKfB)-%?0@~GvAng5Od-xGtI=?pe%`<9LQiVnpNl^m z*DrC&IA)~&Uw*E<&GY3h8C?I}r&<2||KiVsNdJxt=ZfZ)1G)3x`*vQq7xYf2_*4A? zb5$o}kl0(_ZlEE4|DIP(Rx(MRIr;z1drLUZMm&2`zYnV9|C2~YkVIh^#BLBd;W+;> Xf2D5`YRbU0$H3s}>gTe~DWM4fHwb&* literal 0 HcmV?d00001 diff --git a/icons/clothing/shirts/scrubs.dmi b/icons/clothing/shirts/scrubs.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c623c5b58c8bd3eb7bee9baa7777eda30cb85c78 GIT binary patch literal 900 zcmV-~1AF|5P)C0000>P)t-sz`($n znVGq{x!Kv->+9=-gM*}`r2qf_=H}+l&(G!M<;~5_&d$!IrKP5(rp(ODqobp0YHD$D zalpX9`1ttW-`|OeiMzYIz`($2@R#QR0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`;i@u9a})FOGgB0j@>42xi*xcz z;>+Vp^D@)&i*gZ~O^DW<6Q7ZomqL!tBD^}46VG^2IV=NWeh`RFfnE%JFBAlF|4hjs_g4YSK>p%HCo!-DdZz;H z<=gz%^r+2c4u{9WJj(6A354=IQ|@mH$RhB03d+kM8xTwX;?LDU52HhR02T!fS-^W^ z8NM0Vt01U=)n9p75=e_sr$Ao^mVh+@)dDB`7Ib~adJn7$1Q7_P0A&MPAiW6_)|;?G zKv@Fpn(fxLDiJAZoK1S85v?jM8k3tF^5dr!g^&E42*; zUJ_pf=Cut4^nQO4nAf&rnx-hnY7GDY0001h8NU>vzu&(qLK~JX@}>O)t<*$l!?Gp+ zm-Y{G|C$Ib;lE_rlK)Hl2f1Dmp_AqHIx78C0000>P)t-sz`($n znVGq{x!Kv->+9=-gM*}`r2qf_=H}+l&(G!M<;~5_&d$!IrKP5(rp(ODqobp0YHD$D zalpX9`1ttW-`|OeiMzYIz`($2@R#QR0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`;i@u9a})FOGgB0j@>42xi*xcz z;>+Vp^D@)&i*gZ~O^DW<6Q7ZomqL!tBD^}46HTwrx7w`HyHj0DP4~JML3|km13-!&{W=@)B}DKOASqyifVILh z{4kJLLC*qGeC91J(1jsL3P=M`EHKHBpzS(-1kyf`73fKz7X=^~Bm_K`%cBBJT3||z zfdBt_Gl<{d6DdHh{j*a_plKUf0C@!Djqc2I;4HRJ#!QI;2+yDupMV#b=Q%0BTd^1c zD12fHWFY~+4aoxINbOX}cS!7mg#socU~&R?3;=DVEO5F*Ahiff1ZV}qoDiTDNV`!| z;P~5u-v?Mg-UkWbhD2k$ZG8z1{LAVeozVtmEiod`jpK$yS z0XBHCzzZhe9XV3fNQS1Xu;|F0E1;& zj9JnGc=HDMO~9W$UT^pSfeR^Q;^X^j)_43TTCDDr3oPcqT zgE^O}J1lU?Ekd_au+?SjjtM|kVBJ>Fwr1*%3M_enKb{`~`?{k7*`K0y Date: Tue, 23 Apr 2024 17:52:38 +1000 Subject: [PATCH 184/212] Converted formalwear into shirt/slacks. --- code/datums/outfits/horror_killers.dm | 2 +- .../wizard/servant_items/infiltrator.dm | 6 - code/game/objects/effects/landmarks.dm | 130 +++++++++--------- .../crates_lockers/closets/wardrobe.dm | 16 +-- .../loadout/lists/uniforms.dm | 9 +- code/modules/clothing/pants/slacks.dm | 80 +++++++++++ code/modules/clothing/shirts/formal.dm | 4 + code/modules/clothing/under/formalwear.dm | 62 --------- .../spells/artifacts/spellbound_servants.dm | 2 +- icons/clothing/pants/slacks.dmi | Bin 0 -> 767 bytes icons/clothing/pants/slacks_black.dmi | Bin 0 -> 688 bytes icons/clothing/pants/slacks_blue.dmi | Bin 0 -> 761 bytes icons/clothing/pants/slacks_red.dmi | Bin 0 -> 844 bytes icons/clothing/pants/slacks_tan.dmi | Bin 0 -> 708 bytes icons/clothing/shirts/button_up.dmi | Bin 0 -> 1064 bytes icons/clothing/shirts/polo.dmi | Bin 0 -> 500 bytes icons/clothing/under/formalwear.dmi | Bin 1220 -> 0 bytes icons/clothing/under/formalwear_black.dmi | Bin 1277 -> 0 bytes icons/clothing/under/formalwear_blue.dmi | Bin 1431 -> 0 bytes icons/clothing/under/formalwear_red.dmi | Bin 1238 -> 0 bytes icons/clothing/under/formalwear_tan.dmi | Bin 1342 -> 0 bytes maps/exodus/outfits/civilian.dm | 2 +- maps/tradeship/outfits/command.dm | 2 +- mods/content/corporate/_corporate.dme | 3 +- .../corporate/clothing/under/formalwear.dm | 35 ----- .../corporate/clothing/under/security.dm | 5 - .../corporate/clothing/under/shirts.dm | 38 +++++ .../corporate/clothing/under/slacks.dm | 77 +++++++++++ .../corporate/clothing/under/uniforms.dm | 68 --------- mods/content/corporate/datum/loadout.dm | 40 ++++-- .../corporate/icons/clothing/under/polo.dmi | Bin 0 -> 633 bytes .../icons/clothing/under/polo_heph.dmi | Bin 0 -> 642 bytes .../icons/clothing/under/polo_nt.dmi | Bin 0 -> 561 bytes .../icons/clothing/under/polo_zeng.dmi | Bin 0 -> 608 bytes .../corporate/icons/clothing/under/smock.dmi | Bin 837 -> 0 bytes .../icons/clothing/under/smock_exec.dmi | Bin 865 -> 0 bytes .../icons/clothing/under/smock_exec_heph.dmi | Bin 864 -> 0 bytes .../icons/clothing/under/smock_exec_nt.dmi | Bin 805 -> 0 bytes .../icons/clothing/under/smock_exec_zeng.dmi | Bin 845 -> 0 bytes .../icons/clothing/under/smock_heph.dmi | Bin 837 -> 0 bytes .../icons/clothing/under/smock_nt.dmi | Bin 784 -> 0 bytes .../icons/clothing/under/smock_zeng.dmi | Bin 818 -> 0 bytes .../corporate/icons/clothing/under/suit.dmi | Bin 1058 -> 0 bytes .../icons/clothing/under/suit_heph.dmi | Bin 1058 -> 0 bytes .../icons/clothing/under/suit_nt.dmi | Bin 1063 -> 0 bytes .../icons/clothing/under/suit_pcrc.dmi | Bin 769 -> 0 bytes .../icons/clothing/under/suit_zeng.dmi | Bin 1055 -> 0 bytes .../psionics/datum/antagonists/foundation.dm | 2 +- nebula.dme | 2 +- 49 files changed, 307 insertions(+), 278 deletions(-) create mode 100644 code/modules/clothing/pants/slacks.dm create mode 100644 code/modules/clothing/shirts/formal.dm delete mode 100644 code/modules/clothing/under/formalwear.dm create mode 100644 icons/clothing/pants/slacks.dmi create mode 100644 icons/clothing/pants/slacks_black.dmi create mode 100644 icons/clothing/pants/slacks_blue.dmi create mode 100644 icons/clothing/pants/slacks_red.dmi create mode 100644 icons/clothing/pants/slacks_tan.dmi create mode 100644 icons/clothing/shirts/button_up.dmi create mode 100644 icons/clothing/shirts/polo.dmi delete mode 100644 icons/clothing/under/formalwear.dmi delete mode 100644 icons/clothing/under/formalwear_black.dmi delete mode 100644 icons/clothing/under/formalwear_blue.dmi delete mode 100644 icons/clothing/under/formalwear_red.dmi delete mode 100644 icons/clothing/under/formalwear_tan.dmi delete mode 100644 mods/content/corporate/clothing/under/formalwear.dm create mode 100644 mods/content/corporate/clothing/under/shirts.dm create mode 100644 mods/content/corporate/clothing/under/slacks.dm create mode 100644 mods/content/corporate/icons/clothing/under/polo.dmi create mode 100644 mods/content/corporate/icons/clothing/under/polo_heph.dmi create mode 100644 mods/content/corporate/icons/clothing/under/polo_nt.dmi create mode 100644 mods/content/corporate/icons/clothing/under/polo_zeng.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_exec.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_exec_heph.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_exec_nt.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_exec_zeng.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_heph.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_nt.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/smock_zeng.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/suit.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/suit_heph.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/suit_nt.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/suit_pcrc.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/suit_zeng.dmi diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index ee87c93d3d..167c7f70ac 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -38,7 +38,7 @@ /decl/hierarchy/outfit/reaper name = "Reaper" - uniform = /obj/item/clothing/under/formal + uniform = /obj/item/clothing/pants/slacks/outfit shoes = /obj/item/clothing/shoes/color/black gloves = /obj/item/clothing/gloves/thick l_ear = /obj/item/radio/headset diff --git a/code/game/gamemodes/wizard/servant_items/infiltrator.dm b/code/game/gamemodes/wizard/servant_items/infiltrator.dm index 30778b2aa8..9166c65b37 100644 --- a/code/game/gamemodes/wizard/servant_items/infiltrator.dm +++ b/code/game/gamemodes/wizard/servant_items/infiltrator.dm @@ -24,12 +24,6 @@ ARMOR_ENERGY = ARMOR_ENERGY_MINOR ) -/obj/item/clothing/under/lawyer/infil - name = "formal outfit" - desc = "A white dress shirt and navy pants. Snazzy." - icon = 'icons/clothing/under/formal.dmi' - bodytype_equip_flags = BODY_FLAG_HUMANOID - /obj/item/clothing/shoes/dress/infilshoes name = "black leather shoes" desc = "Dress shoes. Their footsteps are dead silent." diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index e01b2d43c8..a8421ac437 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -42,114 +42,116 @@ //SUBCLASSES. Spawn a bunch of items and disappear likewise /obj/abstract/landmark/costume/chameleon/make_costumes() - new /obj/item/clothing/mask/chameleon(src.loc) - new /obj/item/clothing/under/chameleon(src.loc) - new /obj/item/clothing/glasses/chameleon(src.loc) - new /obj/item/clothing/shoes/chameleon(src.loc) - new /obj/item/clothing/gloves/chameleon(src.loc) - new /obj/item/clothing/suit/chameleon(src.loc) - new /obj/item/clothing/head/chameleon(src.loc) - new /obj/item/backpack/chameleon(src.loc) + new /obj/item/clothing/mask/chameleon(loc) + new /obj/item/clothing/under/chameleon(loc) + new /obj/item/clothing/glasses/chameleon(loc) + new /obj/item/clothing/shoes/chameleon(loc) + new /obj/item/clothing/gloves/chameleon(loc) + new /obj/item/clothing/suit/chameleon(loc) + new /obj/item/clothing/head/chameleon(loc) + new /obj/item/backpack/chameleon(loc) /obj/abstract/landmark/costume/gladiator/make_costumes() - new /obj/item/clothing/costume/gladiator(src.loc) - new /obj/item/clothing/head/helmet/gladiator(src.loc) + new /obj/item/clothing/costume/gladiator(loc) + new /obj/item/clothing/head/helmet/gladiator(loc) /obj/abstract/landmark/costume/madscientist/make_costumes() - new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) - new /obj/item/clothing/head/flatcap(src.loc) - new /obj/item/clothing/suit/toggle/labcoat/mad(src.loc) - new /obj/item/clothing/glasses/prescription/gglasses(src.loc) + new /obj/item/clothing/under/gimmick/rank/captain/suit(loc) + new /obj/item/clothing/head/flatcap(loc) + new /obj/item/clothing/suit/toggle/labcoat/mad(loc) + new /obj/item/clothing/glasses/prescription/gglasses(loc) /obj/abstract/landmark/costume/elpresidente/make_costumes() - new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) - new /obj/item/clothing/head/flatcap(src.loc) - new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(src.loc) - new /obj/item/clothing/shoes/jackboots(src.loc) + new /obj/item/clothing/under/gimmick/rank/captain/suit(loc) + new /obj/item/clothing/head/flatcap(loc) + new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(loc) + new /obj/item/clothing/shoes/jackboots(loc) /obj/abstract/landmark/costume/nyangirl/make_costumes() - new /obj/item/clothing/costume/schoolgirl(src.loc) - new /obj/item/clothing/head/kitty(src.loc) + new /obj/item/clothing/costume/schoolgirl(loc) + new /obj/item/clothing/head/kitty(loc) /obj/abstract/landmark/costume/maid/make_costumes() - new /obj/item/clothing/skirt/red/blouse(src.loc) + new /obj/item/clothing/skirt/red/blouse(loc) var/CHOICE = pick(/obj/item/clothing/head/beret, /obj/item/clothing/head/rabbitears) - new CHOICE(src.loc) - new /obj/item/clothing/glasses/blindfold(src.loc) + new CHOICE(loc) + new /obj/item/clothing/glasses/blindfold(loc) /obj/abstract/landmark/costume/butler/make_costumes() - new /obj/item/clothing/under/formal(src.loc) - new /obj/item/clothing/head/that(src.loc) + new /obj/item/clothing/pants/slacks(loc) + new /obj/item/clothing/shirt/button(loc) + new /obj/item/clothing/suit/jacket/waistcoat/black(loc) + new /obj/item/clothing/head/that(loc) /obj/abstract/landmark/costume/prig/make_costumes() - new /obj/item/clothing/suit/jacket/waistcoat/black(src.loc) - new /obj/item/clothing/glasses/eyepatch/monocle(src.loc) + new /obj/item/clothing/suit/jacket/waistcoat/black(loc) + new /obj/item/clothing/glasses/eyepatch/monocle(loc) var/CHOICE= pick( /obj/item/clothing/head/bowler, /obj/item/clothing/head/that) - new CHOICE(src.loc) - new /obj/item/clothing/shoes/color/black(src.loc) - new /obj/item/cane(src.loc) - new /obj/item/clothing/under/sl_suit(src.loc) - new /obj/item/clothing/mask/fakemoustache(src.loc) + new CHOICE(loc) + new /obj/item/clothing/shoes/color/black(loc) + new /obj/item/cane(loc) + new /obj/item/clothing/under/sl_suit(loc) + new /obj/item/clothing/mask/fakemoustache(loc) /obj/abstract/landmark/costume/plaguedoctor/make_costumes() - new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(src.loc) - new /obj/item/clothing/head/plaguedoctorhat(src.loc) + new /obj/item/clothing/suit/bio_suit/plaguedoctorsuit(loc) + new /obj/item/clothing/head/plaguedoctorhat(loc) /obj/abstract/landmark/costume/nightowl/make_costumes() - new /obj/item/clothing/costume/owl(src.loc) - new /obj/item/clothing/mask/gas/owl_mask(src.loc) + new /obj/item/clothing/costume/owl(loc) + new /obj/item/clothing/mask/gas/owl_mask(loc) /obj/abstract/landmark/costume/waiter/make_costumes() - new /obj/item/clothing/under/waiter(src.loc) + new /obj/item/clothing/under/waiter(loc) var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears) - new CHOICE(src.loc) - new /obj/item/clothing/suit/apron(src.loc) + new CHOICE(loc) + new /obj/item/clothing/suit/apron(loc) /obj/abstract/landmark/costume/pirate/make_costumes() - new /obj/item/clothing/costume/pirate(src.loc) - new /obj/item/clothing/suit/pirate(src.loc) + new /obj/item/clothing/costume/pirate(loc) + new /obj/item/clothing/suit/pirate(loc) var/CHOICE = pick( /obj/item/clothing/head/pirate , /obj/item/clothing/mask/bandana/red) - new CHOICE(src.loc) - new /obj/item/clothing/glasses/eyepatch(src.loc) + new CHOICE(loc) + new /obj/item/clothing/glasses/eyepatch(loc) /obj/abstract/landmark/costume/commie/make_costumes() - new /obj/item/clothing/costume/soviet(src.loc) - new /obj/item/clothing/head/ushanka(src.loc) + new /obj/item/clothing/costume/soviet(loc) + new /obj/item/clothing/head/ushanka(loc) /obj/abstract/landmark/costume/imperium_monk/make_costumes() - new /obj/item/clothing/suit/imperium_monk(src.loc) + new /obj/item/clothing/suit/imperium_monk(loc) if (prob(25)) - new /obj/item/clothing/mask/gas/cyborg(src.loc) + new /obj/item/clothing/mask/gas/cyborg(loc) /obj/abstract/landmark/costume/holiday_priest/make_costumes() - new /obj/item/clothing/suit/holidaypriest(src.loc) + new /obj/item/clothing/suit/holidaypriest(loc) /obj/abstract/landmark/costume/marisawizard/fake/make_costumes() - new /obj/item/clothing/head/wizard/marisa/fake(src.loc) - new/obj/item/clothing/suit/wizrobe/marisa/fake(src.loc) + new /obj/item/clothing/head/wizard/marisa/fake(loc) + new/obj/item/clothing/suit/wizrobe/marisa/fake(loc) /obj/abstract/landmark/costume/cutewitch/make_costumes() - new /obj/item/clothing/dress/sun(src.loc) - new /obj/item/clothing/head/witchwig(src.loc) - new /obj/item/staff/broom(src.loc) + new /obj/item/clothing/dress/sun(loc) + new /obj/item/clothing/head/witchwig(loc) + new /obj/item/staff/broom(loc) /obj/abstract/landmark/costume/fakewizard/make_costumes() - new /obj/item/clothing/suit/wizrobe/fake(src.loc) - new /obj/item/clothing/head/wizard/fake(src.loc) - new /obj/item/staff/(src.loc) + new /obj/item/clothing/suit/wizrobe/fake(loc) + new /obj/item/clothing/head/wizard/fake(loc) + new /obj/item/staff/(loc) /obj/abstract/landmark/costume/sexyclown/make_costumes() - new /obj/item/clothing/mask/gas/sexyclown(src.loc) - new /obj/item/clothing/costume/sexyclown(src.loc) + new /obj/item/clothing/mask/gas/sexyclown(loc) + new /obj/item/clothing/costume/sexyclown(loc) /obj/abstract/landmark/costume/sexymime/make_costumes() - new /obj/item/clothing/mask/gas/sexymime(src.loc) - new /obj/item/clothing/costume/sexymime(src.loc) + new /obj/item/clothing/mask/gas/sexymime(loc) + new /obj/item/clothing/costume/sexymime(loc) /obj/abstract/landmark/costume/savagehunter/make_costumes() - new /obj/item/clothing/mask/spirit(src.loc) - new /obj/item/clothing/costume/savage_hunter(src.loc) + new /obj/item/clothing/mask/spirit(loc) + new /obj/item/clothing/costume/savage_hunter(loc) /obj/abstract/landmark/costume/savagehuntress/make_costumes() - new /obj/item/clothing/mask/spirit(src.loc) - new /obj/item/clothing/costume/savage_hunter/female(src.loc) + new /obj/item/clothing/mask/spirit(loc) + new /obj/item/clothing/costume/savage_hunter/female(loc) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 8bc71e913a..6b85d15203 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -290,15 +290,15 @@ /obj/structure/closet/wardrobe/suit/WillContain() return list( - /obj/item/clothing/under/formal/charcoal, - /obj/item/clothing/under/formal/navy, - /obj/item/clothing/under/formal/burgundy, - /obj/item/clothing/under/formal/checkered, - /obj/item/clothing/under/formal/tan, - /obj/item/clothing/under/formal/red, + /obj/item/clothing/pants/slacks, + /obj/item/clothing/pants/slacks/outfit/tie, + /obj/item/clothing/pants/slacks/tan/outfit, + /obj/item/clothing/pants/slacks/red/outfit, + /obj/item/clothing/pants/slacks/black/outfit, + /obj/item/clothing/pants/slacks/black/outfit/navy, + /obj/item/clothing/pants/slacks/black/outfit/burgundy, + /obj/item/clothing/pants/slacks/black/outfit/checkered, /obj/item/clothing/under/sl_suit, - /obj/item/clothing/under/formal, - /obj/item/clothing/under/formal/tie, /obj/item/clothing/under/scratch, /obj/item/clothing/under/internalaffairs/plain, /obj/item/clothing/suit/jacket/black, diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 8f8c031ec3..beed133237 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -28,6 +28,7 @@ . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( + /obj/item/clothing/shirt/button, /obj/item/clothing/shirt/ubac, /obj/item/clothing/shirt/ubac/blue, /obj/item/clothing/shirt/ubac/tan, @@ -45,20 +46,12 @@ LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( /obj/item/clothing/under/sl_suit, - /obj/item/clothing/under/formal, /obj/item/clothing/under/lawyer/blue, - /obj/item/clothing/under/formal/burgundy, - /obj/item/clothing/under/formal/charcoal, - /obj/item/clothing/under/formal/checkered, - /obj/item/clothing/under/formal/tie, /obj/item/clothing/under/gentlesuit, - /obj/item/clothing/under/formal/navy, /obj/item/clothing/under/lawyer/oldman, /obj/item/clothing/under/lawyer/purpsuit, - /obj/item/clothing/under/formal/red, /obj/item/clothing/under/lawyer/red, /obj/item/clothing/under/lawyer, - /obj/item/clothing/under/formal/tan, /obj/item/clothing/under/scratch, /obj/item/clothing/under/lawyer/bluesuit, /obj/item/clothing/under/internalaffairs/plain, diff --git a/code/modules/clothing/pants/slacks.dm b/code/modules/clothing/pants/slacks.dm new file mode 100644 index 0000000000..d189c8f260 --- /dev/null +++ b/code/modules/clothing/pants/slacks.dm @@ -0,0 +1,80 @@ +/obj/item/clothing/pants/slacks + name = "grey slacks" + desc = "Crisp grey slacks. Moderately formal." + icon = 'icons/clothing/pants/slacks.dmi' + +/obj/item/clothing/pants/slacks/outfit + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/suit/jacket/waistcoat/black + ) + +/obj/item/clothing/pants/slacks/outfit/tie + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/suit/jacket/waistcoat/black, + /obj/item/clothing/neck/tie/long/red + ) + +/obj/item/clothing/pants/slacks/tan + name = "tan slacks" + desc = "Crisp tan slacks. Moderately formal. Careful with the mustard." + icon = 'icons/clothing/pants/slacks_tan.dmi' + +/obj/item/clothing/pants/slacks/tan/outfit + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/long/yellow, + /obj/item/clothing/suit/jacket/tan + ) + +/obj/item/clothing/pants/slacks/blue + name = "blue slacks" + desc = "Crisp blue slacks. Moderately formal." + icon = 'icons/clothing/pants/slacks_blue.dmi' + +/obj/item/clothing/pants/slacks/red + name = "red slacks" + desc = "Crisp red slacks. Moderately formal." + icon = 'icons/clothing/pants/slacks_red.dmi' + +/obj/item/clothing/pants/slacks/red/outfit + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/navy, + /obj/item/clothing/suit/jacket/charcoal + ) + +/obj/item/clothing/pants/slacks/black + name = "black slacks" + desc = "Crisp black slacks. Very formal." + icon = 'icons/clothing/pants/slacks_black.dmi' + +/obj/item/clothing/pants/slacks/black/outfit + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/navy, + /obj/item/clothing/suit/jacket/charcoal + ) + +/obj/item/clothing/pants/slacks/black/outfit/navy + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/red, + /obj/item/clothing/suit/jacket/navy + ) + +/obj/item/clothing/pants/slacks/black/outfit/burgundy + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/black, + /obj/item/clothing/suit/jacket/burgundy + ) + +/obj/item/clothing/pants/slacks/black/outfit/checkered + desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/black, + /obj/item/clothing/suit/jacket/checkered + ) diff --git a/code/modules/clothing/shirts/formal.dm b/code/modules/clothing/shirts/formal.dm new file mode 100644 index 0000000000..edebba63cc --- /dev/null +++ b/code/modules/clothing/shirts/formal.dm @@ -0,0 +1,4 @@ +/obj/item/clothing/shirt/button + name = "button-up shirt" + desc = "A crisply pressed white button-up shirt. Somewhat formal." + icon = 'icons/clothing/shirts/button_up.dmi' diff --git a/code/modules/clothing/under/formalwear.dm b/code/modules/clothing/under/formalwear.dm deleted file mode 100644 index 1f5436ca16..0000000000 --- a/code/modules/clothing/under/formalwear.dm +++ /dev/null @@ -1,62 +0,0 @@ -/obj/item/clothing/under/formal - name = "formal suit" - desc = "Crisp slacks and a white button-down shirt. Moderately formal." - icon = 'icons/clothing/under/formalwear.dmi' - starting_accessories = list( - /obj/item/clothing/suit/jacket/waistcoat/black - ) - -/obj/item/clothing/under/formal/tie - starting_accessories = list( - /obj/item/clothing/suit/jacket/waistcoat/black, - /obj/item/clothing/neck/tie/long/red - ) - -/obj/item/clothing/under/formal/blue - desc = "Blue slacks and a white button-down shirt. Moderately formal." - icon = 'icons/clothing/under/formalwear_blue.dmi' - -/obj/item/clothing/under/formal/red - desc = "Red slacks and a white shirt. Somewhat formal." - icon = 'icons/clothing/under/formalwear_red.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/navy, - /obj/item/clothing/suit/jacket/charcoal - ) - -/obj/item/clothing/under/formal/charcoal - icon = 'icons/clothing/under/formalwear_black.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/navy, - /obj/item/clothing/suit/jacket/charcoal - ) - -/obj/item/clothing/under/formal/navy - icon = 'icons/clothing/under/formalwear_black.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/red, - /obj/item/clothing/suit/jacket/navy - ) - -/obj/item/clothing/under/formal/burgundy - icon = 'icons/clothing/under/formalwear_black.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/black, - /obj/item/clothing/suit/jacket/burgundy - ) - -/obj/item/clothing/under/formal/checkered - desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" - icon = 'icons/clothing/under/formalwear_black.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/black, - /obj/item/clothing/suit/jacket/checkered - ) - -/obj/item/clothing/under/formal/tan - desc = "Tan slacks and a white button-down shirt. Moderately formal. Careful with the mustard." - icon = 'icons/clothing/under/formalwear_tan.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/long/yellow, - /obj/item/clothing/suit/jacket/tan - ) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 9252f63aa2..cccfbf560a 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -173,7 +173,7 @@ /datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/carbon/human/H) if(H.gender == MALE) - equipment = list(/obj/item/clothing/under/lawyer/infil = slot_w_uniform_str, + equipment = list(/obj/item/clothing/pants/slacks/outfit/tie = slot_w_uniform_str, /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) spells += /spell/toggle_armor/infiltrator else diff --git a/icons/clothing/pants/slacks.dmi b/icons/clothing/pants/slacks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f53e77363847bf8a7686968ab885563ca478674e GIT binary patch literal 767 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&c?bA}xE?rg0LT;+6x7hru(PwP ztE+QxaEOhKjfjXyO-&652&k&6^78Vsva&KWGt0@zsjRHDx3~B6^K)}^b9Z+)G&I!F z(NR%R0h(i0vGESjEXI-`zhDN3XE)M-oEcRi5hX6E#mPmP1tppJc?=8{bArPPib}tK z2`>2f^@*0ZuGYCT=Yuzd8eBAf@JQ#pkLF2+qMqIz7REuwmyNv?<~*8oWKxJi@JgHg z8tSf{-Nve$S4f;NfAYvj+v|*P>xPG`jJ%44KYua~7Mb)ZSgW+V_>=de(~rGB8(sd? zT_iZmx8vFz;rSD1On2%#r?kgvs%XsLm;({sOvppQnpsNX4ADGaB=n z3f{H% zo@2fI^IXaNxrTH1w@l+!P|OXk{`&9P->HAOqOVul@87?}_wB=)-#g}V+owF-v}FH} z38(lCnRIv+a)L8$SYO;(#Bj+>^jL7ikw5={P62|3e2xE`mpzZF=QJ^lcGds?_xZ{@ z_C33JXC8XQk{h)AoJ9B(@h(fp8ZLq2|2rx;Z#}40|JtuOtK{Dcv(VY|9|TQPfA#yw zK4sDD)vN|CJ0&LuMC&$Gnh0lSvvTyOIj%U%`@qVQVX5kW*@TeUojD&?-u(O7j>}-x zT6W$JQ?LU**v~Y&fBo*B{Zm-WPSwO;-|w_=`I&NwfG3Z_HaabgJbm?t{q`-_mKt-lH8G}UX-Z8aa n`|;oEJ(tPDkL$p;f(eJ?;^ysYmL`+dTY>nVu6{1-oD!M2i literal 0 HcmV?d00001 diff --git a/icons/clothing/pants/slacks_black.dmi b/icons/clothing/pants/slacks_black.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0c7508ace72ffb4ac134ff6d4cd99a189e884fb6 GIT binary patch literal 688 zcmV;h0#E&kP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-G zsxnG*6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*lauJ$Mh}N7FpOKiCLXOTNygHQ?T>V_Y z;Q#=FT~iU1E`|C400EFmL_t(&f$f$-PQx$|MGcE7f>Y4kfGeQhfCG4CS1OCH>@Hcg zLA?Y=U==EL&$&oiHJKS3CnhY2n76XW@%Pvh>5o!^Ap9a%#p3aPi~u-m+$e$awcL&q zaGP-gJ8h>f;I+k7;AOoo=EWS%Z0bJ6TZf*=V0gU*YG02kx!A}$E^9B1iyofoU` z`T?AyJ#8SX$bsYi0M4=Ysu?pY?7;DU0O#149TULz74HW~)YSVmUvF3A{Q!wVV7J(T z<7P^tHaLPW2MN$C0000sP)t-sz`(!& z000pY5hy4qK0ZEvetrNbPyjJm05VztMvMS5ZU97#06dI(dU^mne*iC604r0#z`*fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j) z$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*lauJ$Mh}N7FpOKiC zLXOTNygHQ?T>V_Y;Q#=FT~iU1E`|C400GTOL_t(|ob8wmZ-OusMG>5Ryv^$W|Fvri zX2JFLgQ8uQdm@;$m3ITYnA2e(gb+gh5T|iEf1IcB)GNTn$U?6GW}attN4EentBUGp z&j2!relbA502%@)3Xp5lah%3*fca}!`$L7M7kU($6xQNm3o;=Lt+g|GOV0%*%WO|DHJ^Qa5lYpk{@ zK&DO2I)8&#xSM`|wS*8t2qA?0Cq%<}JLXR<(zD>@-+y1z^?z4eGc_l0Zf(88U($<0 zosEFW9O}34uek(@)$3=;u=V`dSVMyJMa1t>gpVZ0_6D%I0AU|QpY}mwV><&B2)ujN z`W!Phwl6@!zE|`?W^8W&o6!5EnBOXLPg^r%yAzmuK7d35JdeGO*k)npeSSg+A%qZe zATjej?&AKG5x2Ke~%03Joo{#{bb>EK+D-xi$We z*A^*s+;VIDKe4tzp^@d*_&;1*qR`NCYy2OrEm3G>xi$U|*A^)>u-qE|$7>rDy2k%s rvsX|Po_hs^5JCtcgb+dqA$5EMCbk@l0+k>V00000NkvXXu0mjfLzGgT literal 0 HcmV?d00001 diff --git a/icons/clothing/pants/slacks_red.dmi b/icons/clothing/pants/slacks_red.dmi new file mode 100644 index 0000000000000000000000000000000000000000..efe4e8d6f46418d3db3fbf1ef068aa943fed8647 GIT binary patch literal 844 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&RRs8ixE?rg0LT;+6x7hru(PwP ztEs#F8c4ttI~6V6V1j&L>ZUVG8ieliO@Bo9Q$rRwq* zn{%cba;6z__HeQ7=I1=f&-q!4ySuwPD=TXUA4ei5yOotyLqh}5qGAr#IXvw4_Vz&b ztP|HIfEF{B1o;IsI6S+N2IS1B3W+FjNi9w;$}A|!%+CWlaZYepK~d@VFTn*Lzdq6O z*3~+9=6vvmP=kxc4<6~9_t8AbP}I}A!@@Yo__DE=!kkBwj!X(s2wrKkUqjusv)fp8 z^9qR*=1(5^XnURUZQby2m62Dm@aIp)!6K7B1#6Xd7k~18bo#OPXQRuXx{Cy7`F32J zBRqfNjOk8&=alwXO%;v#8*|_x14C16u;3KE)?YyP-t%;E45^s&cE;%V=;b8e>G==Z3TnZgA0TAiTq@ws-svFV>yFx=Z5 zU%#hbHsRX?hIyX^9!z9xl4PC18pH5%hE?C|EAeS{ar%q0H!yabK5&M6d5U1$LnEGe zu`@Ly+EbUTEp#xWYkK;vbT`iphOE6(m*Q(Yp0-Oc zwy_EHtu*mxoKz72G@0wONW+W!@<5jW!H3>+uQo=mZu8l`X4|4k|6i5gyICLp{pL%z zw^?Znf-8d;h1}89w_5+s7KpCgoF^6FgFf0osGm5XMd{cN6f zgX6h3j5%<6iJ(-mJSeAGiE>-6wzVzRdyO&D)~RGZZSZXz(BX_%}kv zYvDEFn-9Ew|C`o&FEo>T>RJCHSo0d#RR``bIa~9-{A1ROuoq^Z_r}*Vx8@n&KkZ^F z@ymXDHyhX4sCB*ni+5)%y0GTytsg)kH?Ff0K%vjsy&}8L*1Y|*KY4AV)BOE9-|wjJ z*)nbS4^xo3`rmr9G)=O1n*BS!)-)*NSW)hu`SI2c3v>U}&nag$d-!o3*m8&q`ur_i UT*E9`ogRSrp00i_>zopr05OnncmMzZ literal 0 HcmV?d00001 diff --git a/icons/clothing/pants/slacks_tan.dmi b/icons/clothing/pants/slacks_tan.dmi new file mode 100644 index 0000000000000000000000000000000000000000..af53bdbc82bf60360798b827db8b82686407ea8e GIT binary patch literal 708 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 ADF6Tf diff --git a/icons/clothing/under/formalwear_tan.dmi b/icons/clothing/under/formalwear_tan.dmi deleted file mode 100644 index f1fbf3c8a20612b0bdb93f878ca2648ce3128b69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1342 zcmV-E1;P4>P)004jp0{{R3ySU3y=jV8M zc)Pi|#l^+6w6uU~P~hO;0000H5fLaTC_X+uetv$1Zd7nwMu>4%i*#6pZc}k_alpX9 zKR-W%Mlo$XD={%KEG#S}BqYGVzbx6>xWUaw}CH6(F89pqS+rf%LbAza6WOS(L8ioAtsfu#3~1}P;mx^V&Nla6Dfyl z{-xVP<+MBT0+SRopX{azXh~c$PT@} zQtAUx5i?vEQ_AvIk|Wge77C0(N0_JtHntP8FED^!Kl=d8Fy8`hOjQ|kM^Et1*oqAX zX!lS2`M6hq?{Jo%DF9R%<~zXBR2q(uo}e`=Q=))bBDx8=cNh4Xn_!0d4p3%N!wJ$8 zgnK|k5e6ug6y1c}yGS3tlC1;WChi>usHD{432F&N)Pn}@bC?kQl<4)h%4$pbYfG&+ zp$Tp*JUog>0H*+8*#EY5A_46JXB?Pdsk=f%b^YC{t_lDCVfXmsarbZ^@E-%dJ2~5f z0<_J$LJY8}tr`ljc=Do-sMznDw%PAVzY(Hs+k!sg0&F1~s-OnjeN)$i_hfe<0h+dG z8?wJE2=IBr!1eXv00V@D1Z(fNu%gI=}}7bxZRJd%k`l0SdcE05Iqe2J909 z4hB3N3cpGMA{z3K-XA^*$Ds><`boZ17d zysFCVvNQf8|HJ*?`5)S0u~<~v-X_!*_WscolwAZUKIMOe-{pU}?7q4L2xd3aGBm;R3_zK>6>+Yf|9$X1+aD=H zc=i0x1DY30XfVKQ=YO8hER|48gAiUl|MP&EG0MP-0?r`4lF|W6^oZvGD5L_wfBq0N zAHd_uJ?l2!MCVSuy9|Bk!2_n+@?7~o8_^SU+$i^XEGSS%Kc#rlGx zlc{+qkW3BjJWgLSnTqL;or3?}^H4%EnTqL;o`N*?`WGydivuK*shIxQDTFe)I6^#` zis_HmhBCQGLNu9*>5tb2GPx*G$y7{#yq3=7;sB{+DyBbH8_47$0r6xiraxL6$mHTg zBvUc{(b}mqxtRWV?bMlEOn=S?Su7Td#bU8otp8LaMO>3GSxTe!c5!YlIE8?0=qeWa(iT~}4#rl%^1)j%g4{a>yzW@LL07*qoM6N<$f=3mK ADgXcg diff --git a/maps/exodus/outfits/civilian.dm b/maps/exodus/outfits/civilian.dm index 6507cd8cfd..f0bad0a08c 100644 --- a/maps/exodus/outfits/civilian.dm +++ b/maps/exodus/outfits/civilian.dm @@ -39,7 +39,7 @@ /decl/hierarchy/outfit/job/librarian name = "Job - Librarian" - uniform = /obj/item/clothing/under/formal/red + uniform = /obj/item/clothing/pants/slacks/red/outfit id_type = /obj/item/card/id/civilian pda_type = /obj/item/modular_computer/pda diff --git a/maps/tradeship/outfits/command.dm b/maps/tradeship/outfits/command.dm index e9cd7c1908..7b39ba89c6 100644 --- a/maps/tradeship/outfits/command.dm +++ b/maps/tradeship/outfits/command.dm @@ -19,7 +19,7 @@ /decl/hierarchy/outfit/job/tradeship/mate name = "Tradeship - Job - Tradehouse First Mate" - uniform = /obj/item/clothing/under/formal/checkered + uniform = /obj/item/clothing/pants/slacks/black/outfit/checkered shoes = /obj/item/clothing/shoes/dress glasses = /obj/item/clothing/glasses/sunglasses/big pda_type = /obj/item/modular_computer/pda/cargo diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 0cea617b2b..3a62ba3a91 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -22,9 +22,10 @@ #include "clothing\suit\jackets.dm" #include "clothing\suit\labcoats.dm" #include "clothing\suit\ponchos.dm" -#include "clothing\under\formalwear.dm" #include "clothing\under\jumpsuits.dm" #include "clothing\under\security.dm" +#include "clothing\under\shirts.dm" +#include "clothing\under\slacks.dm" #include "clothing\under\uniforms.dm" #include "datum\ai_icons.dm" #include "datum\ai_laws.dm" diff --git a/mods/content/corporate/clothing/under/formalwear.dm b/mods/content/corporate/clothing/under/formalwear.dm deleted file mode 100644 index 7dc8cf05d6..0000000000 --- a/mods/content/corporate/clothing/under/formalwear.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/clothing/under/formal/corp - name = "\improper EXO executive suit" - desc = "A set of Expeditionary Corps Organisation-issued suit pants and shirt that particularly enthusiastic company executives tend to wear." - icon = 'mods/content/corporate/icons/clothing/under/suit.dmi' - starting_accessories = list( - /obj/item/clothing/suit/jacket/corp, - /obj/item/clothing/neck/tie/corp - ) - -/obj/item/clothing/under/formal/corp/nanotrasen - name = "\improper NanoTrasen executive suit" - desc = "A set of NanoTrasen-issued suit pants and shirt that particularly enthusiastic company executives tend to wear." - icon = 'mods/content/corporate/icons/clothing/under/suit_nt.dmi' - starting_accessories = list( - /obj/item/clothing/suit/jacket/corp/nanotrasen, - /obj/item/clothing/neck/tie/corp/nanotrasen - ) - -/obj/item/clothing/under/formal/corp/heph - name = "\improper Hephaestus executive suit" - desc = "A set of Hephaestus Industries-issued suit pants and shirt that particularly enthusiastic company executives tend to wear." - icon = 'mods/content/corporate/icons/clothing/under/suit_heph.dmi' - starting_accessories = list( - /obj/item/clothing/suit/jacket/corp/heph, - /obj/item/clothing/neck/tie/corp/heph - ) - -/obj/item/clothing/under/formal/corp/zeng - name = "\improper Zeng-Hu executive suit" - desc = "A set of Zeng-Hu Pharmaceuticals-issued suit pants and shirt that particularly enthusiastic company executives tend to wear." - icon = 'mods/content/corporate/icons/clothing/under/suit_zeng.dmi' - starting_accessories = list( - /obj/item/clothing/suit/jacket/corp/zeng, - /obj/item/clothing/neck/tie/corp/zeng - ) diff --git a/mods/content/corporate/clothing/under/security.dm b/mods/content/corporate/clothing/under/security.dm index 747442b084..bf58bea5d6 100644 --- a/mods/content/corporate/clothing/under/security.dm +++ b/mods/content/corporate/clothing/under/security.dm @@ -30,8 +30,3 @@ name = "\improper PCRC uniform" desc = "A uniform belonging to Proxima Centauri Risk Control, a private security firm." icon = 'mods/content/corporate/icons/clothing/under/pcrc.dmi' - -/obj/item/clothing/under/guard/pcrcsuit - name = "\improper PCRC suit" - desc = "A suit belonging to Proxima Centauri Risk Control, a private security firm. This one looks more formal than its utility counterpart." - icon = 'mods/content/corporate/icons/clothing/under/suit_pcrc.dmi' diff --git a/mods/content/corporate/clothing/under/shirts.dm b/mods/content/corporate/clothing/under/shirts.dm new file mode 100644 index 0000000000..de649591d2 --- /dev/null +++ b/mods/content/corporate/clothing/under/shirts.dm @@ -0,0 +1,38 @@ +/obj/item/clothing/shirt/polo/corp + name = "\improper EXO polo shirt" + desc = "A fashionable polo shirt made from patented biohazard-resistant synthetic fabrics." + icon = 'mods/content/corporate/icons/clothing/under/polo.dmi' + permeability_coefficient = 0.50 + armor = list( + ARMOR_BIO = ARMOR_BIO_MINOR + ) + +/obj/item/clothing/shirt/polo/corp/nanotrasen + name = "\improper NanoTrasen polo shirt" + desc = "A fashionable polo belonging to NanoTrasen, a megacorporation primarily concerned with the research of new and dangerous technologies." + icon = 'mods/content/corporate/icons/clothing/under/polo_nt.dmi' + +/obj/item/clothing/shirt/polo/corp/heph + name = "\improper Hephaestus polo shirt" + desc = "A fashionable polo shirt belonging to Hephaestus Industries, a megacorporation primarily concerned with the research and production of weapon systems." + icon = 'mods/content/corporate/icons/clothing/under/polo_heph.dmi' + +/obj/item/clothing/shirt/polo/corp/zeng + name = "\improper Zeng-Hu polo shirt" + desc = "A fashionable polo shirt belonging to Zeng-Hu Pharmaceuticals, a megacorporation primarily concerned with the research and production of medical equipment and pharmaceuticals." + icon = 'mods/content/corporate/icons/clothing/under/polo_zeng.dmi' + +/obj/item/clothing/shirt/button/corp + name = "\improper EXO button-up shirt" + desc = "A monogrammed Expeditionary Corps Organisation-issued shirt that particularly enthusiastic company executives tend to wear." + +/obj/item/clothing/shirt/button/corp/nt + name = "\improper NanoTrasen button-up shirt" + desc = "A monogrammed NanoTrasen-issued shirt that particularly enthusiastic company executives tend to wear." +/obj/item/clothing/shirt/button/corp/heph + name = "\improper Hephaestus button-up shirt" + desc = "A monogrammed Hephaestus Industries-issued shirt that particularly enthusiastic company executives tend to wear." + +/obj/item/clothing/shirt/button/corp/zeng + name = "\improper Zeng-Hu button-up shirt" + desc = "A monogrammed Zeng-Hu Pharmaceuticals-issued shirt that particularly enthusiastic company executives tend to wear." diff --git a/mods/content/corporate/clothing/under/slacks.dm b/mods/content/corporate/clothing/under/slacks.dm new file mode 100644 index 0000000000..a23407579e --- /dev/null +++ b/mods/content/corporate/clothing/under/slacks.dm @@ -0,0 +1,77 @@ +/obj/item/clothing/pants/slacks/white/corp + +/obj/item/clothing/pants/slacks/white/corp/polo + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp, + /obj/item/clothing/shirt/tunic/corp + ) + +/obj/item/clothing/pants/slacks/white/corp/nanotrasen + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp/nanotrasen, + /obj/item/clothing/shirt/tunic/corp/nanotrasen + ) + +/obj/item/clothing/pants/slacks/white/corp/polo/heph + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp/heph, + /obj/item/clothing/shirt/tunic/corp/heph + ) + +/obj/item/clothing/pants/slacks/white/corp/zeng + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp/zeng, + /obj/item/clothing/shirt/tunic/corp/zeng + ) + +/obj/item/clothing/pants/slacks/black/corp + starting_accessories = list( + /obj/item/clothing/shirt/button/corp, + /obj/item/clothing/suit/jacket/corp, + /obj/item/clothing/neck/tie/corp + ) +/obj/item/clothing/pants/slacks/black/corp/nanotrasen + starting_accessories = list( + /obj/item/clothing/shirt/button/corp/nt, + /obj/item/clothing/suit/jacket/corp/nanotrasen, + /obj/item/clothing/neck/tie/corp/nanotrasen + ) + +/obj/item/clothing/pants/slacks/black/corp/heph + starting_accessories = list( + /obj/item/clothing/shirt/button/corp/heph, + /obj/item/clothing/suit/jacket/corp/heph, + /obj/item/clothing/neck/tie/corp/heph + ) + +/obj/item/clothing/pants/slacks/black/corp/zeng + starting_accessories = list( + /obj/item/clothing/shirt/button/corp/zeng, + /obj/item/clothing/suit/jacket/corp/zeng, + /obj/item/clothing/neck/tie/corp/zeng + ) + + +/obj/item/clothing/pants/slacks/black/corp/polo + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp, + /obj/item/clothing/shirt/tunic/corp/exec + ) + +/obj/item/clothing/pants/slacks/black/corp/nanotrasen + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp/nanotrasen, + /obj/item/clothing/shirt/tunic/corp/exec/nanotrasen + ) + +/obj/item/clothing/pants/slacks/black/corp/heph + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp/heph, + /obj/item/clothing/shirt/tunic/corp/exec/heph + ) + +/obj/item/clothing/pants/slacks/black/corp/zeng + starting_accessories = list( + /obj/item/clothing/shirt/polo/corp/zeng, + /obj/item/clothing/shirt/tunic/corp/exec/zeng + ) diff --git a/mods/content/corporate/clothing/under/uniforms.dm b/mods/content/corporate/clothing/under/uniforms.dm index c2a4a53ee7..13583d8cdf 100644 --- a/mods/content/corporate/clothing/under/uniforms.dm +++ b/mods/content/corporate/clothing/under/uniforms.dm @@ -7,26 +7,6 @@ ARMOR_BIO = ARMOR_BIO_MINOR ) -/obj/item/clothing/under/polo - name = "\improper EXO polo and pants" - desc = "A fashionable polo and pair of trousers made from patented biohazard-resistant synthetic fabrics." - icon = 'mods/content/corporate/icons/clothing/under/smock.dmi' - permeability_coefficient = 0.50 - armor = list( - ARMOR_BIO = ARMOR_BIO_MINOR - ) - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp - ) - -/obj/item/clothing/under/executive - name = "\improper EXO polo and pants" - desc = "A fashionable polo and pair of trousers made from expensive biohazard-resistant fabrics. The colors denote the wearer as a Expeditionary Corps Organisation higher-up." - icon = 'mods/content/corporate/icons/clothing/under/smock_exec.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/exec - ) - /obj/item/clothing/under/pilot name = "green flight suit" desc = "A sleek green Expeditionary Corps Organisation flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." @@ -36,22 +16,6 @@ name = "beige and red coveralls" icon = 'mods/content/corporate/icons/clothing/under/work_nt.dmi' -/obj/item/clothing/under/polo/nanotrasen - name = "\improper NanoTrasen polo and pants" - desc = "A fashionable polo and pair of trousers belonging to NanoTrasen, a megacorporation primarily concerned with the research of new and dangerous technologies." - icon = 'mods/content/corporate/icons/clothing/under/smock_nt.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/nanotrasen - ) - -/obj/item/clothing/under/executive/nanotrasen - name = "\improper NanoTrasen polo and pants" - desc = "A fashionable polo and pair of trousers made from expensive biohazard-resistant fabrics. The colors denote the wearer as a NanoTrasen higher-up." - icon = 'mods/content/corporate/icons/clothing/under/smock_exec_nt.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/exec/nanotrasen - ) - /obj/item/clothing/under/pilot/nanotrasen name = "red flight suit" desc = "A sleek red NanoTrasen flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." @@ -61,22 +25,6 @@ name = "grey and cyan coveralls" icon = 'mods/content/corporate/icons/clothing/under/work_heph.dmi' -/obj/item/clothing/under/polo/heph - name = "\improper Hephaestus polo and pants" - desc = "A fashionable polo and pair of trousers belonging to Hephaestus Industries, a megacorporation primarily concerned with the research and production of weapon systems." - icon = 'mods/content/corporate/icons/clothing/under/smock_heph.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/heph - ) - -/obj/item/clothing/under/executive/heph - name = "\improper Hephaestus polo and pants" - desc = "A fashionable polo and pair of trousers made from expensive biohazard-resistant fabrics. The colors denote the wearer as a Hephaestus Industries higher-up." - icon = 'mods/content/corporate/icons/clothing/under/smock_exec_heph.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/exec/heph - ) - /obj/item/clothing/under/pilot/heph name = "cyan flight suit" desc = "A sleek cyan Hephaestus Industries flight suit. It proudly sports three different patches with corporate logos on them, as well as several unnecessary looking flaps and pockets for effect." @@ -87,22 +35,6 @@ name = "beige and gold coveralls" icon = 'mods/content/corporate/icons/clothing/under/work_zeng.dmi' -/obj/item/clothing/under/polo/zeng - name = "\improper Zeng-Hu polo and pants" - desc = "A fashionable polo and pair of trousers belonging to Zeng-Hu Pharmaceuticals, a megacorporation primarily concerned with the research and production of medical equipment and pharmaceuticals." - icon = 'mods/content/corporate/icons/clothing/under/smock_zeng.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/zeng - ) - -/obj/item/clothing/under/executive/zeng - name = "\improper Zeng-Hu polo and pants" - desc = "A fashionable polo and pair of trousers made from expensive biohazard-resistant fabrics. The colors denote the wearer as a Zeng-Hu Pharmaceuticals higher-up." - icon = 'mods/content/corporate/icons/clothing/under/smock_exec_zeng.dmi' - starting_accessories = list( - /obj/item/clothing/shirt/tunic/corp/exec/zeng - ) - /obj/item/clothing/under/grayson name = "\improper Grayson overalls" desc = "A set of overalls belonging to Grayson Manufactories, a manufacturing and mining company." diff --git a/mods/content/corporate/datum/loadout.dm b/mods/content/corporate/datum/loadout.dm index 07d6990c48..a1f70428c2 100644 --- a/mods/content/corporate/datum/loadout.dm +++ b/mods/content/corporate/datum/loadout.dm @@ -26,32 +26,33 @@ name = "corporate uniform selection" path = /obj/item/clothing/under +/decl/loadout_option/uniform/corp_polo + name = "corporate polo selection" + path = /obj/item/clothing/shirt/polo/corp + loadout_flags = GEAR_HAS_TYPE_SELECTION + +/decl/loadout_option/uniform/corp_tunic + name = "corporate tunic selection" + path = /obj/item/clothing/shirt/tunic/corp + loadout_flags = GEAR_HAS_TYPE_SELECTION + /decl/loadout_option/uniform/corporate/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( - /obj/item/clothing/under/polo/nanotrasen, - /obj/item/clothing/under/polo/heph, - /obj/item/clothing/under/polo/zeng, - /obj/item/clothing/under/mbill, - /obj/item/clothing/under/saare, /obj/item/clothing/jumpsuit/aether, /obj/item/clothing/jumpsuit/hephaestus, - /obj/item/clothing/under/guard/pcrc, - /obj/item/clothing/under/guard/pcrcsuit, /obj/item/clothing/jumpsuit/wardt, - /obj/item/clothing/under/grayson, /obj/item/clothing/jumpsuit/focal, + /obj/item/clothing/under/mbill, + /obj/item/clothing/under/saare, + /obj/item/clothing/under/guard/pcrc, + /obj/item/clothing/under/grayson, /obj/item/clothing/under/morpheus, /obj/item/clothing/under/skinner, /obj/item/clothing/under/dais ) -/decl/loadout_option/uniform/corp_exec - name = "corporate colours, senior researcher" - path = /obj/item/clothing/under/executive - loadout_flags = GEAR_HAS_TYPE_SELECTION - /decl/loadout_option/uniform/corp_overalls name = "corporate colours, coveralls" path = /obj/item/clothing/under/work @@ -62,9 +63,18 @@ path = /obj/item/clothing/under/pilot loadout_flags = GEAR_HAS_TYPE_SELECTION +/decl/loadout_option/uniform/corp_exec_shirt + name = "corporate colours, slacks" + path = /obj/item/clothing/shirt/button/corp + /decl/loadout_option/uniform/corp_exec_jacket - name = "corporate colours, liason suit" - path = /obj/item/clothing/under/formal/corp + path = /obj/item/clothing/suit/jacket/corp + slot = slot_tie_str + loadout_flags = GEAR_HAS_TYPE_SELECTION + +/decl/loadout_option/uniform/corp_exec_tie + path = /obj/item/clothing/neck/tie/corp + slot = slot_tie_str loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/suit/nanotrasen_poncho diff --git a/mods/content/corporate/icons/clothing/under/polo.dmi b/mods/content/corporate/icons/clothing/under/polo.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c2bf51629553c77364e190e58a5f904c15caa5e9 GIT binary patch literal 633 zcmV-<0*3vGP)O|A`oyx|NsBf(b2WFwF)*N6lp;cSvU<}IsX6u($Ue*%*>>uq@tptz`($!qM~59 z#drV!00DGTPE!Ct=GbNc004}7R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j) z$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*lauJ$MP&6wmxca$( z-2?zv%`O`gxq+_$00CJ^L_t(oh3%KYa>F1DL?asn6xkj9|IbFkX{QGS8Pc4hofsch z>_a#QxZPYX*I&W5%eZgwuKW;%ux~NEhp>kz1eAP>04d9ulf?%}rIZB5><}@?6ZbFd z6QGh1a-wP^)QTx3tbHFMLKK4h0Ar^lR}unBexD%xdWmZ8H>d#Z0(wo#d|4YI<$^te z`lR9QZS*LBpn$GP2#)|j>HsEwt2r9rFkH|8?V{VE`l#C{AmcMn0J_L)i%lO}2WbAw z;XG8Q9iRj<1LgqH31)+@17-q5BEkUx1z`JAouY3Y2L3tlT`rf)<#K(FAkAyc>%lYm zwF+SXQP(*BKbcRQQ!xo*Wu|okjM8Ng!zzXE8%Gr(`*GJppk`D$Pp(9ZRv^Zk$K7XX*b_0PHkpsx<` Tv{O|$00000NkvXXu0mjf__`Vd literal 0 HcmV?d00001 diff --git a/mods/content/corporate/icons/clothing/under/polo_heph.dmi b/mods/content/corporate/icons/clothing/under/polo_heph.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9ebdc586ea29fcd5f21f93a8efe4705d90950409 GIT binary patch literal 642 zcmV-|0)737P)>uq@tptz`($!qM{NK z5_WcWxQMS$00001bW%=J06^y0W&i*HjCxd9bVOxyV{&P5bZKvH004NLQ&wi?^C?`dU zi!&v&s2IpM~U)PY`}RMK$*uRDgB?y(VS8 ztc{Rz!5%?<((v{)dK5rVK-VOMM*tvo00Y0(Yz?p(E@*&u(d|%u)a?_H@tOw!UF5mN zrjM-yG{17#H`Q(jD1pp?F+j9~+2H$tkpPj1@B)AWu>GNS(YFp4{(j-RTrQW(<@!H@ zG_Em^2e0JUDufG&y2kJSi}}Pk6_X%VW|}8JF099xVigoU-7wDsDuXQ0{Cn0Fkd({= zxB=|>Z4b3-62N+sb^d7pB7PK31Na)i?*Llx2=FYN2Jpp8J{y<@9Bnv`yH#)(^I7O} cxm&dkiDq@=*Wz^0<2qN1YjIweT}0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`;i@u9 za})FOGgB0j@>42xi*xcz;>+Vp^D@)&i*gZ~O;9u|E4cc(fZYTDSIsUP6S;w}0003X zNkl>#u66pg(0%jzJu53I;Bhe`n zZ$=~}@EOI>4XO8U{&nAd@sa}w`9Cou=%4NaM2m}=JNWzgKGEcy=G{hf_*hvk$T7ct zUDy#I)Ne=N5QIeCjqDTM`v~ zYXL|jm^;D(c=5Vkzwo(4DpbI>*#(d>t1S0`6(u?#jbaW73EBIY6WR3i_a(Xl59z^p z-f{F(fXi9Mi|J^Kn!;SxH04F*;x`qzi5>r2!_j@M15NC_Z;q&LG++RO%m=a!Y;<7j z14|t+01^ODcK~R-rH9S0fIa5LyVZe^kRSN~U!FpVmz!v100000NkvXXu0mjf(dhhh literal 0 HcmV?d00001 diff --git a/mods/content/corporate/icons/clothing/under/polo_zeng.dmi b/mods/content/corporate/icons/clothing/under/polo_zeng.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f74a7403348b634c8e65536bc317a2532c1fe59e GIT binary patch literal 608 zcmV-m0-ybfP)D@x2w zg|OkOGD>q3^YSxO6q52&Ds_u<@=M~&<4f~0)AEaQ5t>a@6Pjb5fqnSUR#Z%!)q|BJkX0#bqF(VEpy0Z#n^ zAGDe)v?;{tl3IK)(2X}M@X*lwwTA86r5#8cy70}CmZ=S>LUmFECJR{DfmIQh+5rJz u0sz(<0Mf$I_4G%;-Q$CI*AA2^^DQ4@-dcyz--^}%0000O|A`oyx|NsBf(b2WFwF)*N6lp;cSvU<}IsX6u($Ue*%*>>uq^6>xqo1FmqM~_o zbb2g^+yDRo0d!JMQvg8b*k%9#0F`=FSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1 zD@x2wg|OkOGD>q3^YSxO6q52&Ds_u<@=M~&<4f~0)AEaQ5t>a%*Q{HV zpOcfCg3AnL1y?^8u)hE<*F>_0>+KW(00J3FL_t(&f$f;lZi6rkMKKU3EH3W){~tR$ z&}k2G5)mOyTdvmZ;Tj)IXt9~5p`oFlf_ag3nc=Sds}sU9yY(KzvN|E4OckKz&#*sKJIq!BC6Jk*1_0Hb)|&tu~Pz^2oU zv<;U5F?A(o_pE22jmvcaCxCr?x`rBc5uguiCTspl03tpEF9Wy?;2uCqTmyUuUIuVs zlaB%}15#gK>hIs45m1{SN=X>Xe`uqRR`Jv(cf8YGj(7g7w_rC(rH9s@~dgh0Q{=RR17|QDl)qNq&Q1uQn P00000NkvXXu0mjf)yI2+ diff --git a/mods/content/corporate/icons/clothing/under/smock_exec.dmi b/mods/content/corporate/icons/clothing/under/smock_exec.dmi deleted file mode 100644 index 42cc3ebdc7608df66b1fefa5b7cbd66799528ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865 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 P00000NkvXXu0mjfhxdR2 diff --git a/mods/content/corporate/icons/clothing/under/smock_nt.dmi b/mods/content/corporate/icons/clothing/under/smock_nt.dmi deleted file mode 100644 index 3bf04b9228c3096e057850452c5aefa7a5691d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 784 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 diff --git a/mods/content/corporate/icons/clothing/under/suit_nt.dmi b/mods/content/corporate/icons/clothing/under/suit_nt.dmi deleted file mode 100644 index 8da533aabc4cc6674d9ae965b7cd6e147e167814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1063 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 Ze*vm0VHutn$hiOj002ovPDHLkV1nPL@*@BM diff --git a/mods/content/psionics/datum/antagonists/foundation.dm b/mods/content/psionics/datum/antagonists/foundation.dm index 8da03b4ff7..9e255a579a 100644 --- a/mods/content/psionics/datum/antagonists/foundation.dm +++ b/mods/content/psionics/datum/antagonists/foundation.dm @@ -38,7 +38,7 @@ /decl/hierarchy/outfit/foundation name = "Cuchulain Foundation Agent" glasses = /obj/item/clothing/glasses/sunglasses - uniform = /obj/item/clothing/under/formal/charcoal + uniform = /obj/item/clothing/pants/slacks/black/outfit shoes = /obj/item/clothing/shoes/color/black hands = list(/obj/item/briefcase/foundation) l_ear = /obj/item/radio/headset/foundation diff --git a/nebula.dme b/nebula.dme index 67b4e24487..a456b30b4f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1988,6 +1988,7 @@ #include "code\modules\clothing\pants\pants_formal.dm" #include "code\modules\clothing\pants\scrubs.dm" #include "code\modules\clothing\pants\shorts.dm" +#include "code\modules\clothing\pants\slacks.dm" #include "code\modules\clothing\sensors\_sensor.dm" #include "code\modules\clothing\sensors\buddytag.dm" #include "code\modules\clothing\sensors\vitals_sensor.dm" @@ -2078,7 +2079,6 @@ #include "code\modules\clothing\suits\jackets\wintercoat.dm" #include "code\modules\clothing\under\_under.dm" #include "code\modules\clothing\under\fated_robes.dm" -#include "code\modules\clothing\under\formalwear.dm" #include "code\modules\clothing\under\miscellaneous.dm" #include "code\modules\clothing\under\monkey.dm" #include "code\modules\clothing\under\syndicate.dm" From f03747685e1d9ab90c6ae334d2e36b28b5a70ddc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 18:16:01 +1000 Subject: [PATCH 185/212] Converts avian smocks into /dress. --- mods/species/neoavians/clothing.dm | 16 ++++++++-------- mods/species/neoavians/datum/loadout.dm | 18 +++++++++--------- mods/species/neoavians/datum/species.dm | 4 ++-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/mods/species/neoavians/clothing.dm b/mods/species/neoavians/clothing.dm index 4ad16cfebf..90a6e96f69 100644 --- a/mods/species/neoavians/clothing.dm +++ b/mods/species/neoavians/clothing.dm @@ -43,41 +43,41 @@ LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi') //clothing -/obj/item/clothing/under/avian_smock +/obj/item/clothing/dress/avian_smock name = "smock" desc = "A loose-fitting smock favoured by neo-avians." icon = 'mods/species/neoavians/icons/clothing/under/smock.dmi' icon_state = ICON_STATE_WORLD bodytype_equip_flags = BODY_FLAG_AVIAN -/obj/item/clothing/under/avian_smock/worker +/obj/item/clothing/dress/avian_smock/worker name = "worker's smock" icon = 'mods/species/neoavians/icons/clothing/under/smock_grey.dmi' -/obj/item/clothing/under/avian_smock/rainbow +/obj/item/clothing/dress/avian_smock/rainbow name = "rainbow smock" desc = "A brightly coloured, loose-fitting smock - the height of neo-avian fashion." icon = 'mods/species/neoavians/icons/clothing/under/smock_rainbow.dmi' -/obj/item/clothing/under/avian_smock/security +/obj/item/clothing/dress/avian_smock/security name = "armoured smock" desc = "A bright red smock with light armour insets, worn by neo-avian security personnel." icon = 'mods/species/neoavians/icons/clothing/under/smock_red.dmi' -/obj/item/clothing/under/avian_smock/engineering +/obj/item/clothing/dress/avian_smock/engineering name = "hazard smock" desc = "A high-visibility yellow smock with orange highlights light armour insets, worn by neo-avian engineering personnel." icon = 'mods/species/neoavians/icons/clothing/under/smock_yellow.dmi' -/obj/item/clothing/under/avian_smock/utility +/obj/item/clothing/dress/avian_smock/utility name = "black uniform" icon = 'mods/species/neoavians/icons/clothing/under/black_utility.dmi' -/obj/item/clothing/under/avian_smock/utility/gray +/obj/item/clothing/dress/avian_smock/utility/gray name = "gray uniform" icon = 'mods/species/neoavians/icons/clothing/under/gray_utility.dmi' -/obj/item/clothing/under/avian_smock/stylish_command +/obj/item/clothing/dress/avian_smock/stylish_command name = "stylish uniform" icon = 'mods/species/neoavians/icons/clothing/under/stylish_form.dmi' diff --git a/mods/species/neoavians/datum/loadout.dm b/mods/species/neoavians/datum/loadout.dm index 94a9547937..bc366b2108 100644 --- a/mods/species/neoavians/datum/loadout.dm +++ b/mods/species/neoavians/datum/loadout.dm @@ -8,21 +8,21 @@ /decl/loadout_option/avian/uniform_selection name = "Neo-Avian uniform selection" - path = /obj/item/clothing/under/avian_smock + path = /obj/item/clothing/dress/avian_smock slot = slot_w_uniform_str /decl/loadout_option/avian/uniform_selection/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path]) .[/datum/gear_tweak/path] |= list( - "plain smock" = /obj/item/clothing/under/avian_smock, - "worker's smock" = /obj/item/clothing/under/avian_smock/worker, - "rainbow smock" = /obj/item/clothing/under/avian_smock/rainbow, - "armoured smock" = /obj/item/clothing/under/avian_smock/security, - "hazard smock" = /obj/item/clothing/under/avian_smock/engineering, - "black uniform" = /obj/item/clothing/under/avian_smock/utility, - "gray uniform" = /obj/item/clothing/under/avian_smock/utility/gray, - "stylish uniform" = /obj/item/clothing/under/avian_smock/stylish_command + "plain smock" = /obj/item/clothing/dress/avian_smock, + "worker's smock" = /obj/item/clothing/dress/avian_smock/worker, + "rainbow smock" = /obj/item/clothing/dress/avian_smock/rainbow, + "armoured smock" = /obj/item/clothing/dress/avian_smock/security, + "hazard smock" = /obj/item/clothing/dress/avian_smock/engineering, + "black uniform" = /obj/item/clothing/dress/avian_smock/utility, + "gray uniform" = /obj/item/clothing/dress/avian_smock/utility/gray, + "stylish uniform" = /obj/item/clothing/dress/avian_smock/stylish_command ) /decl/loadout_option/avian/shoes diff --git a/mods/species/neoavians/datum/species.dm b/mods/species/neoavians/datum/species.dm index 1a123f0403..7521389517 100644 --- a/mods/species/neoavians/datum/species.dm +++ b/mods/species/neoavians/datum/species.dm @@ -66,7 +66,7 @@ /decl/species/neoavian/equip_default_fallback_uniform(var/mob/living/carbon/human/H) if(istype(H)) - H.equip_to_slot_or_del(new /obj/item/clothing/under/avian_smock/worker, slot_w_uniform_str) + H.equip_to_slot_or_del(new /obj/item/clothing/dress/avian_smock/worker, slot_w_uniform_str) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/avian, slot_shoes_str) /decl/species/neoavian/get_holder_color(var/mob/living/carbon/human/H) @@ -74,5 +74,5 @@ /decl/hierarchy/outfit/job/generic/assistant/avian name = "Job - Avian Assistant" - uniform = /obj/item/clothing/under/avian_smock/worker + uniform = /obj/item/clothing/dress/avian_smock/worker shoes = /obj/item/clothing/shoes/avian/footwraps From 67b4b391218248ae93bdbe27876f3496da925975 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 18:25:07 +1000 Subject: [PATCH 186/212] Converted detective uniforms to slacks/shirt. --- code/datums/outfits/tournament.dm | 2 +- .../crates_lockers/closets/secure/security.dm | 11 +- .../crates_lockers/closets/wardrobe.dm | 2 +- .../loadout/lists/uniforms.dm | 5 +- code/modules/clothing/costumes/misc.dm | 5 + code/modules/clothing/head/security.dm | 45 +++++++ code/modules/clothing/pants/detective.dm | 18 +++ code/modules/clothing/shirts/formal.dm | 7 +- code/modules/clothing/suits/security.dm | 33 +++++ code/modules/clothing/under/jobs/civilian.dm | 5 - code/modules/clothing/under/jobs/security.dm | 126 +----------------- .../fabrication/designs/textile/_textile.dm | 9 -- .../fabrication/designs/textile/job.dm | 2 +- code/modules/mining/abandonedcrates.dm | 2 +- icons/clothing/shirts/button_up_tan.dmi | Bin 0 -> 828 bytes icons/clothing/under/uniform_detective_1.dmi | Bin 1270 -> 0 bytes icons/clothing/under/uniform_detective_2.dmi | Bin 986 -> 0 bytes icons/clothing/under/uniform_detective_3.dmi | Bin 1384 -> 0 bytes maps/antag_spawn/heist/heist_outfit.dm | 1 - maps/exodus/outfits/security.dm | 2 +- maps/ministation/outfits/medical.dm | 2 +- maps/ministation/outfits/security.dm | 2 +- maps/tradeship/outfits/medical.dm | 2 +- nebula.dme | 4 + 24 files changed, 129 insertions(+), 156 deletions(-) create mode 100644 code/modules/clothing/head/security.dm create mode 100644 code/modules/clothing/pants/detective.dm create mode 100644 code/modules/clothing/suits/security.dm create mode 100644 icons/clothing/shirts/button_up_tan.dmi delete mode 100644 icons/clothing/under/uniform_detective_1.dmi delete mode 100644 icons/clothing/under/uniform_detective_2.dmi delete mode 100644 icons/clothing/under/uniform_detective_3.dmi diff --git a/code/datums/outfits/tournament.dm b/code/datums/outfits/tournament.dm index 998393a073..d5acd71b51 100644 --- a/code/datums/outfits/tournament.dm +++ b/code/datums/outfits/tournament.dm @@ -20,7 +20,7 @@ /decl/hierarchy/outfit/tournament_gear/gangster name = "Tournament gear - Gangster" head = /obj/item/clothing/head/det - uniform = /obj/item/clothing/under/det + uniform = /obj/item/clothing/pants/slacks/outfit/detective suit_store = /obj/item/clothing/suit/det_trench glasses = /obj/item/clothing/glasses/thermal/plain/monocle hands = list( diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 9b319d50dd..62e2760580 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -142,9 +142,14 @@ /obj/structure/closet/secure_closet/detective/WillContain() return list( - /obj/item/clothing/under/det, - /obj/item/clothing/under/det/grey, - /obj/item/clothing/under/det/black, + /obj/item/clothing/shirt/button/tan, + /obj/item/clothing/shirt/button = 2, + /obj/item/clothing/pants/slacks = 2, + /obj/item/clothing/pants/slacks/black, + /obj/item/clothing/neck/tie/blue_clip, + /obj/item/clothing/neck/tie/long/red, + /obj/item/clothing/neck/tie/long/red, + /obj/item/clothing/suit/jacket/vest/black, /obj/item/clothing/suit/det_trench, /obj/item/clothing/suit/det_trench/grey, /obj/item/clothing/suit/forensics/blue, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 6b85d15203..065bf6139e 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -10,7 +10,7 @@ /obj/structure/closet/wardrobe/red/WillContain() return list( /obj/item/clothing/jumpsuit/security = 3, - /obj/item/clothing/jumpsuit/security2 = 3, + /obj/item/clothing/under/security2 = 3, /obj/item/clothing/shoes/jackboots = 3, /obj/item/clothing/head/soft/sec = 3, ) diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index beed133237..7c9144bd61 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -58,10 +58,7 @@ /obj/item/clothing/under/blazer, /obj/item/clothing/under/blackjumpskirt, /obj/item/clothing/costume/kilt, - /obj/item/clothing/dress/hr, - /obj/item/clothing/under/det, - /obj/item/clothing/under/det/black, - /obj/item/clothing/under/det/grey + /obj/item/clothing/dress/hr ) /decl/loadout_option/uniform/dress diff --git a/code/modules/clothing/costumes/misc.dm b/code/modules/clothing/costumes/misc.dm index abb6e9683d..470f98771b 100644 --- a/code/modules/clothing/costumes/misc.dm +++ b/code/modules/clothing/costumes/misc.dm @@ -3,6 +3,11 @@ desc = "'HONK!'" icon = 'icons/clothing/under/uniform_clown.dmi' +/obj/item/clothing/costume/mime + name = "mime costume" + desc = "It's not very colourful." + icon = 'icons/clothing/under/uniform_mime.dmi' + /obj/item/clothing/costume/owl name = "owl costume" desc = "A jumpsuit with owl wings. Photorealistic owl feathers! Twooooo!" diff --git a/code/modules/clothing/head/security.dm b/code/modules/clothing/head/security.dm new file mode 100644 index 0000000000..a11237dcc3 --- /dev/null +++ b/code/modules/clothing/head/security.dm @@ -0,0 +1,45 @@ +/obj/item/clothing/head/det + name = "fedora" + desc = "A brown fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it." + icon = 'icons/clothing/head/detective.dmi' + color = "#725443" + armor = list( + ARMOR_MELEE = ARMOR_MELEE_RESISTANT, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR + ) + siemens_coefficient = 0.9 + flags_inv = BLOCK_HEAD_HAIR + markings_state_modifier = "band" + markings_color = "#b2977c" + material = /decl/material/solid/organic/leather + matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) + +/obj/item/clothing/head/det/attack_self(mob/user) + flags_inv ^= BLOCK_HEAD_HAIR + to_chat(user, "[src] will now [flags_inv & BLOCK_HEAD_HAIR ? "hide" : "show"] hair.") + ..() + +/obj/item/clothing/head/det/grey + color = COLOR_GRAY40 + markings_color = COLOR_SILVER + desc = "A grey fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it." + +/obj/item/clothing/head/det/wack + color = COLOR_VIOLET + markings_color = COLOR_YELLOW + desc = "A colorful fedora - either the cornerstone of a detective's style or a poor attempt at looking disco, depending on the person wearing it." + +/obj/item/clothing/head/HoS + name = "Head of Security hat" + desc = "The hat of the Head of Security. For showing the officers who's in charge." + icon = 'icons/clothing/head/hos.dmi' + body_parts_covered = 0 + siemens_coefficient = 0.8 + material = /decl/material/solid/organic/leather + +/obj/item/clothing/head/warden + name = "warden's hat" + desc = "It's a special helmet issued to the Warden of a security force." + icon = 'icons/clothing/head/warden.dmi' + body_parts_covered = 0 diff --git a/code/modules/clothing/pants/detective.dm b/code/modules/clothing/pants/detective.dm new file mode 100644 index 0000000000..13d85c2750 --- /dev/null +++ b/code/modules/clothing/pants/detective.dm @@ -0,0 +1,18 @@ +/obj/item/clothing/pants/slacks/outfit/detective + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/blue_clip + ) + +/obj/item/clothing/pants/slacks/black/outfit/detective + starting_accessories = list( + /obj/item/clothing/shirt/button/tan, + /obj/item/clothing/neck/tie/long/red + ) + +/obj/item/clothing/pants/slacks/outfit/detective_black + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/long/red, + /obj/item/clothing/suit/jacket/vest/black + ) diff --git a/code/modules/clothing/shirts/formal.dm b/code/modules/clothing/shirts/formal.dm index edebba63cc..e8ed2468c0 100644 --- a/code/modules/clothing/shirts/formal.dm +++ b/code/modules/clothing/shirts/formal.dm @@ -1,4 +1,9 @@ /obj/item/clothing/shirt/button - name = "button-up shirt" + name = "dress shirt" desc = "A crisply pressed white button-up shirt. Somewhat formal." icon = 'icons/clothing/shirts/button_up.dmi' + +/obj/item/clothing/shirt/button/tan + name = "tan dress shirt" + desc = "A crisply pressed tan button-up shirt. Somewhat formal." + icon = 'icons/clothing/shirts/button_up_tan.dmi' diff --git a/code/modules/clothing/suits/security.dm b/code/modules/clothing/suits/security.dm new file mode 100644 index 0000000000..cd43e96eef --- /dev/null +++ b/code/modules/clothing/suits/security.dm @@ -0,0 +1,33 @@ +/obj/item/clothing/suit/armor/hos + name = "armored coat" + desc = "A greatcoat enhanced with a special alloy for some protection and style." + icon = 'icons/clothing/suit/hos.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS + armor = list( + ARMOR_MELEE = ARMOR_MELEE_MAJOR, + ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, + ARMOR_LASER = ARMOR_LASER_HANDGUNS, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED + ) + flags_inv = HIDEJUMPSUIT + siemens_coefficient = 0.6 + material = /decl/material/solid/organic/leather + matter = list( + /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT + ) + origin_tech = @'{"materials":3,"engineering":1, "combat":2}' + +/obj/item/clothing/suit/armor/hos/jensen + name = "armored trenchcoat" + desc = "A trenchcoat augmented with a special alloy for some protection and style." + icon = 'icons/clothing/suit/jensen.dmi' + flags_inv = 0 + siemens_coefficient = 0.6 + material = /decl/material/solid/organic/leather + matter = list( + /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT + ) + origin_tech = @'{"materials":3,"engineering":1, "combat":2}' diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 0a348db982..216b3e6201 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -73,8 +73,3 @@ name = "sensible suit" desc = "It's very... sensible." icon = 'icons/clothing/under/uniform_lawyer_red.dmi' - -/obj/item/clothing/under/mime - name = "mime's outfit" - desc = "It's not very colourful." - icon = 'icons/clothing/under/uniform_mime.dmi' diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 5aeebf9198..6782a4237f 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -1,21 +1,3 @@ -/* - * Contains: - * Security - * Detective - * Head of Security - */ - -/* - * Security - */ - -/obj/item/clothing/head/warden - name = "warden's hat" - desc = "It's a special helmet issued to the Warden of a securiy force." - icon = 'icons/clothing/head/warden.dmi' - body_parts_covered = 0 - - /obj/item/clothing/under/dispatch name = "dispatcher's uniform" desc = "A dress shirt and khakis with a security patch sewn on." @@ -29,7 +11,7 @@ /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE ) -/obj/item/clothing/jumpsuit/security2 +/obj/item/clothing/under/security2 name = "security officer's uniform" desc = "It's made of a slightly sturdier material, to allow for robust protection." icon = 'icons/clothing/under/uniform_redshirt.dmi' @@ -40,109 +22,3 @@ matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE ) - -/* - * Detective - */ -/obj/item/clothing/under/det - name = "detective's suit" - desc = "A rumpled white dress shirt paired with well-worn grey slacks." - icon = 'icons/clothing/under/uniform_detective_1.dmi' - siemens_coefficient = 0.9 - starting_accessories = list( - /obj/item/clothing/neck/tie/blue_clip - ) - material = /decl/material/solid/organic/cloth - -/obj/item/clothing/under/det/grey - desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks." - icon = 'icons/clothing/under/uniform_detective_2.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/long/red - ) - -/obj/item/clothing/under/det/black - desc = "An immaculate white dress shirt, paired with a pair of dark grey dress pants." - icon = 'icons/clothing/under/uniform_detective_3.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/long/red, - /obj/item/clothing/suit/jacket/vest/black - ) - -/obj/item/clothing/head/det - name = "fedora" - desc = "A brown fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it." - icon = 'icons/clothing/head/detective.dmi' - color = "#725443" - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - siemens_coefficient = 0.9 - flags_inv = BLOCK_HEAD_HAIR - markings_state_modifier = "band" - markings_color = "#b2977c" - material = /decl/material/solid/organic/leather - matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) - -/obj/item/clothing/head/det/attack_self(mob/user) - flags_inv ^= BLOCK_HEAD_HAIR - to_chat(user, "[src] will now [flags_inv & BLOCK_HEAD_HAIR ? "hide" : "show"] hair.") - ..() - -/obj/item/clothing/head/det/grey - color = COLOR_GRAY40 - markings_color = COLOR_SILVER - desc = "A grey fedora - either the cornerstone of a detective's style or a poor attempt at looking cool, depending on the person wearing it." - -/obj/item/clothing/head/det/wack - color = COLOR_VIOLET - markings_color = COLOR_YELLOW - desc = "A colorful fedora - either the cornerstone of a detective's style or a poor attempt at looking disco, depending on the person wearing it." - -/* - * Head of Security - */ - -/obj/item/clothing/head/HoS - name = "Head of Security hat" - desc = "The hat of the Head of Security. For showing the officers who's in charge." - icon = 'icons/clothing/head/hos.dmi' - body_parts_covered = 0 - siemens_coefficient = 0.8 - material = /decl/material/solid/organic/leather - -/obj/item/clothing/suit/armor/hos - name = "armored coat" - desc = "A greatcoat enhanced with a special alloy for some protection and style." - icon = 'icons/clothing/suit/hos.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MAJOR, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED - ) - flags_inv = HIDEJUMPSUIT - siemens_coefficient = 0.6 - material = /decl/material/solid/organic/leather - matter = list( - /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT - ) - origin_tech = @'{"materials":3,"engineering":1, "combat":2}' - -/obj/item/clothing/suit/armor/hos/jensen - name = "armored trenchcoat" - desc = "A trenchcoat augmented with a special alloy for some protection and style." - icon = 'icons/clothing/suit/jensen.dmi' - flags_inv = 0 - siemens_coefficient = 0.6 - material = /decl/material/solid/organic/leather - matter = list( - /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT - ) - origin_tech = @'{"materials":3,"engineering":1, "combat":2}' diff --git a/code/modules/fabrication/designs/textile/_textile.dm b/code/modules/fabrication/designs/textile/_textile.dm index bfddaec64f..29c301d091 100644 --- a/code/modules/fabrication/designs/textile/_textile.dm +++ b/code/modules/fabrication/designs/textile/_textile.dm @@ -51,15 +51,6 @@ /datum/fabricator_recipe/textiles/jeancamo path = /obj/item/clothing/pants/casual/camo -/datum/fabricator_recipe/textiles/detsuit - path = /obj/item/clothing/under/det - -/datum/fabricator_recipe/textiles/detectivegrey - path = /obj/item/clothing/under/det/grey - -/datum/fabricator_recipe/textiles/detectiveblack - path = /obj/item/clothing/under/det/black - // Headwear /datum/fabricator_recipe/textiles/hat category = "Headwear" diff --git a/code/modules/fabrication/designs/textile/job.dm b/code/modules/fabrication/designs/textile/job.dm index ed03f48be3..276b59321f 100644 --- a/code/modules/fabrication/designs/textile/job.dm +++ b/code/modules/fabrication/designs/textile/job.dm @@ -166,7 +166,7 @@ path = /obj/item/clothing/under/dispatch /datum/fabricator_recipe/textiles/job/security/alt - path = /obj/item/clothing/jumpsuit/security2 + path = /obj/item/clothing/under/security2 /datum/fabricator_recipe/textiles/job/security/tacticalofficer path = /obj/item/clothing/jumpsuit/tactical diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index e5e5724fa5..f9d2a47b78 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -114,7 +114,7 @@ new /obj/item/pen/crayon/rainbow(src) new /obj/item/chems/spray/waterflower(src) if(95) - new /obj/item/clothing/under/mime(src) + new /obj/item/clothing/costume/mime(src) new /obj/item/clothing/shoes/color/black(src) new /obj/item/clothing/gloves(src) new /obj/item/clothing/mask/gas/mime(src) diff --git a/icons/clothing/shirts/button_up_tan.dmi b/icons/clothing/shirts/button_up_tan.dmi new file mode 100644 index 0000000000000000000000000000000000000000..09a70d4d57117fa9db1168a19832b1a2592f2a3b GIT binary patch literal 828 zcmV-C1H=4@P)00001bW%=J06^y0W&i*Hm3mZIbVOxyV{&P5bZKvH004NLQ&wi?^C?`dU zi!&v&s2IpMujejlkho{D)xd85mB9E$8C}BJPd(A;Iohp2VM_{gn0$xB_OrMrin81g~$#NzVHX} z8jw>)2~rU(E95iemxzq_Q_8uFg%3eS1oKSG{+umdA|yeQ1QwqtaboE}ei#KBpAoMG z)&T2(yiNE~6TD_-}F)`4ExdsDdxJ zgQDUdSghav!QP+hv62Mg4)_Uj5WdB(I_CnU&)MrhBD?~lUw{{G!Rdf#!2gz>e;AZt z`HnjvEim8$u77Cz!~>uJF$Ye8o_`1g0)apv@G0od|M&Wb-u!>@4}N;bKXm8+tAD`4 z%J&bw`Tyo0u(Wji!yo4Vn}2XR!2Y4>`)&S@BGf;4@?PBm9&WGWdB6`UzP%2b{N7Wb z_6$mO3;6T@Mc#WIxbnU~|8E5dci{Vn?)-nRe+UEu0fZmeYY;skOmKDp0000004jp0{{R3ySq@?HP z=XiK{w6wGU000pY5hy4qK0ZEvetsqfFDZ*Bkpc$}S(%L>9U z6hzm_SA=%0_~_P+w3IIFFNDawHGw?fCT;NV4Hk4K*xekMGmELkwd;pbw6}pTNYMl@ zE~42VILii-E^t0^rqMifS|KKtu*50{vQTjbhGO9(XA>!hYyPzK?351%#67@s7i~x~ z%h{VLko(Hb|8haZ1>=?xE4A{l#iXBRExNINpZNk97it~*u?$!M00V|eL_t(|ob8$c zTiP%XhLds)p%tW{=(@rb{r|slmlUgxyM)+w#qD0TigzS$6I!3=L!|^k5Cq|Gp|cE+ zS*E%A8|(-(h|dDEkU*|-RzMpw&s1iOp&PJ%f-{^g018#|a-}K&7MvlVK%VC)K%S?z zj?5n^gSKwiI!>^_5)?N}&Tn~B0Jbccb#^tIy93prtIPqf z{9Qz^{Y_@g)eC1`ZbB=#aq@U8;sx@MK;$;3@75kx&>e7(11q>HyT)_wJAr$qVfXO( z<0#&2Ez#|y^u zzg~hp^FJ>U&;Pi1?GnLB^S=|2`6E%8I{$m~dvf10!f@*R?<8oSjZ%hsD`e{Y@8oCa z*8fd7H=I2GYXvL+=c1wouOJ)(|CXEudW)|>P=UYMQCIPG2p-+-81Hq*s}+2K;<NeHknEppW21?cTar{ z*<>nZd~z4Sx)XmU|A9J5kV&Re#;0}x{JS%F_Pq`1WGZERau-6GT%sYFOr?xZ_XaY# zB)DWMWqi7q&*ahsxnwG3e5yB)$t4QX$yCbtWN#poOEjdDsg&`_-mx>el=11_u`{`p z@g*M=1VIo4K@f!hlz}3y(HJP=8jpb@uF)7Q;u?$LBCfF*D&iWCfg-Na7%Ji#jlm+W gv5V!Z07*qoM6N<$f+PlS?EnA( diff --git a/icons/clothing/under/uniform_detective_2.dmi b/icons/clothing/under/uniform_detective_2.dmi deleted file mode 100644 index 8b18b131eea716cbec3d28b735bda77bb28e26c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 986 zcmV<0110>4P)fFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBS zJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*l zauJ$MNY@PHrlyvq7UMERS;5uM1?({ZdvZl5Qkt^E0007|NklN)3 zlnE~>=?RP%`XF2qa?GeeEFAj^@eJ`jBjf!k=3J&ihe%2W;RN&koHd*?xIp9r8Xi-m z!rTFWQ3x8I5iSHrf_6aK#`q)!zE)^>dj=ZbQjQa92YjLDd*Jd*$1}hs=d;DHU`;ig z9mp>o&j8cqVNVD`4>a1J@^MS7Vt_{i(!C%1>wT{DT~!WGYZ$3k}t^rRN`Zf+$J21KJ${ zf#V-qjwtwoJ18RVfyMgWKj`~oeW{6)a0m1RDGA?VQ=Jn*lILu7z!?_7WE0RrEf^i7 z6!5>r^AAA)lJB^KBm@BynEs*dV-J85*c=!Ho_`=w76OT9Ed5BEZ=3@XJpa%fgi(KI zz|zt255i!=jlpQp_78u8z*E z;tud|`xwsyJc#(VI%x8{hoE`}rJ4lx{C}7CRtKiM_vinOAmI*d|KQI5d;Nnu|L^q= z?)<;kKlt8z0U4+5i9m07*qo IM6N<$f@-zLvj6}9 diff --git a/icons/clothing/under/uniform_detective_3.dmi b/icons/clothing/under/uniform_detective_3.dmi deleted file mode 100644 index 5ebd8c26d71ee44208936df95af30de92979daf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1384 zcmV-u1(*7XP)004jp0{{R3ySjz`(#?HVlGH6RUF^ zz`($W%o(cy0004WQchCdQ@0+L}hbha%pgMX>V=-0C=38kjo0fFcd`B z$ybDSt@!BHjkJ_5>@S4Ky)}V6;3jSG?+q4oC)nK_m@|v1#kK2)QM9*#FG$e@FD|0l zA2`bfk}hyQai-BcbXp-Mm9WGr2eMFc28LqcBWDvShim?{^z4)m2E;wUa~Ew$GRxVU zDUkch&Hr*i#0BG)5i7Owu*IaGW-Yq0eV_RP7#C_C`>_mI000B~Nklk8rZA?d z;^InWSq39pVWEd-(Tfnka=Byylredlq}CWZ0pcmprCc2NR$3Qfyh7_0N2mb+0G%=9 zaVm={{YVjXal^)8f)#{xVR<}TXh>Nxebx@N#DPjs)^rFky&(vof94Emm>w>yt#tLE zOOCJ950GFj-9qh@%X5?G@JbLWqW}y$h;JxBm7M`IDvp3_yV+R#gKZ&%Fk{UE8s9-f z0V1F3*3ZBDNZ{j{0YH;caSvG8O^v4s2Z-lSy|GmY&~Sj6O8O4^Eh3)z4rWx`1L{oI zu!4LC;T)(TiMdL2-$7!9HC#D;2mRKEIQ*!s2iz*ZMFASE>u?8a4N2T(+;@lE^*AX5$J^(Bc4+a*nZ5wC-U!Xy;9fXW9Uq=|&9g3GY z3A;D!+ynpz;vO)7pZF#P0EaXM;2}K!V8ZNx?NA5XF@UWHU@Hv8eS`Q*$R{*oI*9k6 zZn!S)FJnIVr^fYwB9TZW5{bUKZtnjLXe$3N-~bju|8I!T_5PnD{Xf_He`Fl}Kj+Z@ zV+jlN|D5CezahSN{vSbbiT_u*OZ-2_xK~4f6Zn5wb&3C1W!J6oKmH#b|Lgye6&8!d zCH^0zT?LrD^Z%H5@Bh)ld58VKg!Nu70<Kko(p-x$DA{$B@p zf&Ui<)Ttkd$XNf+f1us%`H#NGW9R<`Kl$qP8DCO@@Yep{8PL6$Br(*ZkX!qIXFiuZ zW5~xzH~0TKz|6U=gOLQh1OHF^M{-V+OMDmppEl4z@`2`k_@J@8~OGc~sIG<8{LDyBZQ z3f=#n#}cy6R7`zx6|}9Ra*>3j zGZj;x&JB2SQR1AbnEG@s@5#jha?VsteJVHL$wdOv&Qwf&GB@DKMH14^R7`y`cWzHE zraqlJw8Jn;G0000 Date: Tue, 23 Apr 2024 18:35:44 +1000 Subject: [PATCH 187/212] Continuing to convert uniforms to shirt and pants. --- code/datums/supplypacks/nonessent.dm | 8 +++-- .../crates_lockers/closets/job_closets.dm | 5 ++-- .../crates_lockers/closets/secure/security.dm | 1 - .../crates_lockers/closets/wardrobe.dm | 26 ++++++++-------- .../loadout/lists/uniforms.dm | 3 +- code/modules/clothing/pants/slacks.dm | 23 ++++++++++++++ code/modules/clothing/under/jobs/civilian.dm | 28 ------------------ code/unit_tests/equipment_tests.dm | 2 +- icons/clothing/pants/slacks_purple.dmi | Bin 0 -> 665 bytes icons/clothing/shirts/button_up_tan.dmi | Bin 828 -> 738 bytes .../under/uniform_internalaffairs.dmi | Bin 1281 -> 0 bytes .../clothing/under/uniform_lawyer_purple.dmi | Bin 1082 -> 0 bytes maps/exodus/outfits/civilian.dm | 2 +- 13 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 icons/clothing/pants/slacks_purple.dmi delete mode 100644 icons/clothing/under/uniform_internalaffairs.dmi delete mode 100644 icons/clothing/under/uniform_lawyer_purple.dmi diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index a1a8232078..3279772725 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -91,7 +91,9 @@ /obj/item/clothing/suit/ianshirt, /obj/item/clothing/under/gimmick/rank/captain/suit, /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit, - /obj/item/clothing/under/lawyer/purpsuit, + /obj/item/clothing/pants/slacks/purple, + /obj/item/clothing/shirt/button, + /obj/item/clothing/suit/jacket/vest/black, /obj/item/clothing/jumpsuit/mailman, /obj/item/clothing/dress/saloon, /obj/item/clothing/suspenders, @@ -126,7 +128,9 @@ /obj/item/clothing/suit/jacket/burgundy, /obj/item/clothing/suit/jacket/waistcoat, /obj/item/clothing/under/lawyer/bluesuit, - /obj/item/clothing/under/lawyer/purpsuit, + /obj/item/clothing/pants/slacks/purple, + /obj/item/clothing/shirt/button, + /obj/item/clothing/suit/jacket/vest/black, /obj/item/clothing/shoes/color/black, /obj/item/clothing/shoes/color/black, /obj/item/clothing/shoes/craftable diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 1c63021688..5ab8e63b2f 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -81,11 +81,12 @@ /obj/structure/closet/lawcloset/WillContain() return list( - /obj/item/clothing/under/lawyer/female, /obj/item/clothing/under/lawyer, /obj/item/clothing/under/lawyer/red, /obj/item/clothing/under/lawyer/bluesuit, - /obj/item/clothing/under/lawyer/purpsuit, + /obj/item/clothing/pants/slacks/purple, + /obj/item/clothing/shirt/button, + /obj/item/clothing/suit/jacket/vest/black, /obj/item/clothing/suit/jacket/blue, /obj/item/clothing/suit/jacket/purple, /obj/item/clothing/shoes/color/brown, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 62e2760580..647c53036e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -46,7 +46,6 @@ /obj/item/clothing/jumpsuit/head_of_personnel, /obj/item/clothing/dress/hop, /obj/item/clothing/dress/hr, - /obj/item/clothing/under/lawyer/female, /obj/item/clothing/under/lawyer, /obj/item/clothing/under/lawyer/red, /obj/item/clothing/under/lawyer/oldman, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 065bf6139e..af3128a673 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -290,26 +290,26 @@ /obj/structure/closet/wardrobe/suit/WillContain() return list( - /obj/item/clothing/pants/slacks, - /obj/item/clothing/pants/slacks/outfit/tie, - /obj/item/clothing/pants/slacks/tan/outfit, - /obj/item/clothing/pants/slacks/red/outfit, - /obj/item/clothing/pants/slacks/black/outfit, - /obj/item/clothing/pants/slacks/black/outfit/navy, - /obj/item/clothing/pants/slacks/black/outfit/burgundy, - /obj/item/clothing/pants/slacks/black/outfit/checkered, + /obj/item/clothing/pants/slacks = 2, + /obj/item/clothing/pants/slacks/purple, + /obj/item/clothing/pants/slacks/tan, + /obj/item/clothing/pants/slacks/red, + /obj/item/clothing/pants/slacks/black = 2, + /obj/item/clothing/shirt/button = 4, + /obj/item/clothing/suit/jacket/waistcoat/black, + /obj/item/clothing/neck/tie/long/red, /obj/item/clothing/under/sl_suit, /obj/item/clothing/under/scratch, - /obj/item/clothing/under/internalaffairs/plain, + /obj/item/clothing/slacks/black, + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/black, /obj/item/clothing/suit/jacket/black, /obj/item/clothing/suit/jacket/blue, /obj/item/clothing/suit/jacket/purple, /obj/item/clothing/under/assistantformal, - /obj/item/clothing/under/lawyer/female, /obj/item/clothing/under/lawyer, /obj/item/clothing/under/lawyer/red, /obj/item/clothing/under/lawyer/bluesuit, - /obj/item/clothing/under/lawyer/purpsuit, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/shoes/dress, ) @@ -320,7 +320,9 @@ /obj/structure/closet/wardrobe/lawyer_black/WillContain() return list( - /obj/item/clothing/under/internalaffairs = 2, + /obj/item/clothing/slacks/black = 2, + /obj/item/clothing/shirt/button = 2, + /obj/item/clothing/neck/tie/long/red = 2, /obj/item/clothing/suit/jacket/black = 2, /obj/item/clothing/shoes/color/brown = 2, /obj/item/clothing/glasses/sunglasses/big = 2, diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 7c9144bd61..30bf717274 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -49,12 +49,11 @@ /obj/item/clothing/under/lawyer/blue, /obj/item/clothing/under/gentlesuit, /obj/item/clothing/under/lawyer/oldman, - /obj/item/clothing/under/lawyer/purpsuit, /obj/item/clothing/under/lawyer/red, /obj/item/clothing/under/lawyer, /obj/item/clothing/under/scratch, /obj/item/clothing/under/lawyer/bluesuit, - /obj/item/clothing/under/internalaffairs/plain, + /obj/item/clothing/slacks/black/outfit/internal_affairs, /obj/item/clothing/under/blazer, /obj/item/clothing/under/blackjumpskirt, /obj/item/clothing/costume/kilt, diff --git a/code/modules/clothing/pants/slacks.dm b/code/modules/clothing/pants/slacks.dm index d189c8f260..25afe8aaf1 100644 --- a/code/modules/clothing/pants/slacks.dm +++ b/code/modules/clothing/pants/slacks.dm @@ -71,6 +71,18 @@ /obj/item/clothing/suit/jacket/burgundy ) +/obj/item/clothing/slacks/black/outfit/internal_affairs + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/black + ) + +/obj/item/clothing/slacks/black/outfit/nanotrasen + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/neck/tie/long/red + ) + /obj/item/clothing/pants/slacks/black/outfit/checkered desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" starting_accessories = list( @@ -78,3 +90,14 @@ /obj/item/clothing/neck/tie/black, /obj/item/clothing/suit/jacket/checkered ) + +/obj/item/clothing/pants/slacks/purple + name = "purple slacks" + desc = "Some whimsical purple slacks. Not very formal." + icon = 'icons/clothing/pants/slacks_purple.dmi' + +/obj/item/clothing/pants/slacks/purple/outfit + starting_accessories = list( + /obj/item/clothing/shirt/button, + /obj/item/clothing/suit/jacket/vest/black + ) diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 216b3e6201..7904b2d5f1 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -15,35 +15,11 @@ name = "head of personnel's suit" icon = 'icons/clothing/under/uniform_hop_whimsy.dmi' -/obj/item/clothing/under/internalaffairs - desc = "The plain, professional attire of an Internal Affairs Agent. The collar is immaculately starched." - name = "Internal Affairs uniform" - icon = 'icons/clothing/under/uniform_internalaffairs.dmi' - starting_accessories = list( - /obj/item/clothing/neck/tie/black - ) - -/obj/item/clothing/under/internalaffairs/plain - desc = "A plain shirt and pair of pressed black pants." - name = "formal outfit" - starting_accessories = null - -/obj/item/clothing/under/internalaffairs/plain/nt - desc = "A plain shirt and pair of pressed black pants." - name = "formal outfit" - starting_accessories = list( - /obj/item/clothing/neck/tie/long/red - ) - /obj/item/clothing/under/lawyer name = "black lawyer suit" desc = "Slick threads." icon = 'icons/clothing/under/uniform_lawyer_black.dmi' -/obj/item/clothing/under/lawyer/female - name = "black lawyer suit" - icon = 'icons/clothing/under/uniform_lawyer_black_female.dmi' - /obj/item/clothing/under/lawyer/red name = "red Lawyer suit" icon = 'icons/clothing/under/uniform_lawyer_red.dmi' @@ -60,10 +36,6 @@ /obj/item/clothing/neck/tie/red ) -/obj/item/clothing/under/lawyer/purpsuit - name = "purple suit" - icon = 'icons/clothing/under/uniform_lawyer_purple.dmi' - /obj/item/clothing/under/lawyer/oldman name = "Old Man's Suit" desc = "A classic suit for the older gentleman with built in back support." diff --git a/code/unit_tests/equipment_tests.dm b/code/unit_tests/equipment_tests.dm index fc7ff33a0a..95032a01c8 100644 --- a/code/unit_tests/equipment_tests.dm +++ b/code/unit_tests/equipment_tests.dm @@ -115,7 +115,7 @@ ..() /// Ordering is important here, dependencies like ID should be after uniform, etc. slot_to_valid_type = list( - "[slot_w_uniform_str]" = /obj/item/clothing/under/lawyer/purpsuit, + "[slot_w_uniform_str]" = /obj/item/clothing/costume/clown, "[slot_back_str]" = /obj/item/backpack/clown, "[slot_wear_id_str]" = /obj/item/card/id, "[slot_glasses_str]" = /obj/item/clothing/glasses/meson, diff --git a/icons/clothing/pants/slacks_purple.dmi b/icons/clothing/pants/slacks_purple.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b70d286970ec3d285e704d6075f4f1ad3374504f GIT binary patch literal 665 zcmV;K0%rY*P)HrDhX4Qoqe-NqNTN<7PQbvx*pW=H00001bW%=J06^y0W&i*Hn0i!LbVOxyV{&P5 zbZKvH004NLQ&wi?^C?`dUi!&v&s2IpM+m+eywbTb_{ap%BE3Mi6+#Sj zK8z2!`P|61f}i;XA|4x~Z$1d;$U4Rx#ffkZl!ngV=0>q9}^; z=Wxc{U)|OWyD#xedFzj?0>wyfUIOFiqz&flAOw;%H#dW;*^e*aQ{WY!$Cxc2wRlhB zls={$Egy9Wlr!B!$ujB^FfJu4M_ngK;hu7qQJ;Xz3B{-dpjZPwL=>Yw@H<4H#tB7H z{uzrG{{;9l-la0FN;}&*zTe`-W-AZSGy3v1&6iLIhH4(5XDlE0gZODf9k`wc=oz6b zPJ9V<;CdclRm`jZ2gHHvd4N?R#!WBY$^)$GLl9dq2d?Jzgv00000NkvXXu0mjf^)nrf literal 0 HcmV?d00001 diff --git a/icons/clothing/shirts/button_up_tan.dmi b/icons/clothing/shirts/button_up_tan.dmi index 09a70d4d57117fa9db1168a19832b1a2592f2a3b..299e24cf792b7020d0d626569f6bced9fda59375 100644 GIT binary patch delta 510 zcmVLqQl*+aIzRGWXr1@N%s(^nJ>#EkX;eP*cTODbK(Q=l$mE1Nfp}_iHqe zlrpBEprGSbG#UY7iQwf0Q77YDlO+|d7q$Pbt$ zH+cJj8~?lmAOE9uz!|1!c<>DVesCx+f`Z2S0g_B~Y(>HgB>(^b07*qoM6N<$g7{PI AD*ylh delta 601 zcmV-f0;c`q1-u537!3#m0002hMu!Rj002CZB`y{W3=9ts50sRY)z#Gy5D*g+6A&oG zqmfsze*z6jL_t(&f$dn)Zo)7OY;aOSfx^cB|Lbh0EtBv$lPdOt4-rwFW5;cg?mP^E zK;W~G4hLQjhlF_r;w2!p#iofe^M%L`5WesS@fwg*MhQ|8EGy(QwvsX_)!zQW@vnS1{U8!))QI> zJo58hdA+jv40w%sw)jd`s>9ZSUfFyG{L;gELL2;=75tV8p9PTD1n@0wJdNb@%k^@eP9VWFohSVQex7gF``7(?n`aQQ6Z4JnEz8>qJRY2#mp2vQdo*(g^Ska) ze;^PD1Ooqt3MI`G$<$QJbo>M7uPiHvjFV^9HmQONJ^vv2S=!Z9MwEXnsj~93EA;$> z9-(ATP+<#=wY6o>KP&~32H_5PcLD`E{-MRFf-ks(qT(J{tl$2@-k<8Rk_6!n_z7|l zzQwLO=K`e9+3P?eyaJ40d!fB%-Ae;AZt`HnjvEim8$u77Cz!~>uJF$Ye8 zo_`1g0)apv@G0od|M&Wb-u!>@4}N;bKXm8+tAD`4%J&bw`Tyo0u(Wji!yo4Vn}2XR z!2Y4>`)&S@BGf;4@?PBm9&WGWdB6`UzP%2b{N7Wb_6$mO3;6T@Mc#WIxbnU~C;x8+ n2zTK7hwl7;uYU*x0s({{*lQ3yAWU#}00000NkvXXu0mjf9S|M9 diff --git a/icons/clothing/under/uniform_internalaffairs.dmi b/icons/clothing/under/uniform_internalaffairs.dmi deleted file mode 100644 index 99b4da4f6e2d8bb1215ef71040f7965b8caaeb8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmV+c1^)VpP)004jp0{{R3ySw;ZV`5@}fPnM!^U%=H#>U3y=jV8M zc)Pi|%F4>c#l_au)wHyf(z`(%n8495Q0004WQchCdQ@0+L}hbha%pgMX>V=- z0C=38kjo0fFcd`B$ybDSt@!BHjkJ_5>@S4Ky)}V6;3jSG?+q4oC)nK_m@|v1#kK2) zQM9*#FG$e@FD|0lA2`bfk}hyQai-BcbXp-Mm9WGr2eMFc28LqcBWDvShim?{^z4)m z2E;wUa~Ew$GRxVUDUkch&Hr*i#0BG)5i7Owu*IaGW-Yq0eV_RP7#C_C`>_mI000As zNklqd9urK^JU?}%*4RUMIUy*^;z4eH0`knB zUw2RaOt4X#T7T0YMW}#<5Tx^8jRh4n7k!VPFu^B%hc62uw(axp=XQ(5 zu6(;~xAqIk^YaXBzMSo%R&DKmnV5%jp_fY{JU=xsvorZrT>F5`?~wT z==<+usvorZrT@bP-TmKHf>-u`<}#xH!|OG-;LQD>MI`nLMRWImC%+f-EddN?@Bezi z^wk)qkl@_?U+?Q z*M{!oeCESzLw9mM^SK{n7=~dOhGCfhl!+>?U`$kTg=3+w?*HCxu>^4^2yh7rH`IARJ+FoaTTQ@vhW#m;X{P~k{u*jrO!CIx= z#h<(%oqp{7+3518?jpfiz8%-*2+yB5W4cq{Ii)>TQ$=I`#vFLaz|a&MEI384^%nyJ z(+5u%$B>FSZ)fxttyU0db#(|5<~|m5d*A=&d#u6PhxC%_o}YU&bK1)d+RwRX%#>Tz zbu?*X#8aU~Z5zd!)^KYsRd~H!N<;V6F_WzqxYql>Gk8?`A|PwKG4Ip;NegW7fuW99fZ?hJE4$7s1C6OAN2;V5qt^UmS1{elyqS?NfK&5J z+~J6Y3{x{6Gj55fWmNdS!v0D+^Ba~cEDGujQyEqmH!QJpye8-%%)rgOYv1{+=?pQe z`no4rZ^&ba|NO(5X$yO0hG&DG*+FZ!EBDiz%l90-wXQfeT{pGB;>$LBnO!msTdxUz zUA*=1gSLaWlo=WB*#-nK9Jv1VgEteCpi>18Y z&fKu<;jXGR6J5o+LE#+Od-Lswkk2~*-C8*QYBjygJ0S4#pXR?PXQSLWRtA=+eIg5P zofc<)!4a@{JGZ~!8;6c-UtgC!C^_lz^!4N#nLkCx&VM#PIrm@gdFBf9-a13!|7GUF zEj4%jE$z4&+~$ij%zy5&U7#fU-{Rtbr|WlLoNRpkwelUtCzmJ7?=6l`*vYVCPNfFJ zp2Ef4^RK0+$#Ds6yE8w(-0E{i!+Vwodif4N1%Eu@_*2`rK;_Wk(`LI0zvvl%j`(X4 zZuxz4idR~M4#XG#*Is&1eg5cm;}WTw_b=loEWG@nde;3Z|2uPaPFzrY;BcmNx?+0t zKlN=JRh)wj%fT!S=f_~y?rtL!sp9QV>v!!|feCRNnTUdf76FAI>UVV;eG#b<{_p#9 y{+oSv&iSYR_wUfXactf_`3*2fK-^;Vi~Ze2$D3snm!AUWPX Date: Tue, 23 Apr 2024 18:41:54 +1000 Subject: [PATCH 188/212] Converting vox gear to pants/robes. --- mods/species/vox/datum/antagonism.dm | 4 ++-- mods/species/vox/gear/gear_under.dm | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm index 748ed1da6f..cccb64a8cd 100644 --- a/mods/species/vox/datum/antagonism.dm +++ b/mods/species/vox/datum/antagonism.dm @@ -9,7 +9,7 @@ gloves = /obj/item/clothing/gloves/vox mask = /obj/item/clothing/mask/gas/swat/vox back = /obj/item/tank/nitrogen - uniform = /obj/item/clothing/under/vox/vox_robes + uniform = /obj/item/clothing/suit/robe/vox glasses = /obj/item/clothing/glasses/thermal holster = /obj/item/clothing/webbing/holster/armpit suit_store = /obj/item/flashlight @@ -18,7 +18,7 @@ id_type = /obj/item/card/id/syndicate /decl/hierarchy/outfit/vox_raider/equip_outfit(mob/living/carbon/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) - uniform = pick(/obj/item/clothing/under/vox/vox_robes, /obj/item/clothing/under/vox/vox_casual) + uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) glasses = pick(/obj/item/clothing/glasses/thermal, /obj/item/clothing/glasses/thermal/plain/eyepatch, /obj/item/clothing/glasses/thermal/plain/monocle) holster = pick(/obj/item/clothing/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) . = ..() diff --git a/mods/species/vox/gear/gear_under.dm b/mods/species/vox/gear/gear_under.dm index 6e7dd0fbd0..dd6bd618cb 100644 --- a/mods/species/vox/gear/gear_under.dm +++ b/mods/species/vox/gear/gear_under.dm @@ -1,13 +1,12 @@ -/obj/item/clothing/under/vox - bodytype_equip_flags = BODY_FLAG_VOX - -/obj/item/clothing/under/vox/vox_casual +/obj/item/clothing/pants/vox name = "alien clothing" desc = "This doesn't look very comfortable." icon = 'mods/species/vox/icons/clothing/under_clothing.dmi' body_parts_covered = SLOT_LEGS + bodytype_equip_flags = BODY_FLAG_VOX -/obj/item/clothing/under/vox/vox_robes +/obj/item/clothing/suit/robe/vox name = "alien robes" desc = "Weird and flowing!" icon = 'mods/species/vox/icons/clothing/under_robes.dmi' + bodytype_equip_flags = BODY_FLAG_VOX From 7ed69f5eb49f609d58609d4f3a07f157e3951b73 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 23 Apr 2024 18:49:55 +1000 Subject: [PATCH 189/212] More clothing conversions... --- .../modules/clothing/dresses}/gown.dm | 4 +-- .../clothing/dresses}/gown.dmi | Bin .../corporate/clothing/under/security.dm | 25 ++++-------------- .../corporate/clothing/under/shirts.dm | 20 ++++++++++++++ mods/content/corporate/datum/loadout.dm | 10 +++---- .../corporate/icons/clothing/under/guard.dmi | Bin 1183 -> 0 bytes .../icons/clothing/under/guard_heph.dmi | Bin 1127 -> 0 bytes .../icons/clothing/under/guard_nt.dmi | Bin 1126 -> 0 bytes .../icons/clothing/under/guard_shirt.dmi | Bin 0 -> 856 bytes .../icons/clothing/under/guard_shirt_heph.dmi | Bin 0 -> 855 bytes .../icons/clothing/under/guard_shirt_nt.dmi | Bin 0 -> 856 bytes .../fantasy/items/clothing/_loadout.dm | 2 +- .../fantasy/items/clothing/_recipes.dm | 4 +-- nebula.dme | 3 --- 14 files changed, 35 insertions(+), 33 deletions(-) rename {mods/content/fantasy/items/clothing => code/modules/clothing/dresses}/gown.dm (75%) rename {mods/content/fantasy/icons/clothing => icons/clothing/dresses}/gown.dmi (100%) delete mode 100644 mods/content/corporate/icons/clothing/under/guard.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/guard_heph.dmi delete mode 100644 mods/content/corporate/icons/clothing/under/guard_nt.dmi create mode 100644 mods/content/corporate/icons/clothing/under/guard_shirt.dmi create mode 100644 mods/content/corporate/icons/clothing/under/guard_shirt_heph.dmi create mode 100644 mods/content/corporate/icons/clothing/under/guard_shirt_nt.dmi diff --git a/mods/content/fantasy/items/clothing/gown.dm b/code/modules/clothing/dresses/gown.dm similarity index 75% rename from mods/content/fantasy/items/clothing/gown.dm rename to code/modules/clothing/dresses/gown.dm index 8c68a209fe..3f177c522f 100644 --- a/mods/content/fantasy/items/clothing/gown.dm +++ b/code/modules/clothing/dresses/gown.dm @@ -1,6 +1,6 @@ -/obj/item/clothing/under/gown +/obj/item/clothing/dress/gown name = "gown" desc = "A simple, lightweight gown that extends to the feet and laces at the back." - icon = 'mods/content/fantasy/icons/clothing/gown.dmi' + icon = 'icons/clothing/dresses/gown.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/cloth //todo silk diff --git a/mods/content/fantasy/icons/clothing/gown.dmi b/icons/clothing/dresses/gown.dmi similarity index 100% rename from mods/content/fantasy/icons/clothing/gown.dmi rename to icons/clothing/dresses/gown.dmi diff --git a/mods/content/corporate/clothing/under/security.dm b/mods/content/corporate/clothing/under/security.dm index bf58bea5d6..12cffa8681 100644 --- a/mods/content/corporate/clothing/under/security.dm +++ b/mods/content/corporate/clothing/under/security.dm @@ -1,12 +1,3 @@ -/obj/item/clothing/under/guard - name = "green security guard uniform" - desc = "A durable uniform worn by Expeditionary Corps Organisation security." - icon = 'mods/content/corporate/icons/clothing/under/guard.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SMALL - ) - siemens_coefficient = 0.9 - /obj/item/clothing/jumpsuit/security/corp icon = 'mods/content/corporate/icons/clothing/under/sec_corporate.dmi' @@ -16,17 +7,11 @@ /obj/item/clothing/jumpsuit/head_of_security/corp icon = 'mods/content/corporate/icons/clothing/under/hos_corporate.dmi' -/obj/item/clothing/under/guard/heph - name = "cyan security guard uniform" - desc = "A durable uniform worn by subcontracted Hephaestus Industries security." - icon = 'mods/content/corporate/icons/clothing/under/guard_heph.dmi' - -/obj/item/clothing/under/guard/nanotrasen - name = "red security guard uniform" - desc = "A durable uniform worn by subcontracted NanoTrasen security." - icon = 'mods/content/corporate/icons/clothing/under/guard_nt.dmi' - -/obj/item/clothing/under/guard/pcrc +/obj/item/clothing/under/pcrc name = "\improper PCRC uniform" desc = "A uniform belonging to Proxima Centauri Risk Control, a private security firm." icon = 'mods/content/corporate/icons/clothing/under/pcrc.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_SMALL + ) + siemens_coefficient = 0.9 diff --git a/mods/content/corporate/clothing/under/shirts.dm b/mods/content/corporate/clothing/under/shirts.dm index de649591d2..21ec824a5f 100644 --- a/mods/content/corporate/clothing/under/shirts.dm +++ b/mods/content/corporate/clothing/under/shirts.dm @@ -36,3 +36,23 @@ /obj/item/clothing/shirt/button/corp/zeng name = "\improper Zeng-Hu button-up shirt" desc = "A monogrammed Zeng-Hu Pharmaceuticals-issued shirt that particularly enthusiastic company executives tend to wear." + +/obj/item/clothing/shirt/guard + name = "green security guard shirt" + desc = "A durable shirt worn by Expeditionary Corps Organisation security." + icon = 'mods/content/corporate/icons/clothing/under/guard_shirt.dmi' + armor = list( + ARMOR_MELEE = ARMOR_MELEE_SMALL + ) + siemens_coefficient = 0.9 + +/obj/item/clothing/shirt/guard/heph + name = "cyan security guard shirt" + desc = "A durable shirt worn by subcontracted Hephaestus Industries security." + icon = 'mods/content/corporate/icons/clothing/under/guard_shirt_heph.dmi' + +/obj/item/clothing/shirt/guard/nanotrasen + name = "red security guard shirt" + desc = "A durable shirt worn by subcontracted NanoTrasen security." + icon = 'mods/content/corporate/icons/clothing/under/guard_shirt_nt.dmi' + diff --git a/mods/content/corporate/datum/loadout.dm b/mods/content/corporate/datum/loadout.dm index a1f70428c2..9156b3db62 100644 --- a/mods/content/corporate/datum/loadout.dm +++ b/mods/content/corporate/datum/loadout.dm @@ -22,10 +22,6 @@ path = /obj/item/clothing/suit/toggle/labcoat/science loadout_flags = GEAR_HAS_TYPE_SELECTION -/decl/loadout_option/uniform/corporate - name = "corporate uniform selection" - path = /obj/item/clothing/under - /decl/loadout_option/uniform/corp_polo name = "corporate polo selection" path = /obj/item/clothing/shirt/polo/corp @@ -36,6 +32,10 @@ path = /obj/item/clothing/shirt/tunic/corp loadout_flags = GEAR_HAS_TYPE_SELECTION +/decl/loadout_option/uniform/corporate + name = "corporate uniform selection" + path = /obj/item/clothing/under + /decl/loadout_option/uniform/corporate/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) @@ -46,7 +46,7 @@ /obj/item/clothing/jumpsuit/focal, /obj/item/clothing/under/mbill, /obj/item/clothing/under/saare, - /obj/item/clothing/under/guard/pcrc, + /obj/item/clothing/under/pcrc, /obj/item/clothing/under/grayson, /obj/item/clothing/under/morpheus, /obj/item/clothing/under/skinner, diff --git a/mods/content/corporate/icons/clothing/under/guard.dmi b/mods/content/corporate/icons/clothing/under/guard.dmi deleted file mode 100644 index cadaad00e24b03b1b6bcaf11e634f49468186869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183 zcmV;Q1YrA#P)C00015P)t-sz`($i zl#~r$Ik2|4v$L}*R5r)Q$EBsEfPjGG` zGh<_8y}i9HEiDof5~8A_2nYymZEY$lDjFIZ78Vx3z`!Dhiemr(00DGTPE!Ct=GbNc z005qPR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;Zh zDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG* z6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*lauJ$MNY@PHrlyvq7E@+OQGQNNY6>nhloee4 zT)=??0CEOfzJ&7~J^%m%Nl8RORCt{2TZ?kqFc8$4=xiCg!AYSh=KsI5C)t5cs=H$l zO33tfCML|vtM!Xv*Ty-6!C-hOK+`nvh0{Z`*=!o%EIfgyrH3bW{e|Z@VHv@)hz)F@ zLCh-vw&bDz+n>ZiY`N;sSyDYc~$Q!xj4V+Gg(@8Qw>g@a^5cdx4BYuL! z3kGOa!Qiruf&mSWU_hMU3Ioz9@HqzfYv2mdNlX*4S84hjaKh)ndZpiPz+f;K42I8v z5bw+T0hNyF9Xl?)7WV_Pe&qWt(aebQen8e=HMSJ9v+4d0{eY;y3>avD511=*?$8g2 z`m0C`|Jig&xpwUbXc_;{@RxqzUw+kxvFo7gSOcjX2;4Ec^aFWZ`T;>dC1id;v=7{c zBJ~IFJPLf$??eMbI(RTKbYVa6uJ0Iq=P3NY2m?y{0Zrezas5uue6cU>2Q>Y2a1r8p zQ9q#RyEVJ<$)~g*Q1sJ?*beXp3i|;?|2%*r%j3DM{}=|O0AC)@^@2bQ@OLqw6a->` zFYgDeATSsV2E(_267MTR%kS0a*YbOH16qEsZa~ZL)eVGaFXs2^2DJQM-++?es~gbr zdl__DwI5h?_8_XEoF18GRren5MEz*Udu-@!oL zen5YIpmIN;KR-~pAFz7BU@#aA27|%yZBVHn(D9n$`xhEe@9)=!et*Bd1MU8PbqCu0 x{ZBFQh4VjvfwCU}+`~Z84*>39zykdLhd<^uW5Zzguvq{A002ovPDHLkV1m+_G8q5> diff --git a/mods/content/corporate/icons/clothing/under/guard_heph.dmi b/mods/content/corporate/icons/clothing/under/guard_heph.dmi deleted file mode 100644 index 504eb326736173545c8fdd98a362e352a770d69b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmV-t1ep7YP)C00015P)t-sz`($i zl$187rm(iSv$L}{g@wn*$EBsEfPjGG` zGh<_8y}i9HEiDof5~8A_2nYymZEY$lDjFIZ78Vx3z`)#%;fw$P00DGTPE!Ct=GbNc z005qPR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;Zh zDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG* z6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*lauJ$MNY@PHrlyvq7E@+OQGQNNY6>nhloee4 zT)=??0CEOfzJ&7~J^%m%5lKWrRCt{2n-6c|Fbu`(Lfoc*?kGFB9p(Ff&a=}FrV+ac zmK14z(u&wi?O$m?_(>Fn$z(FUl%On2Sg}2no6V*K31JJ4jt;is`I9eS!n8tk5lh%W zi5RZ{SfMK%9TnfnKCP$`oD<#B`?7(CA7X33dk^G?N5Lm{M8Ti>*Vr}!0hA4T0Pxtv z0KnnJ$H-Moeutglhb7KKE8!79MFoHgR8au$F20M@n0=Idl0)wZpcC%_^x(n&ita+F zn%VzNyR50cE`gl~251=o{4RQv_!ZJZW2(-iyxkS1%RR=za_s4&muKy zKlKm*r~r}g=n7)qw)*7rv$&6f9{@<9h6DifJr-Z0JA739fen!NK(QaZfAfCWKkOs^ zK@|NVETS3`z~M0TeLoxyf`26a<%8lMHGf{z3;sLnUpNW{PN!4&lNyjWD*ihe@8dWM z<;fpIgYhT>(CLo@@Fk8Xu|EOOxzj;vKx{-Q1Dwyt^H~F+>SBK?z^@LyMskDTD*$w= z0ytfx0G<*&e%ICoRPJbN0WHOmdraV%{`_%bB z5$0FGTAE%H=L5W;X{o(HkUSrlYP2+FM;X)S1H7Um0Ov7wqcY?JT!e@J=yXYQ?WcU8 zy4h&_ziU2l>$B<_>RQPMc*y5)z)QREnh(Tv%?E_?{HNsuMHv2hikBM5`N4;eiqBa?7fuf(k(+gkhQ|AMh!9^L*ljZ}(JiE!0PvU$a zEa7xO21uL_d;myhj`4hb0PP;-$OqI-nj;@j2YAZ|OeT}b^h2bL_vxkP13CI@`9Kx` zB_GHGpyUI20BHCRL;Pw0G~9>rcs&4*^{N0g{k@ErFpYj1}BLY}H zVEMo+jOVKZSUzC+fXQSsnM@{=$rO|*A6V8~7~fX}SjY#`Yat)VLZIaXSqQXzAREAn t{a*m!xgP+02f$N50Qd#~8{mJQ{sY~bW67WI&R+lk002ovPDHLkV1k{E2%`W1 diff --git a/mods/content/corporate/icons/clothing/under/guard_nt.dmi b/mods/content/corporate/icons/clothing/under/guard_nt.dmi deleted file mode 100644 index 58cc7527fcd00e02a69cf1e5d47efcaf563ba5ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmV-s1eyDZP)C00015P)t-sz`($i zl$1&l0I;^Wv$L~X6adG^$EBsEfPjGG` zGh<_8y}i9HEiDof5~8A_2nYymZEY$lDjFIZ78Vx3z`!@)LPP)n00DGTPE!Ct=GbNc z005qPR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;Zh zDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG* z6Z7&jQxuZ&Qz~_fbMi~#%i~M)GSl*lauJ$MNY@PHrlyvq7E@+OQGQNNY6>nhloee4 zT)=??0CEOfzJ&7~J^%m%5J^NqRCt{2n-6c|Fbu`(Lfoc*Zj>DyNBRDr^X#;P(-yl3 zmK14z(#p_F?O$m?_(>Fn$z(FUl%On2Sg}2no6V*K31JJ4jt;is`I9eS!n8tk5lh%W zi5RZ{SfMK%9TnfnKCP$`oD<#B`?7(CA7X33dk^G?N5Lm{M8Ti>*Vr}!0hA4T0Pxtv z0KnnZ$H-Moeutglhb7KKE8!79MFoHgR8au$uD*-Zn0=Idl0)wZpcC%_^x(n&ita+F zn%RG&UDi~em%z>g1GEePeiyw-{0edn382Al2fGeqHwmca)ep};13*!c-;!U2XOSAU zpLz%YRDj5LbOkYQTm9$rv$&6f9{@<9h6DifJr-Z0JA739fen!NK(QaZfA@aaKkOs^ zMil)aETS3`z~M0TeLoxyf`26a;e+BIHGf{z3;v1qHynim=kq!INe##w75_xWX>P zJo#g2Fdk(9I{k3~zQpk?_9p;3cREN7h>a*^fXn50xo7}XUF=T<_|>7;NNx~(1%OUf z0H5l`LOeT}blt;>VpE@5X z!u$$YOVexOe1I1;EwvX2lIH_cjh4pjC}aA3fLC+`;5^1|REB(ji}3Itoi1svo$~=Y z^8XS4mJfXOS#=F{t>gndfPBOg!)c*_S&CX>nZL!^!O>80iaIr?k)Ko$Tc zAIJlspydNu2()}48^DVF sUjX2_9{_v@z*9c}_yzzQ;D4U}0qMzO!!aISaR2}S07*qoM6N<$f`PLCEC2ui diff --git a/mods/content/corporate/icons/clothing/under/guard_shirt.dmi b/mods/content/corporate/icons/clothing/under/guard_shirt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..40642e836a23c6d029616c74ac6fb835e92d2853 GIT binary patch literal 856 zcmV-e1E>6nP)zb0Po$00DGTPE!Ct=GbNc005PGR9JLGWpiV4 zX>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_f zbMi~#%i~M)GSl*lauJ$MNY@PHrlyvq7UMERS;5uM1?({ZdvZl5Qkt^E0006PNkl1}!rtB?_yJVgI|3^p3PExd_7|duNRvr-9#+`I>%N5F;EQBFYND0aHjkcKFocBT>wd>qSxk5drh-L<359J_%dgc+~hRfe8rchj_{`e0`F6 zRQPol+kdQo$2N~0KAab#7oz3-&phHUM3oPh%Q8*Va=9q{mGQd{9sb(k!z<%Y9W;T% z;cz${j{gN~h2Mo<{+s!M*DnZ3tc-60X0a#&D?hC37o4TibQ9#6mscFD{IKqiU{>k2 z#>{29T>TsQp&}tAHW+n-kqr`|bWm1)Xqvi%ngR4TsNq1YZhfFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_f zbMi~#%i~M)GSl*lauJ$MNY@PHrlyvq7UMERS;5uM1?({ZdvZl5Qkt^E0006ONkl1}!qUyL6lW|3^p3Zc?`56A{ju!JCEtTVB;s86uuc`761#fXh7-CC*g=Yj~d@3FarU76K@%E+4=8$ zizUC6z=fb0EX@GuBECYw=>nGti)aAh&iC0{0|=S>q_)Qv|j(3NBn`P^5J${=XqXlH-&#@{A|O3e;)AR7vpyuG=an6 za5x-}e+65GKZIWXoB4tFuLw!3j9&!IVpRlIe%SV}xJaexE+`9cuQ*uwVLKneqSAej zh0Aog`Zw}JLqbYyFzE&p8ze&MqOAPTHSGi~1L$wi!hu-b0$22p{E+1@0V-`7K{e>% zfwWtGj5PDtD z<^8M)=Dqe;0)Ukt91e%W;c)yfu=@W;^Mlp@Kb#+|{{PYZVD|ry<%f^-|BvMduIV5B zf4RP|6>7EeLl-IhqyMk0Z$B$Pz%G;xUi$yKLACNj9T-^s|6a9!AU|m3z1jainjg&m h|Iz&5a5x+q{s82v9IFpbO;!K^002ovPDHLkV1meGmLLEC literal 0 HcmV?d00001 diff --git a/mods/content/corporate/icons/clothing/under/guard_shirt_nt.dmi b/mods/content/corporate/icons/clothing/under/guard_shirt_nt.dmi new file mode 100644 index 0000000000000000000000000000000000000000..12cfd77deb816207838cbb0cec4e2b746b7f7c18 GIT binary patch literal 856 zcmV-e1E>6nP)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*-GsxnG*6Z7&jQxuZ&Qz~_f zbMi~#%i~M)GSl*lauJ$MNY@PHrlyvq7UMERS;5uM1?({ZdvZl5Qkt^E0006PNkl1}!rtB?_yJVgI|3^p3PExd_7|duNRvr-9#+`I>%N5F;EQBFYND0aHjkcKFocBT>wd>qSxk5drh-L<359J_%dgc+~hRfe8rchj_{`e0`F6 zRQPol+kdQo$2N~0KAab#7oz3-&phHUM3oPh%Q8*Va=9q{mGQd{9sb(k!z<%Y9W;T% z;cz${j{gN~h2Mo<{+s!M*DnZ3tc-60X0a#&D?hC37o4TibQ9#6mscFD{IKqiU{>k2 z#>{29T>TsQp&}tAHW+n-kqr`|bWm1)Xqvi%ngR4TsNq1YZh Date: Mon, 29 Apr 2024 09:29:17 +1000 Subject: [PATCH 190/212] Map update/compile stuff for uniform rework. --- code/modules/clothing/shoes/miscellaneous.dm | 1 + maps/away/liberia/liberia.dmm | 4 +- maps/exodus/exodus-2.dmm | 2 +- maps/exodus/exodus-admin.dmm | 2 +- .../exoplanet_ruins/hydrobase/hydrobase.dmm | 2 +- .../exoplanet_ruins/playablecolony/colony.dmm | 32 +++---- nebula.dme | 3 + tools/map_migrations/3948_uniforms.txt | 88 +++++++++++++++++++ 8 files changed, 113 insertions(+), 21 deletions(-) create mode 100644 tools/map_migrations/3948_uniforms.txt diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e35c22837c..60e88bf9d7 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -100,6 +100,7 @@ desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" name = "clown shoes" icon = 'icons/clothing/feet/clown.dmi' + force = 0 bodytype_equip_flags = null can_add_hidden_item = FALSE var/footstep = 1 //used for squeeks whilst walking diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index edb296e8dc..766993e725 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -3818,7 +3818,7 @@ /obj/item/clothing/shoes/craftable, /obj/item/clothing/under/blazer, /obj/item/clothing/under/lawyer, -/obj/item/clothing/under/formal/navy, +/obj/item/clothing/pants/slacks/black/outfit/navy, /obj/random/handgun, /obj/item/chems/drinks/bottle/premiumwine, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -4234,7 +4234,7 @@ /obj/structure/closet/cabinet, /obj/item/clothing/shoes/color/black, /obj/item/clothing/under/overalls, -/obj/item/clothing/under/skirt, +/obj/item/clothing/skirt, /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 4de720ef3c..493d6853e5 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -20976,7 +20976,7 @@ /area/exodus/chapel/main) "aSm" = ( /obj/structure/cult/tome, -/obj/item/clothing/under/formal/red, +/obj/item/clothing/pants/slacks/red/outfit, /obj/item/radio/intercom{ dir = 8; pixel_x = 22 diff --git a/maps/exodus/exodus-admin.dmm b/maps/exodus/exodus-admin.dmm index 2dc424d75f..73a6ea89d6 100644 --- a/maps/exodus/exodus-admin.dmm +++ b/maps/exodus/exodus-admin.dmm @@ -2058,7 +2058,7 @@ /obj/structure/table/woodentable{ dir = 5 }, -/obj/item/clothing/under/formal, +/obj/item/clothing/pants/slacks/outfit, /obj/item/clothing/head/that{ pixel_x = 4; pixel_y = 6 diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index b07c1e7702..73c7af3d9a 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -2577,7 +2577,7 @@ /turf/floor/tiled/freezer, /area/map_template/hydrobase/station/shower) "gz" = ( -/obj/item/clothing/under/skirt_c/dress/black, +/obj/item/clothing/skirt/black, /obj/item/clothing/head/beret/purple, /obj/item/clothing/shoes/dress, /obj/structure/closet, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index b05cf7ef36..113cdb5358 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -157,10 +157,10 @@ /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/under/frontier, /obj/item/clothing/jumpsuit/hazard, -/obj/item/clothing/under/formal, -/obj/item/clothing/under/formal/charcoal, +/obj/item/clothing/pants/slacks/outfit, +/obj/item/clothing/pants/slacks/black/outfit, /obj/item/clothing/under/syndicate, -/obj/item/clothing/under/det/grey, +/obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, /obj/item/clothing/pants/casual/youngfolksjeans, /obj/item/clothing/suit/jacket/bomber, @@ -1364,13 +1364,13 @@ /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/under/frontier, /obj/item/clothing/jumpsuit/hazard, -/obj/item/clothing/under/skirt, -/obj/item/clothing/under/formal, -/obj/item/clothing/under/formal/navy, -/obj/item/clothing/under/formal/charcoal, +/obj/item/clothing/skirt, +/obj/item/clothing/pants/slacks/outfit, +/obj/item/clothing/pants/slacks/black/outfit/navy, +/obj/item/clothing/pants/slacks/black/outfit, /obj/item/clothing/under/syndicate, /obj/item/clothing/jumpsuit/sterile, -/obj/item/clothing/under/det/grey, +/obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, /obj/item/clothing/pants/casual/camo, /obj/item/clothing/pants/casual/track, @@ -2299,12 +2299,12 @@ /obj/item/clothing/jumpsuit/captain_fly, /obj/item/clothing/under/frontier, /obj/item/clothing/jumpsuit/hazard, -/obj/item/clothing/under/skirt, -/obj/item/clothing/under/formal/navy, -/obj/item/clothing/under/formal/charcoal, +/obj/item/clothing/skirt, +/obj/item/clothing/pants/slacks/black/outfit/navy, +/obj/item/clothing/pants/slacks/black/outfit, /obj/item/clothing/under/syndicate, /obj/item/clothing/jumpsuit/sterile, -/obj/item/clothing/under/det/grey, +/obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, /obj/item/clothing/pants/casual/camo, /obj/item/clothing/pants/casual/track, @@ -2747,12 +2747,12 @@ /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/under/frontier, /obj/item/clothing/jumpsuit/hazard, -/obj/item/clothing/under/skirt, -/obj/item/clothing/under/formal, -/obj/item/clothing/under/formal/navy, +/obj/item/clothing/skirt, +/obj/item/clothing/pants/slacks/outfit, +/obj/item/clothing/pants/slacks/black/outfit/navy, /obj/item/clothing/under/syndicate, /obj/item/clothing/jumpsuit/sterile, -/obj/item/clothing/under/det/grey, +/obj/item/clothing/pants/slacks/outfit/detective, /obj/item/clothing/pants/baggy, /obj/item/clothing/pants/casual/camo, /obj/item/clothing/pants/casual/track, diff --git a/nebula.dme b/nebula.dme index 57974af8bb..6bf00a6a84 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1954,6 +1954,7 @@ #include "code\modules\clothing\head\jobs.dm" #include "code\modules\clothing\head\misc.dm" #include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\security.dm" #include "code\modules\clothing\head\soft_caps.dm" #include "code\modules\clothing\jumpsuits\_jumpsuit.dm" #include "code\modules\clothing\jumpsuits\color.dm" @@ -1982,6 +1983,7 @@ #include "code\modules\clothing\neck\stethoscope.dm" #include "code\modules\clothing\neck\ties.dm" #include "code\modules\clothing\pants\_pants.dm" +#include "code\modules\clothing\pants\detective.dm" #include "code\modules\clothing\pants\misc.dm" #include "code\modules\clothing\pants\pajamas.dm" #include "code\modules\clothing\pants\pants_casual.dm" @@ -1995,6 +1997,7 @@ #include "code\modules\clothing\shirts\_shirts.dm" #include "code\modules\clothing\shirts\blouse.dm" #include "code\modules\clothing\shirts\flannel.dm" +#include "code\modules\clothing\shirts\formal.dm" #include "code\modules\clothing\shirts\hawaii.dm" #include "code\modules\clothing\shirts\misc.dm" #include "code\modules\clothing\shirts\pajamas.dm" diff --git a/tools/map_migrations/3948_uniforms.txt b/tools/map_migrations/3948_uniforms.txt new file mode 100644 index 0000000000..2cb182aa7e --- /dev/null +++ b/tools/map_migrations/3948_uniforms.txt @@ -0,0 +1,88 @@ +/obj/item/clothing/under/lawyer/female/@SUBTYPES : /obj/item/clothing/under/lawyer/@SUBTYPES{@OLD} +/obj/item/clothing/under/clown/@SUBTYPES : /obj/item/clothing/costume/clown/@SUBTYPES{@OLD} +/obj/item/clothing/under/mime/@SUBTYPES : /obj/item/clothing/costume/mime/@SUBTYPES{@OLD} +/obj/item/clothing/under/sexyclown/@SUBTYPES : /obj/item/clothing/costume/sexyclown/@SUBTYPES{@OLD} +/obj/item/clothing/under/redcoat/@SUBTYPES : /obj/item/clothing/costume/redcoat/@SUBTYPES{@OLD} +/obj/item/clothing/under/sexymime/@SUBTYPES : /obj/item/clothing/costume/sexymime/@SUBTYPES{@OLD} +/obj/item/clothing/under/soviet/@SUBTYPES : /obj/item/clothing/costume/soviet/@SUBTYPES{@OLD} +/obj/item/clothing/under/pirate/@SUBTYPES : /obj/item/clothing/costume/pirate/@SUBTYPES{@OLD} +/obj/item/clothing/under/redcoat/@SUBTYPES : /obj/item/clothing/costume/redcoat/@SUBTYPES{@OLD} +/obj/item/clothing/under/kilt/@SUBTYPES: /obj/item/clothing/costume/kilt/@SUBTYPES{@OLD} +/obj/item/clothing/under/savage_hunter/@SUBTYPES : /obj/item/clothing/costume/savage_hunter/@SUBTYPES{@OLD} +/obj/item/clothing/under/schoolgirl/@SUBTYPES : /obj/item/clothing/costume/schoolgirl/@SUBTYPES{@OLD} +/obj/item/clothing/under/owl/@SUBTYPES : /obj/item/clothing/costume/owl/@SUBTYPES{@OLD} +/obj/item/clothing/under/gladiator/@SUBTYPES : /obj/item/clothing/costume/gladiator/@SUBTYPES{@OLD} +/obj/item/clothing/under/internalaffairs/plain/@SUBTYPES : /obj/item/clothing/slacks/black/outfit/internal_affairs/@SUBTYPES{@OLD} +/obj/item/clothing/under/internalaffairs/@SUBTYPES : /obj/item/clothing/slacks/black/outfit/internal_affairs/@SUBTYPES{@OLD} +/obj/item/clothing/under/formal/corp/@SUBTYPES : /obj/item/clothing/pants/slacks/black/corp/@SUBTYPES{@OLD} +/obj/item/clothing/under/formal/navy/@SUBTYPES : /obj/item/clothing/pants/slacks/black/outfit/navy/@SUBTYPES{@OLD} +/obj/item/clothing/under/formal/red/@SUBTYPES : /obj/item/clothing/pants/slacks/red/outfit/@SUBTYPES{@OLD} +/obj/item/clothing/under/formal/checkered/@SUBTYPES : /obj/item/clothing/pants/slacks/black/outfit/checkered/@SUBTYPES{@OLD} +/obj/item/clothing/under/formal/charcoal/@SUBTYPES : /obj/item/clothing/pants/slacks/black/outfit/@SUBTYPES{@OLD} +/obj/item/clothing/under/formal/@SUBTYPES : /obj/item/clothing/pants/slacks/outfit/@SUBTYPES{@OLD} +/obj/item/clothing/under/det/black/@SUBTYPES : /obj/item/clothing/pants/slacks/black/outfit/detective/@SUBTYPES{@OLD} +/obj/item/clothing/under/det/@SUBTYPES : /obj/item/clothing/pants/slacks/outfit/detective/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/purpsuit/@SUBTYPES : /obj/item/clothing/pants/slacks/purple/outfit/@SUBTYPES{@OLD} +/obj/item/clothing/under/medical/scrubs/@SUBTYPES : /obj/item/clothing/pants/scrubs/@SUBTYPES{@OLD} +/obj/item/clothing/under/pj/@SUBTYPES : /obj/item/clothing/pants/pj/@SUBTYPES{@OLD}, /obj/item/clothing/shirt/pj/@SUBTYPES{@OLD} +/obj/item/clothing/under/research_director/dress_rd : /obj/item/clothing/skirt/research_director/outfit/@SUBTYPES{@OLD} +/obj/item/clothing/under/color/@SUBTYPES : /obj/item/clothing/jumpsuit/@SUBTYPES{@OLD} +/obj/item/clothing/under/chaplain/@SUBTYPES : /obj/item/clothing/jumpsuit/chaplain/@SUBTYPES{@OLD} +/obj/item/clothing/under/engineer/@SUBTYPES : /obj/item/clothing/jumpsuit/engineer/@SUBTYPES{@OLD} +/obj/item/clothing/under/janitor/@SUBTYPES : /obj/item/clothing/jumpsuit/janitor/@SUBTYPES{@OLD} +/obj/item/clothing/under/medical/@SUBTYPES : /obj/item/clothing/jumpsuit/medical/@SUBTYPES{@OLD} +/obj/item/clothing/under/chemist/@SUBTYPES : /obj/item/clothing/jumpsuit/chemist/@SUBTYPES{@OLD} +/obj/item/clothing/under/psych/@SUBTYPES : /obj/item/clothing/jumpsuit/psych/@SUBTYPES{@OLD} +/obj/item/clothing/under/chief_medical_officer/@SUBTYPES : /obj/item/clothing/jumpsuit/chief_medical_officer/@SUBTYPES{@OLD} +/obj/item/clothing/under/geneticist/@SUBTYPES : /obj/item/clothing/jumpsuit/geneticist/@SUBTYPES{@OLD} +/obj/item/clothing/under/virologist/@SUBTYPES : /obj/item/clothing/jumpsuit/virologist/@SUBTYPES{@OLD} +/obj/item/clothing/under/tactical/@SUBTYPES : /obj/item/clothing/jumpsuit/tactical/@SUBTYPES{@OLD} +/obj/item/clothing/under/caretaker/@SUBTYPES : obj/item/clothing/jumpsuit/caretaker/@SUBTYPES{@OLD} +/obj/item/clothing/under/hazard/@SUBTYPES : /obj/item/clothing/jumpsuit/hazard/@SUBTYPES{@OLD} +/obj/item/clothing/under/head_of_security/@SUBTYPES : /obj/item/clothing/jumpsuit/head_of_security/@SUBTYPES{@OLD} +/obj/item/clothing/under/warden/@SUBTYPES : /obj/item/clothing/jumpsuit/warden/@SUBTYPES{@OLD} +/obj/item/clothing/under/security/@SUBTYPES : /obj/item/clothing/jumpsuit/security/@SUBTYPES{@OLD} +/obj/item/clothing/under/mailman/@SUBTYPES : /obj/item/clothing/jumpsuit/mailman/@SUBTYPES{@OLD} +/obj/item/clothing/under/miner/@SUBTYPES : /obj/item/clothing/jumpsuit/miner/@SUBTYPES{@OLD} +/obj/item/clothing/under/sterile/@SUBTYPES : /obj/item/clothing/jumpsuit/sterile/@SUBTYPES{@OLD} +/obj/item/clothing/under/cargotech/@SUBTYPES : /obj/item/clothing/jumpsuit/cargotech/@SUBTYPES{@OLD} +/obj/item/clothing/under/chief_engineer/@SUBTYPES : /obj/item/clothing/jumpsuit/chief_engineer/@SUBTYPES{@OLD} +/obj/item/clothing/under/hydroponics/@SUBTYPES : /obj/item/clothing/jumpsuit/hydroponics/@SUBTYPES{@OLD} +/obj/item/clothing/under/captain/@SUBTYPES : /obj/item/clothing/jumpsuit/captain/@SUBTYPES{@OLD} +/obj/item/clothing/under/captainformal/@SUBTYPES : /obj/item/clothing/jumpsuit/captainformal/@SUBTYPES{@OLD} +/obj/item/clothing/under/quantum/@SUBTYPES : /obj/item/clothing/jumpsuit/quantum/@SUBTYPES{@OLD} +/obj/item/clothing/under/captain_fly/@SUBTYPES : /obj/item/clothing/jumpsuit/captain_fly/@SUBTYPES{@OLD} +/obj/item/clothing/under/johnny/@SUBTYPES : /obj/item/clothing/jumpsuit/johnny/@SUBTYPES{@OLD} +/obj/item/clothing/under/atmospheric_technician/@SUBTYPES : /obj/item/clothing/jumpsuit/atmospheric_technician/@SUBTYPES{@OLD} +/obj/item/clothing/under/blackjumpshorts/@SUBTYPES : /obj/item/clothing/jumpsuit/blackjumpshorts/@SUBTYPES{@OLD} +/obj/item/clothing/under/executive/@SUBTYPES : /obj/item/clothing/pants/slacks/black/corp/@SUBTYPES{@OLD} +/obj/item/clothing/under/polo/@SUBTYPES : /obj/item/clothing/pants/slacks/white/corp/polo/@SUBTYPES{@OLD} +/obj/item/clothing/under/guard/pcrc/@SUBTYPES : /obj/item/clothing/under/pcrc/@SUBTYPES{@OLD} +/obj/item/clothing/under/aether/@SUBTYPES : /obj/item/clothing/jumpsuit/aether/@SUBTYPES{@OLD} +/obj/item/clothing/under/focal/@SUBTYPES : /obj/item/clothing/jumpsuit/focal/@SUBTYPES{@OLD} +/obj/item/clothing/under/hephaestus/@SUBTYPES : /obj/item/clothing/jumpsuit/hephaestus/@SUBTYPES{@OLD} +/obj/item/clothing/under/wardt/@SUBTYPES : /obj/item/clothing/jumpsuit/wardt/@SUBTYPES{@OLD} +/obj/item/clothing/under/abaya/@SUBTYPES : /obj/item/clothing/suit/robe/abaya/@SUBTYPES{@OLD} +/obj/item/clothing/under/skirt/@SUBTYPES : /obj/item/clothing/skirt/@SUBTYPES{@OLD} +/obj/item/clothing/under/skirt_c/dress/@SUBTYPES : /obj/item/clothing/dress/short/@SUBTYPES{@OLD} +/obj/item/clothing/under/skirt_c/@SUBTYPES : /obj/item/clothing/skirt/short/@SUBTYPES{@OLD} +/obj/item/clothing/under/kimono/@SUBTYPES : /obj/item/clothing/dress/kimono/@SUBTYPES{@OLD} +/obj/item/clothing/under/cheongsam/@SUBTYPES : /obj/item/clothing/dress/cheongsam/@SUBTYPES{@OLD} +/obj/item/clothing/under/sundress_white/@SUBTYPES : /obj/item/clothing/dress/sun/white/@SUBTYPES{@OLD} +/obj/item/clothing/under/dress/dress_hop/@SUBTYPES : /obj/item/clothing/dress/hop/@SUBTYPES{@OLD} +/obj/item/clothing/under/dress/dress_hr/@SUBTYPES : /obj/item/clothing/dress/hr/@SUBTYPES{@OLD} +/obj/item/clothing/under/dress/dress_cap/@SUBTYPES : /obj/item/clothing/dress/cap/@SUBTYPES{@OLD} +/obj/item/clothing/under/dress/dress_saloon/@SUBTYPES : /obj/item/clothing/dress/saloon/@SUBTYPES{@OLD} +/obj/item/clothing/under/nursesuit/@SUBTYPES : /obj/item/clothing/dress/nurse/@SUBTYPES{@OLD} +/obj/item/clothing/under/nurse/@SUBTYPES : /obj/item/clothing/dress/nurse/@SUBTYPES{@OLD} +/obj/item/clothing/under/wedding/@SUBTYPES : /obj/item/clothing/dress/wedding/@SUBTYPES{@OLD} +/obj/item/clothing/under/dress/@SUBTYPES : /obj/item/clothing/dress/@SUBTYPES{@OLD} +/obj/item/clothing/under/sundress/@SUBTYPES : /obj/item/clothing/dress/sun/@SUBTYPES{@OLD} +/obj/item/clothing/under/devildress/@SUBTYPES : /obj/item/clothing/dress/devil/@SUBTYPES{@OLD} +/obj/item/clothing/under/avian_smock/@SUBTYPES : /obj/item/clothing/dress/avian_smock/@SUBTYPES{@OLD} +/obj/item/clothing/under/gown/@SUBTYPES : /obj/item/clothing/dress/gown/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/infil/fem/@SUBTYPES : /obj/item/clothing/dress/white/@SUBTYPES{@OLD} +/obj/item/clothing/under/lawyer/infil/@SUBTYPES : /obj/item/clothing/pants/slacks/outfit/tie/@SUBTYPES{@OLD} +/obj/item/clothing/under/vox/vox_robes/@SUBTYPES : /obj/item/clothing/suit/robe/vox/@SUBTYPES{@OLD} +/obj/item/clothing/under/vox/vox_casual/@SUBTYPES : /obj/item/clothing/pants/vox/@SUBTYPES{@OLD} +/obj/item/clothing/under/vox/@SUBTYPES : /obj/item/clothing/pants/vox/@SUBTYPES{@OLD} \ No newline at end of file From c285a2f69d003694662700ee3864d7e82494f18e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 29 Apr 2024 10:27:12 +1000 Subject: [PATCH 191/212] Ran map migrations against entire maps folder. --- maps/antag_spawn/ert/ert_base.dmm | 46 ++++--- maps/antag_spawn/heist/heist_base.dmm | 30 ++--- maps/antag_spawn/mercenary/mercenary_base.dmm | 6 +- maps/antag_spawn/ninja/ninja_base.dmm | 10 +- maps/antag_spawn/wizard/wizard_base.dmm | 8 +- maps/away/bearcat/bearcat-1.dmm | 40 +++--- maps/away/bearcat/bearcat-2.dmm | 102 +++++++++------ maps/away/casino/casino.dmm | 100 +++++++-------- maps/away/derelict/derelict-station.dmm | 35 ++++-- maps/away/errant_pisces/errant_pisces.dmm | 47 ++++--- maps/away/liberia/liberia.dmm | 36 ++++-- .../lost_supply_base/lost_supply_base.dmm | 119 +++++------------- maps/away/magshield/magshield.dmm | 23 ++-- maps/away/mining/mining-asteroid.dmm | 15 ++- maps/away/mining/mining-signal.dmm | 19 ++- maps/away/smugglers/smugglers.dmm | 9 +- maps/away/unishi/unishi-1.dmm | 9 +- maps/away/unishi/unishi-2.dmm | 10 +- maps/away/unishi/unishi-3.dmm | 3 +- maps/away/yacht/yacht.dmm | 9 +- maps/example/example-1.dmm | 21 ++-- maps/example/example-3.dmm | 3 +- maps/exodus/exodus-2.dmm | 3 +- .../crashed_pod/crashed_pod.dmm | 6 +- .../datacapsule/contents_2.dmm | 12 +- .../deserted_lab/deserted_lab.dmm | 3 +- .../exoplanet_ruins/hydrobase/hydrobase.dmm | 15 ++- .../exoplanet_ruins/monoliths/monoliths.dmm | 4 +- .../exoplanet_ruins/oasis/oasis.dmm | 6 +- .../exoplanet_ruins/oldpod/oldpod.dmm | 24 +--- .../exoplanet_ruins/playablecolony/colony.dmm | 39 +++--- .../spider_nest/spider_nest.dmm | 3 +- maps/tradeship/tradeship-0.dmm | 2 +- maps/tradeship/tradeship-1.dmm | 4 +- maps/tradeship/tradeship-2.dmm | 4 +- tools/map_migrations/3793_exterior_floor.txt | 1 - 36 files changed, 433 insertions(+), 393 deletions(-) diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 365c4970f6..a5904e1866 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -188,7 +188,7 @@ /obj/item/gun/projectile/shotgun/pump, /obj/item/gun/projectile/shotgun/pump, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 1; @@ -262,7 +262,7 @@ /obj/structure/reagent_dispensers/watertank, /obj/effect/floor_decal/corner/blue/diagonal, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ icon_state = "dark" @@ -273,7 +273,7 @@ /obj/machinery/chemical_dispenser/bar_soft/full, /obj/effect/floor_decal/corner/blue/diagonal, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ icon_state = "dark" @@ -333,7 +333,7 @@ /area/map_template/rescue_base/base) "aU" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 8; @@ -465,7 +465,7 @@ pixel_y = 4 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ icon_state = "dark" @@ -780,7 +780,7 @@ /obj/structure/bed/padded, /obj/item/bedsheet/captain, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 1; @@ -1108,7 +1108,7 @@ /obj/item/cell/high, /obj/item/cell/high, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 1; @@ -1723,7 +1723,7 @@ "dw" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/unsimulated/floor{ dir = 8; @@ -1805,7 +1805,7 @@ /obj/item/aicard, /obj/item/pinpointer/advpinpointer, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 1; @@ -1845,7 +1845,7 @@ "dK" = ( /obj/machinery/fabricator/pipe, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 1; @@ -1984,7 +1984,7 @@ "ed" = ( /obj/structure/table/reinforced, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ dir = 1; @@ -2328,7 +2328,7 @@ /area/map_template/rescue_base/base) "eG" = ( /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ icon_state = "dark" @@ -2452,6 +2452,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "rescuebridge"; name = "Cockpit Blast Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2461,6 +2462,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "rescuedock"; name = "Blast Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2479,7 +2481,8 @@ /obj/machinery/button/blast_door{ id_tag = "rescuebridge"; name = "Window Shutters Control"; - pixel_y = -4 + pixel_y = -4; + dir = 1 }, /turf/floor/tiled/dark, /area/map_template/rescue_base/start) @@ -2693,6 +2696,7 @@ dir = 4; id_tag = "rescuebridge"; name = "Cockpit Blast Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2752,6 +2756,7 @@ dir = 4; id_tag = "rescueeva"; name = "Blast Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2854,7 +2859,7 @@ "fX" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/floor/tiled/dark, /area/map_template/rescue_base/start) @@ -3043,7 +3048,8 @@ /area/map_template/rescue_base/start) "gG" = ( /obj/machinery/recharger/wallcharger{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/floor/tiled/dark, /area/map_template/rescue_base/start) @@ -3078,7 +3084,7 @@ "gM" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/floor/tiled/white, /area/map_template/rescue_base/start) @@ -3097,7 +3103,8 @@ /obj/machinery/button/flasher{ id_tag = "rescueflash"; name = "Flasher"; - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/structure/bed/chair{ dir = 8 @@ -3121,7 +3128,8 @@ pixel_y = 2 }, /obj/structure/closet/medical_wall{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/item/chems/glass/bottle/sedatives, /obj/item/chems/glass/bottle/sedatives, @@ -3154,6 +3162,7 @@ dir = 4; id_tag = "rescuebridge"; name = "Blast Shutters"; + }, /obj/effect/paint/blue, /turf/floor/plating, @@ -3204,6 +3213,7 @@ dir = 4; id_tag = "rescueinfirm"; name = "Blast Shutters"; + }, /obj/effect/paint/blue, /turf/floor/plating, diff --git a/maps/antag_spawn/heist/heist_base.dmm b/maps/antag_spawn/heist/heist_base.dmm index 87e51a21b2..c9069350d5 100644 --- a/maps/antag_spawn/heist/heist_base.dmm +++ b/maps/antag_spawn/heist/heist_base.dmm @@ -623,11 +623,6 @@ icon_state = "asteroid" }, /area/map_template/syndicate_mothership/raider_base) -"bz" = ( -/turf/unsimulated/floor{ - icon_state = "asteroid" - }, -/area/map_template/syndicate_mothership/raider_base) "bC" = ( /obj/effect/decal/cleanable/cobweb2{ icon_state = "spiderling"; @@ -640,7 +635,7 @@ "bD" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/carpet, /obj/effect/floor_decal/carpet{ @@ -1016,6 +1011,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "SkipjackShuttersNorth"; name = "Blast Doors"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1040,7 +1036,8 @@ "cC" = ( /obj/machinery/airlock_sensor/shuttle{ id_tag = "raider_west_sensor"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /turf/floor/plating, /area/map_template/skipjack_station/start) @@ -1087,7 +1084,8 @@ tag_airpump = "raider_west_vent"; tag_chamber_sensor = "raider_west_sensor"; tag_exterior_door = "raider_northwest_lock"; - tag_interior_door = "raider_southwest_lock" + tag_interior_door = "raider_southwest_lock"; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/shuttle{ dir = 8; @@ -1214,7 +1212,8 @@ /obj/machinery/button/access/shuttle/interior{ id_tag = "raider_west_control"; pixel_x = -22; - req_access = list("ACCESS_RAIDER") + req_access = list("ACCESS_RAIDER"); + dir = 4 }, /turf/floor/plating, /area/map_template/skipjack_station/start) @@ -1379,6 +1378,7 @@ dir = 4; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1405,6 +1405,7 @@ dir = 8; id_tag = "SkipjackShuttersEast"; name = "Skipjack Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/brown, @@ -1476,6 +1477,7 @@ dir = 4; id_tag = "SkipjackShuttersWest"; name = "Skipjack Shutters"; + }, /obj/effect/wallframe_spawn/reinforced/titanium, /turf/floor/plating, @@ -1803,12 +1805,6 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/shuttle/red, /area/map_template/skipjack_station/start) -"eI" = ( -/turf/unsimulated/floor{ - icon_state = "plating"; - name = "plating" - }, -/area/map_template/syndicate_mothership/raider_base) "jf" = ( /obj/machinery/network/acl{ initial_network_id = "piratenet"; @@ -2675,7 +2671,7 @@ ab ab aQ aq -bz +aq aq aq ce @@ -5188,7 +5184,7 @@ ab ab ab ae -eI +aj aj av av diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index 2b5f1d06e3..082f05c1af 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -457,7 +457,8 @@ /area/map_template/merc_shuttle) "aS" = ( /obj/structure/closet/medical_wall/filled{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/item/chems/spray/cleaner, /obj/item/chems/spray/antiseptic, @@ -1715,7 +1716,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "merc_shuttle_exterior_sensor"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/machinery/power/terminal{ dir = 8 diff --git a/maps/antag_spawn/ninja/ninja_base.dmm b/maps/antag_spawn/ninja/ninja_base.dmm index 1923db2e02..478d108f6c 100644 --- a/maps/antag_spawn/ninja/ninja_base.dmm +++ b/maps/antag_spawn/ninja/ninja_base.dmm @@ -386,7 +386,7 @@ "bb" = ( /obj/item/radio/intercom/ninja{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/unsimulated/floor{ dir = 8; @@ -778,7 +778,7 @@ /obj/item/toy/figure/wizard, /obj/item/radio/intercom/ninja{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/unsimulated/floor{ dir = 8; @@ -1087,7 +1087,7 @@ /obj/item/plastique, /obj/item/radio/intercom/ninja{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /obj/effect/floor_decal/industrial/outline/grey, /turf/unsimulated/floor{ @@ -1211,6 +1211,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "ninjadoor"; name = "Blast Door"; + }, /turf/unsimulated/floor{ icon_state = "dark" @@ -1271,7 +1272,8 @@ /obj/machinery/button/blast_door{ id_tag = "ninjadoor"; name = "remote shutter control"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /turf/unsimulated/floor{ icon_state = "dark" diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm index e3a9e008a7..b05912d7e4 100644 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ b/maps/antag_spawn/wizard/wizard_base.dmm @@ -405,7 +405,7 @@ }, /obj/item/radio/intercom/wizard{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/unsimulated/floor{ icon_state = "freezerfloor" @@ -457,7 +457,7 @@ /obj/item/staff/gentcane, /obj/item/radio/intercom/wizard{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/unsimulated/floor{ icon_state = "lino" @@ -489,7 +489,7 @@ "bn" = ( /obj/item/radio/intercom/wizard{ dir = 1; - pixel_y = -22 + pixel_y = -30 }, /turf/unsimulated/floor{ dir = 8; @@ -504,7 +504,7 @@ /area/map_template/wizard_station) "bp" = ( /obj/item/radio/intercom/wizard{ - pixel_y = 22 + pixel_y = 20 }, /turf/unsimulated/floor{ icon_state = "cult"; diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index a97d3feb52..9a6fc4c310 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -75,7 +75,8 @@ tag_airpump = "cargo_pump"; tag_chamber_sensor = "cargo_sensor"; tag_exterior_door = "cargo_out"; - tag_interior_door = "cargo_in" + tag_interior_door = "cargo_in"; + dir = 8 }, /obj/machinery/light/small{ dir = 4 @@ -127,7 +128,8 @@ "au" = ( /obj/machinery/airlock_sensor{ id_tag = "cargo_sensor"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/door/blast/regular/open{ @@ -248,7 +250,8 @@ /area/ship/scrap/cargo/lower) "aF" = ( /obj/machinery/light_switch{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/floor/tiled/usedup, @@ -389,7 +392,8 @@ pixel_y = 1 }, /obj/machinery/light_switch{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/machinery/power/apc/derelict{ dir = 1 @@ -476,7 +480,8 @@ pixel_y = 1 }, /obj/machinery/light_switch{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/effect/floor_decal/corner/beige{ dir = 5 @@ -897,7 +902,8 @@ pixel_y = 1 }, /obj/machinery/light_switch{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/machinery/power/apc/derelict{ dir = 1 @@ -929,7 +935,8 @@ dir = 9 }, /obj/item/radio/intercom{ - pixel_x = -32 + pixel_x = -22; + dir = 4 }, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -993,7 +1000,8 @@ pixel_y = 1 }, /obj/machinery/light_switch{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/effect/floor_decal/corner/beige{ dir = 5 @@ -1340,13 +1348,14 @@ pixel_y = 1 }, /obj/machinery/light_switch{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/machinery/power/apc/derelict{ dir = 1 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/floor/usedup, /area/ship/scrap/broken1) @@ -1442,7 +1451,8 @@ pixel_y = 1 }, /obj/machinery/light_switch{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/effect/floor_decal/corner/beige{ dir = 5 @@ -1890,7 +1900,7 @@ }, /obj/machinery/network/relay{ initial_network_id = "freightnet_0451" -}, + }, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/techstorage) "ee" = ( @@ -1907,7 +1917,8 @@ }, /obj/item/stack/tape_roll/duct_tape, /obj/machinery/light_switch{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/effect/floor_decal/corner/yellow{ dir = 9 @@ -2390,7 +2401,8 @@ /obj/item/stack/tape_roll/duct_tape, /obj/structure/table, /obj/item/radio/intercom{ - pixel_y = -32 + pixel_y = -30; + dir = 1 }, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 5ac4db0910..b432227c58 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -161,7 +161,8 @@ "ay" = ( /obj/machinery/light, /obj/item/radio/intercom{ - pixel_x = -32 + pixel_x = -22; + dir = 4 }, /obj/machinery/computer/modular/preset/engineering{ dir = 1; @@ -209,7 +210,8 @@ /area/ship/scrap/comms) "aE" = ( /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -246,7 +248,8 @@ icon_state = "0-2" }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/tiled/dark/usedup, @@ -323,7 +326,7 @@ "aO" = ( /obj/machinery/network/message_server{ initial_network_id = "freightnet_0451" -}, + }, /turf/floor/bluegrid/airless, /area/ship/scrap/comms) "aP" = ( @@ -429,7 +432,8 @@ dir = 8 }, /obj/item/radio/intercom{ - pixel_y = -32 + pixel_y = -30; + dir = 1 }, /obj/machinery/alarm{ dir = 8; @@ -452,7 +456,8 @@ /area/ship/scrap/command/hallway) "ba" = ( /obj/item/radio/intercom{ - pixel_x = -32 + pixel_x = -22; + dir = 4 }, /obj/item/gun/projectile/shotgun/pump{ desc = "When words don't strike hard enough."; @@ -754,7 +759,8 @@ "bA" = ( /obj/structure/emergency_dispenser/south, /obj/item/radio/intercom{ - pixel_x = -32 + pixel_x = -22; + dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; @@ -775,10 +781,12 @@ /area/ship/scrap/dock) "bC" = ( /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /turf/floor/tiled/usedup, /area/ship/scrap/dock) @@ -911,7 +919,8 @@ /area/ship/scrap/dock) "bN" = ( /obj/item/radio/intercom{ - pixel_y = -32 + pixel_y = -30; + dir = 1 }, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/alarm{ @@ -932,7 +941,8 @@ /area/ship/scrap/dock) "bP" = ( /obj/item/radio/intercom{ - pixel_y = -32 + pixel_y = -30; + dir = 1 }, /obj/machinery/alarm{ dir = 4; @@ -1289,7 +1299,8 @@ icon_state = "bulb1" }, /obj/item/radio/intercom{ - pixel_x = -32 + pixel_x = -22; + dir = 4 }, /obj/structure/closet/wardrobe/pjs, /obj/structure/sign/poster{ @@ -1566,7 +1577,8 @@ name = "Bathrooms APC" }, /obj/machinery/light_switch{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -1630,7 +1642,8 @@ dir = 4 }, /obj/item/radio/intercom{ - pixel_y = -32 + pixel_y = -30; + dir = 1 }, /obj/structure/ladder, /turf/floor/tiled/usedup, @@ -1641,7 +1654,8 @@ dir = 8 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/effect/floor_decal/corner/beige{ dir = 6 @@ -1664,7 +1678,8 @@ name = "Dorms APC" }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/structure/closet/wardrobe/mixed, /obj/item/backpack/dufflebag/med, @@ -1688,7 +1703,8 @@ /obj/structure/disposalpipe/segment, /obj/structure/emergency_dispenser/east, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1709,7 +1725,8 @@ /area/ship/scrap/cargo) "dA" = ( /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1739,7 +1756,7 @@ /area/ship/scrap/crew/kitchen) "dF" = ( /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 @@ -1792,7 +1809,7 @@ icon_state = "bulb1" }, /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/usedup, @@ -1843,7 +1860,7 @@ /area/ship/scrap/crew/medbay) "dQ" = ( /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/item/bedsheet/medical, /obj/structure/curtain/open/privacy, @@ -2002,7 +2019,8 @@ /obj/structure/iv_drip, /obj/structure/closet/secure_closet/medical_wall/pills{ req_access = null; - pixel_x = 26 + pixel_x = 26; + dir = 8 }, /turf/floor/tiled/white, /area/ship/scrap/crew/medbay) @@ -2340,7 +2358,8 @@ dir = 1 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/effect/floor_decal/corner/red/diagonal, /turf/floor/tiled/usedup, @@ -2356,7 +2375,8 @@ icon_state = "bulb1" }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/effect/floor_decal/corner/beige{ dir = 9 @@ -2428,10 +2448,12 @@ name = "Medical Bay APC" }, /obj/machinery/light_switch{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /obj/structure/closet/medical_wall/filled{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/item/stack/tape_roll/duct_tape, /obj/item/retractor, @@ -2671,7 +2693,7 @@ icon_state = "bulb1" }, /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -2840,7 +2862,7 @@ }, /obj/machinery/network/relay{ initial_network_id = "freightnet_0451" -}, + }, /turf/floor/usedup, /area/ship/scrap/unused) "fA" = ( @@ -2903,7 +2925,8 @@ dir = 1 }, /obj/machinery/light_switch{ - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, @@ -3737,7 +3760,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/structure/cable{ icon_state = "4-8" @@ -4137,12 +4160,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/button/ignition{ id_tag = "engine"; - pixel_x = -5 + pixel_x = -5; + dir = 4 }, /obj/machinery/button/blast_door{ id_tag = "engwindow"; name = "Engine Observation"; - pixel_x = 6 + pixel_x = 6; + dir = 8 }, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) @@ -4154,7 +4179,8 @@ /obj/machinery/button/blast_door{ id_tag = "scram"; name = "CORE SCRAM"; - pixel_y = -26 + pixel_y = -26; + dir = 1 }, /obj/machinery/computer/modular/preset/engineering{ dir = 1; @@ -4404,7 +4430,8 @@ /obj/machinery/button/blast_door{ id_tag = "radaway"; name = "Radiation shields"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/power) @@ -4453,7 +4480,8 @@ }, /obj/structure/cable, /obj/item/radio/intercom{ - pixel_x = -32 + pixel_x = -22; + dir = 4 }, /turf/floor/airless, /area/ship/scrap/maintenance/engine/aft) @@ -5151,7 +5179,7 @@ icon_state = "0-4" }, /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/item/cell/crap, /obj/item/cell/crap, @@ -5180,7 +5208,7 @@ "Ix" = ( /obj/machinery/network/router{ initial_network_id = "freightnet_0451" -}, + }, /turf/floor/bluegrid/airless, /area/ship/scrap/comms) "IG" = ( diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index e5b650ccf2..f4603d45bd 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -112,15 +112,10 @@ dir = 2; id_tag = "casino_bridge"; name = "Casino Bridge Blast Doors"; + }, /turf/floor/plating, /area/casino/casino_bridge) -"ao" = ( -/turf/space, -/turf/wall/shuttle/dark{ - unique_merge_identifier = "casino_bridge" - }, -/area/casino/casino_bridge) "ap" = ( /turf/floor/tiled, /area/casino/casino_bridge) @@ -143,6 +138,7 @@ dir = 4; id_tag = "casino_bridge"; name = "Casino Bridge Blast Doors"; + }, /turf/floor/plating, /area/casino/casino_bridge) @@ -297,7 +293,8 @@ /obj/machinery/button/blast_door{ id_tag = "casino_weaponry"; name = "Weaponry Blast Door contol"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/flora/pottedplant/unusual, /obj/machinery/power/apc{ @@ -311,7 +308,8 @@ /obj/machinery/button/blast_door{ id_tag = "casino_bridge"; name = "Casino Bridge Blast Door contol"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable{ icon_state = "4-8" @@ -1146,11 +1144,6 @@ unique_merge_identifier = "casino_cutter" }, /area/casino/casino_cutter) -"dp" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "casino_cutter" - }, -/area/casino/casino_cutter) "dq" = ( /obj/structure/fuel_port/hydrogen, /turf/wall/shuttle{ @@ -1473,11 +1466,6 @@ }, /turf/floor/shuttle/blue, /area/casino/casino_cutter) -"ep" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "casino_cutter" - }, -/area/casino/casino_cutter) "eq" = ( /obj/structure/cable/yellow{ icon_state = "2-4" @@ -1813,6 +1801,7 @@ dir = 4; id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Doors"; + }, /turf/floor/tiled, /area/casino/casino_security) @@ -1903,6 +1892,7 @@ dir = 4; id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Doors"; + }, /turf/floor/tiled, /area/casino/casino_security) @@ -2145,6 +2135,7 @@ dir = 4; id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Doors"; + }, /turf/floor/plating, /area/casino/casino_security) @@ -2318,7 +2309,8 @@ tag_airpump = "casino_solar_pump"; tag_chamber_sensor = "casino_solar_sensor"; tag_exterior_door = "casino_solar_outer"; - tag_interior_door = "casino_solar_inner" + tag_interior_door = "casino_solar_inner"; + dir = 8 }, /obj/machinery/airlock_sensor{ id_tag = "casino_solar_sensor"; @@ -4522,12 +4514,6 @@ }, /turf/floor/plating, /area/casino/casino_bow) -"mT" = ( -/turf/space, -/turf/wall/shuttle/dark{ - unique_merge_identifier = "casino_bridge" - }, -/area/casino/casino_bow) "mU" = ( /obj/machinery/atmospherics/portables_connector{ dir = 4 @@ -4645,39 +4631,45 @@ "nm" = ( /obj/structure/bed/chair, /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{ id_tag = "Casino_escape_pod_3"; name = "Casino escape pod Three controller"; pixel_x = 24; - tag_door = "Casino escape_pod_3_hatch" + tag_door = "Casino escape_pod_3_hatch"; + dir = 8 }, /turf/floor/plating, /area/casino/casino_bow) "nn" = ( /obj/structure/bed/chair, /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{ id_tag = "Casino_escape_pod_2"; name = "Casino escape pod Two controller"; pixel_x = 24; - tag_door = "Casino escape_pod_2_hatch" + tag_door = "Casino escape_pod_2_hatch"; + dir = 8 }, /turf/floor/plating, /area/casino/casino_bow) "no" = ( /obj/structure/bed/chair, /obj/machinery/status_display{ - pixel_x = -32 + pixel_x = -32; + dir = 8 }, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{ id_tag = "Casino_escape_pod_1"; name = "Casino escape pod One controller"; pixel_x = 24; - tag_door = "escape_pod_17_hatch" + tag_door = "escape_pod_17_hatch"; + dir = 8 }, /turf/floor/plating, /area/casino/casino_bow) @@ -4701,11 +4693,6 @@ }, /turf/floor/plating, /area/casino/casino_bow) -"nr" = ( -/turf/wall/shuttle/dark{ - unique_merge_identifier = "casino_bridge" - }, -/area/casino/casino_bow) "ns" = ( /turf/floor/reinforced/airless, /area/casino/casino_bow) @@ -5032,7 +5019,8 @@ /obj/machinery/button/blast_door{ id_tag = "casino_checkpoint"; name = "Casino Checkpoint Blast Door contol"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/tiled, /area/casino/casino_security) @@ -9884,7 +9872,7 @@ aa aa aa aa -ao +al am at at @@ -10652,7 +10640,7 @@ kC nf nf nf -nr +np ns aa aa @@ -11060,7 +11048,7 @@ kC nf nf nf -nr +np ns aa aa @@ -11468,7 +11456,7 @@ kC nf nf nf -nr +np ns aa aa @@ -11836,10 +11824,10 @@ bP ci cD cV -dp +do dG Ub -dp +do eG eX bq @@ -11938,7 +11926,7 @@ bQ cj cD cV -dp +do dH dW eo @@ -12040,10 +12028,10 @@ bR ck cD cV -dp +do dI dX -dp +do eG eZ br @@ -12142,10 +12130,10 @@ bS cl cE cW -dp +do Tb dY -dp +do eG cF br @@ -12244,10 +12232,10 @@ bq bq bq cU -dp +do dI dZ -dp +do eG cF br @@ -12346,10 +12334,10 @@ bT cm cF cV -dp +do dJ ea -dp +do eG fa br @@ -12451,7 +12439,7 @@ cV dq dK dK -ep +do eG fa br @@ -12484,7 +12472,7 @@ mE kC mH kC -mT +mM aa aa aa @@ -12585,7 +12573,7 @@ mj kl kC kC -mT +mM aa aa aa @@ -12686,7 +12674,7 @@ fA fA fA kC -mT +mM aa aa aa diff --git a/maps/away/derelict/derelict-station.dmm b/maps/away/derelict/derelict-station.dmm index 9809f822e2..0b122a0b51 100644 --- a/maps/away/derelict/derelict-station.dmm +++ b/maps/away/derelict/derelict-station.dmm @@ -271,7 +271,8 @@ /area/derelict/ship) "aP" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/structure/cable/yellow{ icon_state = "1-2" @@ -359,7 +360,8 @@ /area/derelict/ship) "bc" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/floor/tiled, /area/derelict/ship) @@ -528,7 +530,8 @@ /area/derelict/ship) "bJ" = ( /obj/machinery/light_switch{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/machinery/light{ dir = 4 @@ -1154,7 +1157,8 @@ "ea" = ( /obj/structure/extinguisher_cabinet{ icon_state = "extinguisher_empty"; - pixel_x = 30 + pixel_x = 29; + dir = 8 }, /turf/floor/airless, /area/constructionsite/hallway/fore) @@ -1367,7 +1371,8 @@ /obj/machinery/button/access/exterior{ id_tag = "constructionsite_airlock"; pixel_x = 20; - req_access = newlist() + req_access = newlist(); + dir = 8 }, /turf/floor/tiled/dark/airless, /area/constructionsite/hallway/fore) @@ -1378,7 +1383,8 @@ /obj/machinery/button/access/interior{ id_tag = "constructionsite_airlock"; pixel_x = -20; - req_access = newlist() + req_access = newlist(); + dir = 4 }, /obj/effect/floor_decal/industrial/warning/corner{ dir = 1; @@ -1493,7 +1499,8 @@ tag_airpump = "constructionsite_vent"; tag_chamber_sensor = "constructionsite_sensor"; tag_exterior_door = "constructionsite_outer"; - tag_interior_door = "constructionsite_inner" + tag_interior_door = "constructionsite_inner"; + dir = 1 }, /obj/effect/floor_decal/industrial/warning{ dir = 10; @@ -1505,7 +1512,8 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/blue, /obj/machinery/airlock_sensor{ id_tag = "constructionsite_sensor"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/effect/floor_decal/industrial/warning{ dir = 6; @@ -1765,7 +1773,7 @@ /area/constructionsite/maintenance) "fR" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 30 + pixel_y = 29 }, /turf/floor/airless, /area/constructionsite/hallway/fore) @@ -1980,7 +1988,8 @@ /obj/structure/lattice, /obj/structure/extinguisher_cabinet{ icon_state = "extinguisher_empty"; - pixel_x = -30 + pixel_x = -29; + dir = 4 }, /turf/space, /area/constructionsite/hallway/fore) @@ -2248,7 +2257,8 @@ /area/constructionsite/medical) "hS" = ( /obj/structure/closet/medical_wall/filled{ - pixel_x = 32 + pixel_x = 32; + dir = 8 }, /turf/floor/airless, /area/constructionsite/medical) @@ -2830,7 +2840,8 @@ "jQ" = ( /obj/structure/extinguisher_cabinet{ icon_state = "extinguisher_empty"; - pixel_x = 30 + pixel_x = 29; + dir = 8 }, /turf/floor/tiled/dark/airless, /area/constructionsite/hallway/aft) diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 720220ef27..e05aba4743 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -1536,7 +1536,8 @@ tag_airpump = "Harpoon_solar_starboard_pump"; tag_chamber_sensor = "Harpoon_solar_starboard_sensor"; tag_exterior_door = "Harpoon_solar_starboard_outer"; - tag_interior_door = "Harpoon_solar_starboard_inner" + tag_interior_door = "Harpoon_solar_starboard_inner"; + dir = 8 }, /turf/floor/plating, /area/errant_pisces/solar_starboard) @@ -1689,7 +1690,8 @@ tag_airpump = "Harpoon_solar_port_pump"; tag_chamber_sensor = "Harpoon_solar_port_sensor"; tag_exterior_door = "Harpoon_solar_port_outer"; - tag_interior_door = "Harpoon_solar_port_inner" + tag_interior_door = "Harpoon_solar_port_inner"; + dir = 4 }, /obj/machinery/airlock_sensor{ id_tag = "Harpoon_solar_port_sensor"; @@ -2976,7 +2978,7 @@ /obj/item/clothing/shirt/scrubs, /obj/item/clothing/shirt/scrubs, /obj/item/clothing/shirt/scrubs, -/obj/item/clothing/under/nurse, +/obj/item/clothing/dress/nurse, /turf/floor/plating, /area/errant_pisces/infirmary) "hH" = ( @@ -3158,7 +3160,8 @@ /obj/machinery/button/blast_door{ id_tag = "Harpoon_bd_cell1"; name = "Cell 1 blast door-control"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/plating, /area/errant_pisces/live_storage) @@ -3170,7 +3173,8 @@ /obj/machinery/button/blast_door{ id_tag = "Harpoon_bd_cell2"; name = "Cell 2 blast door-control"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/plating, /area/errant_pisces/live_storage) @@ -3178,13 +3182,15 @@ /obj/machinery/button/blast_door{ id_tag = "Harpoon_bd_cell3"; name = "Cell 3 blast door-control"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/plating, /area/errant_pisces/live_storage) "iu" = ( /obj/machinery/button/crematorium{ - pixel_x = -20 + pixel_x = -20; + dir = 4 }, /turf/floor/plating, /area/errant_pisces/infirmary) @@ -3553,7 +3559,8 @@ "jy" = ( /obj/machinery/button/access/exterior{ id_tag = "Harpoon_ls_airlock"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/floor/plating, /area/errant_pisces/live_storage) @@ -3747,7 +3754,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "Harpoon_ls_sensor"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/floor/plating, /area/errant_pisces/live_storage) @@ -4101,7 +4109,8 @@ tag_airpump = "Harpoon_ls_pump"; tag_chamber_sensor = "Harpoon_ls_sensor"; tag_exterior_door = "Harpoon_ls_outer"; - tag_interior_door = "Harpoon_ls_inner" + tag_interior_door = "Harpoon_ls_inner"; + dir = 8 }, /turf/floor/plating, /area/errant_pisces/live_storage) @@ -4412,7 +4421,8 @@ /obj/structure/lattice, /obj/machinery/button/access/exterior{ id_tag = "Harpoon_sci_airlock"; - pixel_y = -20 + pixel_y = -20; + dir = 1 }, /turf/space, /area/errant_pisces/science_wing) @@ -4436,7 +4446,8 @@ tag_airpump = "Harpoon_sci_pump"; tag_chamber_sensor = "Harpoon_sci_sensor"; tag_exterior_door = "Harpoon_sci_outer"; - tag_interior_door = "Harpoon_sci_inner" + tag_interior_door = "Harpoon_sci_inner"; + dir = 1 }, /obj/machinery/airlock_sensor{ id_tag = "Harpoon_sci_sensor"; @@ -4867,7 +4878,8 @@ tag_airpump = "Harpoon_dock1_pump"; tag_chamber_sensor = "Harpoon_dock1_sensor"; tag_exterior_door = "Harpoon_dock1_outer"; - tag_interior_door = "Harpoon_dock1_inner" + tag_interior_door = "Harpoon_dock1_inner"; + dir = 1 }, /obj/machinery/airlock_sensor{ id_tag = "Harpoon_dock1_sensor"; @@ -5397,7 +5409,8 @@ }, /obj/machinery/button/access/interior{ id_tag = "Harpoon_dock2_airlock"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/plating, /area/errant_pisces/aft_hallway) @@ -5425,7 +5438,8 @@ tag_airpump = "Harpoon_dock2_pump"; tag_chamber_sensor = "Harpoon_dock2_sensor"; tag_exterior_door = "Harpoon_dock2_outer"; - tag_interior_door = "Harpoon_dock2_inner" + tag_interior_door = "Harpoon_dock2_inner"; + dir = 1 }, /obj/machinery/airlock_sensor{ id_tag = "Harpoon_dock2_sensor"; @@ -6311,7 +6325,8 @@ tag_airpump = "Harpoon_fish_pump"; tag_chamber_sensor = "Harpoon_fish_sensor"; tag_exterior_door = "Harpoon_fish_outer"; - tag_interior_door = "Harpoon_fish_inner" + tag_interior_door = "Harpoon_fish_inner"; + dir = 1 }, /obj/machinery/airlock_sensor{ id_tag = "Harpoon_fish_sensor"; diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 766993e725..3cdc092750 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -178,6 +178,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "merch_radaway"; + }, /obj/machinery/door/window/northleft{ dir = 8; @@ -206,6 +207,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "merch_radaway"; + }, /turf/floor, /area/liberia/engineeringreactor) @@ -357,7 +359,8 @@ /obj/machinery/button/blast_door{ id_tag = "merchantwarehouse"; name = "Warehouse Shutters"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /turf/floor/tiled/techfloor, /area/liberia/merchantstorage) @@ -643,6 +646,7 @@ dir = 2; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; + }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, @@ -832,6 +836,7 @@ dir = 4; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; + }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, @@ -1134,7 +1139,8 @@ id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; pixel_y = -28; - req_access = list("ACCESS_MERCHANT") + req_access = list("ACCESS_MERCHANT"); + dir = 1 }, /obj/structure/bed/chair/shuttle/blue{ dir = 8 @@ -1264,6 +1270,7 @@ dir = 4; id_tag = "merchantdesk"; name = "Merchant Desk Shutters"; + }, /obj/effect/paint/silver, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1405,7 +1412,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "merchant_ship_sensor"; - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /obj/structure/catwalk, /turf/floor/plating, @@ -1569,6 +1577,7 @@ dir = 4; id_tag = "merchantdesk"; name = "Merchant Desk Shutters"; + }, /obj/structure/cable/blue{ icon_state = "4-8" @@ -1799,7 +1808,8 @@ tag_airpump = "merchant_ship_vent"; tag_chamber_sensor = "merchant_ship_sensor"; tag_exterior_door = "merchant_ship_exterior"; - tag_interior_door = "merchant_ship_interior" + tag_interior_door = "merchant_ship_interior"; + dir = 4 }, /obj/effect/floor_decal/corner/brown/half{ dir = 1 @@ -2582,7 +2592,8 @@ }, /obj/machinery/button/access/exterior{ id_tag = "mule_port_shuttle_dock"; - pixel_x = -28 + pixel_x = -28; + dir = 4 }, /obj/structure/cable/blue{ icon_state = "1-2" @@ -2812,7 +2823,7 @@ }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /obj/effect/floor_decal/techfloor{ dir = 9 @@ -3778,7 +3789,7 @@ }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/tiled/monotile, /area/liberia/officeroom) @@ -4169,7 +4180,7 @@ "hy" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -4324,7 +4335,7 @@ "hQ" = ( /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /obj/structure/closet/secure_closet/freezer/kitchen{ req_access = newlist() @@ -5003,6 +5014,7 @@ /obj/structure/table/glass, /obj/machinery/faxmachine/mapped{ req_access = list("ACCESS_MERCHANT"); + }, /obj/effect/floor_decal/corner/blue/mono, /turf/floor/tiled/dark/monotile, @@ -6264,7 +6276,8 @@ "oJ" = ( /obj/abstract/level_data_spawner/player{ name = "Liberia"; -}, + + }, /turf/space, /area/space) "oM" = ( @@ -6606,7 +6619,7 @@ "se" = ( /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /obj/effect/catwalk_plated, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -8082,6 +8095,7 @@ dir = 2; id_tag = "merchantshuttle"; name = "Merchant Window Shutters"; + }, /obj/effect/paint/silver, /obj/effect/paint_stripe/yellow, diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 8e5f98831d..31eca7ad17 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -181,7 +181,8 @@ tag_airpump = "solar_starboard_pump"; tag_chamber_sensor = "solar_starboard_sensor"; tag_exterior_door = "solar_starboard_outer"; - tag_interior_door = "solar_starboard_inner" + tag_interior_door = "solar_starboard_inner"; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "solar_starboard_pump" @@ -646,7 +647,8 @@ tag_airpump = "solar_starboard_pump"; tag_chamber_sensor = "solar_starboard_sensor"; tag_exterior_door = "solar_starboard_outer"; - tag_interior_door = "solar_starboard_inner" + tag_interior_door = "solar_starboard_inner"; + dir = 8 }, /obj/machinery/airlock_sensor{ id_tag = "solar_starboard_sensor"; @@ -1248,21 +1250,6 @@ unique_merge_identifier = "supply_base" }, /area/space) -"dG" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) -"dH" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) -"dI" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "dJ" = ( /obj/random/junk, /obj/effect/floor_decal/industrial/hatch/yellow, @@ -1294,11 +1281,6 @@ icon_state = "steel_burned0" }, /area/lost_supply_base/common) -"dR" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "dS" = ( /turf/floor/shuttle/blue, /area/space) @@ -1316,11 +1298,6 @@ /obj/random/smokes, /turf/floor/shuttle/blue, /area/space) -"dW" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "dX" = ( /obj/structure/window/reinforced{ dir = 1; @@ -1385,11 +1362,6 @@ }, /turf/floor/shuttle/blue, /area/space) -"ei" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "ej" = ( /obj/machinery/computer/modular, /turf/floor/shuttle/blue, @@ -1433,7 +1405,8 @@ /area/lost_supply_base) "eq" = ( /obj/structure/closet/medical_wall{ - pixel_x = -30 + pixel_x = -30; + dir = 4 }, /turf/floor/tiled/airless, /area/lost_supply_base/common) @@ -1489,11 +1462,6 @@ icon_state = "steel_broken4" }, /area/lost_supply_base/common) -"eB" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "eD" = ( /obj/machinery/atmospherics/unary/tank/hydrogen{ volume = 3200 @@ -1555,16 +1523,6 @@ /obj/random/voidhelmet, /turf/floor/shuttle/blue, /area/space) -"eO" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) -"eP" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "eT" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1590,16 +1548,6 @@ }, /turf/floor/tiled/airless, /area/lost_supply_base/common) -"eW" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) -"eX" = ( -/turf/wall/shuttle{ - unique_merge_identifier = "supply_base" - }, -/area/space) "eY" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/portable_atmospherics/canister/nitrogen, @@ -1963,7 +1911,8 @@ tag_airpump = "solar_starboard_pump"; tag_chamber_sensor = "solar_starboard_sensor"; tag_exterior_door = "solar_starboard_outer"; - tag_interior_door = "solar_starboard_inner" + tag_interior_door = "solar_starboard_inner"; + dir = 8 }, /obj/machinery/airlock_sensor{ id_tag = "solar_starboard_sensor"; @@ -5938,13 +5887,13 @@ aa aa aa aa -eB -dR +dF +dF eh eh eh -dR -eW +dF +dF aa aa aa @@ -6046,7 +5995,7 @@ dS ev dS eK -dH +dF aa aa aa @@ -6148,7 +6097,7 @@ dS dS dS eL -dH +dF aa aa aa @@ -6244,13 +6193,13 @@ aa aa aa aa -dG -dR -ei +dF +dF +dF ew -eB -dR -eX +dF +dF +dF aa aa aa @@ -6346,13 +6295,13 @@ aa aa aa aa -dH +dF dT dS dS dS eM -dH +dF aa aa aa @@ -6448,13 +6397,13 @@ aa aa aa aa -dH +dF dU dS dS dS eN -dH +dF aa aa aa @@ -6550,13 +6499,13 @@ aa aa aa aa -dH +dF dV dS dS dS eM -dH +dF aa aa aa @@ -6652,13 +6601,13 @@ aa aa aa aa -dH +dF dS dS dS dS dS -dH +dF aa aa aD @@ -6754,13 +6703,13 @@ aa aa aa aa -dI -dW +dF +dF ej ex Jd -eO -eP +dF +dF aa aa aD @@ -6857,11 +6806,11 @@ aa aa aa aa -dI +dF ek ek ek -eP +dF aa aa aa diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index e3cdfd5163..7109e2bda3 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -157,10 +157,12 @@ /obj/machinery/atmospherics/unary/vent_pump/high_volume, /obj/effect/floor_decal/industrial/hatch/blue, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/airlock_sensor{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/floor/airless, /area/magshield/smes_storage) @@ -673,6 +675,7 @@ dir = 4; id_tag = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; + }, /obj/effect/wallframe_spawn/reinforced, /turf/floor/plating, @@ -732,6 +735,7 @@ dir = 4; id_tag = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; + }, /obj/effect/wallframe_spawn/reinforced, /obj/structure/cable/yellow{ @@ -1648,7 +1652,8 @@ pixel_y = 25 }, /obj/machinery/airlock_sensor{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/structure/cable{ icon_state = "4-8" @@ -1805,10 +1810,12 @@ }, /obj/effect/floor_decal/industrial/hatch/blue, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/airlock_sensor{ - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/floor/airless, /area/magshield/north) @@ -2433,7 +2440,8 @@ pixel_y = 25 }, /obj/machinery/airlock_sensor{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/airless, /area/magshield/east) @@ -3224,7 +3232,8 @@ pixel_y = 25 }, /obj/machinery/airlock_sensor{ - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /turf/floor/airless, /area/magshield/south) diff --git a/maps/away/mining/mining-asteroid.dmm b/maps/away/mining/mining-asteroid.dmm index 999f371f21..33a412188e 100644 --- a/maps/away/mining/mining-asteroid.dmm +++ b/maps/away/mining/mining-asteroid.dmm @@ -242,7 +242,8 @@ /obj/machinery/button/access/exterior{ id_tag = "lp_north_airlock"; name = "exterior access button"; - pixel_y = -24 + pixel_y = -24; + dir = 1 }, /turf/floor/natural/barren, /area/mine/explored) @@ -261,7 +262,8 @@ tag_airpump = "lp_north_pump"; tag_chamber_sensor = "lp_north_sensor"; tag_exterior_door = "lp_north_outer"; - tag_interior_door = "lp_north_inner" + tag_interior_door = "lp_north_inner"; + dir = 8 }, /turf/floor/airless, /area/djstation) @@ -274,7 +276,8 @@ "nb" = ( /obj/machinery/airlock_sensor{ id_tag = "lp_north_sensor"; - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/floor/airless, /area/djstation) @@ -329,7 +332,8 @@ id_tag = "lp_east_airlock"; name = "interior access button"; pixel_x = 24; - req_access = null + req_access = null; + dir = 8 }, /turf/floor/tiled/airless, /area/djstation) @@ -338,7 +342,8 @@ id_tag = "lp_east_airlock"; name = "exterior access button"; pixel_x = -24; - req_access = null + req_access = null; + dir = 4 }, /turf/floor/natural/barren, /area/mine/explored) diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 5e7399a470..fc739c2042 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -1023,12 +1023,6 @@ /obj/structure/table/woodentable, /turf/floor/carpet, /area/outpost/abandoned) -"dB" = ( -/turf/floor/natural/barren, -/turf/wall/shuttle{ - unique_merge_identifier = "mining_signal" - }, -/area/outpost/abandoned) "dC" = ( /obj/machinery/vending/coffee{ icon_state = "coffee-broken"; @@ -1162,7 +1156,8 @@ "dY" = ( /obj/structure/extinguisher_cabinet{ icon_state = "extinguisher_empty"; - pixel_x = 30 + pixel_x = 29; + dir = 8 }, /obj/machinery/light/small{ dir = 4; @@ -2161,12 +2156,14 @@ /obj/machinery/newscaster{ icon_state = "newscaster_off"; pixel_x = -30; - stat = 1 + stat = 1; + dir = 8 }, /obj/machinery/newscaster{ icon_state = "crack3"; pixel_x = -30; - stat = 1 + stat = 1; + dir = 8 }, /obj/structure/cable/orange{ icon_state = "1-2" @@ -18375,7 +18372,7 @@ cs cM dl dm -dB +dv ab ab ej @@ -18576,7 +18573,7 @@ af af af dm -dB +dv ab ab ab diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 5acabf45b1..9de3527ba0 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -50,7 +50,8 @@ "am" = ( /obj/machinery/airlock_sensor{ id_tag = "asteroid_base_dock_airlock"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "asteroid_base_dock_pump" @@ -107,7 +108,8 @@ pixel_x = -25; tag_airpump = "asteroid_base_dock_pump"; tag_exterior_door = "asteroid_base_dock_outer"; - tag_interior_door = "asteroid_base_dock_inner" + tag_interior_door = "asteroid_base_dock_inner"; + dir = 4 }, /obj/machinery/button/access/interior{ id_tag = "asteroid_base_dock_airlock"; @@ -255,7 +257,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "asteroid_base_east_airlock"; - pixel_y = -25 + pixel_y = -25; + dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; diff --git a/maps/away/unishi/unishi-1.dmm b/maps/away/unishi/unishi-1.dmm index 045b5299ef..382a3beaad 100644 --- a/maps/away/unishi/unishi-1.dmm +++ b/maps/away/unishi/unishi-1.dmm @@ -325,7 +325,8 @@ "aX" = ( /obj/machinery/button/access/interior{ id_tag = "unishi"; - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /turf/floor, /area/unishi/engineering) @@ -336,7 +337,8 @@ "aZ" = ( /obj/machinery/button/access/exterior{ id_tag = "unishi"; - pixel_x = -28 + pixel_x = -28; + dir = 4 }, /turf/space, /area/space) @@ -677,7 +679,8 @@ }, /obj/machinery/button/ignition{ id_tag = "unishi"; - pixel_x = -28 + pixel_x = -28; + dir = 4 }, /turf/floor, /area/unishi/engineroom) diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index 156185cca0..683b1d36f8 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -2069,6 +2069,7 @@ /obj/machinery/door/blast/regular/open{ id_tag = "Biohazard"; name = "Biohazard Shutter"; + }, /obj/machinery/door/airlock/hatch, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -2215,6 +2216,7 @@ dir = 4; id_tag = "Biohazard"; name = "Biohazard Shutter"; + }, /turf/floor, /area/unishi/smresearch) @@ -2330,7 +2332,8 @@ }, /obj/machinery/button/mass_driver{ id_tag = "unishi_sm_eject"; - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/floor/tiled/techfloor, /area/unishi/smresearch) @@ -2343,6 +2346,7 @@ dir = 4; id_tag = "Biohazard"; name = "Biohazard Shutter"; + }, /obj/item/remains, /turf/floor, @@ -2453,7 +2457,8 @@ }, /obj/machinery/button/blast_door{ id_tag = "unishi_eject"; - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /obj/effect/floor_decal/industrial/warning, /turf/floor/tiled/techfloor, @@ -2735,6 +2740,7 @@ dir = 4; id_tag = "Biohazard"; name = "Biohazard Shutter"; + }, /obj/item/remains, /obj/random/shoes, diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index bee72435f1..c2f2ddd1c9 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -248,7 +248,8 @@ /obj/item/clothing/suit/armor/pcarrier/tan, /obj/item/clothing/suit/armor/pcarrier/tan, /obj/machinery/recharger/wallcharger{ - pixel_y = -30 + pixel_y = -30; + dir = 1 }, /turf/floor, /area/unishi/bridge) diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index f0f2c00f5b..9541da7023 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -1188,7 +1188,8 @@ "fb" = ( /obj/machinery/button/access/exterior{ id_tag = "yacht_airlock"; - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/space, /area/space) @@ -1200,7 +1201,8 @@ /obj/machinery/constructable_frame/computerframe, /obj/machinery/button/access/interior{ id_tag = "yacht_airlock"; - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /turf/floor/plating, /area/yacht/engine) @@ -1260,7 +1262,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "yacht_sensor"; - pixel_y = -24 + pixel_y = -24; + dir = 1 }, /turf/floor/airless, /area/yacht/engine) diff --git a/maps/example/example-1.dmm b/maps/example/example-1.dmm index 982bee321f..2aeb3f12d2 100644 --- a/maps/example/example-1.dmm +++ b/maps/example/example-1.dmm @@ -782,13 +782,6 @@ }, /turf/floor/tiled/steel_grid, /area/example/first) -"Mo" = ( -/obj/abstract/landmark/latejoin, -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/turf/floor/tiled/steel_grid, -/area/example/first) "Nu" = ( /obj/machinery/atmospherics/portables_connector, /obj/machinery/portable_atmospherics/canister/air/airlock, @@ -2634,7 +2627,7 @@ WW Yp VY kw -Mo +kw WW Yp VY @@ -2688,7 +2681,7 @@ WW Yp VY kw -Mo +kw WW Yp VY @@ -2742,7 +2735,7 @@ WW Yp VY kw -Mo +kw WW Yp VY @@ -2796,7 +2789,7 @@ WW Yp VY kw -Mo +kw WW Yp VY @@ -2850,7 +2843,7 @@ WW Yp VY kw -Mo +kw WW Yp VY @@ -2904,7 +2897,7 @@ gT Pp VY kw -Mo +kw WW Yp VY @@ -2958,7 +2951,7 @@ tA LM VY kw -Mo +kw WW Yp VY diff --git a/maps/example/example-3.dmm b/maps/example/example-3.dmm index 408aefcc45..5b89fac02e 100644 --- a/maps/example/example-3.dmm +++ b/maps/example/example-3.dmm @@ -229,7 +229,8 @@ "MO" = ( /obj/abstract/level_data_spawner/main_level{ name = "Example Third Deck"; -}, + + }, /turf/space, /area/space) "Nz" = ( diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 493d6853e5..11d6d1d097 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -58170,7 +58170,8 @@ /obj/machinery/button/access/exterior{ id_tag = "engineering_dock_airlock"; name = "exterior access button"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /turf/floor/tiled/techfloor/grid, /area/exodus/maintenance/engi_shuttle) diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index b3fd6d1b7e..5216bfdeef 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -136,7 +136,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/decal/cleanable/dirt, /obj/structure/closet/hydrant{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -498,7 +499,8 @@ }, /obj/structure/bed/chair, /obj/structure/closet/hydrant{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/effect/decal/cleanable/dirt, /turf/floor/tiled/dark, diff --git a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm b/maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm index 05499f112e..35c3a40565 100644 --- a/maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm +++ b/maps/random_ruins/exoplanet_ruins/datacapsule/contents_2.dmm @@ -7,10 +7,6 @@ /mob/living/simple_animal/hostile/viscerator, /turf/template_noop, /area/template_noop) -"d" = ( -/obj/structure/foamedmetal, -/turf/template_noop, -/area/template_noop) "e" = ( /turf/template_noop, /area/template_noop) @@ -36,13 +32,13 @@ f h "} (2,1,1) = {" -d -d -d +a +a +a b "} (3,1,1) = {" -d +a e f h diff --git a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm index 33688478bc..eb58a431cf 100644 --- a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm +++ b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm @@ -213,7 +213,8 @@ /area/template_noop) "aR" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -32 + pixel_x = -29; + dir = 4 }, /turf/floor/carpet/blue2, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index 73c7af3d9a..1ee831f3c7 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -1731,7 +1731,8 @@ tag_airpump = "solars_pump"; tag_chamber_sensor = "solars_sensor"; tag_exterior_door = "solars_outer"; - tag_interior_door = "solars_inner" + tag_interior_door = "solars_inner"; + dir = 1 }, /obj/machinery/power/apc{ dir = 1; @@ -2049,7 +2050,8 @@ /obj/structure/catwalk, /obj/machinery/button/blast_door{ id_tag = "shipping"; - pixel_x = -25 + pixel_x = -25; + dir = 4 }, /turf/floor/fixed/alium, /area/map_template/hydrobase/station/processing) @@ -2254,7 +2256,8 @@ /obj/structure/catwalk, /obj/machinery/button/blast_door{ id_tag = "shipping"; - pixel_x = 25 + pixel_x = 25; + dir = 8 }, /turf/floor/fixed/alium, /area/map_template/hydrobase/station/shipaccess) @@ -2326,7 +2329,8 @@ id_tag = "hydrodock_airlock"; name = "interior access button"; pixel_x = -24; - req_access = newlist() + req_access = newlist(); + dir = 4 }, /turf/floor/fixed/alium, /area/map_template/hydrobase/station/shipaccess) @@ -2611,7 +2615,8 @@ tag_airpump = "hydrodock_pump"; tag_chamber_sensor = "hydrodock_sensor"; tag_exterior_door = "hydrodock_outer"; - tag_interior_door = "hydrodock_inner" + tag_interior_door = "hydrodock_inner"; + dir = 8 }, /obj/structure/catwalk, /turf/floor/fixed/alium, diff --git a/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dmm b/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dmm index b52cc637c5..f3d241c13d 100644 --- a/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dmm +++ b/maps/random_ruins/exoplanet_ruins/monoliths/monoliths.dmm @@ -8,8 +8,8 @@ /turf/template_noop, /area/template_noop) "c" = ( -/turf/floor/fixed/alium/ruin, /obj/abstract/landmark/random_base_turf, +/turf/floor/fixed/alium/ruin, /area/template_noop) "d" = ( /obj/structure/artifact, @@ -23,8 +23,8 @@ dir = 8 }, /obj/structure/window/borosilicate_reinforced, -/turf/floor/fixed/alium/ruin, /obj/abstract/landmark/random_base_turf, +/turf/floor/fixed/alium/ruin, /area/template_noop) "e" = ( /obj/abstract/landmark/clear, diff --git a/maps/random_ruins/exoplanet_ruins/oasis/oasis.dmm b/maps/random_ruins/exoplanet_ruins/oasis/oasis.dmm index e2221c08a5..872264750e 100644 --- a/maps/random_ruins/exoplanet_ruins/oasis/oasis.dmm +++ b/maps/random_ruins/exoplanet_ruins/oasis/oasis.dmm @@ -40,10 +40,6 @@ /obj/structure/flora/grass/brown, /turf/floor/natural/grass/wild, /area/template_noop) -"m" = ( -/obj/structure/flora/bush, -/turf/floor/natural/grass/wild, -/area/template_noop) (1,1,1) = {" a @@ -141,7 +137,7 @@ a a i j -m +i a "} (12,1,1) = {" diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index 311b132aa2..1562dd282a 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -24,11 +24,6 @@ /obj/effect/wallframe_spawn/reinforced/hull, /turf/floor/plating, /area/map_template/oldpod) -"af" = ( -/turf/wall/shuttle/dark{ - unique_merge_identifier = "oldpod" - }, -/area/map_template/oldpod) "ag" = ( /obj/structure/shuttle/engine/heater{ dir = 1 @@ -113,7 +108,8 @@ /area/map_template/oldpod) "aq" = ( /obj/structure/closet/hydrant{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/dirt, @@ -502,16 +498,6 @@ /obj/effect/decal/cleanable/dirt, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) -"bh" = ( -/turf/wall/shuttle/dark{ - unique_merge_identifier = "oldpod" - }, -/area/map_template/oldpod) -"bi" = ( -/turf/wall/shuttle/dark{ - unique_merge_identifier = "oldpod" - }, -/area/map_template/oldpod) (1,1,1) = {" aa @@ -523,7 +509,7 @@ ae ac ac ac -bh +aa "} (2,1,1) = {" ab @@ -622,7 +608,7 @@ bg ac "} (10,1,1) = {" -af +aa ac ac ac @@ -631,5 +617,5 @@ aN ac ac ac -bi +aa "} diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 113cdb5358..2b7e508c2b 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -172,7 +172,8 @@ /obj/item/clothing/suit/toggle/track, /obj/item/radio, /obj/structure/closet/shipping_wall{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/floor/carpet, /area/map_template/colony/command) @@ -507,7 +508,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /turf/floor/tiled/techfloor, /area/map_template/colony/command) @@ -598,7 +599,7 @@ /obj/effect/floor_decal/corner/blue, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/tiled/techfloor, /area/map_template/colony) @@ -854,7 +855,7 @@ }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/tiled/techfloor, /area/map_template/colony/tcomms) @@ -3638,7 +3639,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /turf/floor/tiled/techfloor, /area/map_template/colony) @@ -3719,7 +3720,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /turf/floor/wood/walnut, /area/map_template/colony/messhall) @@ -4886,7 +4887,7 @@ }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/tiled/techfloor, /area/map_template/colony) @@ -4902,7 +4903,7 @@ /obj/item/box/detergent, /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /turf/floor/tiled/white, /area/map_template/colony/bathroom) @@ -4916,7 +4917,7 @@ }, /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /turf/floor/wood/walnut, /area/map_template/colony/commons) @@ -5454,7 +5455,7 @@ }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/lino, /area/map_template/colony) @@ -5520,7 +5521,8 @@ /obj/machinery/button/alternate/door/bolts{ id_tag = "colj"; name = "Jail Bolt Control"; - pixel_x = 28 + pixel_x = 28; + dir = 8 }, /turf/floor/tiled/techfloor, /area/map_template/colony/jail) @@ -6054,7 +6056,8 @@ "lM" = ( /obj/machinery/airlock_sensor{ id_tag = "playablecolonymain_sensor_chamber"; - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -6109,7 +6112,8 @@ }, /obj/machinery/airlock_sensor{ id_tag = "playablecolonymain_sensor_interior"; - pixel_x = -22 + pixel_x = -22; + dir = 4 }, /obj/effect/floor_decal/industrial/warning{ dir = 8; @@ -6227,7 +6231,8 @@ "ma" = ( /obj/machinery/airlock_sensor{ id_tag = "playablecolonymain_sensor_external"; - pixel_x = 22 + pixel_x = 22; + dir = 8 }, /obj/machinery/button/access/exterior{ id_tag = "playablecolonymain"; @@ -7168,7 +7173,7 @@ /obj/machinery/light/spot, /obj/item/radio/intercom{ dir = 1; - pixel_y = -28 + pixel_y = -30 }, /turf/floor/tiled/dark/monotile, /area/map_template/colony/jail) @@ -7205,7 +7210,7 @@ }, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) @@ -7879,7 +7884,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/radio/intercom{ dir = 4; - pixel_x = -21 + pixel_x = -22 }, /turf/floor/wood/walnut, /area/map_template/colony/dorms) diff --git a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm index e7e99011c0..dd4f13ac10 100644 --- a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm +++ b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm @@ -244,7 +244,8 @@ /obj/random/loot, /obj/effect/decal/cleanable/vomit, /obj/structure/extinguisher_cabinet{ - pixel_x = -32 + pixel_x = -29; + dir = 4 }, /turf/floor/lino, /area/template_noop) diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 69a8ed5e96..1c67df5f4a 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -1707,7 +1707,7 @@ /area/ship/trade/livestock) "Hk" = ( /obj/item/radio/intercom{ - pixel_y = 24 + pixel_y = 20 }, /obj/machinery/optable, /obj/machinery/light{ diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 5a243a3e4c..fcfc08e82f 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -2588,7 +2588,7 @@ dir = 1 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/floor/lino, /area/ship/trade/crew/dorms1) @@ -2854,7 +2854,7 @@ dir = 5 }, /obj/item/radio/intercom{ - pixel_y = 22 + pixel_y = 20 }, /turf/floor/lino, /area/ship/trade/crew/dorms2) diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index a458579518..7818d58b8b 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -3536,7 +3536,7 @@ id_tag = "engwindow"; name = "Engine Observation"; pixel_x = 6; - dir = 1; + dir = 8; directional_offset = null }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4851,7 +4851,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom{ - pixel_y = 32 + pixel_y = 20 }, /obj/structure/cable{ icon_state = "4-8" diff --git a/tools/map_migrations/3793_exterior_floor.txt b/tools/map_migrations/3793_exterior_floor.txt index 5d26793773..45503cf732 100644 --- a/tools/map_migrations/3793_exterior_floor.txt +++ b/tools/map_migrations/3793_exterior_floor.txt @@ -1,5 +1,4 @@ /turf/exterior/floor/@SUBTYPES : /turf/floor/natural/@SUBTYPES{@OLD} /turf/floor/grass/@SUBTYPES : /turf/floor/fake_grass/@SUBTYPES{@OLD} -/turf/floor/natural/path/@SUBTYPES : /turf/floor/path/@SUBTYPES{@OLD} /turf/floor/natural/concrete/@SUBTYPES : /turf/floor/concrete/@SUBTYPES{@OLD} /turf/floor/natural/wildgrass/@SUBTYPES : /turf/floor/natural/grass/wild/@SUBTYPES{@OLD} \ No newline at end of file From 45fdf421572e6367ca19e8ba9e11382fba1598ef Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 29 Apr 2024 10:33:53 +1000 Subject: [PATCH 192/212] CI stuff for uniforms PR. --- nebula.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/nebula.dme b/nebula.dme index 6bf00a6a84..f7b31ccff6 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1916,6 +1916,7 @@ #include "code\modules\clothing\costumes\_costume.dm" #include "code\modules\clothing\costumes\misc.dm" #include "code\modules\clothing\dresses\_dress.dm" +#include "code\modules\clothing\dresses\gown.dm" #include "code\modules\clothing\dresses\job.dm" #include "code\modules\clothing\dresses\maxi.dm" #include "code\modules\clothing\dresses\misc.dm" From f90944689979645312c69da77e338d9401da2a09 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 29 Apr 2024 10:48:50 +1000 Subject: [PATCH 193/212] Fixing CI issues, adding new types to chameleon items. --- code/datums/trading/traders/goods.dm | 8 ++- code/game/antagonist/outsider/actors.dm | 2 +- code/game/objects/effects/landmarks.dm | 4 +- .../items/weapons/storage/uplink_kits.dm | 4 +- .../crates_lockers/closets/secure/security.dm | 5 +- .../crates_lockers/closets/wardrobe.dm | 3 +- .../loadout/lists/uniforms.dm | 13 ++-- code/modules/clothing/chameleon.dm | 65 ++++++++++++++++++- code/modules/clothing/jumpsuits/role.dm | 2 +- code/modules/clothing/pants/slacks.dm | 4 +- .../modules/clothing/sensors/vitals_sensor.dm | 2 +- code/modules/clothing/shirts/polo.dm | 4 ++ code/modules/clothing/webbing/holster.dm | 3 +- code/modules/keybindings/human.dm | 2 +- code/modules/mining/abandonedcrates.dm | 2 +- maps/antag_spawn/heist/heist_outfit.dm | 2 +- maps/exodus/outfits/civilian.dm | 2 +- .../exoplanet_ruins/hydrobase/hydrobase.dmm | 2 +- .../corporate/clothing/under/shirts.dm | 2 +- mods/content/corporate/datum/loadout.dm | 24 +++++-- mods/content/fantasy/_fantasy.dme | 1 - nebula.dme | 1 + 22 files changed, 116 insertions(+), 41 deletions(-) create mode 100644 code/modules/clothing/shirts/polo.dm diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index 0b4c00dc7a..8694bd01a4 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -133,19 +133,21 @@ /obj/item/clothing/pants/pj = TRADER_BLACKLIST, /obj/item/clothing/pants/shorts = TRADER_BLACKLIST, /obj/item/clothing/pants/casual/mustangjeans/monke = TRADER_BLACKLIST, + /obj/item/clothing/pants/chameleon = TRADER_BLACKLIST, /obj/item/clothing/shirt = TRADER_SUBTYPES_ONLY, + /obj/item/clothing/shirt/chameleon = TRADER_BLACKLIST, /obj/item/clothing/shirt/pj = TRADER_BLACKLIST, /obj/item/clothing/skirt = TRADER_SUBTYPES_ONLY, /obj/item/clothing/dress = TRADER_SUBTYPES_ONLY, /obj/item/clothing/dress/wedding = TRADER_BLACKLIST, /obj/item/clothing/under = TRADER_SUBTYPES_ONLY, - /obj/item/clothing/under/chameleon = TRADER_BLACKLIST, - /obj/item/clothing/jumpsuit = TRADER_BLACKLIST, + /obj/item/clothing/jumpsuit/chameleon = TRADER_BLACKLIST, + /obj/item/clothing/jumpsuit = TRADER_BLACKLIST, /obj/item/clothing/under/gimmick = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/lawyer = TRADER_BLACKLIST, /obj/item/clothing/under/mankini = TRADER_BLACKLIST_ALL, /obj/item/clothing/under/syndicate = TRADER_BLACKLIST_ALL, - /obj/item/clothing/jumpsuit/tactical = TRADER_BLACKLIST, + /obj/item/clothing/jumpsuit/tactical = TRADER_BLACKLIST, /obj/item/clothing/under/waiter/monke = TRADER_BLACKLIST ) diff --git a/code/game/antagonist/outsider/actors.dm b/code/game/antagonist/outsider/actors.dm index 371add5486..cbc2f72fc8 100644 --- a/code/game/antagonist/outsider/actors.dm +++ b/code/game/antagonist/outsider/actors.dm @@ -16,7 +16,7 @@ /decl/hierarchy/outfit/actor name = "Special Role - Actor" - uniform = /obj/item/clothing/under/chameleon + uniform = /obj/item/clothing/jumpsuit/chameleon shoes = /obj/item/clothing/shoes/chameleon l_ear = /obj/item/radio/headset/entertainment id_type = /obj/item/card/id/syndicate diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index a8421ac437..2dab83f5f3 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -43,7 +43,9 @@ //SUBCLASSES. Spawn a bunch of items and disappear likewise /obj/abstract/landmark/costume/chameleon/make_costumes() new /obj/item/clothing/mask/chameleon(loc) - new /obj/item/clothing/under/chameleon(loc) + new /obj/item/clothing/jumpsuit/chameleon(loc) + new /obj/item/clothing/shirt/chameleon(loc) + new /obj/item/clothing/pants/chameleon(loc) new /obj/item/clothing/glasses/chameleon(loc) new /obj/item/clothing/shoes/chameleon(loc) new /obj/item/clothing/gloves/chameleon(loc) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 08af6b4ff0..7612a6e897 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -57,7 +57,9 @@ /obj/item/backpack/chameleon/sydie_kit/WillContain() return list( - /obj/item/clothing/under/chameleon, + /obj/item/clothing/jumpsuit/chameleon, + /obj/item/clothing/shirt/chameleon, + /obj/item/clothing/pants/chameleon, /obj/item/clothing/suit/chameleon, /obj/item/clothing/shoes/chameleon, /obj/item/clothing/head/chameleon, diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 647c53036e..a2fc5f24a9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -142,12 +142,11 @@ /obj/structure/closet/secure_closet/detective/WillContain() return list( /obj/item/clothing/shirt/button/tan, - /obj/item/clothing/shirt/button = 2, - /obj/item/clothing/pants/slacks = 2, + /obj/item/clothing/shirt/button, + /obj/item/clothing/pants/slacks, /obj/item/clothing/pants/slacks/black, /obj/item/clothing/neck/tie/blue_clip, /obj/item/clothing/neck/tie/long/red, - /obj/item/clothing/neck/tie/long/red, /obj/item/clothing/suit/jacket/vest/black, /obj/item/clothing/suit/det_trench, /obj/item/clothing/suit/det_trench/grey, diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index af3128a673..218f017037 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -300,7 +300,6 @@ /obj/item/clothing/neck/tie/long/red, /obj/item/clothing/under/sl_suit, /obj/item/clothing/under/scratch, - /obj/item/clothing/slacks/black, /obj/item/clothing/shirt/button, /obj/item/clothing/neck/tie/black, /obj/item/clothing/suit/jacket/black, @@ -320,7 +319,7 @@ /obj/structure/closet/wardrobe/lawyer_black/WillContain() return list( - /obj/item/clothing/slacks/black = 2, + /obj/item/clothing/pants/slacks/black = 2, /obj/item/clothing/shirt/button = 2, /obj/item/clothing/neck/tie/long/red = 2, /obj/item/clothing/suit/jacket/black = 2, diff --git a/code/modules/client/preference_setup/loadout/lists/uniforms.dm b/code/modules/client/preference_setup/loadout/lists/uniforms.dm index 30bf717274..26593d4294 100644 --- a/code/modules/client/preference_setup/loadout/lists/uniforms.dm +++ b/code/modules/client/preference_setup/loadout/lists/uniforms.dm @@ -53,18 +53,15 @@ /obj/item/clothing/under/lawyer, /obj/item/clothing/under/scratch, /obj/item/clothing/under/lawyer/bluesuit, - /obj/item/clothing/slacks/black/outfit/internal_affairs, /obj/item/clothing/under/blazer, /obj/item/clothing/under/blackjumpskirt, - /obj/item/clothing/costume/kilt, - /obj/item/clothing/dress/hr ) -/decl/loadout_option/uniform/dress +/decl/loadout_option/uniform/dress_selection name = "dress selection" - path = /obj/item/clothing/under + path = /obj/item/clothing/dress -/decl/loadout_option/uniform/dress/get_gear_tweak_options() +/decl/loadout_option/uniform/dress_selection/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( @@ -97,8 +94,8 @@ path = /obj/item/clothing/skirt/short loadout_flags = GEAR_HAS_COLOR_SELECTION -/decl/loadout_option/uniform/dress - name = "simple dress, colour select" +/decl/loadout_option/uniform/dress_simple + name = "short dress, colour select" path = /obj/item/clothing/dress/short loadout_flags = GEAR_HAS_COLOR_SELECTION diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 7aada67f92..a808a625a1 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -42,8 +42,61 @@ .[name] = typepath return sortTim(., /proc/cmp_text_asc) +/obj/item/clothing/pants/chameleon + name = "grey slacks" + desc = "Crisp grey slacks. Moderately formal. There's a small dial on the waistband." + icon = 'icons/clothing/pants/slacks.dmi' + origin_tech = @'{"esoteric":3}' + item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + var/static/list/clothing_choices + +/obj/item/clothing/pants/chameleon/Initialize() + . = ..() + if(!clothing_choices) + var/static/list/clothing_types = list( + /obj/item/clothing/pants, + /obj/item/clothing/skirt + ) + clothing_choices = generate_chameleon_choices(/obj/item/clothing/under) + +/obj/item/clothing/pants/chameleon/verb/change(picked in clothing_choices) + set name = "Change Pants Appearance" + set category = "Chameleon Items" + set src in usr + if (!(usr.incapacitated())) + if(!ispath(clothing_choices[picked])) + return + disguise(clothing_choices[picked], usr) + update_clothing_icon() + +/obj/item/clothing/shirt/chameleon + name = "dress shirt" + desc = "A crisply pressed white button-up shirt. Somewhat formal. There's a small dial on the cuff." + icon = 'icons/clothing/shirts/button_up.dmi' + origin_tech = @'{"esoteric":3}' + item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + var/static/list/clothing_choices + +/obj/item/clothing/shirt/chameleon/Initialize() + . = ..() + if(!clothing_choices) + var/static/list/clothing_types = list( + /obj/item/clothing/shirt + ) + clothing_choices = generate_chameleon_choices(/obj/item/clothing/under) + +/obj/item/clothing/shirt/chameleon/verb/change(picked in clothing_choices) + set name = "Change Shirt Appearance" + set category = "Chameleon Items" + set src in usr + if (!(usr.incapacitated())) + if(!ispath(clothing_choices[picked])) + return + disguise(clothing_choices[picked], usr) + update_clothing_icon() + //starts off as a jumpsuit -/obj/item/clothing/under/chameleon +/obj/item/clothing/jumpsuit/chameleon name = "jumpsuit" icon = 'icons/clothing/under/jumpsuits/jumpsuit.dmi' desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." @@ -51,12 +104,18 @@ item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON var/static/list/clothing_choices -/obj/item/clothing/under/chameleon/Initialize() +/obj/item/clothing/jumpsuit/chameleon/Initialize() . = ..() if(!clothing_choices) + var/static/list/clothing_types = list( + /obj/item/clothing/under, + /obj/item/clothing/jumpsuit, + /obj/item/clothing/dress, + /obj/item/clothing/costume + ) clothing_choices = generate_chameleon_choices(/obj/item/clothing/under) -/obj/item/clothing/under/chameleon/verb/change(picked in clothing_choices) +/obj/item/clothing/jumpsuit/chameleon/verb/change(picked in clothing_choices) set name = "Change Jumpsuit Appearance" set category = "Chameleon Items" set src in usr diff --git a/code/modules/clothing/jumpsuits/role.dm b/code/modules/clothing/jumpsuits/role.dm index 22362d3423..bc80716a47 100644 --- a/code/modules/clothing/jumpsuits/role.dm +++ b/code/modules/clothing/jumpsuits/role.dm @@ -2,4 +2,4 @@ name = "caretaker's jumpsuit" desc = "A holy jumpsuit. Treat it well." icon = 'icons/clothing/under/caretaker.dmi' - bodytype_equip_flags = BODY_FLAG_HUMANOID \ No newline at end of file + bodytype_equip_flags = BODY_FLAG_HUMANOID diff --git a/code/modules/clothing/pants/slacks.dm b/code/modules/clothing/pants/slacks.dm index 25afe8aaf1..079ad5e299 100644 --- a/code/modules/clothing/pants/slacks.dm +++ b/code/modules/clothing/pants/slacks.dm @@ -71,13 +71,13 @@ /obj/item/clothing/suit/jacket/burgundy ) -/obj/item/clothing/slacks/black/outfit/internal_affairs +/obj/item/clothing/pants/slacks/black/outfit/internal_affairs starting_accessories = list( /obj/item/clothing/shirt/button, /obj/item/clothing/neck/tie/black ) -/obj/item/clothing/slacks/black/outfit/nanotrasen +/obj/item/clothing/pants/slacks/black/outfit/nanotrasen starting_accessories = list( /obj/item/clothing/shirt/button, /obj/item/clothing/neck/tie/long/red diff --git a/code/modules/clothing/sensors/vitals_sensor.dm b/code/modules/clothing/sensors/vitals_sensor.dm index e9996ac7f5..2b2ee26700 100644 --- a/code/modules/clothing/sensors/vitals_sensor.dm +++ b/code/modules/clothing/sensors/vitals_sensor.dm @@ -40,7 +40,7 @@ if(VITALS_SENSOR_TRACKING) to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") -/obj/item/clothing/sensor/vitals/on_attached(obj/item/clothing/S, mob/user) +/obj/item/clothing/sensor/vitals/on_attached(var/obj/item/clothing/holder, var/mob/user) . = ..() update_removable() diff --git a/code/modules/clothing/shirts/polo.dm b/code/modules/clothing/shirts/polo.dm new file mode 100644 index 0000000000..86312b0954 --- /dev/null +++ b/code/modules/clothing/shirts/polo.dm @@ -0,0 +1,4 @@ +/obj/item/clothing/shirt/polo + name = "polo shirt" + desc = "A fashionable polo shirt." + icon = 'icons/clothing/shirts/polo.dmi' diff --git a/code/modules/clothing/webbing/holster.dm b/code/modules/clothing/webbing/holster.dm index 622fd0fee0..8c56984d9c 100644 --- a/code/modules/clothing/webbing/holster.dm +++ b/code/modules/clothing/webbing/holster.dm @@ -32,9 +32,8 @@ var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) H.examine_holster(user) -/obj/item/clothing/webbing/holster/on_attached(obj/item/clothing/under/S, mob/user) +/obj/item/clothing/webbing/holster/on_attached(var/obj/item/clothing/holder, var/mob/user) . = ..() - var/obj/item/clothing/holder = loc if(istype(holder)) holder.verbs |= /atom/proc/holster_verb diff --git a/code/modules/keybindings/human.dm b/code/modules/keybindings/human.dm index 86050212db..aaff20deca 100644 --- a/code/modules/keybindings/human.dm +++ b/code/modules/keybindings/human.dm @@ -26,7 +26,7 @@ if(H.incapacitated()) return - var/obj/item/clothing/under/U = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/U = H.get_equipped_item(slot_w_uniform_str) if(istype(U)) for(var/obj/S in U.accessories) if(istype(S, /obj/item/clothing/webbing/holster)) diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index f9d2a47b78..035a478c13 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -50,7 +50,7 @@ new /obj/item/clothing/pants/shorts/athletic/red(src) new /obj/item/clothing/pants/shorts/athletic/blue(src) if(46 to 50) - new/obj/item/clothing/under/chameleon(src) + new/obj/item/clothing/jumpsuit/chameleon(src) for(var/i = 0, i < 7, i++) new /obj/item/clothing/neck/tie/horrible(src) if(51 to 52) // Uncommon, 2% each diff --git a/maps/antag_spawn/heist/heist_outfit.dm b/maps/antag_spawn/heist/heist_outfit.dm index a967da4eb3..9cb2c3d9b9 100644 --- a/maps/antag_spawn/heist/heist_outfit.dm +++ b/maps/antag_spawn/heist/heist_outfit.dm @@ -118,7 +118,7 @@ H.put_in_hands(ammobox) if(holster) - var/obj/item/clothing/under/uniform = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) if(istype(uniform) && uniform.can_attach_accessory(holster)) uniform.attackby(holster, H) else diff --git a/maps/exodus/outfits/civilian.dm b/maps/exodus/outfits/civilian.dm index 67a81f6df5..c5525340e3 100644 --- a/maps/exodus/outfits/civilian.dm +++ b/maps/exodus/outfits/civilian.dm @@ -50,7 +50,7 @@ /decl/hierarchy/outfit/job/internal_affairs_agent name = "Job - Internal affairs agent" l_ear = /obj/item/radio/headset/heads/ia - uniform = /obj/item/clothing/slacks/black/outfit/internal_affairs + uniform = /obj/item/clothing/pants/slacks/black/outfit/internal_affairs suit = /obj/item/clothing/suit/jacket/black shoes = /obj/item/clothing/shoes/color/brown glasses = /obj/item/clothing/glasses/sunglasses/big diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index 1ee831f3c7..12220e523b 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -2581,7 +2581,7 @@ /turf/floor/tiled/freezer, /area/map_template/hydrobase/station/shower) "gz" = ( -/obj/item/clothing/skirt/black, +/obj/item/clothing/skirt, /obj/item/clothing/head/beret/purple, /obj/item/clothing/shoes/dress, /obj/structure/closet, diff --git a/mods/content/corporate/clothing/under/shirts.dm b/mods/content/corporate/clothing/under/shirts.dm index 21ec824a5f..e9f4575bd6 100644 --- a/mods/content/corporate/clothing/under/shirts.dm +++ b/mods/content/corporate/clothing/under/shirts.dm @@ -5,7 +5,7 @@ permeability_coefficient = 0.50 armor = list( ARMOR_BIO = ARMOR_BIO_MINOR - ) + ) /obj/item/clothing/shirt/polo/corp/nanotrasen name = "\improper NanoTrasen polo shirt" diff --git a/mods/content/corporate/datum/loadout.dm b/mods/content/corporate/datum/loadout.dm index 9156b3db62..78ef934828 100644 --- a/mods/content/corporate/datum/loadout.dm +++ b/mods/content/corporate/datum/loadout.dm @@ -32,6 +32,20 @@ path = /obj/item/clothing/shirt/tunic/corp loadout_flags = GEAR_HAS_TYPE_SELECTION +/decl/loadout_option/uniform/corporate_jumpsuit + name = "corporate jumpsuit selection" + path = /obj/item/clothing/jumpsuit + +/decl/loadout_option/uniform/corporate_jumpsuit/get_gear_tweak_options() + . = ..() + LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) + .[/datum/gear_tweak/path/specified_types_list] |= list( + /obj/item/clothing/jumpsuit/aether, + /obj/item/clothing/jumpsuit/hephaestus, + /obj/item/clothing/jumpsuit/wardt, + /obj/item/clothing/jumpsuit/focal + ) + /decl/loadout_option/uniform/corporate name = "corporate uniform selection" path = /obj/item/clothing/under @@ -40,10 +54,6 @@ . = ..() LAZYINITLIST(.[/datum/gear_tweak/path/specified_types_list]) .[/datum/gear_tweak/path/specified_types_list] |= list( - /obj/item/clothing/jumpsuit/aether, - /obj/item/clothing/jumpsuit/hephaestus, - /obj/item/clothing/jumpsuit/wardt, - /obj/item/clothing/jumpsuit/focal, /obj/item/clothing/under/mbill, /obj/item/clothing/under/saare, /obj/item/clothing/under/pcrc, @@ -68,13 +78,15 @@ path = /obj/item/clothing/shirt/button/corp /decl/loadout_option/uniform/corp_exec_jacket + name = "corporate jacket selection" path = /obj/item/clothing/suit/jacket/corp - slot = slot_tie_str + slot = slot_wear_suit_str loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corp_exec_tie + name = "corporate tie selection" path = /obj/item/clothing/neck/tie/corp - slot = slot_tie_str + slot = slot_w_uniform_str loadout_flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/suit/nanotrasen_poncho diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 195e34cb3b..4d00e7ae42 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -21,7 +21,6 @@ #include "items/clothing/_loadout.dm" #include "items/clothing/_recipes.dm" #include "items/clothing/armor.dm" -#include "items/clothing/gown.dm" #include "items/clothing/jerkin.dm" #include "items/clothing/loincloth.dm" #include "items/clothing/trousers.dm" diff --git a/nebula.dme b/nebula.dme index f7b31ccff6..c2d8d1c5b9 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2002,6 +2002,7 @@ #include "code\modules\clothing\shirts\hawaii.dm" #include "code\modules\clothing\shirts\misc.dm" #include "code\modules\clothing\shirts\pajamas.dm" +#include "code\modules\clothing\shirts\polo.dm" #include "code\modules\clothing\shirts\scrubs.dm" #include "code\modules\clothing\shirts\toga.dm" #include "code\modules\clothing\shirts\tunics.dm" From 9832a30653039786570c178f9ede3e69f20cd1dc Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 23 May 2024 00:39:09 +0000 Subject: [PATCH 194/212] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 3aa6a35896..9518b3210f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -152,13 +152,6 @@

      MistakeNot4892 updated:

      • More ore per ore!
      - -

      21 March 2024

      -

      MistakeNot4892 updated:

      -
        -
      • Mining now requires a tool of sufficient hardness.
      • -
      • Tool crafting is now restricted to specific stack types.
      • -
    From 4118392ecf02387e7d829d36e0c9a1c690c7e0ac Mon Sep 17 00:00:00 2001 From: Knighted Illithid Date: Thu, 23 May 2024 03:56:46 +0300 Subject: [PATCH 195/212] Heat exchanging pipes: fixes heat radiation to space --- code/modules/atmospherics/datum_pipeline.dm | 2 +- code/modules/atmospherics/he_pipes.dm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/atmospherics/datum_pipeline.dm b/code/modules/atmospherics/datum_pipeline.dm index ab0e82e281..a48a75e309 100644 --- a/code/modules/atmospherics/datum_pipeline.dm +++ b/code/modules/atmospherics/datum_pipeline.dm @@ -286,6 +286,6 @@ // Previously, the temperature would enter equilibrium at 26C or 294K. // Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on. // It currently should stabilise at 129.6K or -143.6C - . -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (surface_temperature - COSMIC_RADIATION_TEMPERATURE) ** 4 + . -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (surface_temperature ** 4 - COSMIC_RADIATION_TEMPERATURE ** 4) #undef REAGENT_UNITS_PER_PIPE \ No newline at end of file diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 0ab943cc37..14355d9471 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -57,7 +57,9 @@ else var/turf/turf = loc var/datum/gas_mixture/pipe_air = return_air() - if(istype(turf) && turf.simulated) + if(istype(loc, /turf/space)) + parent.radiate_heat_to_space(surface, 1) + else if(istype(turf) && turf.simulated) var/turf/pipe_turf = loc var/environment_temperature = 0 if(pipe_turf.blocks_air) @@ -67,8 +69,6 @@ environment_temperature = environment.temperature if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) parent.temperature_interact(pipe_turf, volume, thermal_conductivity) - else if(istype(loc, /turf/space)) - parent.radiate_heat_to_space(surface, 1) if(buckled_mob) var/hc = pipe_air.heat_capacity() From 402fe903efc26924258930b1aeabac410acea77b Mon Sep 17 00:00:00 2001 From: Knighted Illithid Date: Fri, 24 May 2024 12:59:35 +0300 Subject: [PATCH 196/212] Fixes clamp() args order (at old `between` helper calls) --- code/_helpers/unsorted.dm | 4 ++-- code/game/machinery/atmo_control.dm | 6 ++--- code/game/machinery/doors/_door.dm | 2 +- code/game/objects/effects/chem/chemsmoke.dm | 2 +- .../structures/_structure_construction.dm | 2 +- code/game/objects/structures/grille.dm | 6 ++--- code/game/objects/structures/watercloset.dm | 2 +- .../binary_devices/oxyregenerator.dm | 4 ++-- .../components/binary_devices/passive_gate.dm | 4 ++-- .../components/binary_devices/pump.dm | 2 +- .../components/unary/cold_sink.dm | 2 +- .../components/unary/heat_source.dm | 2 +- code/modules/clothing/spacesuits/breaches.dm | 2 +- .../liquids/materials_liquid_water.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 2 +- code/modules/organs/internal/_internal.dm | 4 ++-- code/modules/organs/organ.dm | 4 ++-- code/modules/paperwork/papershredder.dm | 2 +- code/modules/power/batteryrack.dm | 8 +++---- code/modules/power/port_gen.dm | 2 +- .../power/singularity/field_generator.dm | 2 +- code/modules/power/smes.dm | 4 ++-- code/modules/power/smes_construction.dm | 6 ++--- code/modules/projectiles/projectile.dm | 4 ++-- code/modules/shield_generators/shield.dm | 2 +- .../shield_generators/shield_generator.dm | 24 +++++++++---------- code/modules/shieldgen/shieldwallgen.dm | 4 ++-- code/modules/supermatter/supermatter.dm | 4 ++-- code/modules/xgm/xgm_gas_mixture.dm | 2 +- 29 files changed, 58 insertions(+), 58 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index df4fcaf4d2..c3dffd26d9 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -203,7 +203,7 @@ Turf and target are seperate in case you want to teleport some distance from a t line+=locate(px,py,M.z) return line -#define LOCATE_COORDS(X, Y, Z) locate(clamp(1, X, world.maxx), clamp(1, Y, world.maxy), Z) +#define LOCATE_COORDS(X, Y, Z) locate(clamp(X, 1, world.maxx), clamp(Y, 1, world.maxy), Z) /proc/getcircle(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. if(!radius) return list(center) @@ -230,7 +230,7 @@ Turf and target are seperate in case you want to teleport some distance from a t #undef LOCATE_COORDS -#define LOCATE_COORDS_SAFE(X, Y, Z) locate(clamp(TRANSITIONEDGE + 1, X, world.maxx - TRANSITIONEDGE), clamp(TRANSITIONEDGE + 1, Y, world.maxy - TRANSITIONEDGE), Z) +#define LOCATE_COORDS_SAFE(X, Y, Z) locate(clamp(X, TRANSITIONEDGE + 1, world.maxx - TRANSITIONEDGE), clamp(Y, TRANSITIONEDGE + 1, world.maxy - TRANSITIONEDGE), Z) /proc/getcirclesafe(turf/center, var/radius) //Uses a fast Bresenham rasterization algorithm to return the turfs in a thin circle. if(!radius) return list(center) diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index dd4c4aab63..a08744dd25 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -161,7 +161,7 @@ input_info = null refreshing_input = TRUE input_flow_setting = input("What would you like to set the rate limit to?", "Set Volume", input_flow_setting) as num|null - input_flow_setting = clamp(0, input_flow_setting, ATMOS_DEFAULT_VOLUME_PUMP+500) + input_flow_setting = clamp(input_flow_setting, 0, ATMOS_DEFAULT_VOLUME_PUMP+500) signal.data = list ("tag" = input_tag, "set_volume_rate" = input_flow_setting) . = 1 @@ -188,7 +188,7 @@ output_info = null refreshing_output = TRUE pressure_setting = input("How much pressure would you like to output?", "Set Pressure", pressure_setting) as num|null - pressure_setting = clamp(0, pressure_setting, MAX_PUMP_PRESSURE) + pressure_setting = clamp(pressure_setting, 0, MAX_PUMP_PRESSURE) signal.data = list ("tag" = output_tag, "set_internal_pressure" = "[pressure_setting]", "status" = 1) . = 1 @@ -196,7 +196,7 @@ output_info = null refreshing_output = TRUE pressure_setting = input("How much pressure would you like to maintain inside the core?", "Set Core Pressure", pressure_setting) as num|null - pressure_setting = clamp(0, pressure_setting, MAX_PUMP_PRESSURE) + pressure_setting = clamp(pressure_setting, 0, MAX_PUMP_PRESSURE) signal.data = list ("tag" = output_tag, "set_external_pressure" = pressure_setting, "checks" = 1, "status" = 1) . = 1 diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index 2e139fc143..f88aa66737 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -285,7 +285,7 @@ playsound(src, 'sound/items/Welder.ogg', 100, 1) if(do_after(user, 5 * repairing.amount, src) && welder && welder.isOn()) to_chat(user, "You finish repairing the damage to \the [src].") - health = clamp(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth) + health = clamp(health + repairing.amount*DOOR_REPAIR_AMOUNT, health, maxhealth) update_icon() qdel(repairing) repairing = null diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 8d2fa7c77c..9d15405b2d 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -181,7 +181,7 @@ var/pressure = 0 var/datum/gas_mixture/environment = location.return_air() if(environment) pressure = environment.return_pressure() - smoke_duration = clamp(5, smoke_duration*pressure/(ONE_ATMOSPHERE/3), smoke_duration) + smoke_duration = clamp(smoke_duration*pressure/(ONE_ATMOSPHERE/3), 5, smoke_duration) var/const/arcLength = 2.3559 //distance between each smoke cloud diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index 7c2f7d060a..c7aac169a2 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -110,7 +110,7 @@ to_chat(user, SPAN_NOTICE("You fit [used] [stack.singular_name]\s to damaged areas of \the [src].")) stack.use(used) last_damage_message = null - health = clamp(health, health + used*DOOR_REPAIR_AMOUNT, maxhealth) + health = clamp(health + used*DOOR_REPAIR_AMOUNT, health, maxhealth) /obj/structure/attackby(obj/item/O, mob/user) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 683a53c58e..408fa85b7a 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -134,11 +134,11 @@ if(BRUTE) //bullets if(Proj.original == src || prob(20)) - Proj.damage *= clamp(0, Proj.damage/60, 0.5) + Proj.damage *= clamp(Proj.damage/60, 0, 0.5) if(prob(max((damage-10)/25, 0))*100) passthrough = 1 else - Proj.damage *= clamp(0, Proj.damage/60, 1) + Proj.damage *= clamp(Proj.damage/60, 0, 1) passthrough = 1 if(BURN) //beams and other projectiles are either blocked completely by grilles or stop half the damage. @@ -148,7 +148,7 @@ if(passthrough) . = PROJECTILE_CONTINUE - damage = clamp(0, (damage - Proj.damage)*(Proj.damage_type == BRUTE? 0.4 : 1), 10) //if the bullet passes through then the grille avoids most of the damage + damage = clamp((damage - Proj.damage)*(Proj.damage_type == BRUTE? 0.4 : 1), 0, 10) //if the bullet passes through then the grille avoids most of the damage take_damage(damage*0.2) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1c466ff083..3a08508843 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -331,7 +331,7 @@ var/global/list/hygiene_props = list() if(!on || !istype(M)) return var/water_temperature = temperature_settings[watertemp] - var/temp_adj = clamp(BODYTEMP_COOLING_MAX, water_temperature - M.bodytemperature, BODYTEMP_HEATING_MAX) + var/temp_adj = clamp(water_temperature - M.bodytemperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX) M.bodytemperature += temp_adj if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm index 7786d1b77f..2fd2be5111 100644 --- a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -68,7 +68,7 @@ if (phase == "processing")//processing CO2 in tank if (inner_tank.gas[/decl/material/gas/carbon_dioxide]) - var/co2_intake = clamp(0, inner_tank.gas[/decl/material/gas/carbon_dioxide], power_setting*wait/10) + var/co2_intake = clamp(inner_tank.gas[/decl/material/gas/carbon_dioxide], 0, power_setting*wait/10) last_flow_rate = co2_intake inner_tank.adjust_gas(/decl/material/gas/carbon_dioxide, -co2_intake, 1) var/datum/gas_mixture/new_oxygen = new @@ -144,5 +144,5 @@ update_icon() return 1 if(href_list["setPower"]) //setting power to 0 is redundant anyways - power_setting = clamp(1, text2num(href_list["setPower"]), 5) + power_setting = clamp(text2num(href_list["setPower"]), 1, 5) return 1 diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index ec6e5526b7..a641278b3e 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -157,7 +157,7 @@ target_pressure = max_pressure_setting if ("set") var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure Control",src.target_pressure) as num - src.target_pressure = clamp(0, new_pressure, max_pressure_setting) + src.target_pressure = clamp(new_pressure, 0, max_pressure_setting) switch(href_list["set_flow_rate"]) if ("min") @@ -166,7 +166,7 @@ set_flow_rate = air1.volume if ("set") var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[air1.volume]kPa)","Flow Rate Control",src.set_flow_rate) as num - src.set_flow_rate = clamp(0, new_flow_rate, air1.volume) + src.set_flow_rate = clamp(new_flow_rate, 0, air1.volume) usr.set_machine(src) //Is this even needed with NanoUI? src.update_icon() diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index 6867e4c8a7..a0b05c844c 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -157,7 +157,7 @@ Thus, the two variables affect pump operation are set in New(): . = 1 if ("set") var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = clamp(0, new_pressure, max_pressure_setting) + src.target_pressure = clamp(new_pressure, 0, max_pressure_setting) . = 1 if(.) diff --git a/code/modules/atmospherics/components/unary/cold_sink.dm b/code/modules/atmospherics/components/unary/cold_sink.dm index d13f13b6d5..59cd07c118 100644 --- a/code/modules/atmospherics/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/components/unary/cold_sink.dm @@ -81,7 +81,7 @@ else set_temperature = max(set_temperature + amount, 0) if(href_list["setPower"]) //setting power to 0 is redundant anyways - var/new_setting = clamp(0, text2num(href_list["setPower"]), 100) + var/new_setting = clamp(text2num(href_list["setPower"]), 0, 100) set_power_level(new_setting) add_fingerprint(usr) diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index b1b6229f27..a476f6fc52 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -99,7 +99,7 @@ else set_temperature = max(set_temperature + amount, 0) if(href_list["setPower"]) //setting power to 0 is redundant anyways - var/new_setting = clamp(0, text2num(href_list["setPower"]), 100) + var/new_setting = clamp(text2num(href_list["setPower"]), 0, 100) set_power_level(new_setting) add_fingerprint(usr) diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index fcab77cc95..1bd4a98b6c 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -36,7 +36,7 @@ /datum/breach/proc/update_descriptor() //Sanity... - class = clamp(1, round(class), 5) + class = clamp(round(class), 1, 5) //Apply the correct descriptor. if(damtype == BURN) descriptor = breach_burn_descriptors[class] diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 74337d9613..94af88bfb2 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -76,7 +76,7 @@ var/volume = REAGENT_VOLUME(holder, type) if (environment && environment.temperature > min_temperature) // Abstracted as steam or something - var/removed_heat = clamp(0, volume * WATER_LATENT_HEAT, -environment.get_thermal_energy_change(min_temperature)) + var/removed_heat = clamp(volume * WATER_LATENT_HEAT, 0, -environment.get_thermal_energy_change(min_temperature)) environment.add_thermal_energy(-removed_heat) if (prob(5) && environment && environment.temperature > T100C) T.visible_message("The water sizzles as it lands on \the [T]!") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8d0d32bf6a..91b52b5c0c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -235,7 +235,7 @@ temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR) //Use heat transfer as proportional to the gas density. However, we only care about the relative density vs standard 101 kPa/20 C air. Therefore we can use mole ratios - bodytemperature += clamp(BODYTEMP_COOLING_MAX, temp_adj*relative_density, BODYTEMP_HEATING_MAX) + bodytemperature += clamp(temp_adj*relative_density, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX) // +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt. if(bodytemperature >= get_temperature_threshold(HEAT_LEVEL_1)) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index 5a04c777e3..539ca151ed 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -106,9 +106,9 @@ /obj/item/organ/internal/proc/take_internal_damage(amount, var/silent=0) if(BP_IS_PROSTHETIC(src)) - damage = clamp(0, src.damage + (amount * 0.8), max_damage) + damage = clamp(src.damage + (amount * 0.8), 0, max_damage) else - damage = clamp(0, src.damage + amount, max_damage) + damage = clamp(src.damage + amount, 0, max_damage) //only show this if the organ is not robotic if(owner && can_feel_pain() && parent_organ && (amount > 5 || prob(10))) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 13470c4e4d..b8815ba19c 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -283,7 +283,7 @@ if(germ_level >= INFECTION_LEVEL_ONE) var/fever_temperature = (owner.get_temperature_threshold(HEAT_LEVEL_1) - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature - owner.bodytemperature += clamp(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature) + owner.bodytemperature += clamp((fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, 0, fever_temperature - owner.bodytemperature) if (germ_level >= INFECTION_LEVEL_TWO) var/obj/item/organ/external/parent = GET_EXTERNAL_ORGAN(owner, parent_organ) @@ -367,7 +367,7 @@ /obj/item/organ/proc/heal_damage(amount) if(can_recover()) - damage = clamp(0, damage - round(amount, 0.1), max_damage) + damage = clamp(damage - round(amount, 0.1), 0, max_damage) /obj/item/organ/attack(var/mob/target, var/mob/user) if(BP_IS_PROSTHETIC(src) || !istype(target) || !istype(user) || (user != target && user.a_intent == I_HELP)) diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 69b22f4e84..7e2d5c1554 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -176,7 +176,7 @@ /obj/machinery/papershredder/on_update_icon() cut_overlays() var/ratio = ((cached_total_matter * 5) / max_total_matter) - icon_state = "papershredder[clamp(0, CEILING(ratio), 5)]" + icon_state = "papershredder[clamp(CEILING(ratio), 0, 5)]" if(!is_unpowered()) add_overlay("papershredder_power") if(is_broken() || is_bin_full()) diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm index 608c4b1970..6d5065007f 100644 --- a/code/modules/power/batteryrack.dm +++ b/code/modules/power/batteryrack.dm @@ -47,7 +47,7 @@ icon_update = 0 var/cellcount = 0 - var/charge_level = clamp(0, round(Percentage() / 12), 7) + var/charge_level = clamp(round(Percentage() / 12), 0, 7) overlays += "charge[charge_level]" @@ -67,7 +67,7 @@ newmaxcharge += C.maxcharge capacity = newmaxcharge - charge = clamp(0, charge, newmaxcharge) + charge = clamp(charge, 0, newmaxcharge) // Sets input/output depending on our "mode" var. @@ -182,7 +182,7 @@ celldiff = (least.maxcharge / 100) * percentdiff else celldiff = (most.maxcharge / 100) * percentdiff - celldiff = clamp(0, celldiff, max_transfer_rate * CELLRATE) + celldiff = clamp(celldiff, 0, max_transfer_rate * CELLRATE) // Ensure we don't transfer more energy than the most charged cell has, and that the least charged cell can input. celldiff = min(min(celldiff, most.charge), least.maxcharge - least.charge) least.give(most.use(celldiff)) @@ -260,7 +260,7 @@ update_io(0) return 1 else if( href_list["enable"] ) - update_io(clamp(1, text2num(href_list["enable"]), 3)) + update_io(clamp(text2num(href_list["enable"]), 1, 3)) return 1 else if( href_list["equaliseon"] ) equalise = 1 diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 5e1ad2297c..02dcfb7039 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -259,7 +259,7 @@ if (operating_temperature > cooling_temperature) var/temp_loss = (operating_temperature - cooling_temperature)/TEMPERATURE_DIVISOR - temp_loss = clamp(2, round(temp_loss, 1), TEMPERATURE_CHANGE_MAX) + temp_loss = clamp(round(temp_loss, 1), 2, TEMPERATURE_CHANGE_MAX) operating_temperature = max(operating_temperature - temp_loss, cooling_temperature) src.updateDialog() diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 34c488513c..141550cc60 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -48,7 +48,7 @@ field_generator power level display // Scale % power to % num_power_levels and truncate value var/level = round(num_power_levels * power / field_generator_max_power) // Clamp between 0 and num_power_levels for out of range power values - level = clamp(0, level, num_power_levels) + level = clamp(level, 0, num_power_levels) if(level) overlays += "+p[level]" diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index fcd463d216..882a009b79 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -115,7 +115,7 @@ /obj/machinery/power/smes/proc/input_power(var/percentage) var/to_input = target_load * (percentage/100) - to_input = clamp(0, to_input, target_load) + to_input = clamp(to_input, 0, target_load) input_available = 0 if(percentage == 100) inputting = 2 @@ -196,7 +196,7 @@ return var/total_restore = output_used * (percent_load / 100) // First calculate amount of power used from our output - total_restore = clamp(0, total_restore, output_used) // Now clamp the value between 0 and actual output, just for clarity. + total_restore = clamp(total_restore, 0, output_used) // Now clamp the value between 0 and actual output, just for clarity. total_restore = output_used - total_restore // And, at last, subtract used power from outputted power, to get amount of power we will give back to the SMES. // now recharge this amount diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 71ac8ba8da..190568bbef 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -137,7 +137,7 @@ capacity *= 1.2 input_level_max *= 2 output_level_max *= 2 - charge = clamp(0, charge, capacity) + charge = clamp(charge, 0, capacity) // Proc: total_system_failure() // Parameters: 2 (intensity - how strong the failure is, user - person which caused the failure) @@ -376,14 +376,14 @@ // Parameters: 1 (new_input - New input value in Watts) // Description: Sets input setting on this SMES. Trims it if limits are exceeded. /obj/machinery/power/smes/buildable/proc/set_input(var/new_input = 0) - input_level = clamp(0, new_input, input_level_max) + input_level = clamp(new_input, 0, input_level_max) update_icon() // Proc: set_output() // Parameters: 1 (new_output - New output value in Watts) // Description: Sets output setting on this SMES. Trims it if limits are exceeded. /obj/machinery/power/smes/buildable/proc/set_output(var/new_output = 0) - output_level = clamp(0, new_output, output_level_max) + output_level = clamp(new_output, 0, output_level_max) update_icon() /obj/machinery/power/smes/buildable/emp_act(var/severity) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a0ea7ec7a6..176f70ae39 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -177,8 +177,8 @@ //randomize clickpoint a bit based on dispersion if(dispersion) var/radius = round((dispersion*0.443)*world.icon_size*0.8) //0.443 = sqrt(pi)/4 = 2a, where a is the side length of a square that shares the same area as a circle with diameter = dispersion - p_x = clamp(0, p_x + gaussian(0, radius) * 0.25, world.icon_size) - p_y = clamp(0, p_y + gaussian(0, radius) * 0.25, world.icon_size) + p_x = clamp(p_x + gaussian(0, radius) * 0.25, 0, world.icon_size) + p_y = clamp(p_y + gaussian(0, radius) * 0.25, 0, world.icon_size) //Used to change the direction of the projectile in flight. /obj/item/projectile/proc/redirect(var/new_x, var/new_y, var/atom/starting_loc, var/atom/movable/new_firer=null, var/is_ricochet = FALSE) diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index 3a43275915..4c706d9743 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -308,7 +308,7 @@ // Small visual effect, makes the shield tiles brighten up by becoming more opaque for a moment, and spreads to nearby shields. /obj/effect/shield/proc/impact_effect(var/i, var/list/affected_shields = list()) - i = clamp(1, i, 10) + i = clamp(i, 1, 10) alpha = 255 animate(src, alpha = initial(alpha), time = 1 SECOND) affected_shields |= src diff --git a/code/modules/shield_generators/shield_generator.dm b/code/modules/shield_generators/shield_generator.dm index d0a84fc3e8..82919a486c 100644 --- a/code/modules/shield_generators/shield_generator.dm +++ b/code/modules/shield_generators/shield_generator.dm @@ -88,12 +88,12 @@ for(var/obj/item/stock_parts/smes_coil/S in component_parts) full_shield_strength += (S.ChargeCapacity / CELLRATE) * 5 max_energy = full_shield_strength * 20 - current_energy = clamp(0, current_energy, max_energy) + current_energy = clamp(current_energy, 0, max_energy) mitigation_max = MAX_MITIGATION_BASE + MAX_MITIGATION_RESEARCH * total_component_rating_of_type(/obj/item/stock_parts/capacitor) - mitigation_em = clamp(0, mitigation_em, mitigation_max) - mitigation_physical = clamp(0, mitigation_physical, mitigation_max) - mitigation_heat = clamp(0, mitigation_heat, mitigation_max) + mitigation_em = clamp(mitigation_em, 0, mitigation_max) + mitigation_physical = clamp(mitigation_physical, 0, mitigation_max) + mitigation_heat = clamp(mitigation_heat, 0, mitigation_max) ..() @@ -172,9 +172,9 @@ running = SHIELD_RUNNING regenerate_field() - mitigation_em = clamp(0, mitigation_em - MITIGATION_LOSS_PASSIVE, mitigation_max) - mitigation_heat = clamp(0, mitigation_heat - MITIGATION_LOSS_PASSIVE, mitigation_max) - mitigation_physical = clamp(0, mitigation_physical - MITIGATION_LOSS_PASSIVE, mitigation_max) + mitigation_em = clamp(mitigation_em - MITIGATION_LOSS_PASSIVE, 0, mitigation_max) + mitigation_heat = clamp(mitigation_heat - MITIGATION_LOSS_PASSIVE, 0, mitigation_max) + mitigation_physical = clamp(mitigation_physical - MITIGATION_LOSS_PASSIVE, 0, mitigation_max) if(running == SHIELD_RUNNING) upkeep_power_usage = round((field_segments.len - damaged_segments.len) * ENERGY_UPKEEP_PER_TILE * upkeep_multiplier) @@ -193,7 +193,7 @@ // Now try to recharge our internal energy. var/energy_to_demand if(input_cap) - energy_to_demand = clamp(0, max_energy - current_energy, input_cap - energy_buffer) + energy_to_demand = clamp(max_energy - current_energy, 0, input_cap - energy_buffer) else energy_to_demand = max(0, max_energy - current_energy) energy_buffer = energy_to_demand - use_power_oneoff(energy_to_demand) @@ -345,7 +345,7 @@ var/new_range = input(user, "Enter new field range (1-[world.maxx]). Leave blank to cancel.", "Field Radius Control", field_radius) as num if(!new_range) return TOPIC_HANDLED - target_radius = clamp(1, new_range, world.maxx) + target_radius = clamp(new_range, 1, world.maxx) return TOPIC_REFRESH if(href_list["set_input_cap"]) @@ -397,9 +397,9 @@ mitigation_heat += MITIGATION_HIT_LOSS + MITIGATION_HIT_GAIN energy_to_use *= 1 - (mitigation_heat / 100) - mitigation_em = clamp(0, mitigation_em, mitigation_max) - mitigation_heat = clamp(0, mitigation_heat, mitigation_max) - mitigation_physical = clamp(0, mitigation_physical, mitigation_max) + mitigation_em = clamp(mitigation_em, 0, mitigation_max) + mitigation_heat = clamp(mitigation_heat, 0, mitigation_max) + mitigation_physical = clamp(mitigation_physical, 0, mitigation_max) current_energy -= energy_to_use diff --git a/code/modules/shieldgen/shieldwallgen.dm b/code/modules/shieldgen/shieldwallgen.dm index 75caf91139..1ee46b4635 100644 --- a/code/modules/shieldgen/shieldwallgen.dm +++ b/code/modules/shieldgen/shieldwallgen.dm @@ -24,7 +24,7 @@ data["draw"] = round(power_draw) data["power"] = round(storedpower) data["maxpower"] = round(max_stored_power) - data["current_draw"] = ((clamp(500, max_stored_power - storedpower, power_draw)) + power ? active_power_usage : 0) + data["current_draw"] = ((clamp(max_stored_power - storedpower, 500, power_draw)) + power ? active_power_usage : 0) data["online"] = active == 2 ? 1 : 0 ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -108,7 +108,7 @@ if(C) PN = C.powernet // find the powernet of the connected cable if(PN) - var/shieldload = clamp(500, max_stored_power - storedpower, power_draw) //what we try to draw + var/shieldload = clamp(max_stored_power - storedpower, 500, power_draw) //what we try to draw shieldload = PN.draw_power(shieldload) //what we actually get storedpower += shieldload diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 31e784b7b1..8d5e8bc991 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -485,7 +485,7 @@ var/global/list/supermatter_delam_accent_sounds = list( else damage_archived = damage - damage = max(0, damage + clamp(-damage_rate_limit, (removed.temperature - critical_temperature) / 150, damage_inc_limit)) + damage = max(0, damage + clamp((removed.temperature - critical_temperature) / 150, -damage_rate_limit, damage_inc_limit)) //Ok, 100% oxygen atmosphere = best reaction //Maxes out at 100% oxygen pressure @@ -518,7 +518,7 @@ var/global/list/supermatter_delam_accent_sounds = list( visible_message("[src]: Releasing additional [round((heat_capacity_new - heat_capacity)*removed.temperature)] W with exhaust gasses.") removed.add_thermal_energy(thermal_power) - removed.temperature = clamp(0, removed.temperature, 10000) + removed.temperature = clamp(removed.temperature, 0, 10000) env.merge(removed) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index ae9f0a4d90..ad2e3bcb25 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -260,7 +260,7 @@ /datum/gas_mixture/proc/remove_ratio(ratio, out_group_multiplier = 1) if(ratio <= 0) return null - out_group_multiplier = clamp(1, out_group_multiplier, group_multiplier) + out_group_multiplier = clamp(out_group_multiplier, 1, group_multiplier) ratio = min(ratio, 1) From 7a7b361f0dc9ecb3f7583b22c049a1c75dad5916 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 24 May 2024 21:05:29 -0400 Subject: [PATCH 197/212] Allow hnolls to wear gloves --- mods/content/fantasy/_fantasy.dme | 1 + mods/content/fantasy/items/clothing/overrides.dm | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 mods/content/fantasy/items/clothing/overrides.dm diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 195e34cb3b..0f2015461c 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -24,5 +24,6 @@ #include "items/clothing/gown.dm" #include "items/clothing/jerkin.dm" #include "items/clothing/loincloth.dm" +#include "items/clothing/overrides.dm" #include "items/clothing/trousers.dm" #endif diff --git a/mods/content/fantasy/items/clothing/overrides.dm b/mods/content/fantasy/items/clothing/overrides.dm new file mode 100644 index 0000000000..f79af51e4c --- /dev/null +++ b/mods/content/fantasy/items/clothing/overrides.dm @@ -0,0 +1,4 @@ +/obj/item/clothing/gloves/setup_equip_flags() + . = ..() + if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_FLAG_EXCLUDE)) + bodytype_equip_flags |= BODY_FLAG_HNOLL \ No newline at end of file From 585b3f4656c3f734c64dae91aac3682f66f5a5ef Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 22 May 2024 20:11:00 -0400 Subject: [PATCH 198/212] Add fantasy modpack to modpack_testing --- maps/modpack_testing/modpack_testing.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 54cd2b7078..0a6993dadf 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -19,6 +19,7 @@ #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/fantasy/_fantasy.dme" #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" From 5094f12c3c0c8798e9381beae8da69b13e7be9c5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 22 May 2024 22:12:18 -0400 Subject: [PATCH 199/212] Comment out invalid TYPE_INITIAL not supported in 514 --- code/game/turfs/walls/wall_log.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/turfs/walls/wall_log.dm b/code/game/turfs/walls/wall_log.dm index b67a4da218..faf5916d52 100644 --- a/code/game/turfs/walls/wall_log.dm +++ b/code/game/turfs/walls/wall_log.dm @@ -1,7 +1,8 @@ /turf/wall/log icon_state = "log" material = /decl/material/solid/organic/wood - color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) + color = WOOD_COLOR_GENERIC + // color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) girder_material = null /turf/wall/log/get_dismantle_stack_type() From 029dbc0bd67166b474c8b5f4b103857d80298c84 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 22 May 2024 22:12:36 -0400 Subject: [PATCH 200/212] Add plant growth rate overrides to dirt and mud --- code/game/turfs/floors/natural/natural_dirt.dm | 3 +++ code/game/turfs/floors/natural/natural_mud.dm | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/code/game/turfs/floors/natural/natural_dirt.dm b/code/game/turfs/floors/natural/natural_dirt.dm index 1cf2407ee2..e341d92188 100644 --- a/code/game/turfs/floors/natural/natural_dirt.dm +++ b/code/game/turfs/floors/natural/natural_dirt.dm @@ -10,6 +10,9 @@ material = /decl/material/solid/soil turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID +/turf/floor/natural/dirt/get_plant_growth_rate() + return 1 + /turf/floor/natural/dirt/fluid_act(var/datum/reagents/fluids) if(fluids?.total_volume < FLUID_SHALLOW) return ..() diff --git a/code/game/turfs/floors/natural/natural_mud.dm b/code/game/turfs/floors/natural/natural_mud.dm index 72de279f21..19bcd0c6de 100644 --- a/code/game/turfs/floors/natural/natural_mud.dm +++ b/code/game/turfs/floors/natural/natural_mud.dm @@ -13,6 +13,10 @@ new /obj/item/rock/flint(src) return ..() +// the internet tells me clay holds water well and is full of nutrients plants crave +/turf/floor/natural/clay/get_plant_growth_rate() + return 1.2 + /turf/floor/natural/clay/flooded flooded = /decl/material/liquid/water @@ -37,6 +41,9 @@ return return ..() +/turf/floor/natural/mud/get_plant_growth_rate() + return 1.1 + /turf/floor/natural/mud/water color = COLOR_SKY_BLUE reagent_type = /decl/material/liquid/water @@ -57,6 +64,10 @@ is_fundament_turf = TRUE material = /decl/material/solid/soil +// Just wet the damn dirt first!! +/turf/floor/natural/dry/get_plant_growth_rate() + return 0.0 + /turf/floor/natural/dry/fluid_act(datum/reagents/fluids) if(fluids?.total_volume < FLUID_SHALLOW) return ..() From 77ddeb590d35e0f2b0b11f1ddb778595a7fb2d62 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 23 May 2024 10:12:16 -0400 Subject: [PATCH 201/212] Fix submaps for server.sh setups with custom GITDIR --- scripts/server.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/server.sh b/scripts/server.sh index 8388b0dd13..f6b4c7c62f 100755 --- a/scripts/server.sh +++ b/scripts/server.sh @@ -62,7 +62,8 @@ while [[ ! -e stopserver ]]; do if [[ "$GITDIR" != "." ]]; then cp "$GITDIR/$DME.dmb" . cp "$GITDIR/$DME.rsc" . - cp -r "$GITDIR/nano" . + cp -r "$GITDIR/nano" . # Necessary for NanoUI + cp -r "$GITDIR/maps" . # Necessary for runtime submap loading [[ ! -e btime.so && -e "$GITDIR/btime.so" ]] && cp "$GITDIR/btime.so" . [[ ! -e .git/logs ]] && mkdir -p .git/logs cp "$GITDIR/.git/HEAD" ./.git/HEAD From f738b52f429cf2e56624b8a1e3cd234efc948cf1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 23 May 2024 10:50:37 -0400 Subject: [PATCH 202/212] Allow thread to be used for fishing line --- code/modules/fishing/fishing_rod.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index ac5e3d3bf8..cb184834f0 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -286,7 +286,8 @@ /obj/item/fishing_line, /obj/item/stack/cable_coil, /obj/item/stack/net_cable_coil, - /obj/item/stack/material/bundle + /obj/item/stack/material/bundle, + /obj/item/stack/material/thread, ) if(!new_line || !is_type_in_list(new_line, valid_line_types)) From 75dbf75d2e381825fdc819020bdf1e0347ce38a0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 23 May 2024 13:47:17 -0400 Subject: [PATCH 203/212] Make fantasy modpack compile off of Shaded Hills --- mods/content/fantasy/_fantasy.dme | 1 + mods/content/fantasy/datum/hnoll/species.dm | 2 +- mods/content/fantasy/datum/kobaloi/species.dm | 2 +- mods/content/fantasy/datum/outfits.dm | 7 +++++++ 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 mods/content/fantasy/datum/outfits.dm diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 195e34cb3b..4279018b19 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -5,6 +5,7 @@ #include "datum/currencies.dm" #include "datum/factions.dm" #include "datum/locations.dm" +#include "datum/outfits.dm" #include "datum/overrides.dm" #include "datum/hnoll/bodytypes.dm" #include "datum/hnoll/culture.dm" diff --git a/mods/content/fantasy/datum/hnoll/species.dm b/mods/content/fantasy/datum/hnoll/species.dm index 34df98dfc4..c79537704f 100644 --- a/mods/content/fantasy/datum/hnoll/species.dm +++ b/mods/content/fantasy/datum/hnoll/species.dm @@ -17,7 +17,7 @@ description = "Gnolls!" hidden_from_codex = FALSE available_bodytypes = list(/decl/bodytype/hnoll) - preview_outfit = /decl/hierarchy/outfit/job/shaded_hills/traveller + preview_outfit = /decl/hierarchy/outfit/job/generic/fantasy spawn_flags = SPECIES_CAN_JOIN flesh_color = "#ae7d32" hunger_factor = DEFAULT_HUNGER_FACTOR * 1.2 diff --git a/mods/content/fantasy/datum/kobaloi/species.dm b/mods/content/fantasy/datum/kobaloi/species.dm index 0b67392f41..a50c170688 100644 --- a/mods/content/fantasy/datum/kobaloi/species.dm +++ b/mods/content/fantasy/datum/kobaloi/species.dm @@ -7,7 +7,7 @@ available_bodytypes = list( /decl/bodytype/kobaloi ) - preview_outfit = /decl/hierarchy/outfit/job/shaded_hills/traveller + preview_outfit = /decl/hierarchy/outfit/job/generic/fantasy base_external_prosthetics_model = null available_cultural_info = list( diff --git a/mods/content/fantasy/datum/outfits.dm b/mods/content/fantasy/datum/outfits.dm new file mode 100644 index 0000000000..2a7faed5e9 --- /dev/null +++ b/mods/content/fantasy/datum/outfits.dm @@ -0,0 +1,7 @@ +/decl/hierarchy/outfit/job/generic/fantasy + name = "Fantasy Outfit" + id_type = null + pda_type = null + l_ear = null + uniform = /obj/item/clothing/pants/trousers/jerkin + shoes = /obj/item/clothing/shoes/craftable/boots \ No newline at end of file From 725407fb640f67db157399f292f31aecfd172b09 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 23 May 2024 23:46:39 -0400 Subject: [PATCH 204/212] Fix being unable to pick up clothing storage items --- code/modules/clothing/_clothing_accessories.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/_clothing_accessories.dm b/code/modules/clothing/_clothing_accessories.dm index 8364c01f3c..e75fda7a26 100644 --- a/code/modules/clothing/_clothing_accessories.dm +++ b/code/modules/clothing/_clothing_accessories.dm @@ -141,7 +141,10 @@ // If we're checking strictly and our parent is an accessory, // This will need to be handled differently if we ever allow non-clothing accessories! /obj/item/clothing/can_interact_with_storage(user, strict = FALSE) - if((. = ..(user, FALSE)) || !strict) // Ignore the parent strictness check. + if(!istype(loc, /obj/item/clothing) || !strict) + return ..() + . = ..(user, FALSE) // Ignore the parent strictness check. + if(.) return . if(istype(loc, /obj/item/clothing)) var/obj/item/clothing/parent = loc From 29f36d1eca17a07a68d6901476a0f12302be4434 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 24 May 2024 06:00:00 -0400 Subject: [PATCH 205/212] Fix being unable to help conscious mobs to their feet --- code/modules/mob/living/living_attackhand.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index 243a53ab39..a75daa5e71 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -89,9 +89,6 @@ // Returns TRUE if further interactions should be halted, FALSE otherwise. /mob/living/proc/try_awaken(mob/user) - if(isSynthetic() || stat == CONSCIOUS) - return user.attempt_hug(src) - var/decl/pronouns/pronouns = get_pronouns() var/obj/item/uniform = get_equipped_item(slot_w_uniform_str) if(uniform) From 51eade56739632dbef0066706a6d7f5140233bbe Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 25 May 2024 13:33:43 -0400 Subject: [PATCH 206/212] Update Tether accessories to latest dev --- maps/tether/atoms/kink.dm | 8 ++++++-- .../obj/clothing/collars/bell_collar.dmi | Bin 500 -> 763 bytes .../obj/clothing/collars/colorized_collar.dmi | Bin 477 -> 748 bytes .../obj/clothing/collars/cowbell_collar.dmi | Bin 514 -> 767 bytes .../obj/clothing/collars/gold_collar.dmi | Bin 478 -> 752 bytes .../obj/clothing/collars/holo_collar.dmi | Bin 483 -> 765 bytes .../obj/clothing/collars/pink_collar.dmi | Bin 484 -> 762 bytes .../obj/clothing/collars/shock_collar.dmi | Bin 2817 -> 1631 bytes .../obj/clothing/collars/silver_collar.dmi | Bin 479 -> 754 bytes .../obj/clothing/collars/spike_collar.dmi | Bin 878 -> 734 bytes maps/tether/icons/obj/permits.dmi | Bin 535 -> 781 bytes 11 files changed, 6 insertions(+), 2 deletions(-) diff --git a/maps/tether/atoms/kink.dm b/maps/tether/atoms/kink.dm index 4a85cee044..26ce57f7da 100644 --- a/maps/tether/atoms/kink.dm +++ b/maps/tether/atoms/kink.dm @@ -17,10 +17,13 @@ /obj/item/clothing/neck/choker //A colorable, tagless choker name = "plain choker" - slot_flags = SLOT_OVER_BODY + slot_flags = SLOT_OVER_BODY | SLOT_FACE + obj_flags = OBJ_FLAG_HOLLOW + fallback_slot = slot_wear_suit_str desc = "A simple, plain choker. Or maybe it's a collar? Use in-hand to customize it." icon = 'maps/tether/icons/obj/clothing/choker.dmi' obj_flags = OBJ_FLAG_HOLLOW + // TODO: make this use loadout geartweaks instead, at least for material var/customized = FALSE var/static/list/allowed_descriptors = list( "plain", @@ -79,8 +82,9 @@ /obj/item/clothing/neck/collar abstract_type = /obj/item/clothing/neck/collar - slot_flags = SLOT_OVER_BODY + slot_flags = SLOT_OVER_BODY | SLOT_FACE obj_flags = OBJ_FLAG_HOLLOW + fallback_slot = slot_wear_suit_str var/writtenon = FALSE /obj/item/clothing/neck/collar/silver diff --git a/maps/tether/icons/obj/clothing/collars/bell_collar.dmi b/maps/tether/icons/obj/clothing/collars/bell_collar.dmi index a7435074f9846334a290773020c128aa18d36c85..7e48e6f88bbffbcc2c76fc8c3a71820eb9d28df3 100644 GIT binary patch delta 631 zcmeyu{F`-xIG+Ot8v_HwQCIDUppJ-GBbq7>2TfB$@JdAdV}b_583ooOg>%ep-)Hj_We2NouoUV$f5zH7Zt{Uthhxc_H6PBVzu2-~&oZZK zvrL5re=qm++rPvXImheef4cgrZo|WDEmn^Tv&QL~+o#Uj=knr1yxg@{f2{6#NIVn^ z5UrcF>{#pJg57)9O|P4={r>q|$+|MV!4nh?-afO{$i05L>kp^;*Zt3a?VJ2*Z=kkA z`?|xIzw23BW-fO1kTt%0c~P0rD@y|T1Cwi7;{_*q5*nIPhCzJF2{*OxpTqmB| zwC40ipGmhgSL{g2$%6W|Z;~C z04yvlS65g6)BvQT0L*~uQ2+n{0d!JMQvg8b*k%9#0F03(e1C}6SCW~EOPjKStDg(l z7XTBTJzk;>Go1hc0O?6YK~z|U?Up+df-n$314BdSN@XdW0Jor}(0kZ;0*_#2XB%&T zr!*g75)*flj&b(Uu&^)50+U4u=AS6k;Q<>jEL#nc;8V68YFwqF@@=|NmW!t|At3gk zK|CxMFQm}h1%HDhP?XJFV6#mVdax%2B+h_?DFK?)CE;-WJf%dTLnYj_kXD0waaNdX zNnj7VJCI*PfRvA%bWuww^MvOsQ;<`hAmo%+gQ%yxe1=&qLBCKN>*z++_XZN#A&x%- zGeS7)NZzOVMHH%EFbu;maq@onq9crM6!eP-biat;&l`{+FbuN--kCIDUppJ-GBbq7>2TfB$@$x@KL;p!dM>&a4-jCF}1U*lR3*GTq9DTX*Xo z&3*n(0zM1(@#jvQfAM354o9DU39Fqf7lSinf(8Q*Yr{eY0}+NcrUNOO2|Hu#W>5RQ zs@bpJ@U~>@A7Q)s=kHn1KL32Np6I8ee;zKstod?Z&?SupazAp+KHvNBwCLyNIZh|? z@6KO+RqOT#*3}HWb}AptLQd><@%Zt}GM)4OI{lo7*ZW_oy?UBzxuix~=$AlLLvVxV z^u^|`+N&m4|7iNGnHYpjA_#ai@wz-FM66{tr_if&ZNvy>Q;)8 zCSSYr29~yaeb*%v)?9!6sBZuAHK*M#S+Q|Q?b*U2z5DLEQg<2VHxbbdd^^(azvtS| zY5e8N|DNKd8@Y{~i+dR#f7~(ae%|&+A1f?Q3tQh4fBa?3r8y>l&ZY&QO}+WY&Ub3N z>xH8hlV5+0+S>8A?tgvMa;0ULH4lG3@>}ObYn$ILLEQt_m^$p|=AXzgS6=u!Wu1DR z%U!|M?Pot6?tIrIQ6&?3PgqU}9F74D5}1Jt78I^E4Viyg|MaE^9kIPJl2hA@w%^YE zYWcjJxg~?qjbZP;rIV^ZoVvYh!9M@Kx&&($dEI-P)*nA2w PDKU7u`njxgN@xNA9d8Nj delta 343 zcmV-d0jU1$1>FOX7eZhJ0{{R35VmRy0000RP)t-sz`(%&|Noblm%qQifPjG7+S*rF zSEHk&ii(QRBdQDl0004WQchC%Sje&vTsYwwZkZPZpT3X-jZR{=Z%O~KAruL3sI~(RQGla+KaNW|$ z`pdw;WbEnU7*a9k?QDDhLk<${>yI5hc=YOw2`3KpP4-SKFH9=<;Jjg$ggt}&A&Kqaq4%C#x=;Rnu-p6nmUrhR6H%7qjJueB^RYH8 zWH1n6sBdFB5Wpb8#o)}C5T&Ug*Dt>8@v>hFw&lL+%z4+cpRM^;uk7;7CzlrPdSP!f z+ox%psL&M%Yd>pGT zoO;#}H)+4k(;~YzCCmExQl}>ut-01z;S7fxUV0{{R35VmRy0000dP)t-sz`(%&Gc&UQ0NVfn|Nk@p{{XI_ z0RI30S65ftv;hCzLI2bMq@w@@l3G6i0004WQchCDu1zryM%IT)iK?Gb< zC{%~7WK_P78)Y2a9SA{xDQT93_i^w@3R0K`Si-)fmL!H&0rM$akV7s7Nhil8ZOj(% ztb&Epa7uwfp-?!x$4VQ}3o4;O6Ug8Huo+6b=hce| h=&$)l1cqT=PYaI-G@qCIDUppJ-GBbq7>2TfB$@#Kt)2xW|7oE^%XN1yqU6^ zQVNv!Uo8Dwd_DX3vuocyJ&sS?eeYg+`QB`OkINx~GS)BHdStm6oEZ}|7%}+O`a>(x6^DWXTm0yF~{!7O=g&qY_k*hkerX4QK!T9wGov)i`wgr}sg(<{Tv zwt8C27p}e#@;h_h6ycdElW*N$(jwNDsLjcXwvE4tTt3Ubmsm}|4?}>UV{5V=LTl@C=|KIn|o3d-?{*dkA z{8{g7_VPIAAA1!SP(N|<`Lo=gU)wovU$~Wl^Z(Pg1z+#Iy!iW*2j?>j{a%%lOMK~! zskRL>4ren+ELTrDxx^uT30U~!*!DsOau`Qf)$ zugoseU-v)m_rC}CBO6#I+}E>X*~hLQTw=z;yEC{_y3Cb(4;wU6a2SSZ!!!1I${TM+ TGOh9gCMO0@S3j3^P6OUY7eZhJ0{{R35VmRy0000RP)t-sz`(!&0000403;+NuAl%cEG$=7 zSMsp{yp`2OQ^Ni_y(Om5;tlca1zruqhYP}73xnne&jQUw4_{oKTQv5Z7RYGg6ezvRW^O#%kkHwQL}n4v`AWyHq#NLai5B#2FMtQ51Un q&wGN6N2~QBLn{25Us05e@&OWQ8}BJ6EJXkd0000z<4 diff --git a/maps/tether/icons/obj/clothing/collars/holo_collar.dmi b/maps/tether/icons/obj/clothing/collars/holo_collar.dmi index 70784ea23d25683324afa20d2408767b2ea2083a..58e2b5b619b483fca244295ae74ecc613c741700 100644 GIT binary patch delta 640 zcmaFN{FiltIG+Ot8v_HwQ+t^#+mruYKP3;}Ob~emqW(bed;ku=h z^_PKx$ZrxO> z$-ZLB!uEs}0zn4@_nYzlEPSN0{?4BMkkHK3v5Tv}t8}NV=Mg-&udLvx@^Kvq^4O{d)L+o%8bN zuO@xoq`$ebTKN2qM>#jQwZ6D;`07)$UB8OVYJAr*aIW`z5VA7t#FFrIMcW7Nd z-_KiP57VbZ{f}?#NIGw=xBhka^=D64Us$+XZr`#k+(Ih#Kdfrkez_PanER;e$1EpC zs}k9Hb@@e;CmThzTuEM59U;Q!{C(ldXNPSx)s0Tpd;Om*bgRN9Po;5Tc=8?1AN$su z&Gwz1E2+{N8&Gvb>ELT^#eM}2E&q^o7E_g?^$e1$m#YW=+Zw<7Q^^ax^I^M>RA@fR zNc%ncSJJkS@ACSu{?@;XT)BMqVk4ftv!b#cBfsQ?+>Mj5i>R4@*yd7e!zM0{{R35VmRy0000UP)t-sz`(!&0000403;+N0GZ4)|Nks3 zELT@o0MgPRaE@cTtN8!`00DGTPE!Ct=GbNc004}UC3SyGGE))SOo-N2T$)*eOP{iW ztDg(l7XS#%JzixPPImwR0NY7KK~z|U?Uqpvf-nq*2jKwLoj^DNHo@1KX!IT?p2P=^ zptqGVF&ivR8()a&#|wr2{40=l#wh+t^#+mruYKP3;}Ob~emqW(bed;ku=h z^_PKxNzc>8F{EP7+u62xhYTdz-gd1le;~D{A|YitcebSi{{hAT{tN3~^3K}0>d>w1 z0^TJe%60}%&ig5>=XtN}s-kFr?zc)=UFo#ct_KxP;twt^WH1n6Xk$7Mz#zfJ;LMny z!QfLrh3Q!S<2`vh)*E?TPqnmq;&sEP=liKm^L@5!PSAhXw*LNg^VsXUD@6+=EB5{U z5dR^e(5!}AardU@$7W<4-adtE!UJcf{FsZ5C$_rW_^{MIjdNv!j^X;wA(lD6j-gZH|efAh_CP9+CLvd*1<-221&)|YW< z`{T5eqyzk33MxE*b!(@<>Fq~9%r0=wzdXU7X=~_&>WfR%+szWHf7yEqEe%?_Z&JGH z{PW$PjlZ}xy<^>(V^%-gX|atApJau?S{9EVnX}}M`!2uyS6{W|VXat5TZ`YV%bpH5 z1sx7$e06YJB`LkDmdKI;Vst08SYY^Z)<= delta 357 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 GOwMnodRx8# diff --git a/maps/tether/icons/obj/clothing/collars/silver_collar.dmi b/maps/tether/icons/obj/clothing/collars/silver_collar.dmi index 8445f779ee529c9742667fcf66116422937219b0..4d91200044186d4d090da79f09ea5f553575ada5 100644 GIT binary patch delta 622 zcmcc5{E2mfIG+Ot8v_HwQCIDUppJ-GBbq7>2TfB$@c%Gzn_aY6RgCCph8g@D}CTKA5ur@4YFc4vAV>%GPFhhei zCGuPS<*${ik}v2knb&&S$Kv;f`;i|bb!zxd{EE=B|MN@Q?e6s%d&>T9l&knOEh0Qd z-+GGx=igl?B_(oyI3;sm_z=VNe(@iz{PoVA6Fz*cJtGtq?GXGUH8LuEj>`9^OYNo_ zun7G!-qLVR&*S2Q*k4g^7r$0&Q~CCxHH=YcSBv_3JMnr;U1g;$a@Kc0FDjMzB|ht; z{Ig8Ush)B#ZPZP-JS}>u+PLt0@?Fg(nOS<%PtQ1RnenEC))eWBeb06q+ENmBiYWpy~2^5MFTnv~&3lVGzcmCSA_HSLj+3d3_+KWF0 zyvy5u`Fr5{V{F_P82pxBUh;pbP<7~sQwgybLelqt;PH3W-ou6zL3oTtMCCJa>E&yz UcTbvX1x!#3p00i_>zopr07{Gz1poj5 delta 345 zcmV-f0jB=)1>XaZ7eZhJ0{{R35VmRy0000RP)t-sz`(!&0000403;+NfPjE3EG$=7 zSEHk&ii(PV=w0*x0004WQchCgm~#z6$clue6{P^qYRA3iDHi{}#|Aa>wDJn%AL=O+w- zKvC9zbAk1aCv@OX3SefyekuWK?v${sKY8S%?RCbtb;H9|Mqb6jpFbG~i%j|ytX0}w{K@-K zx3{skz%QSGFPhpre(h|S%ghiSr^9tiC+jZ*1Cx-ai(^Q|oVT-YPi!&}X-iDMyO5DP z;h1~(22Sn`Y;u*`__!8uc73=g$-RLwy|%!zCs9$&qv1#O&;63>ADx(<9~RbA)ag=E zu-JD&`@_os1_>?(XT}5#1|HUig$xEF49}$ZGU>_mA3t5ScipR}oGB~p;@5_WYks!j zfA+aDBl3^t?{cAlvM;y4Z-2`5Z^xFq?XQo;rZ}fAUOJ^=#ijHQwO{4SV!JLd?~Bk$ ztCha@{`>Q1zcpJ|*!pGP&jw27i!5MzFZ7{WL(%S^~2+yuSsrrv$5*J zmo1l$&PcWIlxA!{?D#2K^p9cX9g{kb>PvMp$N5iRKkw&#!1RZy&=!rZRloAKTkn=( zUHQ~^e()jtwT2G-UbB`Rd|9&U)#;~2YK*0oFLQ7H`k9i)mN>a(qrs1|HSUgQ|IAnM z3|&?7q}ci=otLyPYA)!^WjMEK&AG3$&o28a z+gvyQ9@DM|foBWUcFLT6z~BCz`2c3HwJ~8AV#*A9apjJ%g+D(`>( zEc(ikv$pP^w$YDeHbs4QzkW7o&P)kok>q1f1jYd_!?0TWhtZ($cFCuC0+GN3%i!ti K=d#Wzp$Pysb2X3v literal 878 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo6RScZN?cNllZ!G7N;32F7#J$% z^q$_!b;v;E=ts-%ntX59{J3b^y<`f{TWt@Oi!m9}9(lU^_BuPNAAI}g;h(ISTj%%; z_AX67(R!JuH?3Y_>!#@(y`MWnc>Z*3aurl(l)5_W(+lmOdBu&#CSI}Kt(o)tbJyu7 z&yL7#e-gjjNNp!qyMFe+wA93(PqVf(H@?)}%gAxYHqMRZ&3y(2rWu|tjv*Cu-rhMs zagl>W`@{2VOS@Tk8npUYE_zBd7*;&-kzsQXVtKf6HAe%>ny&}qa>OP7Hy+AQx%b?t zZ?Vbc_dFJ1#@(BAc&+wdvHoyb(4mJRiA6xUL4xrJhk_f!#(u7V>!pw9WX~z~{r#^X zKKAvk!5UoNS% zkYVGWk~%ZjZ1!i1W^)tcc)vq;PoCWL=BeYY+XJ zmu!EY!|?K}il6(rElqB}73QqpGwW1_gOSlAAEuq2@)oOCX4QwT*dKdRn0HdNN%PyO zUp*dIJ-?N4ck5Kw36C0!eC9aD^QERQbjwP&xXbsS=Yx9kJc+eg7d)PG#$_E|CcU8G zYi=*oW}YKT+Uw@`S2Cxp-SF;HOVttv1}08V7srr_IdAV8_T6$2VF+MA53zh%ph=6Bkkw zs=?+GlLQZ&C(ota919t-n_E}kox)J~^?3cIod5TmbzeP-54-ns$K}7($COf@E;mwj zSbx3SY_{(QKbt0#m)%9{m+03>>F%!DTX$;am!*9h?=yk|1P1ITzt`8_`ET2knKo5A zM*7jOzW-j&JnwAU(ztIW`R4_=y${1wLTNdtXQppYKmAndTUoRFZrusfj|)3kQPi+< z?3$PR-`MNgsnGqcw(r-zJ$~Hv>(f9M?sNS==RYvtb(H1LroW4Rf7WQSvDx(^;s5JL vpAD}HI^5(^;O_4~ztTti{uy?tfev4|moHk*vuE`aA&`ittDnm{r-UW|*+OS* delta 521 zcmV+k0`~ol2A2eo8Gi!+008vhk@)}s05DKYR7C&)0OjT7=jZ3q(b2-f!ib27gM))= zYHG^L$~ZVU0001acXw4)Rk^vj=hOhgvH$>1kc|KU00DGTPE!Ct=GbNc006prR9JLG zWpiV4X>fFDZ*Bkpc$}4z&kBPu493sxQxrWr_Q&fkLm3|CD}M~Pb~aF((PoNoKUohl z#?apK!S~CTgrwqBo~v3Emx}kwc|a?UBHwH|8$gnt#9_~wR?un+!c#+PDw6@7kqKuK zoS*cLvxjRs73yzSc1MHGFPg#j$`ZP9y>o4A{puQvAjJ*kn0bSAB~UY#$6!C9f9QEi zw5mlTJvn%)h=1)Opm6E9puj8xsVM8>^CfSi&#T78p@gac007TPL_t(|obA%<5`rKQ zhG7vDD-ZX7w_)Qr#VBj7j#Tes{}y&XprQZ(?8F#TK8x#RWd8v6g^TMhl4XGT7T0E^ z>QaDr4zad5SvR%{Z0+jtx3p%gO93kD{o-a>*xWQ#>VF2tx*VW(J`o_%U<%;93*Tao zEdf;T_jrQT4Tw*0xlTR{p#Kx9%;^<}`0fAz0001f#O>r3ZQE++>sp*100000004Ad zmq7~v0000$2KrvE3rkdnL9R<{j-P*E0Ie+tIC*}?w+8?K{?Z-9?+3iKWGqDh0000< LMNUMnLIPld3w7%! From 7027df156d22b75192896cbe6a3c71aed1ba4422 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 25 May 2024 14:52:45 -0400 Subject: [PATCH 207/212] Remove legacy slot_tie state from choker --- maps/tether/icons/obj/clothing/choker.dmi | Bin 376 -> 581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/maps/tether/icons/obj/clothing/choker.dmi b/maps/tether/icons/obj/clothing/choker.dmi index b763aabe1336598af32f8f4074abe31107db6e2e..069461c24676466090b4ba711084ce505e70fb87 100644 GIT binary patch delta 455 zcmeytbd+U+IG+Ot8v_HwQ=|hv8d2fiMyBN(630={& z`0HGDmAyzq=&!Sz!9+gqFOgc>SEa}UqHl9wF6j~u@kKb!H9 z>f$Hw)WyC<_dT9DVcTw&qt4vkUYzZ9IZ@kp00i_>zopr0Hl|~NdN!< delta 248 zcmVHF_KmbCsIzVWqRjU@D2tWbT%FxiL1y~Hw304$#{ yFor;AQ3nW(mQO~(C>RNVV6sQgC!=5#KmY)_J{j^RFyzqy0000 Date: Mon, 27 May 2024 00:40:34 +0000 Subject: [PATCH 208/212] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 9518b3210f..5a7ee446ec 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -146,12 +146,6 @@

    Chinsky updated:

  • Liberia away site is no longer mandatory spawn
  • Fixed planets having wrong colors when seen on skybox
  • - -

    25 March 2024

    -

    MistakeNot4892 updated:

    -
      -
    • More ore per ore!
    • -
    From 852d39ee229ea2278973474aca3b737d3504c081 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 19 May 2024 09:33:19 -0400 Subject: [PATCH 209/212] Update minimum BYOND version to 515 --- code/__defines/_byond_version_compat.dm | 46 +------------- code/__defines/lists.dm | 7 --- code/__defines/misc.dm | 24 +++++--- code/_helpers/auxtools.dm | 4 +- code/_helpers/profiling.dm | 2 +- code/game/objects/structures/doors/_door.dm | 8 +-- code/game/objects/structures/fires.dm | 2 +- code/game/turfs/flooring/flooring_wood.dm | 14 ++--- code/game/turfs/floors/subtypes/floor_path.dm | 61 +++---------------- code/game/turfs/floors/subtypes/floor_wood.dm | 14 ++--- code/game/turfs/walls/wall_brick.dm | 26 +------- code/game/turfs/walls/wall_log.dm | 37 +---------- code/modules/client/client_procs.dm | 3 - .../modules/crafting/stack_recipes/_recipe.dm | 4 +- code/modules/power/cell.dm | 5 -- code/modules/synthesized_instruments/song.dm | 3 - code/modules/webhooks/_webhook.dm | 2 +- 17 files changed, 56 insertions(+), 206 deletions(-) diff --git a/code/__defines/_byond_version_compat.dm b/code/__defines/_byond_version_compat.dm index 72ad8942ae..61d61853a8 100644 --- a/code/__defines/_byond_version_compat.dm +++ b/code/__defines/_byond_version_compat.dm @@ -1,47 +1,5 @@ -#define REQUIRED_DM_VERSION 514 +#define REQUIRED_DM_VERSION 515 #if DM_VERSION < REQUIRED_DM_VERSION -#warn Nebula is not tested on BYOND versions older than 514. The code may not compile, and if it does compile it may have severe problems. -#endif - -// 515 split call for external libraries into call_ext -#if DM_VERSION < 515 -#define LIBCALL call -#else -#define LIBCALL call_ext -#endif - -// So we want to have compile time guarantees these methods exist on local type, unfortunately 515 killed the .proc/procname and .verb/verbname syntax so we have to use nameof() -// For the record: GLOBAL_VERB_REF would be useless as verbs can't be global. - -#if DM_VERSION < 515 - -/// Call by name proc references, checks if the proc exists on either this type or as a global proc. -#define PROC_REF(X) (.proc/##X) -/// Call by name verb references, checks if the verb exists on either this type or as a global verb. -#define VERB_REF(X) (.verb/##X) - -/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc -#define TYPE_PROC_REF(TYPE, X) (##TYPE.proc/##X) -/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb -#define TYPE_VERB_REF(TYPE, X) (##TYPE.verb/##X) - -/// Call by name proc reference, checks if the proc is an existing global proc -#define GLOBAL_PROC_REF(X) (/proc/##X) - -#else - -/// Call by name proc references, checks if the proc exists on either this type or as a global proc. -#define PROC_REF(X) (nameof(.proc/##X)) -/// Call by name verb references, checks if the verb exists on either this type or as a global verb. -#define VERB_REF(X) (nameof(.verb/##X)) - -/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc -#define TYPE_PROC_REF(TYPE, X) (nameof(##TYPE.proc/##X)) -/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb -#define TYPE_VERB_REF(TYPE, X) (nameof(##TYPE.verb/##X)) - -/// Call by name proc reference, checks if the proc is an existing global proc -#define GLOBAL_PROC_REF(X) (/proc/##X) - +#warn Nebula is not tested on BYOND versions older than 515. The code may not compile, and if it does compile it may have severe problems. #endif \ No newline at end of file diff --git a/code/__defines/lists.dm b/code/__defines/lists.dm index 448d8161a6..b77ba2f90d 100644 --- a/code/__defines/lists.dm +++ b/code/__defines/lists.dm @@ -72,11 +72,4 @@ };\ } while(FALSE) -#if DM_VERSION < 515 // legacy, remove once we make 515 mandatory -/proc/LIST_CLEAR_NULLS(list/L) - var/start_len = L.len - L -= new /list(L.len) - return start_len - L.len -#else #define LIST_CLEAR_NULLS(L) L.RemoveAll(null) -#endif diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index fcdfaccd21..ec5eea099a 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -347,13 +347,23 @@ // Can groom properly (long hair with a brush) #define GROOMING_RESULT_SUCCESS 2 -#if DM_VERSION < 515 -#define TYPE_INITIAL(REF, VAR) initial(REF.VAR) -#else -#define TYPE_INITIAL(REF, VAR) (REF::VAR) -#endif - // Used by recipe selection. #define RECIPE_CATEGORY_MICROWAVE "microwave" #define RECIPE_CATEGORY_POT "pot" -#define RECIPE_CATEGORY_SKILLET "skillet" \ No newline at end of file +#define RECIPE_CATEGORY_SKILLET "skillet" + +// So we want to have compile time guarantees these methods exist on local type, unfortunately 515 killed the .proc/procname and .verb/verbname syntax so we have to use nameof() +// For the record: GLOBAL_VERB_REF would be useless as verbs can't be global. + +/// Call by name proc references, checks if the proc exists on either this type or as a global proc. +#define PROC_REF(X) (nameof(.proc/##X)) +/// Call by name verb references, checks if the verb exists on either this type or as a global verb. +#define VERB_REF(X) (nameof(.verb/##X)) + +/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc +#define TYPE_PROC_REF(TYPE, X) (nameof(##TYPE.proc/##X)) +/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb +#define TYPE_VERB_REF(TYPE, X) (nameof(##TYPE.verb/##X)) + +/// Call by name proc reference, checks if the proc is an existing global proc +#define GLOBAL_PROC_REF(X) (/proc/##X) \ No newline at end of file diff --git a/code/_helpers/auxtools.dm b/code/_helpers/auxtools.dm index 26ac67f7b5..1950aa4b17 100644 --- a/code/_helpers/auxtools.dm +++ b/code/_helpers/auxtools.dm @@ -11,11 +11,11 @@ var/global/auxtools_debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") /hook/startup/proc/auxtools_init() if (global.auxtools_debug_server) - LIBCALL(global.auxtools_debug_server, "auxtools_init")() + call_ext(global.auxtools_debug_server, "auxtools_init")() enable_debugging() return TRUE /hook/shutdown/proc/auxtools_shutdown() if (global.auxtools_debug_server) - LIBCALL(global.auxtools_debug_server, "auxtools_shutdown")() + call_ext(global.auxtools_debug_server, "auxtools_shutdown")() return TRUE diff --git a/code/_helpers/profiling.dm b/code/_helpers/profiling.dm index ac6b571adc..ad16a2c2d2 100644 --- a/code/_helpers/profiling.dm +++ b/code/_helpers/profiling.dm @@ -107,7 +107,7 @@ if(UNIX) lib = "libprof.so" else CRASH("unsupported platform") - var/init = LIBCALL(lib, "init")() + var/init = call_ext(lib, "init")() if("0" != init) CRASH("[lib] init error: [init]") /world/New() diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index d52596e057..71c595d1eb 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -219,19 +219,19 @@ /obj/structure/door/wood/ebony material = /decl/material/solid/organic/wood/ebony - color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = /decl/material/solid/organic/wood/ebony::color /obj/structure/door/wood/saloon/ebony material = /decl/material/solid/organic/wood/ebony - color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = /decl/material/solid/organic/wood/ebony::color /obj/structure/door/wood/walnut material = /decl/material/solid/organic/wood/walnut - color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = /decl/material/solid/organic/wood/walnut::color /obj/structure/door/wood/saloon/walnut material = /decl/material/solid/organic/wood/walnut - color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = /decl/material/solid/organic/wood/walnut::color /obj/structure/door/glass material = /decl/material/solid/glass diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index c1a39fbdb6..213a98fd0a 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -446,7 +446,7 @@ /* Uncomment when 515 is the minimum version. #define MATERIAL_FIREPLACE(material_name) \ /obj/structure/fire_source/fireplace/##material_name { \ - color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ + color = /decl/material/solid/stone/##material_name::color; \ material = /decl/material/solid/stone/##material_name; \ } */ diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index f51c1c346c..833645aec7 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -8,28 +8,28 @@ build_type = /obj/item/stack/tile/wood flags = TURF_CAN_BREAK | TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER footstep_type = /decl/footsteps/wood - color = WOOD_COLOR_GENERIC // TYPE_INITIAL(/decl/material/solid/organic/wood, color) + color = /decl/material/solid/organic/wood::color /decl/flooring/wood/mahogany - color = WOOD_COLOR_RICH // TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) + color = /decl/material/solid/organic/wood/mahogany::color build_type = /obj/item/stack/tile/mahogany /decl/flooring/wood/maple - color = WOOD_COLOR_PALE // TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) + color = /decl/material/solid/organic/wood/maple::color build_type = /obj/item/stack/tile/maple /decl/flooring/wood/ebony - color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = /decl/material/solid/organic/wood/ebony::color build_type = /obj/item/stack/tile/ebony /decl/flooring/wood/walnut - color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = /decl/material/solid/organic/wood/walnut::color build_type = /obj/item/stack/tile/walnut /decl/flooring/wood/bamboo - color = WOOD_COLOR_PALE2 // TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) + color = /decl/material/solid/organic/wood/bamboo::color build_type = /obj/item/stack/tile/bamboo /decl/flooring/wood/yew - color = WOOD_COLOR_YELLOW // TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) + color = /decl/material/solid/organic/wood/yew::color build_type = /obj/item/stack/tile/yew diff --git a/code/game/turfs/floors/subtypes/floor_path.dm b/code/game/turfs/floors/subtypes/floor_path.dm index 752bfe4a0f..9e3a0a0077 100644 --- a/code/game/turfs/floors/subtypes/floor_path.dm +++ b/code/game/turfs/floors/subtypes/floor_path.dm @@ -38,70 +38,23 @@ // initial_flooring = /decl/flooring/path/herringbone // Material subtypes. -/* Uncomment when 515 is the required base version. #define PATH_MATERIAL_SUBTYPES(material_name) \ /turf/floor/natural/path/##material_name { \ - color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ - base_color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ + color = /decl/material/solid/stone/##material_name::color; \ + base_color = /decl/material/solid/stone/##material_name::color; \ material = /decl/material/solid/stone/##material_name; \ } \ /turf/floor/natural/path/herringbone/##material_name { \ - color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ - base_color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ + color = /decl/material/solid/stone/##material_name::color; \ + base_color = /decl/material/solid/stone/##material_name::color; \ material = /decl/material/solid/stone/##material_name; \ } \ /turf/floor/natural/path/running_bond/##material_name { \ - color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ - base_color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ + color = /decl/material/solid/stone/##material_name::color; \ + base_color = /decl/material/solid/stone/##material_name::color; \ material = /decl/material/solid/stone/##material_name; \ } PATH_MATERIAL_SUBTYPES(basalt) PATH_MATERIAL_SUBTYPES(granite) PATH_MATERIAL_SUBTYPES(marble) -#undef PATH_MATERIAL_SUBTYPES -*/ - -/turf/floor/natural/path/basalt - color = COLOR_DARK_GRAY - base_color = COLOR_DARK_GRAY - material = /decl/material/solid/stone/basalt - -/turf/floor/natural/path/running_bond/basalt - color = COLOR_DARK_GRAY - base_color = COLOR_DARK_GRAY - material = /decl/material/solid/stone/basalt - -/turf/floor/natural/path/herringbone/basalt - color = COLOR_DARK_GRAY - base_color = COLOR_DARK_GRAY - material = /decl/material/solid/stone/basalt - -/turf/floor/natural/path/granite - color = "#615f5f" - base_color = "#615f5f" - material = /decl/material/solid/stone/granite - -/turf/floor/natural/path/running_bond/granite - color = "#615f5f" - base_color = "#615f5f" - material = /decl/material/solid/stone/granite - -/turf/floor/natural/path/herringbone/granite - color = "#615f5f" - base_color = "#615f5f" - material = /decl/material/solid/stone/granite - -/turf/floor/natural/path/marble - color = "#aaaaaa" - base_color = "#aaaaaa" - material = /decl/material/solid/stone/marble - -/turf/floor/natural/path/running_bond/marble - color = "#aaaaaa" - base_color = "#aaaaaa" - material = /decl/material/solid/stone/marble - -/turf/floor/natural/path/herringbone/marble - color = "#aaaaaa" - base_color = "#aaaaaa" - material = /decl/material/solid/stone/marble +#undef PATH_MATERIAL_SUBTYPES \ No newline at end of file diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index c607fa6e07..4f625786a4 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -2,29 +2,29 @@ name = "wooden floor" icon = 'icons/turf/flooring/wood.dmi' icon_state = "wood" - color = WOOD_COLOR_GENERIC // TYPE_INITIAL(/decl/material/solid/organic/wood, color) + color = /decl/material/solid/organic/wood::color initial_flooring = /decl/flooring/wood /turf/floor/wood/mahogany - color = WOOD_COLOR_RICH // TYPE_INITIAL(/decl/material/solid/organic/wood/mahogany, color) + color = /decl/material/solid/organic/wood/mahogany::color initial_flooring = /decl/flooring/wood/mahogany /turf/floor/wood/maple - color = WOOD_COLOR_PALE // TYPE_INITIAL(/decl/material/solid/organic/wood/maple, color) + color = /decl/material/solid/organic/wood/maple::color initial_flooring = /decl/flooring/wood/maple /turf/floor/wood/ebony - color = WOOD_COLOR_BLACK // TYPE_INITIAL(/decl/material/solid/organic/wood/ebony, color) + color = /decl/material/solid/organic/wood/ebony::color initial_flooring = /decl/flooring/wood/ebony /turf/floor/wood/walnut - color = WOOD_COLOR_CHOCOLATE // TYPE_INITIAL(/decl/material/solid/organic/wood/walnut, color) + color = /decl/material/solid/organic/wood/walnut::color initial_flooring = /decl/flooring/wood/walnut /turf/floor/wood/bamboo - color = WOOD_COLOR_PALE2 // TYPE_INITIAL(/decl/material/solid/organic/wood/bamboo, color) + color = /decl/material/solid/organic/wood/bamboo::color initial_flooring = /decl/flooring/wood/bamboo /turf/floor/wood/yew - color = WOOD_COLOR_YELLOW // TYPE_INITIAL(/decl/material/solid/organic/wood/yew, color) + color = /decl/material/solid/organic/wood/yew::color initial_flooring = /decl/flooring/wood/yew diff --git a/code/game/turfs/walls/wall_brick.dm b/code/game/turfs/walls/wall_brick.dm index 55f3d6852e..45ed89751e 100644 --- a/code/game/turfs/walls/wall_brick.dm +++ b/code/game/turfs/walls/wall_brick.dm @@ -21,10 +21,9 @@ desc = "A brick wall made of [material.solid_name]." // Subtypes. -/* Uncomment when 515 is the minimum version. #define MATERIAL_BRICK_WALL(material_name) \ /turf/wall/brick/##material_name { \ - color = TYPE_INITIAL(/decl/material/solid/stone/##material_name, color); \ + color = /decl/material/solid/stone/##material_name::color; \ material = /decl/material/solid/stone/##material_name; \ } @@ -33,25 +32,4 @@ MATERIAL_BRICK_WALL(basalt) MATERIAL_BRICK_WALL(granite) MATERIAL_BRICK_WALL(marble) MATERIAL_BRICK_WALL(pottery) -#undef MATERIAL_BRICK_WALL -*/ - -/turf/wall/brick/sandstone - color = "#d9c179" - material = /decl/material/solid/stone/sandstone - -/turf/wall/brick/basalt - color = COLOR_DARK_GRAY - material = /decl/material/solid/stone/basalt - -/turf/wall/brick/granite - color = "#615f5f" - material = /decl/material/solid/stone/granite - -/turf/wall/brick/marble - color = "#aaaaaa" - material = /decl/material/solid/stone/marble - -/turf/wall/brick/pottery - color = "#cd8f75" - material = /decl/material/solid/stone/pottery +#undef MATERIAL_BRICK_WALL \ No newline at end of file diff --git a/code/game/turfs/walls/wall_log.dm b/code/game/turfs/walls/wall_log.dm index faf5916d52..e65ef166db 100644 --- a/code/game/turfs/walls/wall_log.dm +++ b/code/game/turfs/walls/wall_log.dm @@ -1,8 +1,7 @@ /turf/wall/log icon_state = "log" material = /decl/material/solid/organic/wood - color = WOOD_COLOR_GENERIC - // color = TYPE_INITIAL(/decl/material/solid/organic/wood, color) + color = /decl/material/solid/organic/wood::color girder_material = null /turf/wall/log/get_dismantle_stack_type() @@ -23,11 +22,10 @@ desc = "A log wall made of [material.solid_name]." // Subtypes. -/* Uncomment when 515 is the minimum version. #define LOG_WALL_SUBTYPE(material_name) \ /turf/wall/log/##material_name { \ material = /decl/material/solid/organic/wood/##material_name; \ - color = TYPE_INITIAL(/decl/material/solid/organic/wood/##material_name, color); \ + color = /decl/material/solid/organic/wood/##material_name::color; \ } LOG_WALL_SUBTYPE(fungal) @@ -38,33 +36,4 @@ LOG_WALL_SUBTYPE(mahogany) LOG_WALL_SUBTYPE(bamboo) LOG_WALL_SUBTYPE(yew) -#undef LOG_WALL_SUBTYPE -*/ - -/turf/wall/log/fungal - material = /decl/material/solid/organic/wood/fungal - color = "#e6d8dd" - -/turf/wall/log/ebony - material = /decl/material/solid/organic/wood/ebony - color = WOOD_COLOR_BLACK - -/turf/wall/log/walnut - material = /decl/material/solid/organic/wood/walnut - color = WOOD_COLOR_CHOCOLATE - -/turf/wall/log/maple - material = /decl/material/solid/organic/wood/maple - color = WOOD_COLOR_PALE - -/turf/wall/log/mahogany - material = /decl/material/solid/organic/wood/mahogany - color = WOOD_COLOR_RICH - -/turf/wall/log/bamboo - material = /decl/material/solid/organic/wood/bamboo - color = WOOD_COLOR_PALE2 - -/turf/wall/log/yew - material = /decl/material/solid/organic/wood/yew - color = WOOD_COLOR_YELLOW \ No newline at end of file +#undef LOG_WALL_SUBTYPE \ No newline at end of file diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 479b09a92c..2ec78b32e4 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -130,7 +130,6 @@ var/global/list/localhost_addresses = list( deactivate_darkmode(clear_chat = FALSE) // Overwritten if the pref is set later. - #if DM_VERSION >= 512 var/bad_version = byond_version < get_config_value(/decl/config/num/minimum_byond_version) var/bad_build = byond_build < get_config_value(/decl/config/num/minimum_byond_build) @@ -145,8 +144,6 @@ var/global/list/localhost_addresses = list( qdel(src) return - #endif - var/local_connection = (get_config_value(/decl/config/toggle/on/auto_local_admin) && (isnull(address) || global.localhost_addresses[address])) if(!local_connection) if(!get_config_value(/decl/config/toggle/guests_allowed) && IsGuestKey(key)) diff --git a/code/modules/crafting/stack_recipes/_recipe.dm b/code/modules/crafting/stack_recipes/_recipe.dm index 2d3f3217d6..5afc8fd264 100644 --- a/code/modules/crafting/stack_recipes/_recipe.dm +++ b/code/modules/crafting/stack_recipes/_recipe.dm @@ -226,7 +226,7 @@ // Early checks to avoid letting recipes make themselves. if(ispath(result_type, /obj/item/stack)) var/obj/item/stack/result_ref = result_type - if(stack_type == TYPE_INITIAL(result_ref, crafting_stack_type)) + if(stack_type == result_ref::crafting_stack_type) return FALSE if(required_reinforce_material == MATERIAL_FORBIDDEN && reinf_mat) @@ -403,4 +403,4 @@ . = time if(isnull(time)) var/obj/result = result_type - . = max(0.5 SECONDS, round(BASE_CRAFTING_TIME + CRAFT_TIME_SIZE(TYPE_INITIAL(result, w_class)) + CRAFT_TIME_DIFFICULTY(get_skill_difficulty(mat, reinf_mat)), 0.5 SECONDS)) + . = max(0.5 SECONDS, round(BASE_CRAFTING_TIME + CRAFT_TIME_SIZE(result::w_class) + CRAFT_TIME_DIFFICULTY(get_skill_difficulty(mat, reinf_mat)), 0.5 SECONDS)) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index e5c5de3484..b78e4ba666 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -332,11 +332,6 @@ maxcharge = 500 w_class = ITEM_SIZE_SMALL //Perhaps unwise. -#if DM_VERSION < 514 -/proc/gradient(var/colour_one, var/colour_two, var/percentage) - return colour_two -#endif - /obj/item/cell/gun/on_update_icon() . = ..() //Color the battery charging overlay against the percentage of the battery capacity. However the index of gradient() is set to 1, instead of 100, so we divide it by 100. Colors were chosen by the sprite artist. diff --git a/code/modules/synthesized_instruments/song.dm b/code/modules/synthesized_instruments/song.dm index 090324ac2a..6ec5112d13 100644 --- a/code/modules/synthesized_instruments/song.dm +++ b/code/modules/synthesized_instruments/song.dm @@ -82,9 +82,6 @@ var/current_volume = clamp(sound_copy.volume, 0, 100) sound_copy.volume = current_volume //Sanitize volume var/datum/sound_token/token = new /datum/sound_token/instrument(src.player.actual_instrument, src.sound_id, sound_copy, src.player.range, FALSE, use_env, player) - #if DM_VERSION < 511 - sound_copy.frequency = 1 - #endif var/delta_volume = player.volume / src.sustain_timer var/tick = duration diff --git a/code/modules/webhooks/_webhook.dm b/code/modules/webhooks/_webhook.dm index ed5087c06b..af9ae44ac1 100644 --- a/code/modules/webhooks/_webhook.dm +++ b/code/modules/webhooks/_webhook.dm @@ -10,7 +10,7 @@ if (!target_url) return -1 - var/result = LIBCALL(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json"))) + var/result = call_ext(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json"))) result = cached_json_decode(result) if (result["error_code"]) From 45e232153e4302188fe9372b1c880bbd64720fe7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 27 May 2024 14:47:16 -0400 Subject: [PATCH 210/212] Update spacemandmm.toml to fix mapdiffbot issues --- SpacemanDMM.toml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index 879c739a9b..0ae9a31e0f 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -51,3 +51,18 @@ macro_undefined_no_definition = "error" # Raised by Object Tree override_precedes_definition = "error" + +[map_renderer] +hide_invisible = [ + "/obj/effect/step_trigger", + "/obj/abstract", +] + +[map_renderer.render_passes] +random = false +overlays = false +gravity-gen = false +pretty = false +icon-smoothing = false +icon-smoothing-2016 = true +smart-cables = false \ No newline at end of file From 0fc93630dbd91f0c3bbd7e068318e4a248b2c5a1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 29 May 2024 02:29:21 -0400 Subject: [PATCH 211/212] Migrate Tether /under clothes to new types --- code/modules/clothing/pants/scrubs.dm | 5 ++++ code/modules/clothing/under/miscellaneous.dm | 22 -------------- maps/tether/atoms/closets.dm | 8 ++--- maps/tether/atoms/kink.dm | 8 ++--- maps/tether/datums/outfits/civilian.dm | 18 ++++++------ maps/tether/datums/outfits/command.dm | 6 ++-- maps/tether/datums/outfits/engineering.dm | 8 ++--- maps/tether/datums/outfits/medical.dm | 29 ++++++------------- maps/tether/datums/outfits/science.dm | 8 ++--- maps/tether/datums/outfits/security.dm | 10 +++---- maps/tether/main_dmms/tether-01-surface1.dmm | 2 +- maps/tether/main_dmms/tether-02-surface2.dmm | 6 ++-- maps/tether/main_dmms/tether-03-surface3.dmm | 2 +- maps/tether/main_dmms/tether-05-station1.dmm | 2 +- maps/tether/main_dmms/tether-06-station2.dmm | 22 +++++++------- maps/tether/main_dmms/tether-07-station3.dmm | 20 ++++++------- maps/tether/main_dmms/tether-10-colony.dmm | 16 +++++----- .../submaps/aerostat/submaps/DJOutpost1.dmm | 2 +- maps/tether/submaps/gateway/zoo.dmm | 4 +-- maps/tether/submaps/tether_misc.dmm | 6 ++-- tether_migration.txt | 6 ++-- 21 files changed, 91 insertions(+), 119 deletions(-) diff --git a/code/modules/clothing/pants/scrubs.dm b/code/modules/clothing/pants/scrubs.dm index ef5e399576..17a8345185 100644 --- a/code/modules/clothing/pants/scrubs.dm +++ b/code/modules/clothing/pants/scrubs.dm @@ -44,3 +44,8 @@ starting_accessories = list( /obj/item/clothing/shirt/scrubs/purple ) + +/obj/item/clothing/pants/scrubs/black/outfit + starting_accessories = list( + /obj/item/clothing/shirt/scrubs/black + ) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index f845001474..76c315063c 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -60,28 +60,6 @@ desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." icon = 'icons/clothing/under/suits/suit_teal.dmi' -/obj/item/clothing/costume/schoolgirl - name = "blue schoolgirl uniform" - desc = "It's just like one of my Japanese animes!" - icon = 'icons/clothing/under/uniform_schoolgirl.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY - -/obj/item/clothing/costume/schoolgirl/red - name = "red schoolgirl uniform" - icon = 'icons/clothing/under/uniform_schoolgirl_red.dmi' - -/obj/item/clothing/costume/schoolgirl/yellow - name = "yellow schoolgirl uniform" - icon = 'icons/clothing/under/uniform_schoolgirl_yellow.dmi' - -/obj/item/clothing/costume/schoolgirl/green - name = "green schoolgirl uniform" - icon = 'icons/clothing/under/uniform_schoolgirl_green.dmi' - -/obj/item/clothing/costume/schoolgirl/pink - name = "pink schoolgirl uniform" - icon = 'icons/clothing/under/uniform_schoolgirl_pink.dmi' - /obj/item/clothing/under/overalls name = "laborer's overalls" desc = "A set of durable overalls for getting the job done." diff --git a/maps/tether/atoms/closets.dm b/maps/tether/atoms/closets.dm index 81f0d7485c..a0803e8409 100644 --- a/maps/tether/atoms/closets.dm +++ b/maps/tether/atoms/closets.dm @@ -122,10 +122,10 @@ // /obj/item/clothing/suit/parade_coat, // /obj/item/clothing/suit/parade_coat/fem, /obj/item/clothing/suit/jacket/winter/captain, - /obj/item/clothing/under/captain, - // /obj/item/clothing/under/captain/skirt_pleated, - /obj/item/clothing/under/dress/dress_cap, - /obj/item/clothing/under/captainformal, + /obj/item/clothing/jumpsuit/captain, + // /obj/item/clothing/jumpsuit/captain/skirt_pleated, + /obj/item/clothing/dress/cap, + /obj/item/clothing/jumpsuit/captainformal, /obj/item/clothing/under/gimmick/rank/captain/suit, // /obj/item/clothing/under/gimmick/rank/captain/suit/skirt, // /obj/item/clothing/under/bodysuit/bodysuitcommand, diff --git a/maps/tether/atoms/kink.dm b/maps/tether/atoms/kink.dm index 26ce57f7da..c93c424fe2 100644 --- a/maps/tether/atoms/kink.dm +++ b/maps/tether/atoms/kink.dm @@ -325,23 +325,23 @@ desc = initial(desc) + " Something has been [erasemethod] on the tag, and it now has \"[str]\" [writemethod] on it." // Costumes -/obj/item/clothing/under/dress/maid +/obj/item/clothing/dress/maid name = "maid costume" desc = "Maid in China." icon = 'maps/tether/icons/obj/clothing/costume/maid.dmi' -/obj/item/clothing/under/dress/maid/janitor +/obj/item/clothing/dress/maid/janitor name = "maid uniform" desc = "A simple maid uniform for housekeeping." icon = 'maps/tether/icons/obj/clothing/costume/janitor_maid.dmi' -/obj/item/clothing/under/dress/maid/sexy +/obj/item/clothing/dress/maid/sexy name = "sexy maid costume" desc = "You must be a bit risque teasing all of them in a maid uniform!" icon = 'maps/tether/icons/obj/clothing/costume/sexy_maid.dmi' //KotetsuRedwood:Latex Maid Dresses, for everyone to 'enjoy'. :3c -/obj/item/clothing/under/dress/maid/latex +/obj/item/clothing/dress/maid/latex name = "latex maid dress" desc = "Squeak! A shiny outfit for cleaning, made by people with dirty minds." icon = 'maps/tether/icons/obj/clothing/costume/latex_maid.dmi' diff --git a/maps/tether/datums/outfits/civilian.dm b/maps/tether/datums/outfits/civilian.dm index 6883d0f9ec..e78154ba33 100644 --- a/maps/tether/datums/outfits/civilian.dm +++ b/maps/tether/datums/outfits/civilian.dm @@ -35,7 +35,7 @@ /decl/hierarchy/outfit/job/service/gardener name = "Job - Gardener" - uniform = /obj/item/clothing/under/hydroponics + uniform = /obj/item/clothing/jumpsuit/hydroponics suit = /obj/item/clothing/suit/apron gloves = /obj/item/clothing/gloves/thick/botany r_pocket = /obj/item/scanner/plant @@ -50,13 +50,13 @@ /decl/hierarchy/outfit/job/service/janitor name = "Job - Janitor" - uniform = /obj/item/clothing/under/janitor + uniform = /obj/item/clothing/jumpsuit/janitor id_type = /obj/item/card/id/civilian pda_type = /obj/item/modular_computer/pda /decl/hierarchy/outfit/job/librarian name = "Job - Librarian" - uniform = /obj/item/clothing/under/formal/red + uniform = /obj/item/clothing/pants/slacks/red/outfit id_type = /obj/item/card/id/civilian pda_type = /obj/item/modular_computer/pda @@ -69,7 +69,7 @@ /decl/hierarchy/outfit/job/internal_affairs_agent name = "Job - Internal affairs agent" l_ear = /obj/item/radio/headset/heads/ia - uniform = /obj/item/clothing/under/internalaffairs + uniform = /obj/item/clothing/pants/slacks/black/outfit/internal_affairs suit = /obj/item/clothing/suit/jacket/black shoes = /obj/item/clothing/shoes/color/brown glasses = /obj/item/clothing/glasses/sunglasses/big @@ -79,7 +79,7 @@ /decl/hierarchy/outfit/job/chaplain name = "Job - Chaplain" - uniform = /obj/item/clothing/under/chaplain + uniform = /obj/item/clothing/jumpsuit/chaplain hands = list(/obj/item/bible) id_type = /obj/item/card/id/civilian pda_type = /obj/item/modular_computer/pda/medical @@ -90,7 +90,7 @@ /decl/hierarchy/outfit/job/cargo/qm name = "Job - Cargo" - uniform = /obj/item/clothing/under/cargo + uniform = /obj/item/clothing/jumpsuit/cargo shoes = /obj/item/clothing/shoes/color/brown glasses = /obj/item/clothing/glasses/sunglasses hands = list(/obj/item/clipboard) @@ -104,13 +104,13 @@ /decl/hierarchy/outfit/job/cargo/cargo_tech name = "Job - Cargo technician" - uniform = /obj/item/clothing/under/cargotech + uniform = /obj/item/clothing/jumpsuit/cargotech id_type = /obj/item/card/id/cargo pda_type = /obj/item/modular_computer/pda/cargo /decl/hierarchy/outfit/job/cargo/mining name = "Job - Shaft miner" - uniform = /obj/item/clothing/under/miner + uniform = /obj/item/clothing/jumpsuit/miner id_type = /obj/item/card/id/cargo pda_type = /obj/item/modular_computer/pda/science backpack_contents = list(/obj/item/crowbar = 1, /obj/item/ore = 1) @@ -122,6 +122,6 @@ /decl/hierarchy/outfit/job/cargo/assistant name = "Job - Jr. Cargo Technician" - uniform = /obj/item/clothing/under/cargotech + uniform = /obj/item/clothing/jumpsuit/cargotech id_type = /obj/item/card/id/cargo pda_type = /obj/item/modular_computer/pda/cargo \ No newline at end of file diff --git a/maps/tether/datums/outfits/command.dm b/maps/tether/datums/outfits/command.dm index 51ddc61148..0c75856563 100644 --- a/maps/tether/datums/outfits/command.dm +++ b/maps/tether/datums/outfits/command.dm @@ -2,7 +2,7 @@ name = "Job - Captain" head = /obj/item/clothing/head/caphat glasses = /obj/item/clothing/glasses/sunglasses - uniform = /obj/item/clothing/under/captain + uniform = /obj/item/clothing/jumpsuit/captain l_ear = /obj/item/radio/headset/heads/captain shoes = /obj/item/clothing/shoes/color/brown id_type = /obj/item/card/id/gold @@ -30,7 +30,7 @@ /decl/hierarchy/outfit/job/hop name = "Job - Head of Personnel" - uniform = /obj/item/clothing/under/head_of_personnel + uniform = /obj/item/clothing/jumpsuit/head_of_personnel l_ear = /obj/item/radio/headset/heads/hop shoes = /obj/item/clothing/shoes/color/brown id_type = /obj/item/card/id/silver @@ -40,7 +40,7 @@ /decl/hierarchy/outfit/job/secretary name = "Job - Command Secretary" l_ear = /obj/item/radio/headset/headset_adj - uniform = /obj/item/clothing/under/formal/charcoal + uniform = /obj/item/clothing/pants/slacks/black/outfit shoes = /obj/item/clothing/shoes/color/brown id_type = /obj/item/card/id/silver pda_type = /obj/item/modular_computer/pda/heads/hop diff --git a/maps/tether/datums/outfits/engineering.dm b/maps/tether/datums/outfits/engineering.dm index 95208c7138..880e49417a 100644 --- a/maps/tether/datums/outfits/engineering.dm +++ b/maps/tether/datums/outfits/engineering.dm @@ -13,7 +13,7 @@ /decl/hierarchy/outfit/job/engineering/chief_engineer name = "Job - Chief Engineer" head = /obj/item/clothing/head/hardhat/white - uniform = /obj/item/clothing/under/chief_engineer + uniform = /obj/item/clothing/jumpsuit/chief_engineer l_ear = /obj/item/radio/headset/heads/ce gloves = /obj/item/clothing/gloves/thick id_type = /obj/item/card/id/engineering/head @@ -22,21 +22,21 @@ /decl/hierarchy/outfit/job/engineering/engineer name = "Job - Engineer" head = /obj/item/clothing/head/hardhat - uniform = /obj/item/clothing/under/engineer + uniform = /obj/item/clothing/jumpsuit/engineer r_pocket = /obj/item/t_scanner id_type = /obj/item/card/id/engineering pda_type = /obj/item/modular_computer/pda/engineering /decl/hierarchy/outfit/job/engineering/atmos name = "Job - Atmospheric technician" - uniform = /obj/item/clothing/under/atmospheric_technician + uniform = /obj/item/clothing/jumpsuit/atmospheric_technician belt = /obj/item/belt/utility/atmostech id_type = /obj/item/card/id/engineering pda_type = /obj/item/modular_computer/pda/engineering /decl/hierarchy/outfit/job/engineering/apprentice name = "Job - Apprentice Engineer" - uniform = /obj/item/clothing/under/engineer + uniform = /obj/item/clothing/jumpsuit/engineer belt = null // earn your tools, newbie id_type = /obj/item/card/id/engineering pda_type = /obj/item/modular_computer/pda/engineering \ No newline at end of file diff --git a/maps/tether/datums/outfits/medical.dm b/maps/tether/datums/outfits/medical.dm index f6f87ae2de..7c8fa521da 100644 --- a/maps/tether/datums/outfits/medical.dm +++ b/maps/tether/datums/outfits/medical.dm @@ -12,7 +12,7 @@ /decl/hierarchy/outfit/job/medical/cmo name = "Job - Chief Medical Officer" l_ear = /obj/item/radio/headset/heads/cmo - uniform = /obj/item/clothing/under/chief_medical_officer + uniform = /obj/item/clothing/jumpsuit/chief_medical_officer suit = /obj/item/clothing/suit/toggle/labcoat/cmo shoes = /obj/item/clothing/shoes/color/brown hands = list(/obj/item/firstaid/adv) @@ -22,7 +22,7 @@ /decl/hierarchy/outfit/job/medical/doctor name = "Job - Medical Doctor" - uniform = /obj/item/clothing/under/medical + uniform = /obj/item/clothing/jumpsuit/medical suit = /obj/item/clothing/suit/toggle/labcoat hands = list(/obj/item/firstaid/adv) r_pocket = /obj/item/flashlight/pen @@ -34,12 +34,12 @@ /decl/hierarchy/outfit/job/medical/doctor/surgeon name = "Job - Surgeon" - uniform = /obj/item/clothing/under/medical/scrubs/blue + uniform = /obj/item/clothing/pants/scrubs/blue/outfit head = /obj/item/clothing/head/surgery/blue /decl/hierarchy/outfit/job/medical/doctor/virologist name = "Job - Virologist" - uniform = /obj/item/clothing/under/virologist + uniform = /obj/item/clothing/jumpsuit/virologist suit = /obj/item/clothing/suit/toggle/labcoat/virologist mask = /obj/item/clothing/mask/surgical @@ -49,30 +49,19 @@ /decl/hierarchy/outfit/job/medical/doctor/nurse name = "Job - Nurse" + uniform = /obj/item/clothing/pants/scrubs/purple/outfit suit = null -/decl/hierarchy/outfit/job/medical/doctor/nurse/pre_equip(mob/living/carbon/human/H) - ..() - if(H.gender == FEMALE) - if(prob(50)) - uniform = /obj/item/clothing/under/nursesuit - else - uniform = /obj/item/clothing/under/nurse - head = /obj/item/clothing/head/nursehat - else - uniform = /obj/item/clothing/under/medical/scrubs/purple - head = null - /decl/hierarchy/outfit/job/medical/intern name = "Job - Medical Intern" - uniform = /obj/item/clothing/under/medical + uniform = /obj/item/clothing/jumpsuit/medical suit = /obj/item/clothing/suit/toggle/labcoat r_pocket = /obj/item/flashlight/pen id_type = /obj/item/card/id/medical /decl/hierarchy/outfit/job/medical/chemist name = "Job - Chemist" - uniform = /obj/item/clothing/under/chemist + uniform = /obj/item/clothing/jumpsuit/chemist suit = /obj/item/clothing/suit/toggle/labcoat/chemist id_type = /obj/item/card/id/medical pda_type = /obj/item/modular_computer/pda/medical @@ -83,14 +72,14 @@ /decl/hierarchy/outfit/job/medical/psychiatrist name = "Job - Psychiatrist" - uniform = /obj/item/clothing/under/psych + uniform = /obj/item/clothing/jumpsuit/psych suit = /obj/item/clothing/suit/toggle/labcoat shoes = /obj/item/clothing/shoes/dress id_type = /obj/item/card/id/medical /decl/hierarchy/outfit/job/medical/paramedic name = "Job - Paramedic" - uniform = /obj/item/clothing/under/medical/scrubs/black + uniform = /obj/item/clothing/pants/scrubs/black/outfit suit = /obj/item/clothing/suit/jacket/first_responder shoes = /obj/item/clothing/shoes/jackboots hands = list(/obj/item/firstaid/regular) diff --git a/maps/tether/datums/outfits/science.dm b/maps/tether/datums/outfits/science.dm index 0ad7585648..395dd0d413 100644 --- a/maps/tether/datums/outfits/science.dm +++ b/maps/tether/datums/outfits/science.dm @@ -8,7 +8,7 @@ /decl/hierarchy/outfit/job/science/rd name = "Job - Chief Science Officer" l_ear = /obj/item/radio/headset/heads/rd - uniform = /obj/item/clothing/under/research_director + uniform = /obj/item/clothing/jumpsuit/research_director shoes = /obj/item/clothing/shoes/color/brown hands = list(/obj/item/clipboard) id_type = /obj/item/card/id/science/head @@ -16,19 +16,19 @@ /decl/hierarchy/outfit/job/science/scientist name = "Job - Scientist" - uniform = /obj/item/clothing/under/color/white + uniform = /obj/item/clothing/jumpsuit/white id_type = /obj/item/card/id/science suit = /obj/item/clothing/suit/toggle/labcoat/science /decl/hierarchy/outfit/job/science/labassistant name = "Job - Lab Assistant" - uniform = /obj/item/clothing/under/color/white + uniform = /obj/item/clothing/jumpsuit/white id_type = /obj/item/card/id/science suit = /obj/item/clothing/suit/toggle/labcoat /decl/hierarchy/outfit/job/science/roboticist name = "Job - Roboticist" - uniform = /obj/item/clothing/under/color/white + uniform = /obj/item/clothing/jumpsuit/white shoes = /obj/item/clothing/shoes/color/black belt = /obj/item/belt/utility/full id_type = /obj/item/card/id/science diff --git a/maps/tether/datums/outfits/security.dm b/maps/tether/datums/outfits/security.dm index fd3250fbc4..06b3dafa3c 100644 --- a/maps/tether/datums/outfits/security.dm +++ b/maps/tether/datums/outfits/security.dm @@ -13,14 +13,14 @@ /decl/hierarchy/outfit/job/security/hos name = "Job - Head of security" l_ear = /obj/item/radio/headset/heads/hos - uniform = /obj/item/clothing/under/head_of_security + uniform = /obj/item/clothing/jumpsuit/head_of_security id_type = /obj/item/card/id/security/head pda_type = /obj/item/modular_computer/pda/heads backpack_contents = list(/obj/item/handcuffs = 1) /decl/hierarchy/outfit/job/security/warden name = "Job - Warden" - uniform = /obj/item/clothing/under/warden + uniform = /obj/item/clothing/jumpsuit/warden l_pocket = /obj/item/flash id_type = /obj/item/card/id/security pda_type = /obj/item/modular_computer/pda @@ -28,7 +28,7 @@ /decl/hierarchy/outfit/job/security/detective name = "Job - Detective" head = /obj/item/clothing/head/det - uniform = /obj/item/clothing/under/det + uniform = /obj/item/clothing/pants/slacks/outfit/detective suit = /obj/item/clothing/suit/det_trench l_pocket = /obj/item/flame/fuelled/lighter/zippo shoes = /obj/item/clothing/shoes/dress @@ -48,7 +48,7 @@ /decl/hierarchy/outfit/job/security/officer name = "Job - Security Officer" - uniform = /obj/item/clothing/under/security + uniform = /obj/item/clothing/jumpsuit/security l_pocket = /obj/item/flash r_pocket = /obj/item/handcuffs id_type = /obj/item/card/id/security @@ -56,6 +56,6 @@ /decl/hierarchy/outfit/job/generic/assistant/cadet name = "Job - Security Cadet" - uniform = /obj/item/clothing/under/security + uniform = /obj/item/clothing/jumpsuit/security id_type = /obj/item/card/id/security l_ear = /obj/item/radio/headset/headset_sec diff --git a/maps/tether/main_dmms/tether-01-surface1.dmm b/maps/tether/main_dmms/tether-01-surface1.dmm index 1413e0a57f..c0791ca406 100644 --- a/maps/tether/main_dmms/tether-01-surface1.dmm +++ b/maps/tether/main_dmms/tether-01-surface1.dmm @@ -17793,7 +17793,7 @@ "aHR" = ( /obj/item/clothing/head/soft/rainbow, /obj/item/clothing/shoes/rainbow, -/obj/item/clothing/under/color/rainbow, +/obj/item/clothing/jumpsuit/rainbow, /turf/floor/plating, /area/engineering/atmos) "aHS" = ( diff --git a/maps/tether/main_dmms/tether-02-surface2.dmm b/maps/tether/main_dmms/tether-02-surface2.dmm index 523c2e08f6..d30a96630a 100644 --- a/maps/tether/main_dmms/tether-02-surface2.dmm +++ b/maps/tether/main_dmms/tether-02-surface2.dmm @@ -351,7 +351,7 @@ desc = "These gloves are insulated with rubber."; name = "black insulated gloves" }, -/obj/item/clothing/under/dress/maid/latex, +/obj/item/clothing/dress/maid/latex, /turf/floor/tiled/techfloor, /area/maintenance/lower/mining) "aZ" = ( @@ -10329,7 +10329,7 @@ /area/tether/surfacebase/outside/outside2) "vX" = ( /obj/structure/closet, -/obj/item/clothing/under/schoolgirl, +/obj/item/clothing/costume/schoolgirl, /turf/floor/wood, /area/maintenance/lower/atmos) "vZ" = ( @@ -13851,7 +13851,7 @@ /area/engineering/atmos) "Dg" = ( /obj/structure/rack, -/obj/item/clothing/under/color/black, +/obj/item/clothing/jumpsuit/black, /turf/floor/plating, /area/maintenance/lower/south) "Dh" = ( diff --git a/maps/tether/main_dmms/tether-03-surface3.dmm b/maps/tether/main_dmms/tether-03-surface3.dmm index 8557476075..19c747de0b 100644 --- a/maps/tether/main_dmms/tether-03-surface3.dmm +++ b/maps/tether/main_dmms/tether-03-surface3.dmm @@ -17945,7 +17945,7 @@ /turf/floor/tiled/steel_grid, /area/assembly/chargebay) "Hx" = ( -/obj/item/clothing/under/color/grey, +/obj/item/clothing/jumpsuit/grey, /obj/item/clothing/mask/gas/budget, /obj/item/belt/utility/full, /obj/effect/decal/cleanable/dirt, diff --git a/maps/tether/main_dmms/tether-05-station1.dmm b/maps/tether/main_dmms/tether-05-station1.dmm index 68c8e34340..0f1e1ce5bc 100644 --- a/maps/tether/main_dmms/tether-05-station1.dmm +++ b/maps/tether/main_dmms/tether-05-station1.dmm @@ -4567,7 +4567,7 @@ /area/library) "ajV" = ( /obj/structure/closet, -/obj/item/clothing/under/formal/red, +/obj/item/clothing/pants/slacks/red/outfit, /obj/item/scanner/barcode, /obj/item/pen/invisible, /obj/item/pen/invisible, diff --git a/maps/tether/main_dmms/tether-06-station2.dmm b/maps/tether/main_dmms/tether-06-station2.dmm index e08483271d..6f31510cb4 100644 --- a/maps/tether/main_dmms/tether-06-station2.dmm +++ b/maps/tether/main_dmms/tether-06-station2.dmm @@ -2662,7 +2662,7 @@ /obj/item/clothing/head/soft/mime, /obj/item/clothing/mask/gas/mime, /obj/item/clothing/shoes/color/white, -/obj/item/clothing/under/mime, +/obj/item/clothing/costume/mime, /obj/item/pen/crayon/mime, /obj/effect/decal/cleanable/dirt, /obj/effect/floor_decal/rust, @@ -9179,13 +9179,13 @@ /area/medical/virologyisolation) "qP" = ( /obj/structure/closet/secure_closet/personal/patient, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, /obj/item/clothing/shoes/color/white, /obj/item/clothing/shoes/color/white, /obj/item/clothing/shoes/color/white, @@ -15748,8 +15748,8 @@ /obj/item/clothing/shoes/winterboots/medical, /obj/item/clothing/shoes/winterboots/medical, /obj/item/clothing/suit/jacket/winter/medical, -/obj/item/clothing/under/medical, -/obj/item/clothing/under/avian_smock/utility, +/obj/item/clothing/jumpsuit/medical, +/obj/item/clothing/dress/avian_smock/utility, /turf/floor, /area/maintenance/station/sec_lower) "Fv" = ( @@ -17676,7 +17676,7 @@ /obj/structure/closet, /obj/item/clothing/shoes/winterboots/medical, /obj/item/clothing/suit/jacket/winter/medical, -/obj/item/clothing/under/medical, +/obj/item/clothing/jumpsuit/medical, /turf/floor/tiled/white, /area/maintenance/station/sec_lower) "QO" = ( diff --git a/maps/tether/main_dmms/tether-07-station3.dmm b/maps/tether/main_dmms/tether-07-station3.dmm index 6a85e51c9c..38bde8fe80 100644 --- a/maps/tether/main_dmms/tether-07-station3.dmm +++ b/maps/tether/main_dmms/tether-07-station3.dmm @@ -16703,7 +16703,7 @@ /area/supply/station) "CT" = ( /obj/structure/safe, -/obj/item/clothing/under/color/yellow, +/obj/item/clothing/jumpsuit/yellow, /obj/item/sword/katana/toy, /obj/item/disk/nuclear{ name = "authentication disk" @@ -19999,15 +19999,15 @@ /obj/structure/closet{ name = "spare clothes" }, -/obj/item/clothing/under/color/black, -/obj/item/clothing/under/color/black, -/obj/item/clothing/under/color/grey, -/obj/item/clothing/under/color/grey, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/white, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/under/color/green, -/obj/item/clothing/under/color/lightpurple, +/obj/item/clothing/jumpsuit/black, +/obj/item/clothing/jumpsuit/black, +/obj/item/clothing/jumpsuit/grey, +/obj/item/clothing/jumpsuit/grey, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/white, +/obj/item/clothing/jumpsuit/blue, +/obj/item/clothing/jumpsuit/green, +/obj/item/clothing/jumpsuit/lightpurple, /obj/effect/floor_decal/borderfloorwhite{ dir = 5 }, diff --git a/maps/tether/main_dmms/tether-10-colony.dmm b/maps/tether/main_dmms/tether-10-colony.dmm index f896b65ed2..334cca269c 100644 --- a/maps/tether/main_dmms/tether-10-colony.dmm +++ b/maps/tether/main_dmms/tether-10-colony.dmm @@ -3111,7 +3111,7 @@ /area/centcom/control) "fN" = ( /obj/structure/rack, -/obj/item/clothing/under/color/red, +/obj/item/clothing/jumpsuit/red, /obj/item/clothing/shoes/color/brown, /obj/item/energy_blade/axe, /turf/unsimulated/floor{ @@ -3128,7 +3128,7 @@ /area/tdome/tdomeobserve) "fQ" = ( /obj/structure/rack, -/obj/item/clothing/under/color/green, +/obj/item/clothing/jumpsuit/green, /obj/item/clothing/shoes/color/brown, /obj/item/energy_blade/axe, /turf/unsimulated/floor{ @@ -3300,7 +3300,7 @@ /area/centcom/evac) "gk" = ( /obj/structure/rack, -/obj/item/clothing/under/color/red, +/obj/item/clothing/jumpsuit/red, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/suit/armor/tdome/red, /obj/item/clothing/head/helmet/thunderdome, @@ -3351,7 +3351,7 @@ /area/tdome/tdome1) "gp" = ( /obj/structure/rack, -/obj/item/clothing/under/color/green, +/obj/item/clothing/jumpsuit/green, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/suit/armor/tdome/green, /obj/item/clothing/head/helmet/thunderdome, @@ -4429,7 +4429,7 @@ /area/centcom/evac) "iT" = ( /obj/structure/rack, -/obj/item/clothing/under/color/red, +/obj/item/clothing/jumpsuit/red, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/head/helmet/swat, @@ -4441,7 +4441,7 @@ /area/tdome/tdome2) "iU" = ( /obj/structure/rack, -/obj/item/clothing/under/color/green, +/obj/item/clothing/jumpsuit/green, /obj/item/clothing/shoes/color/brown, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/head/helmet/swat, @@ -4781,7 +4781,7 @@ /obj/item/clothing/mask/balaclava/tactical, /obj/item/clothing/shoes/jackboots/tactical, /obj/item/clothing/suit/armor/pcarrier/tactical, -/obj/item/clothing/under/tactical, +/obj/item/clothing/jumpsuit/tactical, /obj/item/belt/holster/security/tactical, /obj/structure/closet/wardrobe/tactical, /obj/effect/floor_decal/industrial/outline/grey, @@ -4799,7 +4799,7 @@ /obj/item/clothing/mask/balaclava/tactical, /obj/item/clothing/shoes/jackboots/tactical, /obj/item/clothing/suit/armor/pcarrier/tactical, -/obj/item/clothing/under/tactical, +/obj/item/clothing/jumpsuit/tactical, /obj/item/belt/holster/security/tactical, /obj/structure/closet/wardrobe/tactical, /obj/effect/floor_decal/industrial/outline/grey, diff --git a/maps/tether/submaps/aerostat/submaps/DJOutpost1.dmm b/maps/tether/submaps/aerostat/submaps/DJOutpost1.dmm index 2873bfa714..dd9e74008c 100644 --- a/maps/tether/submaps/aerostat/submaps/DJOutpost1.dmm +++ b/maps/tether/submaps/aerostat/submaps/DJOutpost1.dmm @@ -86,7 +86,7 @@ /area/submap/virgo2/DJOutpost1) "q" = ( /obj/item/remains, -/obj/item/clothing/under/dress/blacktango, +/obj/item/clothing/dress/blacktango, /obj/effect/decal/cleanable/blood, /obj/item/universal_translator/ear, /turf/floor/wood, diff --git a/maps/tether/submaps/gateway/zoo.dmm b/maps/tether/submaps/gateway/zoo.dmm index df04d1fbe0..ff4821e37a 100644 --- a/maps/tether/submaps/gateway/zoo.dmm +++ b/maps/tether/submaps/gateway/zoo.dmm @@ -4293,7 +4293,7 @@ /obj/structure/rack, /obj/item/backpack/clown, /obj/item/clothing/shoes/rainbow, -/obj/item/clothing/under/color/rainbow, +/obj/item/clothing/jumpsuit/rainbow, /obj/item/clothing/under/teshari/undercoat/standard/rainbow, /obj/item/clothing/gloves/rainbow, /obj/item/clothing/head/soft/rainbow, @@ -8349,7 +8349,7 @@ /area/awaymission/zoo) "vX" = ( /obj/structure/closet, -/obj/item/clothing/under/captain_fly, +/obj/item/clothing/jumpsuit/captain_fly, /turf/floor/tiled/dark, /area/awaymission/zoo) "vY" = ( diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index ad85070837..ca36ec717a 100644 --- a/maps/tether/submaps/tether_misc.dmm +++ b/maps/tether/submaps/tether_misc.dmm @@ -61,7 +61,7 @@ /area/holodeck/source_picnicarea) "aO" = ( /obj/structure/rack/holorack, -/obj/item/clothing/under/dress/dress_saloon, +/obj/item/clothing/dress/saloon, /obj/item/clothing/head/hairflower, /turf/floor/holofloor/tiled/dark, /area/holodeck/source_theatre) @@ -947,7 +947,7 @@ /obj/structure/table/holotable, /obj/item/clothing/head/helmet/thunderdome, /obj/item/clothing/suit/armor/tdome/red, -/obj/item/clothing/under/color/red, +/obj/item/clothing/jumpsuit/red, /obj/item/holo/esword/red, /obj/effect/floor_decal/corner/red{ dir = 5 @@ -1472,7 +1472,7 @@ /obj/structure/table/holotable, /obj/item/clothing/head/helmet/thunderdome, /obj/item/clothing/suit/armor/tdome/green, -/obj/item/clothing/under/color/green, +/obj/item/clothing/jumpsuit/green, /obj/item/holo/esword/green, /obj/effect/floor_decal/corner/green{ dir = 10 diff --git a/tether_migration.txt b/tether_migration.txt index 47656efcea..f60c1d5ffb 100644 --- a/tether_migration.txt +++ b/tether_migration.txt @@ -567,8 +567,8 @@ /obj/item/clothing/shoes/boots/swat : /obj/item/clothing/shoes/jackboots/swat{@OLD} /obj/item/clothing/shoes/boots/tactical : /obj/item/clothing/shoes/jackboots/tactical{@OLD} /obj/item/clothing/shoes/boots/winter/@SUBTYPES : /obj/item/clothing/shoes/winterboots/@SUBTYPES{@OLD} -/obj/item/clothing/under/teshari/smock/@SUBTYPES : /obj/item/clothing/under/avian_smock/@SUBTYPES{@OLD} -/obj/item/clothing/under/avian_smock/medical : /obj/item/clothing/under/avian_smock/utility{@OLD} +/obj/item/clothing/under/teshari/smock/@SUBTYPES : /obj/item/clothing/dress/avian_smock/@SUBTYPES{@OLD} +/obj/item/clothing/dress/avian_smock/medical : /obj/item/clothing/dress/avian_smock/utility{@OLD} /obj/item/clothing/under/rank/@SUBTYPES : /obj/item/clothing/under/@SUBTYPES{@OLD} /obj/item/clothing/accessory/armor/armguards : /obj/item/clothing/gloves/armguards /obj/item/clothing/accessory/armor/legguards : /obj/item/clothing/shoes/legguards @@ -608,7 +608,7 @@ /obj/item/clothing/accessory/scarf/@SUBTYPES : /obj/item/clothing/neck/scarf/@SUBTYPES /obj/item/clothing/glasses/gglasses : /obj/item/clothing/glasses/prescription/gglasses /obj/item/clothing/mask/smokable/cigarette/joint : /obj/item/clothing/mask/smokable/cigarette/rolled -/obj/item/clothing/under/fluff/latexmaid : /obj/item/clothing/under/dress/maid/latex +/obj/item/clothing/under/fluff/latexmaid : /obj/item/clothing/dress/maid/latex /obj/item/knife/machete : /obj/item/tool/machete{@OLD} /obj/item/knife/tacknife/combatknife : /obj/item/knife/combat{@OLD} From c5bcbb82a233a98d7aeae7ecf25bd88ddd0d54e1 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 29 May 2024 02:34:27 -0400 Subject: [PATCH 212/212] Add some missing HoP clothes to uniform migration --- tools/map_migrations/3948_uniforms.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/map_migrations/3948_uniforms.txt b/tools/map_migrations/3948_uniforms.txt index 2cb182aa7e..4e86c5ce45 100644 --- a/tools/map_migrations/3948_uniforms.txt +++ b/tools/map_migrations/3948_uniforms.txt @@ -85,4 +85,6 @@ /obj/item/clothing/under/lawyer/infil/@SUBTYPES : /obj/item/clothing/pants/slacks/outfit/tie/@SUBTYPES{@OLD} /obj/item/clothing/under/vox/vox_robes/@SUBTYPES : /obj/item/clothing/suit/robe/vox/@SUBTYPES{@OLD} /obj/item/clothing/under/vox/vox_casual/@SUBTYPES : /obj/item/clothing/pants/vox/@SUBTYPES{@OLD} -/obj/item/clothing/under/vox/@SUBTYPES : /obj/item/clothing/pants/vox/@SUBTYPES{@OLD} \ No newline at end of file +/obj/item/clothing/under/vox/@SUBTYPES : /obj/item/clothing/pants/vox/@SUBTYPES{@OLD} +/obj/item/clothing/under/head_of_personnel/@SUBTYPES : /obj/item/clothing/jumpsuit/head_of_personnel/@SUBTYPES{@OLD} +/obj/item/clothing/under/head_of_personnel_whimsy/@SUBTYPES : /obj/item/clothing/jumpsuit/head_of_personnel_whimsy/@SUBTYPES{@OLD} \ No newline at end of file
    " switch(track) @@ -434,8 +459,9 @@ var/global/list/solars_list = list() if(href_list["track"]) track = text2num(href_list["track"]) if(track == 2) - if(connected_tracker) - connected_tracker.set_angle(global.sun.angle) + var/datum/sun/sun = get_best_sun() + if(connected_tracker && sun) + connected_tracker.set_angle(sun.angle) set_panels(cdir) else if (track == 1) //begin manual tracking targetdir = cdir @@ -444,8 +470,9 @@ var/global/list/solars_list = list() if(href_list["search_connected"]) search_for_connected() - if(connected_tracker && track == 2) - connected_tracker.set_angle(global.sun.angle) + var/datum/sun/sun = get_best_sun() + if(connected_tracker && track == 2 && sun) + connected_tracker.set_angle(sun.angle) set_panels(cdir) interact(usr) @@ -473,8 +500,9 @@ var/global/list/solars_list = list() /obj/machinery/power/solar_control/autostart/Initialize() search_for_connected() - if(connected_tracker && track == 2) - connected_tracker.set_angle(global.sun.angle) + var/datum/sun/sun = get_best_sun() + if(connected_tracker && track == 2 && sun) + connected_tracker.set_angle(sun.angle) set_panels(cdir) . = ..() @@ -484,7 +512,7 @@ var/global/list/solars_list = list() /obj/item/paper/solar name = "paper- 'Going green! Setup your own solar array instructions.'" - info = "

    Welcome

    At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuels! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

    You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

    Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the global.sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the global.sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

    Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

    That's all to it, be safe, be green!

    " + info = "

    Welcome

    At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuels! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

    You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

    Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

    Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

    That's all to it, be safe, be green!

    " /proc/rate_control(var/S, var/V, var/C, var/Min=1, var/Max=5, var/Limit=null) //How not to name vars var/href = "
    %0000dP)t-sz`($g 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 Do{q%v literal 0 HcmV?d00001 diff --git a/icons/obj/items/sword/rapier.dmi b/icons/obj/items/sword/rapier.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5192e092bda592dc6748f6d90d8bde45593ace32 GIT binary patch literal 1095 zcmV-N1i1T&P)%0000XP)t-sz`(%T z+S;+Pv6-2f?d|Q|-QALsl4xjX|NsAQZ*RcBz)Xg^p#T5?0d!JMQvg8b*k%9#0M~j{ zSad{Xb7OL8aCB*JZU6vyoTZda3WG2Zh1cd3LD!c4xb3D?ii>&$iDYU5(a0n!y?v!h zY27r&-As62=FJNvqL=iR<@9>bNDpYFZs?gNyFCd8$*mZh(~$%MWF_p>7|Se-W!NJ0 z5{8fjT%s9I4kUOWt6{1?xP!Ry zx*8cW8wI)tdE(lJ9q-~17{_4>x^mv*3R04~K5g#*xtBMPs8Uup4j-3kGa z^raEMlTxj^NdeI6k1(RKNpY(ly)T*8qz%$5-s%e>Xa)K5+8b~$*t@2E(+MGv9JpV% zbi9$q)4oHUE{$sxu{>N=gCiu$qSp*Jswz!-Us@eWAo zqLMROQ9rqbpk?ddrp+(zVH8K&W;%HXs^5X?4%EH_^&O~v2LJ%z7oQkYF` z2Nty*z$y@O$31r`VMczR)X&LplXod2g3?`n7UX632ew?9*S2BgKWt$K^uM%R`1yGT zsy~VKS$Lms&!JGoRC53T0000Vg$YT_46l8wxEa}cqbBEIdv*SuEyMC=cbFE1jdNs0 zDHhIgBnM^gVl(U>u6;AXftB~kh~hNf=Ln9fVJe$p)%1<=tH3a=*ogqmv-dYiF+mm`wa!Bvz8NrW#6-4; zg?(n)(Tj5?hE^CXm{x2=*0lAh)^X!w}E@hQh%MiBx4000000001&jB@s9XBMnu zQnoHs_vb-20o;QA9P2dq9=B6ROlTXm&O)pE$8AN>S=@5{jQVDpV@$~~!|2xow z`T+m{00000003YZv)2y{X72g{><<6{000000000VkNNip007`!@*l%jK2Chu9&-Qy N002ovPDHLkV1nQE0=EDF literal 0 HcmV?d00001 diff --git a/icons/obj/items/sword/shortsword.dmi b/icons/obj/items/sword/shortsword.dmi new file mode 100644 index 0000000000000000000000000000000000000000..efc472f4d4d27e3bb6cf1880160edbeeff7a2f8b GIT binary patch literal 1068 zcmV+{1k?M8P)%0000aP)t-sz`($n znVGS%vD(_&Z*Oni-QEBH|LO4X?d|PoXlRm>lEA>gx+MV500001bW%=J06^y0W&i*H z*LqY~bVOxyV{&P5bZKvH004NLrIbwygD?<<*X9&K*Ovac?WRrHljU68;Zou6=@|np_U7r zQY7vmp;Y3OB6yEpIKZjxjh4e&R1Ez7;H|1+;^9?Ys;;x?^ zPpHi|;5hF3n|=cxt0N-cfI=IPJwK!N0kzGeUhA9hvisVUZ)nfx1sfu6z_lviv+TY& z|J`c?F3y$pi%Rxyl|N~RvjN(C<+sN6ne5-vZU7&z%