diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index f7245ef535..eb194cf5cf 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -30845,6 +30845,7 @@ /area/science) "bvF" = ( /obj/machinery/requests_console{ + announcementConsole = 1; department = "Cargo Bay"; departmentType = 2; pixel_x = -30 diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 4e2b009c79..94699a7a00 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -106349,10 +106349,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/closet/crate/freezer/blood, /turf/open/floor/plasteel/dark, /area/medical/surgery) "dyK" = ( -/obj/structure/closet/crate/freezer/blood, /obj/machinery/vending/wallmed{ name = "Emergency NanoMed"; pixel_x = 26; @@ -106368,6 +106368,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/limbgrower, /turf/open/floor/plasteel/dark, /area/medical/surgery) "dyL" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 12c507c2bf..8e23df2e5f 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -37478,11 +37478,10 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bHb" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, /obj/machinery/newscaster/security_unit{ pixel_y = 32 }, +/obj/machinery/limbgrower, /turf/open/floor/plasteel/freezer, /area/medical/surgery) "bHc" = ( @@ -38110,6 +38109,8 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, /turf/open/floor/plasteel/white, /area/medical/surgery) "bIq" = ( diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 936040432b..ac86912c84 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -153,18 +153,20 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list( "Yes-Man" )) -/proc/resolve_ai_icon(input) +/proc/resolve_ai_icon(input, radial_preview = FALSE) if(!input || !(input in GLOB.ai_core_display_screens)) return "ai" - else - if(input == "Random") - input = pick(GLOB.ai_core_display_screens - "Random") - if(input == "Portrait") - var/datum/portrait_picker/tgui = new(usr)//create the datum - tgui.ui_interact(usr)//datum has a tgui component, here we open the window - return "ai-portrait" //just take this until they decide + if(radial_preview) return "ai-[lowertext(input)]" + if(input == "Random") + input = pick(GLOB.ai_core_display_screens - "Random") + if(input == "Portrait") + var/datum/portrait_picker/tgui = new(usr)//create the datum + tgui.ui_interact(usr)//datum has a tgui component, here we open the window + return "ai-portrait" //just take this until they decide + return "ai-[lowertext(input)]" + GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) //Backpacks diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 53fbd15651..32da3b5938 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -425,6 +425,7 @@ Example config: var/list/min_pop = Get(/datum/config_entry/keyed_list/min_pop) var/list/max_pop = Get(/datum/config_entry/keyed_list/max_pop) var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) + var/desired_chaos_level = 9 - SSpersistence.get_recent_chaos() for(var/T in gamemode_cache) var/datum/game_mode/M = new T() if(!(M.config_tag in modes)) @@ -449,6 +450,17 @@ Example config: adjustment += repeated_mode_adjust[recent_round] recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0) final_weight *= max(0,((100-adjustment)/100)) + if(Get(/datum/config_entry/flag/weigh_by_recent_chaos)) + var/chaos_level = M.get_chaos() + var/exponent = Get(/datum/config_entry/number/chaos_exponent) + var/delta = chaos_level - desired_chaos_level + if(desired_chaos_level > 5) + delta = abs(min(delta, 0)) + else if(desired_chaos_level < 5) + delta = max(delta, 0) + else + delta = abs(delta) + final_weight /= (delta + 1) ** exponent runnable_modes[M] = final_weight return runnable_modes diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 4034722417..76a5f5060c 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -7,6 +7,13 @@ /datum/config_entry/keyed_list/probability/ValidateListEntry(key_name) return key_name in config.modes +/datum/config_entry/keyed_list/chaos_level + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/chaos_level/ValidateListEntry(key_name) + return key_name in config.modes + /datum/config_entry/keyed_list/max_pop key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM @@ -596,3 +603,8 @@ /// Dirtyness multiplier for making turfs dirty /datum/config_entry/number/turf_dirty_multiplier config_entry_value = 1 + +/datum/config_entry/flag/weigh_by_recent_chaos + +/datum/config_entry/number/chaos_exponent + config_entry_value = 1 diff --git a/code/controllers/subsystem/persistence/recent_votes_etc.dm b/code/controllers/subsystem/persistence/recent_votes_etc.dm index f1b902d6ab..87f1ec0d4f 100644 --- a/code/controllers/subsystem/persistence/recent_votes_etc.dm +++ b/code/controllers/subsystem/persistence/recent_votes_etc.dm @@ -3,6 +3,7 @@ */ /datum/controller/subsystem/persistence var/list/saved_modes = list(1,2,3) + var/list/saved_chaos = list(5,5,5) var/list/saved_dynamic_rules = list(list(),list(),list()) var/list/saved_storytellers = list("foo","bar","baz") var/list/average_dynamic_threat = 50 @@ -20,6 +21,7 @@ /datum/controller/subsystem/persistence/LoadServerPersistence() . = ..() LoadRecentModes() + LoadRecentChaos() LoadRecentStorytellers() LoadRecentRulesets() LoadRecentMaps() @@ -33,6 +35,14 @@ file_data["data"] = saved_modes fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) + saved_chaos[3] = saved_chaos[2] + saved_chaos[2] = saved_chaos[1] + saved_chaos[1] = SSticker.mode.get_chaos() + json_file = file("data/RecentChaos.json") + file_data = list() + file_data["data"] = saved_chaos + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) /datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) saved_storytellers.len = 3 @@ -76,6 +86,15 @@ return saved_modes = json["data"] +/datum/controller/subsystem/persistence/proc/LoadRecentChaos() + var/json_file = file("data/RecentChaos.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_chaos = json["data"] + /datum/controller/subsystem/persistence/proc/LoadRecentRulesets() var/json_file = file("data/RecentRulesets.json") if(!fexists(json_file)) @@ -105,3 +124,9 @@ if(!json) return saved_maps = json["maps"] + +/datum/controller/subsystem/persistence/proc/get_recent_chaos() + var/sum = 0 + for(var/n in saved_chaos) + sum += n + return sum/length(saved_chaos) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index cce138e82c..38007023b5 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) name = "Light Sensitivity" desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..." value = -1 - gain_text = "The safty of light feels off..." + gain_text = "Bright lights seem irritating." lose_text = "Enlightening." medical_record_text = "Despite my warnings, the patient refuses turn on the lights, only to end up rolling down a full flight of stairs and into the cellar." diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a582fa03e4..fbda722e4f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -331,6 +331,7 @@ return . = anchored anchored = anchorvalue + SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) // SEND_SIGNAL(src, COMSIG_MOVABLE_SET_ANCHORED, anchorvalue) /atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index a16e7eab59..65321f5820 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -24,6 +24,7 @@ traitor_name = "Bloodsucker" antag_flag = ROLE_BLOODSUCKER false_report_weight = 1 + chaos = 4 restricted_jobs = list("AI","Cyborg") protected_jobs = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 20 diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index 718ed2c103..eda6b5f9e2 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -6,6 +6,7 @@ name = "traitor+brothers" config_tag = "traitorbro" required_players = 25 + chaos = 5 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 8029685bf7..20ef83a54c 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -10,6 +10,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th config_tag = "changeling" antag_flag = ROLE_CHANGELING false_report_weight = 10 + chaos = 5 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist required_players = 15 diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index b010b08bc3..88a1cde8ce 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -2,6 +2,7 @@ name = "traitor+changeling" config_tag = "traitorchan" false_report_weight = 10 + chaos = 6 traitors_possible = 3 //hard limit on traitors if scaling is turned off restricted_jobs = list("AI", "Cyborg") required_players = 25 diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 29455afe56..d8ebf6f20c 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -134,6 +134,7 @@ Credit where due: config_tag = "clockwork_cult" antag_flag = ROLE_SERVANT_OF_RATVAR false_report_weight = 10 + chaos = 8 required_players = 24 //Fixing this directly for now since apparently config machine for forcing modes broke. required_enemies = 3 recommended_enemies = 5 diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index 108c67ad27..659d2de105 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -1,7 +1,7 @@ /datum/game_mode/nuclear/clown_ops name = "clown ops" config_tag = "clownops" - + chaos = 8 announce_span = "danger" announce_text = "Clown empire forces are approaching the station in an attempt to HONK it!\n\ Operatives: Secure the nuclear authentication disk and use your bananium fission explosive to HONK the station.\n\ diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 8ec4123201..ba9fad7a84 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -38,6 +38,7 @@ config_tag = "cult" antag_flag = ROLE_CULTIST false_report_weight = 10 + chaos = 8 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 30 diff --git a/code/game/gamemodes/devil/devil agent/devil_agent.dm b/code/game/gamemodes/devil/devil agent/devil_agent.dm index 789cff5c8f..ccfd6f1dd5 100644 --- a/code/game/gamemodes/devil/devil agent/devil_agent.dm +++ b/code/game/gamemodes/devil/devil agent/devil_agent.dm @@ -1,6 +1,7 @@ /datum/game_mode/devil/devil_agents name = "Devil Agents" config_tag = "devil_agents" + chaos = 5 required_players = 25 required_enemies = 3 recommended_enemies = 8 diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 0f2e8f7858..9bf7fc0e82 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -3,6 +3,7 @@ config_tag = "devil" antag_flag = ROLE_DEVIL false_report_weight = 1 + chaos = 3 protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI") required_players = 0 required_enemies = 1 diff --git a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm index a3e3c54dce..1693163fa2 100644 --- a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm +++ b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm @@ -3,6 +3,7 @@ config_tag = "heresy" antag_flag = ROLE_HERETIC false_report_weight = 5 + chaos = 5 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to heretic role blacklist required_players = 15 diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 976f3e3eca..a6abcbefbd 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -3,6 +3,7 @@ config_tag = "secret_extended" false_report_weight = 5 required_players = 0 + chaos = 0 announce_span = "notice" announce_text = "Just have fun and enjoy the game!" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8bef236c5e..10c0154412 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -17,6 +17,7 @@ var/config_tag = null var/votable = 1 var/probability = 0 + var/chaos = 5 // 0-9, used for weighting round-to-round var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report? var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm var/nuke_off_station = 0 //Used for tracking where the nuke hit @@ -623,3 +624,10 @@ /// Mode specific info for ghost game_info /datum/game_mode/proc/ghost_info() return + +/datum/game_mode/proc/get_chaos() + var/chaos_levels = CONFIG_GET(keyed_list/chaos_level) + if(config_tag in chaos_levels) + return chaos_levels[config_tag] + else + return chaos diff --git a/code/game/gamemodes/gangs/gangs.dm b/code/game/gamemodes/gangs/gangs.dm index 0dc4a520ef..100669c487 100644 --- a/code/game/gamemodes/gangs/gangs.dm +++ b/code/game/gamemodes/gangs/gangs.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_EMPTY(gangs) name = "gang war" config_tag = "gang" antag_flag = ROLE_GANG + chaos = 9 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 15 diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index afeebb770b..78fe6d9324 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -2,6 +2,7 @@ name = "meteor" config_tag = "meteor" false_report_weight = 1 + chaos = 9 var/meteordelay = 2000 var/nometeors = 0 var/rampupdelta = 5 diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm index 76460ffbb8..c91252258a 100644 --- a/code/game/gamemodes/monkey/monkey.dm +++ b/code/game/gamemodes/monkey/monkey.dm @@ -11,6 +11,7 @@ required_players = 20 required_enemies = 1 recommended_enemies = 1 + chaos = 9 restricted_jobs = list("Cyborg", "AI") diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 48a298984c..dcf84e84db 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -2,6 +2,7 @@ name = "nuclear emergency" config_tag = "nuclear" false_report_weight = 10 + chaos = 9 required_players = 28 // 30 players - 3 players to be the nuke ops = 25 players remaining required_enemies = 2 recommended_enemies = 5 diff --git a/code/game/gamemodes/overthrow/overthrow.dm b/code/game/gamemodes/overthrow/overthrow.dm index dca0c1ade1..6a118567df 100644 --- a/code/game/gamemodes/overthrow/overthrow.dm +++ b/code/game/gamemodes/overthrow/overthrow.dm @@ -3,6 +3,7 @@ name = "overthrow" config_tag = "overthrow" antag_flag = ROLE_OVERTHROW + chaos = 5 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 20 // the core idea is of a swift, bloodless coup, so it shouldn't be as chaotic as revs. diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 9eed18d906..419a74d616 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -12,6 +12,7 @@ config_tag = "revolution" antag_flag = ROLE_REV false_report_weight = 10 + chaos = 8 restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_players = 20 diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index fc669d4855..c64e508cef 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -10,6 +10,7 @@ required_enemies = 5 recommended_enemies = 8 reroll_friendly = 0 + chaos = 7 traitor_name = "Nanotrasen Internal Affairs Agent" antag_flag = ROLE_INTERNAL_AFFAIRS diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 8b1b18660a..d42fe615cd 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -17,6 +17,7 @@ recommended_enemies = 4 reroll_friendly = 1 enemy_minimum_age = 0 + chaos = 2 announce_span = "danger" announce_text = "There are Syndicate agents on the station!\n\ diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 23f065318e..d8cb851aad 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -12,6 +12,7 @@ recommended_enemies = 1 enemy_minimum_age = 7 round_ends_with_antag_death = 1 + chaos = 9 announce_span = "danger" announce_text = "There is a space wizard attacking the station!\n\ Wizard: Accomplish your objectives and cause mayhem on the station.\n\ diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 8d7a8c047a..e37fd13106 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -137,7 +137,7 @@ Class Procs: GLOB.machines += src if(ispath(circuit, /obj/item/circuitboard)) - circuit = new circuit + circuit = new circuit(src) circuit.apply_default_parts(src) if(!speed_process && init_process) @@ -361,11 +361,11 @@ Class Procs: /obj/machinery/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) on_deconstruction() - if(component_parts && component_parts.len) + if(LAZYLEN(component_parts)) spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) - component_parts.Cut() + LAZYCLEARLIST(component_parts) qdel(src) /obj/machinery/proc/spawn_frame(disassembled) @@ -539,12 +539,17 @@ Class Procs: /obj/machinery/Exited(atom/movable/AM, atom/newloc) . = ..() + // if(AM == occupant) + // set_occupant(null) if (AM == occupant) SEND_SIGNAL(src, COMSIG_MACHINE_EJECT_OCCUPANT, occupant) occupant = null + if(AM == circuit && circuit.loc != src) + component_parts -= AM //TODO: make the cmp part functions use lazyX + circuit = null -/obj/machinery/proc/adjust_item_drop_location(atom/movable/AM) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 - var/md5 = md5(AM.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot. +/obj/machinery/proc/adjust_item_drop_location(atom/movable/AM) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 + var/md5 = md5(AM.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot. for (var/i in 1 to 32) . += hex2num(md5[i]) . = . % 9 diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 16081db2c1..0c628ba43e 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -17,20 +17,16 @@ /obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C) . = ..() + power_change() - if(!QDELETED(C)) - qdel(circuit) - circuit = C - C.moveToNullspace() /obj/machinery/computer/Destroy() - QDEL_NULL(circuit) - return ..() + . = ..() /obj/machinery/computer/process() if(stat & (NOPOWER|BROKEN)) - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/computer/ratvar_act() if(!clockwork) @@ -87,25 +83,32 @@ switch(damage_type) if(BRUTE) if(stat & BROKEN) - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) else - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) + playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE) if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/machinery/computer/obj_break(damage_flag) - if(circuit && !(flags_1 & NODECONSTRUCT_1)) //no circuit, no breaking - if(!(stat & BROKEN)) - playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1) - stat |= BROKEN - update_icon() - set_light(0) + if(!circuit) //no circuit, no breaking + return + . = ..() + if(. && !(stat & BROKEN)) + stat |= BROKEN + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + set_light(0) + update_icon() /obj/machinery/computer/emp_act(severity) . = ..() if (!(. & EMP_PROTECT_SELF)) - if(prob(severity/1.8)) - obj_break("energy") + switch(severity) + if(1) + if(prob(50)) + obj_break("energy") + if(2) + if(prob(10)) + obj_break("energy") /obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) on_deconstruction() @@ -114,12 +117,14 @@ var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) A.setDir(dir) A.circuit = circuit - A.setAnchored(TRUE) + // Circuit removal code is handled in /obj/machinery/Exited() + circuit.forceMove(A) + A.set_anchored(TRUE) if(stat & BROKEN) if(user) to_chat(user, "The broken glass falls out.") else - playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE) new /obj/item/shard(drop_location()) new /obj/item/shard(drop_location()) A.state = 3 @@ -129,8 +134,11 @@ to_chat(user, "You disconnect the monitor.") A.state = 4 A.icon_state = "4" - circuit = null for(var/obj/C in src) C.forceMove(loc) - qdel(src) + +/obj/machinery/computer/AltClick(mob/user) + . = ..() + if(!user.canUseTopic(src, !issilicon(user)) || !(stat & (NOPOWER|BROKEN))) + return diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index d1c7222485..9876206724 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -243,13 +243,14 @@ // Check if the user can use it. /obj/machinery/telecomms/proc/canInteract(mob/user) - var/get = user.get_active_held_item() - var/obj/item/I = get - if(I.tool_behaviour == TOOL_MULTITOOL) - return TRUE + var/obj/item/I = user.get_active_held_item() + if(!issilicon(user) && I) + if(I.tool_behaviour == TOOL_MULTITOOL) + return TRUE if(hasSiliconAccessInArea(user)) return TRUE return FALSE + // Check if the user is nearby and has a multitool. /obj/machinery/telecomms/proc/canAccess(mob/user) if((canInteract(user) && in_range(user, src)) || hasSiliconAccessInArea(user)) @@ -262,14 +263,13 @@ return null var/obj/item/P = user.get_active_held_item() // Is the ref not a null? and is it the actual type? - if(P.tool_behaviour == TOOL_MULTITOOL) - return P - else if(isAI(user)) + if(isAI(user)) var/mob/living/silicon/ai/U = user P = U.aiMulti - else if(iscyborg(user) && in_range(user, src)) - var/get = user.get_active_held_item() - var/obj/item/I = get - if(I.tool_behaviour == TOOL_MULTITOOL) - I = user.get_active_held_item() + else if(iscyborg(user) && !in_range(user, src)) + return null + if(!P) + return null + else if(P.tool_behaviour == TOOL_MULTITOOL) + return P return P diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index e325ab96a4..ce8171405f 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -132,7 +132,6 @@ events = new icon_state += "-open" add_radio() - add_cabin() spark_system.set_up(2, 0, src) spark_system.attach(src) smoke_system.set_up(3, src) @@ -153,6 +152,7 @@ /obj/mecha/LateInitialize() . = ..() add_airtank() + add_cabin() /obj/mecha/get_cell() return cell @@ -255,9 +255,8 @@ cell = new /obj/item/stock_parts/cell/high/plus(src) /obj/mecha/proc/add_cabin() - cabin_air = new + cabin_air = new(200) cabin_air.set_temperature(T20C) - cabin_air.set_volume(200) cabin_air.set_moles(/datum/gas/oxygen,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) cabin_air.set_moles(/datum/gas/nitrogen,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) return cabin_air diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 25a5bcc800..90912f7409 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -721,24 +721,24 @@ /obj/item/disk/medical/defib_heal name = "Defibrillator Healing Disk" - desc = "An upgrade which increases the healing power of the defibrillator" + desc = "An upgrade which increases the healing power of the defibrillator." icon_state = "heal_disk" custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 18000, /datum/material/gold = 6000, /datum/material/silver = 6000) /obj/item/disk/medical/defib_shock name = "Defibrillator Anti-Shock Disk" - desc = "A safety upgrade that guarantees only the patient will get shocked" + desc = "A safety upgrade that guarantees only the patient will get shocked." icon_state = "zap_disk" custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 18000, /datum/material/gold = 6000, /datum/material/silver = 6000) /obj/item/disk/medical/defib_decay name = "Defibrillator Body-Decay Extender Disk" - desc = "An upgrade allowing the defibrillator to work on more decayed bodies" + desc = "An upgrade allowing the defibrillator to work on bodies that have decayed further." icon_state = "body_disk" custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 18000, /datum/material/gold = 16000, /datum/material/silver = 6000, /datum/material/titanium = 2000) /obj/item/disk/medical/defib_speed name = "Defibrillator Fast Charge Disk" - desc = "An upgrade to the defibrillator capacitors, which let it charge faster" + desc = "An upgrade to the defibrillator capacitors, which lets it charge faster." icon_state = "fast_disk" custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 8000, /datum/material/gold = 26000, /datum/material/silver = 26000) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 325e49dd7a..84f2098b06 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -58,7 +58,6 @@ /obj/item/tank/internals/air name = "air tank" desc = "Mixed anyone?" - icon_state = "air" item_state = "air" force = 10 dog_fashion = /datum/dog_fashion/back diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index dcd67bf1f2..f0edf7ee1d 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -80,9 +80,9 @@ SStgui.close_uis(src) . = ..() +/// @depricated DO NOT USE /obj/proc/setAnchored(anchorvalue) - SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) - anchored = anchorvalue + set_anchored(anchorvalue) /obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) . = ..() diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 47584a1775..9b2f305b42 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -16,12 +16,12 @@ //Adding canvases /obj/structure/easel/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/canvas)) - var/obj/item/canvas/C = I - user.dropItemToGround(C) - painting = C - C.forceMove(get_turf(src)) - C.layer = layer+0.1 - user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].") + var/obj/item/canvas/canvas = I + user.dropItemToGround(canvas) + painting = canvas + canvas.forceMove(get_turf(src)) + canvas.layer = layer+0.1 + user.visible_message("[user] puts \the [canvas] on \the [src].","You place \the [canvas] on \the [src].") else return ..() @@ -40,13 +40,14 @@ desc = "Draw out your soul on this canvas!" icon = 'icons/obj/artstuff.dmi' icon_state = "11x11" + // flags_1 = UNPAINTABLE_1 resistance_flags = FLAMMABLE var/width = 11 var/height = 11 var/list/grid var/canvas_color = "#ffffff" //empty canvas color var/used = FALSE - var/painting_name //Painting name, this is set after framing. + var/painting_name = "Untitled Artwork" //Painting name, this is set after framing. var/finalized = FALSE //Blocks edits var/author_ckey var/icon_generated = FALSE @@ -132,17 +133,19 @@ /obj/item/canvas/update_overlays() . = ..() - if(!icon_generated) - if(used) - var/mutable_appearance/detail = mutable_appearance(icon,"[icon_state]wip") - detail.pixel_x = 1 - detail.pixel_y = 1 - . += detail - else + if(icon_generated) var/mutable_appearance/detail = mutable_appearance(generated_icon) detail.pixel_x = 1 detail.pixel_y = 1 . += detail + return + if(!used) + return + + var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip") + detail.pixel_x = 1 + detail.pixel_y = 1 + . += detail /obj/item/canvas/proc/generate_proper_overlay() if(icon_generated) @@ -167,8 +170,8 @@ if(!I) return if(istype(I, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/C = I - return C.paint_color + var/obj/item/toy/crayon/crayon = I + return crayon.paint_color else if(istype(I, /obj/item/pen)) var/obj/item/pen/P = I switch(P.colour) @@ -184,7 +187,7 @@ /obj/item/canvas/proc/try_rename(mob/user) var/new_name = stripped_input(user,"What do you want to name the painting?") - if(!painting_name && new_name && user.canUseTopic(src,BE_CLOSE)) + if(new_name != painting_name && new_name && user.canUseTopic(src,BE_CLOSE)) painting_name = new_name SStgui.update_uis(src) @@ -215,12 +218,23 @@ framed_offset_x = 5 framed_offset_y = 6 +/obj/item/canvas/twentyfour_twentyfour + name = "ai universal standard canvas" + desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." + icon_state = "24x24" + width = 24 + height = 24 + pixel_x = 2 + pixel_y = 1 + framed_offset_x = 4 + framed_offset_y = 5 + /obj/item/wallframe/painting name = "painting frame" desc = "The perfect showcase for your favorite deathtrap memories." icon = 'icons/obj/decals.dmi' - custom_materials = null - flags_1 = 0 + custom_materials = list(/datum/material/wood = 2000) + flags_1 = NONE icon_state = "frame-empty" result_path = /obj/structure/sign/painting @@ -229,8 +243,13 @@ desc = "Art or \"Art\"? You decide." icon = 'icons/obj/decals.dmi' icon_state = "frame-empty" + // base_icon_state = "frame" + custom_materials = list(/datum/material/wood = 2000) buildable_sign = FALSE - var/obj/item/canvas/C + ///Canvas we're currently displaying. + var/obj/item/canvas/current_canvas + ///Description set when canvas is added. + var/desc_with_canvas var/persistence_id /obj/structure/sign/painting/Initialize(mapload, dir, building) @@ -242,64 +261,78 @@ if(building) pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 + desc = current_canvas ? desc_with_canvas : initial(desc) /obj/structure/sign/painting/Destroy() . = ..() SSpersistence.painting_frames -= src /obj/structure/sign/painting/attackby(obj/item/I, mob/user, params) - if(!C && istype(I, /obj/item/canvas)) + if(!current_canvas && istype(I, /obj/item/canvas)) frame_canvas(user,I) - else if(C && !C.painting_name && istype(I,/obj/item/pen)) + else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/pen)) try_rename(user) else return ..() /obj/structure/sign/painting/examine(mob/user) . = ..() - if(C) - C.ui_interact(user) + if(persistence_id) + . += "Any painting placed here will be archived at the end of the shift." + if(current_canvas) + current_canvas.ui_interact(user) + . += "Use wirecutters to remove the painting." /obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I) . = ..() - if(C) - C.forceMove(drop_location()) - C = null + if(current_canvas) + current_canvas.forceMove(drop_location()) + current_canvas = null to_chat(user, "You remove the painting from the frame.") update_icon() return TRUE /obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas) if(user.transferItemToLoc(new_canvas,src)) - C = new_canvas - if(!C.finalized) - C.finalize(user) - to_chat(user,"You frame [C].") + current_canvas = new_canvas + if(!current_canvas.finalized) + current_canvas.finalize(user) + to_chat(user,"You frame [current_canvas].") update_icon() /obj/structure/sign/painting/proc/try_rename(mob/user) - if(!C.painting_name) - C.try_rename(user) + if(current_canvas.painting_name == initial(current_canvas.painting_name)) + current_canvas.try_rename(user) + +// /obj/structure/sign/painting/update_name(updates) +// name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name) +// return ..() + +// /obj/structure/sign/painting/update_desc(updates) +// desc = current_canvas ? desc_with_canvas : initial(desc) +// return ..() /obj/structure/sign/painting/update_icon_state() - . = ..() - if(C && C.generated_icon) - icon_state = null - else + // icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "overlay" : "empty"]" + if(current_canvas?.generated_icon) icon_state = "frame-empty" - + else + icon_state = null // or "frame-empty" + return ..() /obj/structure/sign/painting/update_overlays() . = ..() - if(C && C.generated_icon) - var/mutable_appearance/MA = mutable_appearance(C.generated_icon) - MA.pixel_x = C.framed_offset_x - MA.pixel_y = C.framed_offset_y - . += MA - var/mutable_appearance/frame = mutable_appearance(C.icon,"[C.icon_state]frame") - frame.pixel_x = C.framed_offset_x - 1 - frame.pixel_y = C.framed_offset_y - 1 - . += frame + if(!current_canvas?.generated_icon) + return + + var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon) + MA.pixel_x = current_canvas.framed_offset_x + MA.pixel_y = current_canvas.framed_offset_y + . += MA + var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame") + frame.pixel_x = current_canvas.framed_offset_x - 1 + frame.pixel_y = current_canvas.framed_offset_y - 1 + . += frame /obj/structure/sign/painting/proc/load_persistent() if(!persistence_id) @@ -310,6 +343,10 @@ var/title = chosen["title"] var/author = chosen["ckey"] var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png" + if(!title) + title = "Untitled Artwork" //Should prevent NULL named art from loading as NULL, if you're still getting the admin log chances are persistence is broken + if(!title) + message_admins("Painting with NO TITLE loaded on a [persistence_id] frame in [get_area(src)]. Please delete it, it is saved in the database with no name and will create bad assets.") if(!fexists(png)) stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.") return @@ -328,17 +365,20 @@ new_canvas.finalized = TRUE new_canvas.painting_name = title new_canvas.author_ckey = author - C = new_canvas + new_canvas.name = "painting - [title]" + current_canvas = new_canvas update_icon() /obj/structure/sign/painting/proc/save_persistent() - if(!persistence_id || !C) + if(!persistence_id || !current_canvas) return if(sanitize_filename(persistence_id) != persistence_id) stack_trace("Invalid persistence_id - [persistence_id]") return - var/data = C.get_data_string() - var/md5 = md5(data) + if(!current_canvas.painting_name) + current_canvas.painting_name = "Untitled Artwork" + var/data = current_canvas.get_data_string() + var/md5 = md5(lowertext(data)) var/list/current = SSpersistence.paintings[persistence_id] if(!current) current = list() @@ -347,10 +387,10 @@ return var/png_directory = "data/paintings/[persistence_id]/" var/png_path = png_directory + "[md5].png" - var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data) + var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data) if(result) CRASH("Error saving persistent painting: [result]") - current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey)) + current += list(list("title" = current_canvas.painting_name , "md5" = md5, "ckey" = current_canvas.author_ckey)) SSpersistence.paintings[persistence_id] = current /obj/item/canvas/proc/fill_grid_from_icon(icon/I) @@ -361,12 +401,21 @@ //Presets for art gallery mapping, for paintings to be shared across stations /obj/structure/sign/painting/library + name = "\improper Public Painting Exhibit mounting" + desc = "For art pieces hung by the public." + desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it." persistence_id = "library" /obj/structure/sign/painting/library_secure + name = "\improper Curated Painting Exhibit mounting" + desc = "For masterpieces hand-picked by the curator." + desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly." persistence_id = "library_secure" /obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least + name = "\improper Private Painting Exhibit mounting" + desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators." + desc_with_canvas = "A painting hung away from lesser minds." persistence_id = "library_private" /obj/structure/sign/painting/vv_get_dropdown() @@ -379,11 +428,11 @@ if(!check_rights(NONE)) return var/mob/user = usr - if(!persistence_id || !C) + if(!persistence_id || !current_canvas) to_chat(user,"This is not a persistent painting.") return - var/md5 = md5(C.get_data_string()) - var/author = C.author_ckey + var/md5 = md5(lowertext(current_canvas.get_data_string())) + var/author = current_canvas.author_ckey var/list/current = SSpersistence.paintings[persistence_id] if(current) for(var/list/entry in current) @@ -392,7 +441,8 @@ var/png = "data/paintings/[persistence_id]/[md5].png" fdel(png) for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) - if(P.C && md5(P.C.get_data_string()) == md5) - QDEL_NULL(P.C) + if(P.current_canvas && md5(P.current_canvas.get_data_string()) == md5) + QDEL_NULL(P.current_canvas) + P.update_icon() log_admin("[key_name(user)] has deleted a persistent painting made by [author].") message_admins("[key_name_admin(user)] has deleted persistent painting made by [author].") diff --git a/code/modules/events/supernova.dm b/code/modules/events/supernova.dm index 9766ab6212..a109d484e9 100644 --- a/code/modules/events/supernova.dm +++ b/code/modules/events/supernova.dm @@ -17,7 +17,7 @@ announceWhen = rand(4, 60) supernova = new SSsun.suns += supernova - if(prob(50)) + if(prob(20)) power = rand(5,100) / 100 else power = rand(5,5000) / 100 @@ -33,9 +33,9 @@ /datum/round_event/supernova/start() - supernova.power_mod = 0.00000002 * power + supernova.power_mod = 0.001 * power var/explosion_size = rand(1000000000, 999999999) - var/turf/epicenter = get_turf_in_angle(supernova.azimuth, SSmapping.get_station_center(), world.maxx / 2) + var/turf/epicenter = get_turf_in_angle(supernova.azimuth, SSmapping.get_station_center(), round(world.maxx * 0.45)) for(var/array in GLOB.doppler_arrays) var/obj/machinery/doppler_array/A = array A.sense_explosion(epicenter, explosion_size/2, explosion_size, 0, 107000000 / power, explosion_size/2, explosion_size, 0) @@ -46,13 +46,13 @@ sucker_light.give_home_power() /datum/round_event/supernova/tick() - var/midpoint = (endWhen-startWhen)/2 + var/midpoint = round((endWhen-startWhen)/2) switch(activeFor) if(startWhen to midpoint) supernova.power_mod = min(supernova.power_mod*1.2, power) if(endWhen-10 to endWhen) supernova.power_mod /= 4 - if(prob(round(supernova.power_mod / 2)) && storm_count < 3 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) + if(prob(round(supernova.power_mod / 2)) && storm_count < 4 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) SSweather.run_weather(/datum/weather/rad_storm/supernova) storm_count++ @@ -62,6 +62,6 @@ /datum/weather/rad_storm/supernova weather_duration_lower = 50 - weather_duration_lower = 100 + weather_duration_upper = 100 telegraph_duration = 100 radiation_intensity = 50 diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index 0c22a85886..a4bd0afdcb 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -477,6 +477,10 @@ name = "Messy" icon_state = "hair_messy" +/datum/sprite_accessory/hair/messy2 + name = "Messy2" + icon_state = "hair_messy2" + /datum/sprite_accessory/hair/modern name = "Modern" icon_state = "hair_modern" diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e0e1d91ba9..ce6a5dcda1 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -200,7 +200,7 @@ if(option == "Random") iconstates[option] = image(icon = src.icon, icon_state = "ai-random") continue - iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option)) + iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option, radial_preview = TRUE)) view_core() var/ai_core_icon = show_radial_menu(src, src , iconstates, radius = 42) diff --git a/code/modules/mob/living/silicon/robot/update_icons.dm b/code/modules/mob/living/silicon/robot/update_icons.dm index a567446e9e..088c93cff1 100644 --- a/code/modules/mob/living/silicon/robot/update_icons.dm +++ b/code/modules/mob/living/silicon/robot/update_icons.dm @@ -23,13 +23,17 @@ if(module.cyborg_base_icon == "robot") icon = 'icons/mob/robots.dmi' pixel_x = initial(pixel_x) - if(stat != DEAD && !(IsUnconscious() ||IsStun() || IsKnockdown() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. + if(stat != DEAD && !(IsUnconscious() || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. if(!eye_lights) eye_lights = new() - if(lamp_intensity > 2) + if(lamp_enabled || lamp_doom) eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_l" + eye_lights.color = lamp_doom? COLOR_RED : lamp_color + eye_lights.plane = 19 //glowy eyes else eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_e[is_servant_of_ratvar(src) ? "_r" : ""]" + eye_lights.color = COLOR_WHITE + eye_lights.plane = -1 eye_lights.icon = icon add_overlay(eye_lights) diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index b4d60af198..98700ffaf0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -11,7 +11,7 @@ var/datum/boss_active_timed_battle/atb var/point_regen_delay = 20 var/point_regen_amount = 1 - + sentience_type = SENTIENCE_BOSS /mob/living/simple_animal/hostile/boss/Initialize() . = ..() diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 8de4b1248f..cd55d00cf1 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -88,9 +88,9 @@ mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor /datum/chemical_reaction/anaphroplus - name = "pentacamphor" + name = "hexacamphor" id = /datum/reagent/drug/anaphrodisiacplus results = list(/datum/reagent/drug/anaphrodisiacplus = 1) - required_reagents = list(/datum/reagent/drug/aphrodisiac = 5, /datum/reagent/acetone = 1) - required_temp = 300 + required_reagents = list(/datum/reagent/drug/anaphrodisiac = 6, /datum/reagent/acetone = 1) + required_temp = 400 mix_message = "The mixture thickens and heats up slighty..." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 9879171e71..471b2f931e 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -809,22 +809,22 @@ research_icon_state = "surgery_chest" /datum/design/surgery/healing/brute_upgrade - name = "Tend Wounds (Brute) Upgrade" + name = "Tend Wounds (Brute) Upgrade I" surgery = /datum/surgery/healing/brute/upgraded id = "surgery_heal_brute_upgrade" /datum/design/surgery/healing/brute_upgrade_2 - name = "Tend Wounds (Brute) Upgrade" + name = "Tend Wounds (Brute) Upgrade II" surgery = /datum/surgery/healing/brute/upgraded/femto id = "surgery_heal_brute_upgrade_femto" /datum/design/surgery/healing/burn_upgrade - name = "Tend Wounds (Burn) Upgrade" + name = "Tend Wounds (Burn) Upgrade I" surgery = /datum/surgery/healing/burn/upgraded id = "surgery_heal_burn_upgrade" /datum/design/surgery/healing/burn_upgrade_2 - name = "Tend Wounds (Burn) Upgrade" + name = "Tend Wounds (Burn) Upgrade II" surgery = /datum/surgery/healing/brute/upgraded/femto id = "surgery_heal_burn_upgrade_femto" @@ -835,16 +835,26 @@ id = "surgery_heal_combo" /datum/design/surgery/healing/combo_upgrade - name = "Tend Wounds (Mixture) Upgrade" + name = "Tend Wounds (Mixture) Upgrade I" surgery = /datum/surgery/healing/combo/upgraded id = "surgery_heal_combo_upgrade" /datum/design/surgery/healing/combo_upgrade_2 - name = "Tend Wounds (Mixture) Upgrade" + name = "Tend Wounds (Mixture) Upgrade II" desc = "A surgical procedure that repairs both bruises and burns faster than their individual counterparts. It is more effective than both the individual surgeries." surgery = /datum/surgery/healing/combo/upgraded/femto id = "surgery_heal_combo_upgrade_femto" +/datum/design/surgery/healing/robot_upgrade + name = "Repair Robotic Limbs Upgrade" + surgery = /datum/surgery/robot_healing/upgraded + id = "surgery_heal_robo_upgrade" + +/datum/design/surgery/healing/robot_upgrade_2 + name = "Repair Robotic Limbs Upgrade II" + surgery = /datum/surgery/robot_healing/upgraded/femto + id = "surgery_heal_robo_upgrade_femto" + /datum/design/surgery/surgery_toxinhealing name = "Body Rejuvenation" desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals." diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index fb29399064..de0ebcb63a 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -43,7 +43,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi /obj/item/storage/part_replacer/bluespace name = "bluespace rapid part exchange device" - desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange." + desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." icon_state = "BS_RPED" w_class = WEIGHT_CLASS_NORMAL works_from_distance = TRUE @@ -109,6 +109,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi icon_state = "borgrped" /obj/item/storage/part_replacer/bluespace/cyborg + desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange." icon_state = "borg_BS_RPED" /proc/cmp_rped_sort(obj/item/A, obj/item/B) diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 914a6174ab..af23804c57 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -116,6 +116,14 @@ design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) +/datum/techweb_node/adv_surgery + id = "adv_surgery" + display_name = "Advanced Surgery" + description = "When simple medicine doesn't cut it." + prereq_ids = list("imp_wt_surgery") + design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto","surgery_heal_robo_upgrade","surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + /datum/techweb_node/advance_surgerytools id = "advance_surgerytools" display_name = "Advanced Surgery Tools" @@ -124,20 +132,12 @@ design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv", "bonesetter", "surgical_tape") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) -/datum/techweb_node/adv_surgery - id = "adv_surgery" - display_name = "Advanced Surgery" - description = "When simple medicine doesn't cut it." - prereq_ids = list("imp_wt_surgery") - design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection") - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - /datum/techweb_node/exp_surgery id = "exp_surgery" display_name = "Experimental Surgery" description = "When evolution isn't fast enough." prereq_ids = list("adv_surgery") - design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade") + design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection","surgery_heal_robo_upgrade_femto","surgery_heal_combo_upgrade") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) /datum/techweb_node/alien_surgery diff --git a/code/modules/smithing/smithed_items.dm b/code/modules/smithing/smithed_items.dm index e514fd5c9a..aff296b684 100644 --- a/code/modules/smithing/smithed_items.dm +++ b/code/modules/smithing/smithed_items.dm @@ -394,7 +394,7 @@ name = "smithed katana blade" finishingitem = /obj/item/swordhandle finalitem = /obj/item/melee/smith/twohand/katana - icon_state = "katana" + icon_state = "katana-s" /obj/item/smithing/katanablade/startfinish() diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index f5b23e6087..dd655a0ea5 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -169,7 +169,6 @@ /***************************COMBO***************************/ /datum/surgery/healing/combo - /datum/surgery/healing/combo name = "Tend Wounds (Mixture, Basic)" replaced_by = /datum/surgery/healing/combo/upgraded diff --git a/code/modules/surgery/robot_healing.dm b/code/modules/surgery/robot_healing.dm index f473ef280e..6c9ff6e78f 100644 --- a/code/modules/surgery/robot_healing.dm +++ b/code/modules/surgery/robot_healing.dm @@ -1,9 +1,9 @@ //Almost copypaste of tend wounds, with some changes /datum/surgery/robot_healing - name = "Repair robotic limbs (basic)" + name = "Repair Robotic Limbs" desc = "A surgical procedure that provides repairs and maintenance to robotic limbs. Is slightly more efficient when the patient is severely damaged." - + replaced_by = /datum/surgery steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/pry_off_plating, /datum/surgery_step/cut_wires, @@ -14,8 +14,28 @@ possible_locs = list(BODY_ZONE_CHEST) requires_bodypart_type = 0 //You can do this on anyone, but it won't really be useful on people without augments. ignore_clothes = TRUE + var/healing_step_type var/antispam = FALSE - var/healing_step_type = /datum/surgery_step/robot_heal/basic + +/datum/surgery/robot_healing/basic + name = "Repair Robotic Limbs (Basic)" + replaced_by = /datum/surgery/robot_healing/upgraded + healing_step_type = /datum/surgery_step/robot_heal/basic + desc = "A surgical procedure that provides basic repairs and maintenance to a patient's robotic limbs. Heals slightly more when the patient is severely injured." + +/datum/surgery/robot_healing/upgraded + name = "Repair Robotic Limbs (Adv.)" + requires_tech = TRUE + replaced_by = /datum/surgery/robot_healing/upgraded/femto + healing_step_type = /datum/surgery_step/robot_heal/upgraded + desc = "A surgical procedure that provides advanced repairs and maintenance to a patient's robotic limbs. Heals more when the patient is severely injured." + +/datum/surgery/robot_healing/upgraded/femto + name = "Repair Robotic Limbs (Exp.)" + requires_tech = TRUE + replaced_by = null // as good as it gets + healing_step_type = /datum/surgery_step/robot_heal/upgraded/femto + desc = "A surgical procedure that provides experimental repairs and maintenance to a patient's robotic limbs. Heals considerably more when the patient is severely injured." /datum/surgery/robot_healing/New(surgery_target, surgery_location, surgery_bodypart) ..() @@ -35,26 +55,21 @@ var/healsburn = FALSE var/brutehealing = 0 var/burnhealing = 0 - var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! + var/missinghpbonus = 0 //heals an extra point of damage per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! /datum/surgery_step/robot_heal/tool_check(mob/user, obj/item/tool) if(implement_type == TOOL_WELDER && !tool.tool_use_check(user, 1)) return FALSE return TRUE -/datum/surgery/robot_healing/can_start(mob/user, mob/living/carbon/target, obj/item/tool) - var/possible = FALSE +/datum/surgery/robot_healing/can_start(mob/user, mob/living/carbon/target, obj/item/tool) // hey delta? why is the check for this all the way down here for(var/obj/item/bodypart/B in target.bodyparts) if(B.is_robotic_limb()) - possible = TRUE - break - if(!possible) - return FALSE - return TRUE + return ..() /datum/surgery_step/robot_heal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/woundtype - if(implement_type == TOOL_WELDER) + if(implement_type == TOOL_WELDER) healsbrute = TRUE healsburn = FALSE woundtype = "dents" @@ -133,3 +148,13 @@ brutehealing = 10 burnhealing = 10 missinghpbonus = 15 + +/datum/surgery_step/robot_heal/upgraded + brutehealing = 10 + burnhealing = 10 + missinghpbonus = 10 + +/datum/surgery_step/robot_heal/upgraded/femto + brutehealing = 10 + burnhealing = 10 + missinghpbonus = 5 diff --git a/config/game_options.txt b/config/game_options.txt index 7776d87d4e..b9d763e5b0 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -72,6 +72,14 @@ ALERT_DELTA Destruction of the station is imminent. All crew are instructed to o ## Uncomment to not send a roundstart intercept report. Gamemodes may override this. #NO_INTERCEPT_REPORT +## Comment to disable weighting modes by how chaotic recent mode rolls were. +WEIGH_BY_RECENT_CHAOS + +## The weight adjustment will be proportional to this power relative to the "ideal" weight range. +## e.g. if we have a weight range of 0-5, and an exponent of 1, 6 will be weighted 1/2, 7 1/3 etc. +## if exponent is 2, it'll be 1/4, 1/9 etc. +CHAOS_EXPONENT 1 + ## Probablities for game modes chosen in 'secret' and 'random' modes. ## Default probablity is 1, increase to make that mode more likely to be picked. ## Set to 0 to disable that mode. @@ -154,6 +162,11 @@ FORCE_ANTAG_COUNT CLOCKWORK_CULT #FORCE_ANTAG_COUNT WIZARD #FORCE_ANTAG_COUNT MONKEY +## A config for how much each game mode's chaos level is. +## All of them have reasonable defaults, but this can be used to adjust them. +## 0-9, where 0 is lowest chaos (should only be extended) and 9 is highest (wizard? nukies?) +#CHAOS_LEVEL EXTENDED 0 + ## Uncomment these for overrides of the minimum / maximum number of players in a round type. ## If you set any of these occasionally check to see if you still need them as the modes ## will still be actively rebalanced around the SUGGESTED populations, not your overrides. diff --git a/html/changelog.html b/html/changelog.html index f039539b98..f0557bd738 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -71,6 +71,34 @@
  • Properly segments all the augment sprites so that they correctly display.
  • Properly labels the augment limb icon sprites.
  • Fixes going over the defined limit of roundstart prosthetics
  • +

    14 March 2021

    +

    Adelphon updated:

    + +

    Hatterhat updated:

    + +

    Putnam3145 updated:

    + +

    kiwedespars updated:

    + +

    necromanceranne updated:

    + + +

    12 March 2021

    +

    R3dtail updated:

    +

    10 March 2021

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 81d12c0c62..a40c2bec77 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -28701,25 +28701,21 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscadd: The femur breaker now actually breaks legs by applying a compound fracture. Putnam3145: - balance: uncapped TEG power, buffing high-temp TEGs -2021-03-11: +2021-03-12: + R3dtail: + - spellcheck: Adds Periods and moves some words around. +2021-03-14: + Adelphon: + - rscadd: messy2 + - bugfix: papermask + Hatterhat: + - rscadd: Robotic limb repair surgery now has tiers. + - rscadd: 'Pubby and Delta now have roundstart limb-growers relatively close to, + if not in, the operating theaters. tweak: Box QM''s console now can announce + things.' Putnam3145: - - rscadd: Supernova event - - refactor: Bloodsucker day/night cycle now processes on a subsystem instead of - using while and sleep (!!) - Sneakyrat: - - bugfix: Fixes precise insertion ui(when it asks you how many sheets you want to - put in the mat container) so you can actually choose how much to put in and - it will still work if your stack is bigger than the remaining space - - bugfix: Fixes precise insertion not working for remote mat containers - - bugfix: Fixes Protolathe/mechfab insert material animations not working - - bugfix: Fixes the material insertion animation for protolathes occurring on the - circuit printer - - bugfix: Fixes the material insertion animation not actually playing when it was - started - - bugfix: Fixes the material insertion animation for iron not being made - - bugfix: Fixes the material insertion animation sometimes not picking the right - material for sheets that have multiple different materials in them + - bugfix: chaos loads now + kiwedespars: + - rscadd: adds a cute new plushie necromanceranne: - - bugfix: Properly segments all the augment sprites so that they correctly display. - - bugfix: Properly labels the augment limb icon sprites. - - bugfix: Fixes going over the defined limit of roundstart prosthetics + - bugfix: Fixes cosmetic augments missing their foot sprites. diff --git a/html/changelogs/AutoChangeLog-pr-14397.yml b/html/changelogs/AutoChangeLog-pr-14397.yml new file mode 100644 index 0000000000..ba93472587 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14397.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - bugfix: "Fixed interacting with telecomms." diff --git a/html/changelogs/AutoChangeLog-pr-14398.yml b/html/changelogs/AutoChangeLog-pr-14398.yml new file mode 100644 index 0000000000..ff5999c8d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14398.yml @@ -0,0 +1,7 @@ +author: "LetterN" +delete-after: True +changes: + - bugfix: "Borg light icons not turning off" + - bugfix: "Double ai icon select + Fixes ai core not having icons" + - bugfix: "Missing air tank icon" + - bugfix: "Computer boards being dumb and nullspacing/qdeling itself" diff --git a/html/changelogs/AutoChangeLog-pr-14433.yml b/html/changelogs/AutoChangeLog-pr-14433.yml new file mode 100644 index 0000000000..a74cf85bc9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14433.yml @@ -0,0 +1,4 @@ +author: "HeroWithYay" +delete-after: True +changes: + - bugfix: "fixed spelling error" diff --git a/html/changelogs/AutoChangeLog-pr-14437.yml b/html/changelogs/AutoChangeLog-pr-14437.yml new file mode 100644 index 0000000000..1e2dbadbfe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14437.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - balance: "Supernova now much lower chance to be inconsequential" diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 33c33aaee2..279a3e76ef 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi b/icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi index 056fea5d4e..b4c622aae9 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi b/icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi index 2545387155..fc53e35f62 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi b/icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi index 97d09d4517..f69736f1fa 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi b/icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi index bc0a068145..6945fe4fc9 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi b/icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi index e3dee175c3..310f14b6fe 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/talon.dmi b/icons/mob/augmentation/cosmetic_prosthetic/talon.dmi index e659e761ce..b502c1df5e 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/talon.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/talon.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/ward.dmi b/icons/mob/augmentation/cosmetic_prosthetic/ward.dmi index 4651c57d74..e0b2f1c958 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/ward.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/ward.dmi differ diff --git a/icons/mob/augmentation/cosmetic_prosthetic/xion.dmi b/icons/mob/augmentation/cosmetic_prosthetic/xion.dmi index c27ad213c7..503c759c4a 100644 Binary files a/icons/mob/augmentation/cosmetic_prosthetic/xion.dmi and b/icons/mob/augmentation/cosmetic_prosthetic/xion.dmi differ diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi index 7d9433525a..b1a2873c55 100644 Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi index 6ecaad55a5..7322b2cfaf 100644 Binary files a/icons/mob/hair.dmi and b/icons/mob/hair.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index 11d02a46cc..97c3ea1409 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi index a67c1b718c..7073328655 100644 Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ