diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index fe50319295..7e385638c5 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -24,18 +24,19 @@ #define LOG_SAY (1 << 1) #define LOG_WHISPER (1 << 2) #define LOG_EMOTE (1 << 3) -#define LOG_DSAY (1 << 4) -#define LOG_PDA (1 << 5) -#define LOG_CHAT (1 << 6) -#define LOG_COMMENT (1 << 7) -#define LOG_TELECOMMS (1 << 8) -#define LOG_OOC (1 << 9) -#define LOG_ADMIN (1 << 10) -#define LOG_OWNERSHIP (1 << 11) -#define LOG_GAME (1 << 12) -#define LOG_ADMIN_PRIVATE (1 << 13) -#define LOG_ASAY (1 << 14) -#define LOG_VIRUS (1 << 15) +#define LOG_SUBTLER (1 << 4) +#define LOG_DSAY (1 << 5) +#define LOG_PDA (1 << 6) +#define LOG_CHAT (1 << 7) +#define LOG_COMMENT (1 << 8) +#define LOG_TELECOMMS (1 << 9) +#define LOG_OOC (1 << 10) +#define LOG_ADMIN (1 << 11) +#define LOG_OWNERSHIP (1 << 12) +#define LOG_GAME (1 << 13) +#define LOG_ADMIN_PRIVATE (1 << 14) +#define LOG_ASAY (1 << 15) +#define LOG_VIRUS (1 << 16) //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index d707f7e58a..a5bbe0e304 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -174,6 +174,7 @@ #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't +#define TRAIT_NO_INTERNALS "no-internals" #define TRAIT_NO_ALCOHOL "alcohol_intolerance" // common trait sources diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index db8f4a1d0d..2d53b86c57 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -94,6 +94,10 @@ if (CONFIG_GET(flag/log_emote)) WRITE_LOG(GLOB.world_game_log, "EMOTE: [text]") +/proc/log_subtler(text) + if (CONFIG_GET(flag/log_emote)) + WRITE_LOG(GLOB.world_game_log, "EMOTE (SUBTLER): [text]") + /proc/log_prayer(text) if (CONFIG_GET(flag/log_prayer)) WRITE_LOG(GLOB.world_game_log, "PRAY: [text]") diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 601ed966bf..faa8c22f38 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -46,19 +46,25 @@ var/start = 1 + (text2ascii(color, 1) == 35) var/len = length(color) var/char = "" + // RRGGBB -> RGB but awful + var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3 . = "" - for(var/i = start, i <= len, i += length(char)) + var/i = start + while(i <= len) char = color[i] switch(text2ascii(char)) - if(48 to 57) //numbers 0 to 9 + if(48 to 57) //numbers 0 to 9 . += char - if(97 to 102) //letters a to f + if(97 to 102) //letters a to f . += char - if(65 to 70) //letters A to F - translates to lowercase + if(65 to 70) //letters A to F . += lowertext(char) else break + i += length(char) + if(convert_to_shorthand && i <= len) //skip next one + i += length(color[i]) if(length_char(.) != desired_format) if(default) @@ -73,4 +79,4 @@ var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8))) HSL[3] = min(HSL[3],0.4) var/list/RGB = hsl2rgb(arglist(HSL)) - return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" \ No newline at end of file + return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 14e1794b4d..15d1d3b717 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -291,6 +291,9 @@ icon_state = "internal0" else if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + if(HAS_TRAIT(C, TRAIT_NO_INTERNALS)) + to_chat(C, "Due to cumbersome equipment or anatomy, you are currently unable to use internals!") + return var/obj/item/clothing/check var/internals = FALSE diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2b3d9d2f72..c3ae90cc1b 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -431,3 +431,7 @@ /datum/config_entry/flag/log_pictures /datum/config_entry/flag/picture_logging_camera + +/datum/config_entry/number/max_bunker_days + config_entry_value = 7 + min_val = 1 diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index e43c8f21a2..2825f4343b 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -39,6 +39,7 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() + LoadPanicBunker() return ..() /datum/controller/subsystem/persistence/proc/LoadSatchels() @@ -259,6 +260,15 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) CollectAntagReputation() SaveRandomizedRecipes() + SavePanicBunker() + +/datum/controller/subsystem/persistence/proc/LoadPanicBunker() + var/bunker_path = file("data/bunker_passthrough.json") + if(fexists(bunker_path)) + GLOB.bunker_passthrough = json_decode(file2text(bunker_path)) + for(var/ckey in GLOB.bunker_passthrough) + if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) + GLOB.bunker_passthrough -= ckey /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") @@ -381,6 +391,13 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) +/datum/controller/subsystem/persistence/proc/SavePanicBunker() + var/json_file = file("data/bunker_passthrough.json") + var/list/file_data = list() + file_data["data"] = GLOB.bunker_passthrough + fdel(json_file) + WRITE_FILE(json_file,json_encode(file_data)) + /datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) var/list/ukeys = list() . = list() diff --git a/code/datums/components/crafting/craft.dm b/code/datums/components/crafting/craft.dm index 8e42c48a8a..5c21801c14 100644 --- a/code/datums/components/crafting/craft.dm +++ b/code/datums/components/crafting/craft.dm @@ -16,41 +16,43 @@ var/viewing_category = 1 //typical powergamer starting on the Weapons tab var/viewing_subcategory = 1 var/list/categories = list( - CAT_WEAPONRY, - CAT_ROBOT, - CAT_MISC, - CAT_PRIMAL, - CAT_FOOD, - CAT_CLOTHING) - var/list/subcategories = list( - list( //Weapon subcategories - CAT_WEAPON, - CAT_AMMO), - CAT_NONE, //Robot subcategories - CAT_NONE, //Misc subcategories - CAT_NONE, //Tribal subcategories - list( //Food subcategories - CAT_BREAD, - CAT_BURGER, - CAT_CAKE, - CAT_EGG, - CAT_FISH, - CAT_ICE, //Called Frozen - CAT_MEAT, - CAT_MISCFOOD, - CAT_PASTRY, - CAT_PIE, - CAT_PIZZA, - CAT_SALAD, - CAT_SANDWICH, - CAT_SOUP, - CAT_SPAGHETTI), - CAT_NONE) //Clothing subcategories + CAT_WEAPONRY = list( + CAT_WEAPON, + CAT_AMMO, + ), + CAT_ROBOT = CAT_NONE, + CAT_MISC = CAT_NONE, + CAT_PRIMAL = CAT_NONE, + CAT_FOOD = list( + CAT_BREAD, + CAT_BURGER, + CAT_CAKE, + CAT_EGG, + CAT_FISH, + CAT_ICE, + CAT_MEAT, + CAT_MISCFOOD, + CAT_PASTRY, + CAT_PIE, + CAT_PIZZA, + CAT_SALAD, + CAT_SANDWICH, + CAT_SOUP, + CAT_SPAGHETTI, + ), + CAT_DRINK = CAT_NONE, + CAT_CLOTHING = CAT_NONE, + ) + var/cur_category = CAT_NONE + var/cur_subcategory = CAT_NONE var/datum/action/innate/crafting/button var/display_craftable_only = FALSE var/display_compact = TRUE + + + /* This is what procs do: get_environment - gets a list of things accessable for crafting by user get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list @@ -60,6 +62,9 @@ del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list */ + + + /datum/component/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents) contents = contents["other"] main_loop: @@ -77,11 +82,11 @@ continue main_loop else continue - return 0 + return FALSE for(var/A in R.chem_catalysts) if(contents[A] < R.chem_catalysts[A]) - return 0 - return 1 + return FALSE + return TRUE /datum/component/personal_crafting/proc/get_environment(mob/user) . = list() @@ -307,43 +312,65 @@ /datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) + cur_category = categories[1] + if(islist(categories[cur_category])) + var/list/subcats = categories[cur_category] + cur_subcategory = subcats[1] + else + cur_subcategory = CAT_NONE ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state) ui.open() /datum/component/personal_crafting/ui_data(mob/user) var/list/data = list() - var/list/subs = list() - var/cur_subcategory = CAT_NONE - var/cur_category = categories[viewing_category] - if (islist(subcategories[viewing_category])) - subs = subcategories[viewing_category] - cur_subcategory = subs[viewing_subcategory] data["busy"] = busy - data["prev_cat"] = categories[prev_cat()] - data["prev_subcat"] = subs[prev_subcat()] data["category"] = cur_category data["subcategory"] = cur_subcategory - data["next_cat"] = categories[next_cat()] - data["next_subcat"] = subs[next_subcat()] data["display_craftable_only"] = display_craftable_only data["display_compact"] = display_compact var/list/surroundings = get_surroundings(user) - var/list/can_craft = list() - var/list/cant_craft = list() + var/list/craftability = list() for(var/rec in GLOB.crafting_recipes) var/datum/crafting_recipe/R = rec + if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. continue + if((R.category != cur_category) || (R.subcategory != cur_subcategory)) continue - if(check_contents(R, surroundings)) - can_craft += list(build_recipe_data(R)) + + craftability["[REF(R)]"] = check_contents(R, surroundings) + + data["craftability"] = craftability + return data + +/datum/component/personal_crafting/ui_static_data(mob/user) + var/list/data = list() + + var/list/crafting_recipes = list() + for(var/rec in GLOB.crafting_recipes) + var/datum/crafting_recipe/R = rec + + if(R.name == "") //This is one of the invalid parents that sneaks in + continue + + if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. + continue + + if(isnull(crafting_recipes[R.category])) + crafting_recipes[R.category] = list() + + if(R.subcategory == CAT_NONE) + crafting_recipes[R.category] += list(build_recipe_data(R)) else - cant_craft += list(build_recipe_data(R)) - data["can_craft"] = can_craft - data["cant_craft"] = cant_craft + if(isnull(crafting_recipes[R.category][R.subcategory])) + crafting_recipes[R.category][R.subcategory] = list() + crafting_recipes[R.category]["has_subcats"] = TRUE + crafting_recipes[R.category][R.subcategory] += list(build_recipe_data(R)) + + data["crafting_recipes"] = crafting_recipes return data @@ -361,60 +388,21 @@ else to_chat(usr, "Construction failed[fail_msg]") busy = FALSE - if("forwardCat") //Meow - viewing_category = next_cat(FALSE) - . = TRUE - if("backwardCat") - viewing_category = prev_cat(FALSE) - . = TRUE - if("forwardSubCat") - viewing_subcategory = next_subcat() - . = TRUE - if("backwardSubCat") - viewing_subcategory = prev_subcat() - . = TRUE if("toggle_recipes") display_craftable_only = !display_craftable_only . = TRUE if("toggle_compact") display_compact = !display_compact . = TRUE - -//Next works nicely with modular arithmetic -/datum/component/personal_crafting/proc/next_cat(readonly = TRUE) - if (!readonly) - viewing_subcategory = 1 - . = viewing_category % categories.len + 1 - -/datum/component/personal_crafting/proc/next_subcat() - if(islist(subcategories[viewing_category])) - var/list/subs = subcategories[viewing_category] - . = viewing_subcategory % subs.len + 1 - - -//Previous can go fuck itself -/datum/component/personal_crafting/proc/prev_cat(readonly = TRUE) - if (!readonly) - viewing_subcategory = 1 - if(viewing_category == categories.len) - . = viewing_category-1 - else - . = viewing_category % categories.len - 1 - if(. <= 0) - . = categories.len - -/datum/component/personal_crafting/proc/prev_subcat() - if(islist(subcategories[viewing_category])) - var/list/subs = subcategories[viewing_category] - if(viewing_subcategory == subs.len) - . = viewing_subcategory-1 - else - . = viewing_subcategory % subs.len - 1 - if(. <= 0) - . = subs.len - else - . = null - + if("set_category") + if(!isnull(params["category"])) + cur_category = params["category"] + if(!isnull(params["subcategory"])) + if(params["subcategory"] == "0") + cur_subcategory = "" + else + cur_subcategory = params["subcategory"] + . = TRUE /datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R) var/list/data = list() @@ -455,4 +443,3 @@ if(!learned_recipes) learned_recipes = list() learned_recipes |= R - \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 6c9ad5a941..5453d6e11a 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -67,7 +67,7 @@ Bonus eyes.applyOrganDamage(eyes.maxHealth) else M.visible_message("[M]'s eyes fall off their sockets!", "Your eyes fall off their sockets!") - eyes.Remove(M) + eyes.Remove() eyes.forceMove(get_turf(M)) else to_chat(M, "Your eyes burn horrifically!") diff --git a/code/datums/elements/wuv.dm b/code/datums/elements/wuv.dm index 84f327500f..bac7d1ff21 100644 --- a/code/datums/elements/wuv.dm +++ b/code/datums/elements/wuv.dm @@ -43,7 +43,7 @@ addtimer(CALLBACK(src, .proc/pet_the_dog, source, user), 1) /datum/element/wuv/proc/pet_the_dog(mob/target, mob/user) - if(!QDELETED(target) || !QDELETED(user) || target.stat != CONSCIOUS) + if(QDELETED(target) || QDELETED(user) || target.stat != CONSCIOUS) return new /obj/effect/temp_visual/heart(target.loc) if(pet_emote) @@ -52,7 +52,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, target, pet_moodlet, target) /datum/element/wuv/proc/kick_the_dog(mob/target, mob/user) - if(!QDELETED(target) || !QDELETED(user) || target.stat != CONSCIOUS) + if(QDELETED(target) || QDELETED(user) || target.stat != CONSCIOUS) return if(punt_emote) target.emote("me", punt_type, punt_emote) diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index 9e00c90a92..779428669c 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -1,8 +1,6 @@ #define SIDE_KICK_COMBO "DH" #define SHOULDER_FLIP_COMBO "GHDGHH" -#define REPULSE_PUNCH_COMBO "GHGH" #define FOOT_SMASH_COMBO "HH" -#define DEFT_SWITCH_COMBO "GDD" /datum/martial_art/the_rising_bass name = "The Rising Bass" @@ -10,6 +8,9 @@ dodge_chance = 100 allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/rising_bass_help + var/datum/action/risingbassmove/repulsepunch = new/datum/action/risingbassmove/repulsepunch() + var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch() + var/repulsecool = 0 /datum/martial_art/the_rising_bass/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,SIDE_KICK_COMBO)) @@ -20,7 +21,7 @@ streak = "" shoulderFlip(A,D) return 1 - if(findtext(streak,REPULSE_PUNCH_COMBO)) + if(findtext(streak,"rplse")) streak = "" repulsePunch(A,D) return 1 @@ -28,13 +29,46 @@ streak = "" footSmash(A,D) return 1 - if(findtext(streak,DEFT_SWITCH_COMBO)) + if(findtext(streak,"deft")) streak = "" deftSwitch(A,D) return 1 return 0 +//Repulse Punch - Slams the opponent far away from you. +/datum/action/risingbassmove + name = "" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "" + var/movestreak = "" + +/datum/action/risingbassmove/Trigger() + if(owner.incapacitated()) + to_chat(owner, "You can't use [name] while you're incapacitated.") + return + var/mob/living/carbon/human/H = owner + if (H.mind.martial_art.streak == "[movestreak]") + H.mind.martial_art.streak = "" + to_chat(H,"You relax your muscles and return to a neutral position.") + else + if(HAS_TRAIT(H, TRAIT_PACIFISM)) + to_chat(H, "You don't want to harm other people!") + return + to_chat(H,"You get ready to use the [name] maneuver!") + H.mind.martial_art.streak = "[movestreak]" + +/datum/action/risingbassmove/repulsepunch + name = "Repulse Punch" + button_icon_state = "repulsepunch" + movestreak = "rplse" + +/datum/action/risingbassmove/deftswitch + name = "Deft Switch" + button_icon_state = "deftswitch" + movestreak = "deft" + + /datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!D.IsKnockdown() || D.lying == 0) var/turf/H = get_step(D, A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH)) @@ -75,7 +109,7 @@ return basic_hit(A,D) /datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.IsKnockdown() || !D.lying) + if(!D.IsKnockdown() || !D.lying || repulsecool > world.time) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] smashes [D] in the chest, throwing them away!", \ "[A] smashes you in the chest, repelling you away!") @@ -85,6 +119,7 @@ D.apply_damage(10, BRUTE, BODY_ZONE_CHEST) D.Knockdown(90) log_combat(A, D, "repulse punched (Rising Bass)") + repulsecool = world.time + 3 SECONDS return 1 return basic_hit(A,D) @@ -132,6 +167,11 @@ return 1 return ..() +/datum/martial_art/the_rising_bass/add_to_streak(element,mob/living/carbon/human/D) + if (streak == "deft" || streak == "rplse") + return + . = ..() + /mob/living/carbon/human/proc/rising_bass_help() set name = "Recall Teachings" set desc = "Remember the martial techniques of the Rising Bass clan." @@ -149,10 +189,14 @@ . = ..() if(!.) return + deftswitch.Grant(H) + repulsepunch.Grant(H) ADD_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) /datum/martial_art/the_rising_bass/on_remove(mob/living/carbon/human/H) . = ..() + deftswitch.Remove(H) + repulsepunch.Remove(H) REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 0b89075d20..4adfdf72d2 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -785,6 +785,8 @@ log_whisper(log_text) if(LOG_EMOTE) log_emote(log_text) + if(LOG_SUBTLER) + log_subtler(log_text) if(LOG_DSAY) log_dsay(log_text) if(LOG_PDA) @@ -911,4 +913,3 @@ Proc for attack log creation, because really why not if(!(material_flags & MATERIAL_NO_EFFECTS)) custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags) custom_materials[custom_material] += materials[x] * multiplier - diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index c9885bb8d7..6db8ed2c68 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -203,13 +203,18 @@ clumsy_check = GRENADE_NONCLUMSY_FUMBLE /obj/item/grenade/chem_grenade/teargas/moustache/prime() - var/myloc = get_turf(src) + var/list/check_later = list() + for(var/mob/living/carbon/C in get_turf(src)) + check_later += C . = ..() - for(var/mob/living/carbon/M in view(6, myloc)) - if(!istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(M.wear_mask, /obj/item/clothing/mask/gas/mime) ) - if(!M.wear_mask || M.dropItemToGround(M.wear_mask)) + if(!.) //grenade did not properly prime. + return + for(var/M in check_later) + var/mob/living/carbon/C = M + if(!istype(C.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(C.wear_mask, /obj/item/clothing/mask/gas/mime)) + if(!C.wear_mask || C.dropItemToGround(C.wear_mask)) var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky() - M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) + C.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) /obj/item/clothing/mask/fakemoustache/sticky var/unstick_time = 2 MINUTES @@ -217,10 +222,16 @@ /obj/item/clothing/mask/fakemoustache/sticky/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) - addtimer(CALLBACK(src, .proc/unstick), unstick_time) + addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT), unstick_time) -/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick() - ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) +/obj/item/clothing/mask/fakemoustache/sticky/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_WEAR_MASK) + ADD_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT) + +/obj/item/clothing/mask/fakemoustache/sticky/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT) //DARK H.O.N.K. AND CLOWN MECH WEAPONS diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm index 948e9b98f9..cb25adc126 100644 --- a/code/game/machinery/bloodbankgen.dm +++ b/code/game/machinery/bloodbankgen.dm @@ -32,7 +32,7 @@ if(bag) . += "It has \a [bag.name] hooked to its input slot. The counter reads: \"Current Capacity: [bag.reagents.total_volume] of [bag.reagents.maximum_volume]\"" if(outbag) - . += "It has \a [bag.name] hooked to its output slot. The counter reads: \"Current Capacity: [outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]\"" + . += "It has \a [outbag.name] hooked to its output slot. The counter reads: \"Current Capacity: [outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]\"" /obj/machinery/bloodbankgen/handle_atom_del(atom/A) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index afb882598e..62304112b2 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -61,7 +61,7 @@ QDEL_LIST(unattached_flesh) . = ..() -/obj/machinery/clonepod/RefreshParts() +/obj/machinery/clonepod/RefreshParts() speed_coeff = 0 efficiency = 0 for(var/obj/item/stock_parts/scanning_module/S in component_parts) @@ -471,7 +471,7 @@ if(!istype(organ) || (organ.organ_flags & ORGAN_VITAL)) continue organ.organ_flags |= ORGAN_FROZEN - organ.Remove(H, special=TRUE) + organ.Remove(TRUE) organ.forceMove(src) unattached_flesh += organ diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9cf988884f..a31f6c71c8 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -294,10 +294,12 @@ if(viable_occupant) temp_html += "