From 2511b7dc1ccb8c5b95c1a9bde6c3221ccc170dd9 Mon Sep 17 00:00:00 2001 From: lila Date: Sun, 24 Sep 2023 20:26:25 +0200 Subject: [PATCH 001/101] Reverts wall-mushroom outbreak, take 2 (#23853) * [Removal] Removes the wall-mushroom * sound --- code/__DEFINES/sound.dm | 2 - .../modules/alerts/code/default_announcer.dm | 1 - .../modules/alerts/sound/alerts/fungi.ogg | Bin 74612 -> 0 bytes .../ices_events/code/ICES_event_config.dm | 6 - .../wall_fungus/code/wall_fungus_component.dm | 159 ------------------ .../wall_fungus/code/wall_fungus_event.dm | 29 ---- .../modules/wall_fungus/code/wall_mushroom.dm | 53 ------ .../wall_fungus/icons/wall_fungus_overlay.dmi | Bin 5362 -> 0 bytes tgstation.dme | 3 - 9 files changed, 253 deletions(-) delete mode 100644 modular_skyrat/modules/alerts/sound/alerts/fungi.ogg delete mode 100644 modular_skyrat/modules/wall_fungus/code/wall_fungus_component.dm delete mode 100644 modular_skyrat/modules/wall_fungus/code/wall_fungus_event.dm delete mode 100644 modular_skyrat/modules/wall_fungus/code/wall_mushroom.dm delete mode 100644 modular_skyrat/modules/wall_fungus/icons/wall_fungus_overlay.dmi diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 3caed7a0622..d95973e3fdb 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -150,7 +150,6 @@ #define ANNOUNCER_ICARUS "announcer_icarus" #define ANNOUNCER_NRI_RAIDERS "announcer_nri_raiders" #define ANNOUNCER_OUTBREAK6 "announcer_outbreak6" -#define ANNOUNCER_FUNGI "announcer_fungi" #define ANNOUNCER_DEPARTMENTAL "announcer_departmental" #define ANNOUNCER_SHUTTLE "announcer_shuttle" //SKYRAT EDIT END @@ -199,7 +198,6 @@ GLOBAL_LIST_INIT(announcer_keys, list( ANNOUNCER_ICARUS, ANNOUNCER_NRI_RAIDERS, ANNOUNCER_OUTBREAK6, - ANNOUNCER_FUNGI, //SKYRAT EDIT END )) diff --git a/modular_skyrat/modules/alerts/code/default_announcer.dm b/modular_skyrat/modules/alerts/code/default_announcer.dm index 7ae320f01f8..86add70db58 100644 --- a/modular_skyrat/modules/alerts/code/default_announcer.dm +++ b/modular_skyrat/modules/alerts/code/default_announcer.dm @@ -43,7 +43,6 @@ ANNOUNCER_KLAXON = 'modular_skyrat/modules/black_mesa/sound/siren1_long.ogg', ANNOUNCER_ICARUS = 'modular_skyrat/modules/assault_operatives/sound/icarus_alarm.ogg', ANNOUNCER_NRI_RAIDERS = 'modular_skyrat/modules/encounters/sounds/morse.ogg', - ANNOUNCER_FUNGI = 'modular_skyrat/modules/alerts/sound/alerts/fungi.ogg', ANNOUNCER_DEPARTMENTAL = 'modular_skyrat/modules/alerts/sound/alerts/alert3.ogg', ANNOUNCER_SHUTTLE = 'modular_skyrat/modules/alerts/sound/alerts/alert3.ogg', ) diff --git a/modular_skyrat/modules/alerts/sound/alerts/fungi.ogg b/modular_skyrat/modules/alerts/sound/alerts/fungi.ogg deleted file mode 100644 index 7eb45de94a22d5d2cf76ec3d897cd4d6f3dfe2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74612 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 FUNGUS_STAGE_MAX) - collapse_parent_structure() - return - - progression_percent += progression_step_amount * seconds_per_tick - - if(progression_percent >= 100) - progression_percent = 0 - progression_stage++ - spread_to_nearby_wall() - parent_wall.update_icon(UPDATE_OVERLAYS) - -/datum/component/wall_fungus/proc/on_attack_hand(datum/source, mob/living/user) - SIGNAL_HANDLER - - if(progression_stage < FUNGUS_STAGE_THREE) - return - - collapse_parent_structure() - - -/// We kill the wall once we have progressed far enough. -/datum/component/wall_fungus/proc/collapse_parent_structure() - var/turf/closed/wall/parent_wall = parent - STOP_PROCESSING(SSobj, src) - parent_wall.balloon_alert_to_viewers("collapses!") - parent_wall.dismantle_wall() - qdel(src) - -/datum/component/wall_fungus/proc/spread_to_nearby_wall() - var/turf/closed/wall/parent_wall = parent - var/list/walls_to_pick_from = list() - for(var/turf/closed/wall/iterating_wall in RANGE_TURFS(3, parent_wall)) - if(iterating_wall.GetComponent(/datum/component/wall_fungus)) - continue - - walls_to_pick_from += iterating_wall - - if(!length(walls_to_pick_from)) - return // sad times - - var/turf/closed/wall/picked_wall = pick(walls_to_pick_from) - - picked_wall.AddComponent(/datum/component/wall_fungus, progression_step_amount, spread_chance, spread_distance, drop_chance) - -/// Gives people an idea of how badly the wall is infected. -/datum/component/wall_fungus/proc/examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - var/turf/closed/wall/parent_wall = parent - switch(progression_stage) - if(FUNGUS_STAGE_ONE) - examine_list += span_green("[parent_wall] is infected with some kind of fungus!") - if(FUNGUS_STAGE_TWO) - examine_list += span_green("[parent_wall] is infected with some kind of fungus, its structure weakened!") - if(FUNGUS_STAGE_THREE) - examine_list += span_green("[parent_wall] is infected with some kind of fungus, its structure seriously weakened!") - if(FUNGUS_STAGE_THREE) - examine_list += span_green("[parent_wall] is infected with some kind of fungus, its falling apart!") - examine_list += span_green("Perhaps you could burn it off?") - -/datum/component/wall_fungus/proc/apply_fungus_overlay(atom/parent_atom, list/overlays) - SIGNAL_HANDLER - overlays += mutable_appearance(overlay_icon_file, "fungus_stage_[progression_stage]") - -/datum/component/wall_fungus/proc/secondary_tool_act(atom/source, mob/user, obj/item/item) - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(handle_tool_use), source, user, item) - return COMPONENT_BLOCK_TOOL_ATTACK - -/// Handles removal of the fungus from a wall. -/datum/component/wall_fungus/proc/handle_tool_use(atom/source, mob/user, obj/item/item) - var/turf/closed/wall/parent_wall = parent - switch(item.tool_behaviour) - if(TOOL_WELDER) - if(!item.tool_start_check(user, 1)) - return - - user.balloon_alert(user, "burning off fungus...") - - if(!item.use_tool(source, user, (1 * progression_stage) SECONDS, 1, volume = 100)) - return - - user.balloon_alert(user, "burned off fungus") - if(prob(drop_chance)) - new /obj/item/food/grown/mushroom/wall(parent_wall) - qdel(src) - - -#undef FUNGUS_STAGE_ONE -#undef FUNGUS_STAGE_TWO -#undef FUNGUS_STAGE_THREE -#undef FUNGUS_STAGE_FOUR -#undef FUNGUS_STAGE_MAX diff --git a/modular_skyrat/modules/wall_fungus/code/wall_fungus_event.dm b/modular_skyrat/modules/wall_fungus/code/wall_fungus_event.dm deleted file mode 100644 index 564b9a9424e..00000000000 --- a/modular_skyrat/modules/wall_fungus/code/wall_fungus_event.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/round_event_control/wall_fungus - name = "Wall Fungus Outbreak" - typepath = /datum/round_event/wall_fungus - category = EVENT_CATEGORY_ENGINEERING - max_occurrences = 2 - earliest_start = 30 MINUTES - description = "A wall fungus will infest a random wall on the station, eating away at it. If left unchecked, it will spread to other walls and eventually destroy the station." - -/datum/round_event/wall_fungus/announce(fake) - priority_announce("Harmful fungi detected on the station, station structures may be contaminated. Crew are advised to provide immediate response in [get_area(starting_wall)].", "Harmful Fungi", ANNOUNCER_FUNGI) - -/datum/round_event/wall_fungus - announce_when = 180 EVENT_SECONDS - announce_chance = 100 - fakeable = FALSE - var/turf/closed/wall/starting_wall - -/datum/round_event/wall_fungus/start() - var/list/possible_start_walls = list() - var/starting_area = get_area(pick(GLOB.generic_maintenance_landmarks)) - - for(var/turf/closed/wall/iterating_wall in starting_area) - possible_start_walls += iterating_wall - - starting_wall = pick(possible_start_walls) - - starting_wall.AddComponent(/datum/component/wall_fungus) - - notify_ghosts("[starting_wall] has been infested with wall eating mushrooms!!", source = starting_wall, action = NOTIFY_JUMP, header = "Fungus Amongus!") diff --git a/modular_skyrat/modules/wall_fungus/code/wall_mushroom.dm b/modular_skyrat/modules/wall_fungus/code/wall_mushroom.dm deleted file mode 100644 index 71d99c164c6..00000000000 --- a/modular_skyrat/modules/wall_fungus/code/wall_mushroom.dm +++ /dev/null @@ -1,53 +0,0 @@ -// WALL EATING FUNGUS!!!! -/obj/item/seeds/wall_mushroom - name = "pack of wall destroying mycelium" - desc = "This mycelium grows into something devastating." - icon = 'modular_skyrat/master_files/icons/obj/hydroponics/seeds.dmi' - icon_state = "seed-wallmushroom" - species = "angel" - plantname = "Wall Mushroom" - product = /obj/item/food/grown/mushroom/wall - lifespan = 50 - endurance = 35 - maturation = 12 - production = 5 - yield = 2 - potency = 35 - growthstages = 3 - genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) - growing_icon = 'modular_skyrat/master_files/icons/obj/hydroponics/growing.dmi' - icon_grow = "wallmushroom-grow" - icon_dead = "wallmushroom-dead" - reagents_add = list(/datum/reagent/drug/mushroomhallucinogen = 0.04, /datum/reagent/toxin/amatoxin = 0.1, /datum/reagent/consumable/nutriment = 0.1) - rarity = 30 - graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism - -/obj/item/food/grown/mushroom/wall - seed = /obj/item/seeds/wall_mushroom - name = "wall mushroom" - desc = "Wallosia Virosa: A wall eating mushroom!" - icon = 'modular_skyrat/master_files/icons/obj/hydroponics/harvest.dmi' - icon_state = "wallmushroom" - wine_power = 60 - - - -/obj/item/food/grown/mushroom/wall/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!iswallturf(target)) - return ..() - var/turf/closed/wall/target_wall = target - if(target_wall.GetComponent(/datum/component/wall_fungus)) - target_wall.balloon_alert(user, "already infested!") - return ..() - target_wall.balloon_alert(user, "planting...") - if(do_after(user, 5 SECONDS, target_wall)) - target_wall.AddComponent(/datum/component/wall_fungus) - target_wall.balloon_alert(user, "planted!") - user.log_message("planted [name] on [target_wall.name].", LOG_ATTACK) - qdel(src) - return - return ..() - - - - diff --git a/modular_skyrat/modules/wall_fungus/icons/wall_fungus_overlay.dmi b/modular_skyrat/modules/wall_fungus/icons/wall_fungus_overlay.dmi deleted file mode 100644 index 822d7ea9b29575fe94aa78e1a76e25ddd3acc694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5362 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 Date: Sun, 24 Sep 2023 20:45:43 +0200 Subject: [PATCH 002/101] Fixed overflow role not actually being overflow anymore after ResetOccupation is called [MDB IGNORE] (#23884) * Fixed overflow role not actually being overflow anymore after ResetOccupation is called (#78556) ## About The Pull Request See title. Calling ResetOccupation doesn't re-apply the overflow role correctly so it has reduced slots when it shouldn't. ## Why It's Good For The Game Bugfix ## Changelog :cl: fix: Fixed the overflow role having less slots than it actually should. /:cl: Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> * Fixed overflow role not actually being overflow anymore after ResetOccupation is called --------- Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> --- code/controllers/subsystem/job.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 5c957445526..96f391b91eb 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -305,6 +305,8 @@ SUBSYSTEM_DEF(job) player.mind.special_role = null SetupOccupations() unassigned = list() + if(overflow_role) + set_overflow_role(overflow_role) return From 2b87f39f69c4b759756a3bb6c457ebdea4a6e05f Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 24 Sep 2023 14:34:07 -0700 Subject: [PATCH 003/101] Fixes a bug with the steampunk goggles that deletes items that aren't welding goggles when hit by it. (#23886) * [MODULAR] Fixes a bug with the steampunk goggles that deletes items that aren't welding goggles when hit by it. * Update modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> --------- Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com> --- .../modules/clothing/~donator/donator_clothing.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm index 64a6c5c1339..746380b59cb 100644 --- a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm +++ b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm @@ -936,7 +936,8 @@ /obj/item/clothing/glasses/welding/steampunk_goggles/attackby(obj/item/attacking_item, mob/living/user, params) if(!istype(attacking_item, /obj/item/clothing/glasses/welding)) - ..() + return ..() + if(welding_upgraded) to_chat(user, span_warning("\The [src] was already upgraded to have welding protection!")) return From b833997e47a57b5735d4949b6595327e27977aed Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 03:55:02 +0200 Subject: [PATCH 004/101] Successful restart vote restarts on current map [MDB IGNORE] (#23892) * Successful restart vote restarts on current map (#78510) ## About The Pull Request A successful restart vote will revert any pending map change. Also performs the end round task so persistence data gets saved. ## Why It's Good For The Game Admin request for lowpop hours. ## Changelog :cl: LT3 admin: Successful restart votes will now restart on the current map code: End round and persistence data will be saved before executing successful restart vote /:cl: * Successful restart vote restarts on current map --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> --- code/datums/votes/map_vote.dm | 9 +++++++++ code/datums/votes/restart_vote.dm | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index 745e7c6f7af..7d45f460a59 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -118,3 +118,12 @@ SSmapping.map_voted = TRUE if(SSmapping.map_vote_rocked) SSmapping.map_vote_rocked = FALSE + +/proc/revert_map_vote() + var/datum/map_config/override_map = SSmapping.config + if(isnull(override_map)) + return + + SSmapping.changemap(override_map) + log_game("The next map has been reset to [override_map.map_name].") + send_to_playing_players(span_boldannounce("The next map is: [override_map.map_name].")) diff --git a/code/datums/votes/restart_vote.dm b/code/datums/votes/restart_vote.dm index 24d38f35396..987d5b87eb3 100644 --- a/code/datums/votes/restart_vote.dm +++ b/code/datums/votes/restart_vote.dm @@ -67,7 +67,14 @@ message_admins("A restart vote has passed, but there are active admins on with +SERVER, so it has been canceled. If you wish, you may restart the server.") return - SSticker.Reboot("Restart vote successful.", "restart vote", 1) + // If there was a previous map vote, we revert the change. + if(!isnull(SSmapping.next_map_config)) + log_game("The next map has been reset due to successful restart vote.") + send_to_playing_players(span_boldannounce("The next map has been reset due to successful restart vote.")) + revert_map_vote() + + SSticker.force_ending = FORCE_END_ROUND + log_game("End round forced by successful restart vote.") return CRASH("[type] wasn't passed a valid winning choice. (Got: [winning_option || "null"])") From fa9b34a07ca6e50fe6adcf5f1e5316ad4e5fe1ba Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 06:15:56 +0200 Subject: [PATCH 005/101] Suspected status is now teal [MDB IGNORE] (#23893) * Suspected status is now teal (#78516) ## About The Pull Request recolors the suspected status to teal ## Why It's Good For The Game now the security records color and the hud color match, which is good for consistency ![image](https://github.com/tgstation/tgstation/assets/124026007/f832db93-e160-4742-9868-dbc4e8bd9ad7) ## Changelog :cl: image: the security records suspected status is now teal instead of orange /:cl: * Suspected status is now teal --------- Co-authored-by: Teagarden <124026007+Vincent983@users.noreply.github.com> --- icons/mob/huds/hud.dmi | Bin 9926 -> 9278 bytes .../interfaces/SecurityRecords/constants.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index ec9be118f5792c15e650d91333fc290fdc1cb55b..9a602eeb806abd53dee9a36b19d7f41bfab4ee03 100644 GIT binary patch literal 9278 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 BeXsxk literal 9926 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 XyzzP7+<89`@b^$vOQrDM^Edwo$rmFA diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/constants.ts b/tgui/packages/tgui/interfaces/SecurityRecords/constants.ts index 36da0731371..1537b7a3e15 100644 --- a/tgui/packages/tgui/interfaces/SecurityRecords/constants.ts +++ b/tgui/packages/tgui/interfaces/SecurityRecords/constants.ts @@ -3,7 +3,7 @@ export const CRIMESTATUS2COLOR = { Discharged: 'good', Incarcerated: 'average', Parole: 'blue', - Suspected: 'purple', + Suspected: 'teal', } as const; export const CRIMESTATUS2DESC = { From ba96b93aa2878b4c5cf4162e7bf0bdc9c83380b3 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 06:39:49 +0200 Subject: [PATCH 006/101] Patches some cargo shuttle Centcom exploits. [MDB IGNORE] (#23894) * Patches some cargo shuttle Centcom exploits. (#78540) ## About The Pull Request Globally prevents anything blacklisted from actually getting to the Centcom z-level by shipping blacklisted items back to their location of origin just before the shuttle docks at Centcom. Everything rejected in this way is logged and admins are given an alert to let them know something funky went on. ![image](https://github.com/tgstation/tgstation/assets/24975989/09717f16-1115-45f2-8f8b-85b316ed4bc6) ![image](https://github.com/tgstation/tgstation/assets/24975989/af149939-1cf1-49f1-b458-7d5d4ff6ae89) ## Why It's Good For The Game Hopefully universally patches all current methods of getting to the Centcom Z-level via getting on the cargo shuttle mid-transit. Individual methods to accomplish this can still be patched individually, but this tries to blanket prevent such exploits from working on a more fundamental level. ## Changelog :cl: fix: Centcom now rejects contraband that somehow makes it way onto the cargo shuttle mid-transit and returns it. /:cl: * Patches some cargo shuttle Centcom exploits. --------- Co-authored-by: Timberpoes --- code/modules/shuttle/supply.dm | 46 +++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index aba37b37a55..44c13e39c76 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -61,17 +61,61 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/docking_port/mobile/supply/proc/check_blacklist(areaInstances) for(var/place in areaInstances) var/area/shuttle/shuttle_area = place - for(var/turf/shuttle_turf in shuttle_area) + for(var/turf/shuttle_turf in shuttle_area.get_contained_turfs()) for(var/atom/passenger in shuttle_turf.get_all_contents()) if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) return FALSE return TRUE +/// Returns anything on the cargo blacklist found within areas_to_check back to the turf of the home docking port via Centcom branded supply pod. +/obj/docking_port/mobile/supply/proc/return_blacklisted_things_home(list/area/areas_to_check, obj/docking_port/stationary/home) + var/list/stuff_to_send_home = list() + for(var/area/shuttle_area as anything in areas_to_check) + for(var/turf/shuttle_turf in shuttle_area.get_contained_turfs()) + for(var/atom/passenger in shuttle_turf.get_all_contents()) + if((is_type_in_typecache(passenger, GLOB.blacklisted_cargo_types) || HAS_TRAIT(passenger, TRAIT_BANNED_FROM_CARGO_SHUTTLE)) && !istype(passenger, /obj/docking_port)) + stuff_to_send_home += passenger + + if(!length(stuff_to_send_home)) + return FALSE + + var/obj/structure/closet/supplypod/centcompod/et_go_home = new() + + for(var/atom/movable/et as anything in stuff_to_send_home) + et.forceMove(et_go_home) + + new /obj/effect/pod_landingzone(get_turf(home), et_go_home) + + return stuff_to_send_home + /obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S) if(mode != SHUTTLE_IDLE) return 2 return ..() +/obj/docking_port/mobile/supply/check_dock(obj/docking_port/stationary/S, silent) + . = ..() + + if(!.) + return + + // If we're not trying to dock at Centcom, we don't care. + if(S.shuttle_id != "cargo_away") + return + + // Else we are docking at Centcom, check the blacklist to make sure no contraband was put onto the shuttle mid-transit. + // If there's anything contrabandy, send these items back to the origin docking port. + // This is a sort of catch-all Centcom exploit check. + var/list/stuff_sent_home = return_blacklisted_things_home(shuttle_areas, previous) + if(!length(stuff_sent_home)) + return + + for(var/atom/thing_sent_home as anything in stuff_sent_home) + investigate_log("Blacklisted item found on in-transit Cargo Shuttle: [thing_sent_home] ([thing_sent_home.type])", INVESTIGATE_CARGO) + + message_admins("Blacklisted item found on in-transit Cargo Shuttle. See cargo logs for more details.") + SSshuttle.centcom_message = "Contraband found on Cargo Shuttle. This has been returned via drop pod." + /obj/docking_port/mobile/supply/initiate_docking() if(getDockedId() == "cargo_away") // Buy when we leave home. buy() From aa0388b4b307bae3b2893758486830620a07c21b Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:18:41 +0200 Subject: [PATCH 007/101] Tweak greyscale JSON test error message [MDB IGNORE] (#23897) * Tweak greyscale JSON test error message (#78469) ## About The Pull Request Slightly changes the wording of the greyscale JSON check error. The previous creates messages such as "Expected 1 but only found 3." which implies it isn't finding enough, which isn't always the case. ## Changelog :cl: LT3 spellcheck: Improved wording in greyscale JSON error message /:cl: * Tweak greyscale JSON test error message --------- Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> --- code/modules/unit_tests/greyscale_config.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/unit_tests/greyscale_config.dm b/code/modules/unit_tests/greyscale_config.dm index 9c5106be5b0..d3d9ce9d4fd 100644 --- a/code/modules/unit_tests/greyscale_config.dm +++ b/code/modules/unit_tests/greyscale_config.dm @@ -38,4 +38,4 @@ continue var/number_of_colors = length(colors) - 1 if(config.expected_colors != number_of_colors) - TEST_FAIL("[thing] has the wrong amount of colors configured for [config.DebugName()]. Expected [config.expected_colors] but only found [number_of_colors].") + TEST_FAIL("[thing] has the wrong amount of colors configured for [config.DebugName()]. Expected [config.expected_colors] colors but found [number_of_colors].") From e6e399df911319adf35a8c1fa3cd263add634dd6 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:20:52 +0200 Subject: [PATCH 008/101] Adds a frog pAI holoform [MDB IGNORE] (#23896) * Adds a frog pAI holoform (#78537) ## About The Pull Request It has been over a year since we have got a new pAI holoform, so I present to you, the fwog. ![image](https://github.com/tgstation/tgstation/assets/20053168/3e1a77f0-e7b6-4aed-8401-c510afbcd2c5) More importantly, it can be worn on the head like a normal frog. ![image](https://github.com/tgstation/tgstation/assets/20053168/795dcfd2-d576-4722-ab6f-edbed5b8fb36) All of the new icons ![image](https://github.com/tgstation/tgstation/assets/20053168/b84ceca5-ff27-4a3a-a023-1d350762148b) ## Why It's Good For The Game More holoform variety for pAIs is nice, especially one that can be worn as a hat. ## Changelog :cl: image: adds a frog holoform for pAIs /:cl: * Adds a frog pAI holoform --------- Co-authored-by: Alexis --- code/modules/pai/pai.dm | 1 + icons/mob/clothing/head/pai_head.dmi | Bin 1630 -> 1817 bytes icons/mob/silicon/pai.dmi | Bin 59707 -> 64479 bytes 3 files changed, 1 insertion(+) diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 8c3039d8c62..e1a4dfb0ae0 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -111,6 +111,7 @@ "crow" = TRUE, "duffel" = TRUE, "fox" = FALSE, + "frog" = TRUE, "hawk" = FALSE, "lizard" = FALSE, "monkey" = TRUE, diff --git a/icons/mob/clothing/head/pai_head.dmi b/icons/mob/clothing/head/pai_head.dmi index 0a04e7e8ab29e39b9e61edd7d9a2ad417ba628fa..e5dd4965d8b8d983fed970938679e988bd589d05 100644 GIT binary patch delta 1578 zcmV+_2G#lA44Dp)7Y@J(0{{R3WdfWv0001fktJs^9vvJM6chme00932D=RBMKR+5+ z84#rqz`(!}Xb+J90004WQchCw-Ro+V+c7&eZ zAB8#X3(39Y&-6TuO1^i;RtLF2c#g zNq$*>mge%inU0(9mxc-m7PQT+3D5iD8L)YZDpk~l3OdqNnC(6kOc#5 zob=HUzjB5fLdIQD0dmMxKqDxZ#*o)9JJ`~H6xee5f`fwBPX^R>v)x?s4O~)qt9S!m zTP_%&5hRWwwLPBG6j_+$f&*G-zR9bQFTjqVDEYO$mh^k|ynZsU30J<0&P`+zN4W~u z<@6`?z#7ovB%o=&ZVOuTqlCW2{45q%+NB|d{1XnrwfBG|FQ;dpulo7N$d4xg0001g z0001hH6mu{W9j=CKT22r;KSyIE~Qj~58eowJ*{=F`Q&5>3TYeFwq@H&?K|Umf#$}w zt!o4aW#dcm4)nFHa@}zGVQm|oSN58B&^E4-3@F1Uc0-iH&N;S**5~fo&$$?|^Q;e2J@&6$&jokWmG|B3F{QiMEaUG=vG+fk&E*Sq|qGw)z3z&o{{HcN; ziR~Y7$02k|%Rau744jcq>sgxt67&g4pDO%S zd}ivLG|d1200000SUZo8k2Au%-A;%WMdVjf?Bx4n^&feZHb98-)h@KbMT@$wMGHIm z{#gA%;G7K*#S2`V4Agsn-a_>LNL-B@2y%VTZ-BV>8z7i4>D%u|iIYu?`uA)vB-}5? z)yxeLUf;f{>n3RA4D5DXFU0PT)~{x6fOvU8wZCu%_WN(U-L!(({n7e^fwT<}oPpQA zoo=8gMg_Y`1+n|%^%L?M6Djs~Trdq3#c>);DvaEpQ2!Tj?1cq?e?`%3d@uaY`c=Xg zG5`Po000000090(x|wlbge}8IUg-ONR-BrU+vsdW!!UH!Q)Q<@mIB={NO$+ohi6G) ze>faO2g8$nl3Ex#-HGv`s^}SXQx5DHsRRrC;U7A9g}o*NT5!+}m92(Ohuu4|JY%@5tccqsi5r*nI!%m;ZC(-2tm67nm=irzNTvm#MYW zA5Q=P0000000000@IMpHzefu!O5Y!z#pJ2#_48r97W#u-Pj5#IXdQXSupA*fFY6y2 zNGbdU3DV-jqwf=JE<*paPt!%kX65M5MSA9aZjSz3Bxl}No1#yawNm{60000000000 c03e-z0hR_{vHrstbpQYW07*qoM6N<$f+{rfzW@LL delta 1390 zcmV-!1(Euh4&Drq7Y?8Z0{{R3ZT6FI0001NktJsyz`(#16chme08HEVCIA2c0d!JM zQvg8b*k%9#0G5%wi+^z`QdV&Fa{&h*07vv(HJIyGh5!Hr{z*hZRCt{2oQ-muIuM2B zfB>Ze6sN&Wa)TN2{_oh8AQ{)uSz%Mh?%e%6#?zifI;%ftL=>eC*{C~uV>T+|^*qlN zl>s1u0=NP+y*LVbVX{r>*7TN6QJBm$`a}1&e5wfZCr0Z1CRsV+LlkiatV}K)-+9)l}OJ?%d#BlrgG%ZIn%`T z#<&oG6DVwLxiL~$%jsk;029bU0#GM^G{hgAK|{#62MVAJK>;*^3T_N}|9l2pngUzo zFJw?+|CE5*=6~D#9#?Qr@>bylytjf$fJP8IhSYX`$0@Tg$(amjow?&zAs+xoP?F-& zK63uOd+eVQ$io$P(WOaD;v^5@dOiOOdf*n&>?ELRe%mQ%jYkQ6i}_j1uC&*N9O4!Z z;;r`pXRn~PFK)X1Qxx-C5ClOG1VIo4LAXWO9s1PveSeCdm8*VY**wvu;tKHM6SK3Y zwJtQ?oD3qfZKJxb>N>7|XB;+Yo?O?tmdT)MeFV-xKiay`E!rQ}w$(*#A8`g<>sl@W zW#GncP)T;q!4f*ZcMmtey+K=37tjUhwWSWIEwce$F%9e;Rt7&D2my-U`sMYoC#Eeo zgvdMf0e?;);g4!Re``984jZTJ&Qb_q#?W=q%eJlyG{mmXKc7IcXy1{7ZgqFBsMA}& zK4R5Fl8ZtM4EqppdQNz|{-^d`8zBgSAP9mW2!bF8!WGzg7~Oa{bx9>$*e`lBe4 zcCPC>yu0nU|107}I>bW>JaY*+H(kP7 z^F^ca@mjfSCg9Hx{AX(%unP%<9yqoV{!JM;;GZ;F9@(EmJ}TMyb#zgx$N2LD&+Ix% z3uw5gFI_PGN2F&y1I&Ucd{W?7Qs)QUJb#4FDcpsJ*oj3n1p47)lHV6`E_i-m@?+A; zf1KkxD}f7gvY%T^fDD~r>7?NA;*_a#)-)3YK@bE%5QJOj?d@%a-1j}BmSy5kQuO@& zsq$yuxC0QZebt9LkXklP!=}*l_ovDa2G<;bC_g|tCD80~3d#Eux|$9U6#4}pfPZ-L z2Oxk<{`ULHVzi3M{~q?jg8NxrtvmqX{q5VPX@f_UK;NTYNZp?-U#&a<@zFqyzn}#6 z`@6o6J4oH1EI%Z$>;MEx;InVz6_n-VppQC8-JdR>;MbT$*x|SU6_n*X4WbSc_b({_ z8<>0HihrVLHNF@AW&diy7qTD-f`1?gf*=TjAPE0QhLySxfiYP5YYd4x2Al9Ojzj%k z+n8iY7{>8TXUiDh?K@Y)IOu`Z$GWCA7-AXNNvSWH!Z6mh9tTDrs130``WE&VAP?l; zU)H%~&?B|ch#xU&GFL;Lns@qy2It)Ci_L|B#=ywTQ?jUG?bP&3>$&JKVlx>%SY2Gq wUomqQRz(*WK@bE%5ClOG1VIo4LHK5V13gVmvSnMLu>b%707*qoM6N<$g7Ykl#{d8T diff --git a/icons/mob/silicon/pai.dmi b/icons/mob/silicon/pai.dmi index 624ed66951948eef19cde537ebe5aaacfe50c41e..2be986d411dbef5035d7eeef957fa3f7bc198906 100644 GIT binary patch literal 64479 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 literal 59707 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�eREb;0zfs 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 jeFk)*7) From 5de7596376e7da231bfd4a5bfc2c8f04552a72cb Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:21:09 +0200 Subject: [PATCH 009/101] Fixes halloween spooky meteors [MDB IGNORE] (#23895) * Fixes halloween spooky meteors (#78543) ## About The Pull Request This fixes the "spooky" meteors that get summoned during catastrophic meteor waves during the Halloween event. By adding a weight value to the SPOOKY meteor list, the meteor wave spawning event process will properly pick_weight the path it's looking for. ## Why It's Good For The Game Fixes a runtime case I hypothesized might happen. ## Changelog :cl: Rhials fix: "Spooky" meteors will now properly spawn during halloween. /:cl: * Fixes halloween spooky meteors --------- Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com> --- code/modules/meteors/meteor_waves.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/meteors/meteor_waves.dm b/code/modules/meteors/meteor_waves.dm index 4235c186a94..7d832d53713 100644 --- a/code/modules/meteors/meteor_waves.dm +++ b/code/modules/meteors/meteor_waves.dm @@ -26,4 +26,4 @@ GLOBAL_LIST_INIT(meteors_stray, list(/obj/effect/meteor/medium=15, /obj/effect/m GLOBAL_LIST_INIT(meteors_sandstorm, list(/obj/effect/meteor/sand=45, /obj/effect/meteor/dust=5)) //for sandstorm event -GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin)) +GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin=1)) From b7a014cf65947658da9500c550e9e8dcfeb26554 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:22:41 +0200 Subject: [PATCH 010/101] Adds logging for first time user connections [MDB IGNORE] (#23889) * Adds logging for first time user connections (#78525) ## About The Pull Request Fikou asked me for this and I like fikou. ![image](https://github.com/tgstation/tgstation/assets/58055496/fdf99821-2404-45c4-ac09-85e29589a7ac) ## Changelog :cl: admin: First time user connections are now logged /:cl: * Adds logging for first time user connections --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- code/modules/client/client_procs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 9c7b5e3e943..56406139379 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -473,6 +473,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/nnpa = CONFIG_GET(number/notify_new_player_age) if (isnum(cached_player_age) && cached_player_age == -1) //first connection if (nnpa >= 0) + log_admin_private("New login: [key_name(key, FALSE, TRUE)] (IP: [address], ID: [computer_id]) logged onto the servers for the first time.") message_admins("New user: [key_name_admin(src)] is connecting here for the first time.") if (CONFIG_GET(flag/irc_first_connection_alert)) var/new_player_alert_role = CONFIG_GET(string/new_player_alert_role_id) From c09c4bee476b6ec0ae49105aaa4699ddb05ebe84 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:24:04 +0200 Subject: [PATCH 011/101] Zap strength is now measured in joules. NT CIMs will now display the power transmission from the zaps, accounting for every factor. [MDB IGNORE] (#23887) * [NO GBP]Zap strength is now measured in joules. NT CIMs will now display the power transmission from the zaps, accounting for every factor. (#78310) ## About The Pull Request Zap strength is now measured in joules. Scales everything to account for this. NT CIMS will now display the zap power transmission in watts, instead of a modifier. This will allow you to actually see how much power the supermatter is generating accurately, without knowledge of hidden multipliers. NT CIMs will also show the internal energy gain from heat in eV/K/s, so you can easily figure out how internal energy gain works, and how much energy gain it actually gives. The internal energy measurement will also adjust its prefix. Internal energy is now a measure of internal energy, rather than internal energy density, removing the "/cm^3". Here is what it looked like: ![Screenshot (25)](https://github.com/tgstation/tgstation/assets/58013024/781323d4-db91-4a78-9a46-8152022993ed) This image was created on an earlier commit where the numbers were wrong due to a hidden multiplier that got removed later, so keep that in mind. Also fixes inactive supermatters unnecessarily scaling delta time. The high energy (>5GeV) additional zaps now also scale with delta time. The code in this PR is absolute garbage trash and there are some major issues, so I'm drafting this for now. ## Why It's Good For The Game Makes it more clear what the factors add, and also how much power the SM is releasing. Zap strength being measured in joules will simplify a lot of things, making power balance more clear rather than guessimating. Adjusting the prefix for internal energy is just the natural thing to do. The per cubic centimeter part of internal energy would imply it is energy density, however it is functionally not. It would probably confuse people thinking the volume of the turf or the size of the supermatter actually matters for what the internal energy does, when it does not (except for gas absorption I guess, which changes heating/mol requirements, but nothing else), so I am removing that part. ## Changelog :cl: qol: NT CIMs shows how much power the supermatter is releasing. qol: NT CIMs internal energy will adjust its prefix. qol: Energy displays (such as multitooling grid) will use the full range of SI prefixes available, up to the peta prefix if you somehow managed to reach that. del: Removes the per cubic centimeter part of internal energy. fix: Fix unnecessary delta time scaling on inactive supermatters. fix: Fix high energy zaps not scaling with delta time. fix: Fixes grounding rods lying about potential power you can generate. code: Convert supermatter_zap() and tesla_zap() zap_str argument unit to be in joules, and scales everything that uses that argument. /:cl: * [NO GBP]Zap strength is now measured in joules. NT CIMs will now display the power transmission from the zaps, accounting for every factor. --------- Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com> --- code/__DEFINES/maths.dm | 3 + code/__DEFINES/supermatter.dm | 10 +- code/__HELPERS/maths.dm | 57 +++++++--- code/__HELPERS/text.dm | 23 +--- code/datums/mutations/touch.dm | 2 +- code/game/machinery/_machinery.dm | 4 +- .../effects/anomalies/anomalies_flux.dm | 2 +- code/game/objects/obj_defense.dm | 2 +- code/game/objects/structures.dm | 4 +- .../abductor/equipment/glands/electric.dm | 2 +- .../antagonists/blob/structures/_blob.dm | 6 +- .../components/fusion/hfr_main_processes.dm | 6 +- .../modules/clothing/suits/reactive_armour.dm | 2 +- code/modules/power/rtg.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 106 ++++++++++++------ .../supermatter/supermatter_extra_effects.dm | 8 +- .../power/supermatter/supermatter_gas.dm | 24 ++-- code/modules/power/tesla/coil.dm | 9 +- code/modules/power/tesla/energy_ball.dm | 8 +- .../projectiles/projectile/energy/tesla.dm | 4 +- code/modules/projectiles/projectile/magic.dm | 4 +- .../chemistry/recipes/pyrotechnics.dm | 6 +- .../internal/stomach/stomach_ethereal.dm | 2 +- tgui/packages/tgui/interfaces/Supermatter.tsx | 52 +++++---- 24 files changed, 205 insertions(+), 143 deletions(-) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index eb1b2ecce51..1260e3daf03 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -254,3 +254,6 @@ /// Returns a random decimal between x and y. #define RANDOM_DECIMAL(x, y) LERP((x), (y), rand()) + +#define SI_COEFFICIENT "coefficient" +#define SI_UNIT "unit" diff --git a/code/__DEFINES/supermatter.dm b/code/__DEFINES/supermatter.dm index bac35207fb5..5eab41fcdf9 100644 --- a/code/__DEFINES/supermatter.dm +++ b/code/__DEFINES/supermatter.dm @@ -28,6 +28,12 @@ #define MATTER_POWER_CONVERSION 10 //Crystal converts 1/this value of stored matter into energy. +/// The internal energy gain coefficient. +#define GAS_HEAT_POWER_SCALING_COEFFICIENT (1/6) + +/// The base zap power transmission of the supermatter crystal in W/MeV. +#define BASE_POWER_TRANSMISSION_RATE 1040 + //These would be what you would get at point blank, decreases with distance #define DETONATION_HALLUCINATION (20 MINUTES) @@ -165,9 +171,9 @@ #define SM_TEMP_LIMIT_LOW_MOLES "Low Moles Heat Resistance" /// How much we are multiplying our zap energy. -#define SM_ZAP_BASE "Base Zap Multiplier" +#define SM_ZAP_BASE "Base Zap Transmission" /// How much we are multiplying our zap energy because of gas factors. -#define SM_ZAP_GAS "Gas Zap Multiplier" +#define SM_ZAP_GAS "Gas Zap Transmission Modifier" /// Delamination types. #define CASCADE_DELAMINATION "cascade" #define SINGULARITY_DELAMINATION "singularity" diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 6cda3466949..116fb34fad5 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -119,25 +119,48 @@ dx -= 1 return perimeter -///Format a power value in W, kW, MW, or GW. +/** + * Formats a number into a list representing the si unit. + * Access the coefficient with [SI_COEFFICIENT], and access the unit with [SI_UNIT]. + * + * Supports SI exponents between 1e-15 to 1e15, but properly handles numbers outside that range as well. + * Arguments: + * * value - The number to convert to text. Can be positive or negative. + * * unit - The base unit of the number, such as "Pa" or "W". + * * maxdecimals - Maximum amount of decimals to display for the final number. Defaults to 1. + * Returns: [SI_COEFFICIENT = si unit coefficient, SI_UNIT = prefixed si unit.] + */ +/proc/siunit_isolated(value, unit, maxdecimals=1) + var/static/list/prefixes = list("f","p","n","μ","m","","k","M","G","T","P") + + // We don't have prefixes beyond this point + // and this also captures value = 0 which you can't compute the logarithm for + // and also byond numbers are floats and doesn't have much precision beyond this point anyway + if(abs(value) <= 1e-18) + . = list(SI_COEFFICIENT = 0, SI_UNIT = " [unit]") + return + + var/exponent = clamp(log(10, abs(value)), -15, 15) // Calculate the exponent and clamp it so we don't go outside the prefix list bounds + var/divider = 10 ** (round(exponent / 3) * 3) // Rounds the exponent to nearest SI unit and power it back to the full form + var/coefficient = round(value / divider, 10 ** -maxdecimals) // Calculate the coefficient and round it to desired decimals + var/prefix_index = round(exponent / 3) + 6 // Calculate the index in the prefixes list for this exponent + + // An edge case which happens if we round 999.9 to 0 decimals for example, which gets rounded to 1000 + // In that case, we manually swap up to the next prefix if there is one available + if(coefficient >= 1000 && prefix_index < 11) + coefficient /= 1e3 + prefix_index++ + + var/prefix = prefixes[prefix_index] + . = list(SI_COEFFICIENT = coefficient, SI_UNIT = " [prefix][unit]") + +///Format a power value in prefixed watts. /proc/display_power(powerused) - if(powerused < 1000) //Less than a kW - return "[powerused] W" - else if(powerused < 1000000) //Less than a MW - return "[round((powerused * 0.001),0.01)] kW" - else if(powerused < 1000000000) //Less than a GW - return "[round((powerused * 0.000001),0.001)] MW" - return "[round((powerused * 0.000000001),0.0001)] GW" - -///Format an energy value in J, kJ, MJ, or GJ. 1W = 1J/s. + return siunit(powerused, "W", 3) + +///Format an energy value in prefixed joules. /proc/display_joules(units) - if (units < 1000) // Less than a kJ - return "[round(units, 0.1)] J" - else if (units < 1000000) // Less than a MJ - return "[round(units * 0.001, 0.01)] kJ" - else if (units < 1000000000) // Less than a GJ - return "[round(units * 0.000001, 0.001)] MJ" - return "[round(units * 0.000000001, 0.0001)] GJ" + return siunit(units, "J", 3) /proc/joules_to_energy(joules) return joules * (1 SECONDS) / SSmachines.wait diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index f75e6770207..00317d8cf1c 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -1048,27 +1048,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) * * For pressure conversion, use proc/siunit_pressure() below */ /proc/siunit(value, unit, maxdecimals=1) - var/static/list/prefixes = list("f","p","n","μ","m","","k","M","G","T","P") - - // We don't have prefixes beyond this point - // and this also captures value = 0 which you can't compute the logarithm for - // and also byond numbers are floats and doesn't have much precision beyond this point anyway - if(abs(value) <= 1e-18) - return "0 [unit]" - - var/exponent = clamp(log(10, abs(value)), -15, 15) // Calculate the exponent and clamp it so we don't go outside the prefix list bounds - var/divider = 10 ** (round(exponent / 3) * 3) // Rounds the exponent to nearest SI unit and power it back to the full form - var/coefficient = round(value / divider, 10 ** -maxdecimals) // Calculate the coefficient and round it to desired decimals - var/prefix_index = round(exponent / 3) + 6 // Calculate the index in the prefixes list for this exponent - - // An edge case which happens if we round 999.9 to 0 decimals for example, which gets rounded to 1000 - // In that case, we manually swap up to the next prefix if there is one available - if(coefficient >= 1000 && prefix_index < 11) - coefficient /= 1e3 - prefix_index++ - - var/prefix = prefixes[prefix_index] - return "[coefficient] [prefix][unit]" + var/si_isolated = siunit_isolated(value, unit, maxdecimals) + return "[si_isolated[SI_COEFFICIENT]][si_isolated[SI_UNIT]]" /** The game code never uses Pa, but kPa, since 1 Pa is too small to reasonably handle diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index 1f1cefe1cbe..3f798ba52b2 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -38,7 +38,7 @@ ///This var decides if the spell should chain, dictated by presence of power chromosome var/chain = FALSE ///Affects damage, should do about 1 per limb - var/zap_power = 7500 + var/zap_power = 3e6 ///Range of tesla shock bounces var/zap_range = 7 ///flags that dictate what the tesla shock can interact with, Can only damage mobs, Cannot damage machines or generate energy diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index b6327480399..349a895238d 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -1122,10 +1122,10 @@ if(prob(85) && (zap_flags & ZAP_MACHINE_EXPLOSIVE) && !(resistance_flags & INDESTRUCTIBLE)) explosion(src, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 4, flame_range = 2, adminlog = FALSE, smoke = FALSE) else if(zap_flags & ZAP_OBJ_DAMAGE) - take_damage(power * 0.0005, BURN, ENERGY) + take_damage(power * 6.25e-7, BURN, ENERGY) if(prob(40)) emp_act(EMP_LIGHT) - power -= power * 0.0005 + power -= power * 5e-4 return ..() /obj/machinery/proc/adjust_item_drop_location(atom/movable/dropped_atom) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 diff --git a/code/game/objects/effects/anomalies/anomalies_flux.dm b/code/game/objects/effects/anomalies/anomalies_flux.dm index eee4319b352..2bb3ab28a1a 100644 --- a/code/game/objects/effects/anomalies/anomalies_flux.dm +++ b/code/game/objects/effects/anomalies/anomalies_flux.dm @@ -66,7 +66,7 @@ ///range in whuich we zap var/zap_range = 1 ///strength of the zappy - var/zap_power = 2500 + var/zap_power = 1e6 ///the zappy flags var/zap_flags = ZAP_GENERATES_POWER | ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 524c189acc6..a06b7fdaea7 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -145,7 +145,7 @@ if(has_buckled_mobs()) for(var/m in buckled_mobs) var/mob/living/buckled_mob = m - buckled_mob.electrocute_act((clamp(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) + buckled_mob.electrocute_act((clamp(round(strength * 3.125e-6), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) ///the obj is deconstructed into pieces, whether through careful disassembly or when destroyed. /obj/proc/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 71d15fb3f58..ba8623ec4aa 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -63,6 +63,6 @@ /obj/structure/zap_act(power, zap_flags) if(zap_flags & ZAP_OBJ_DAMAGE) - take_damage(power/8000, BURN, "energy") - power -= power/2000 //walls take a lot out of ya + take_damage(power * 1.5625e-7, BURN, "energy") + power -= power * 5e-4 //walls take a lot out of ya . = ..() diff --git a/code/modules/antagonists/abductor/equipment/glands/electric.dm b/code/modules/antagonists/abductor/equipment/glands/electric.dm index acb1505a71c..9c4d47dc337 100644 --- a/code/modules/antagonists/abductor/equipment/glands/electric.dm +++ b/code/modules/antagonists/abductor/equipment/glands/electric.dm @@ -22,5 +22,5 @@ addtimer(CALLBACK(src, PROC_REF(zap)), rand(30, 100)) /obj/item/organ/internal/heart/gland/electric/proc/zap() - tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) + tesla_zap(owner, 4, 3.2e6, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN) playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE) diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 3580e3f3bf8..543da00d2f5 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -227,10 +227,10 @@ /obj/structure/blob/zap_act(power, zap_flags) if(overmind) if(overmind.blobstrain.tesla_reaction(src, power)) - take_damage(power * 0.0025, BURN, ENERGY) + take_damage(power * 3.125e-6, BURN, ENERGY) else - take_damage(power * 0.0025, BURN, ENERGY) - power -= power * 0.0025 //You don't get to do it for free + take_damage(power * 3.125e-6, BURN, ENERGY) + power -= power * 2.5e-3 //You don't get to do it for free return ..() //You don't get to do it for free /obj/structure/blob/extinguish() diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm index 5062ec7731f..c6e1d6183ef 100644 --- a/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm +++ b/code/modules/atmospherics/machinery/components/fusion/hfr_main_processes.dm @@ -480,8 +480,8 @@ if(critical_threshold_proximity > 650 && prob(20)) zap_number += 1 - var/cutoff = 1500 - cutoff = clamp(3000 - (power_level * (internal_fusion.total_moles() * 0.45)), 450, 3000) + var/cutoff = 1.2e6 + cutoff = clamp(2.4e6 - (power_level * (internal_fusion.total_moles() * 360)), 3.6e5, 2.4e6) var/zaps_aspect = DEFAULT_ZAP_ICON_STATE var/flags = ZAP_SUPERMATTER_FLAGS @@ -495,7 +495,7 @@ playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) for(var/i in 1 to zap_number) - supermatter_zap(src, 5, power_level * 300, flags, zap_cutoff = cutoff, power_level = src.power_level * 1000, zap_icon = zaps_aspect) + supermatter_zap(src, 5, power_level * 2.4e5, flags, zap_cutoff = cutoff, power_level = src.power_level * 1000, zap_icon = zaps_aspect) /obj/machinery/atmospherics/components/unary/hypertorus/core/proc/check_gravity_pulse(seconds_per_tick) if(SPT_PROB(100 - critical_threshold_proximity / 15, seconds_per_tick)) diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 9537fa7b6ef..6c33e287f03 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -226,7 +226,7 @@ emp_message = span_warning("The tesla capacitors beep ominously for a moment.") clothing_traits = list(TRAIT_TESLA_SHOCKIMMUNE) /// How strong are the zaps we give off? - var/zap_power = 25000 + var/zap_power = 1e7 /// How far to the zaps we give off go? var/zap_range = 20 /// What flags do we pass to the zaps we give off? diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index c49bc455165..974c2e66737 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -71,7 +71,7 @@ visible_message(span_danger("\The [src] lets out a shower of sparks as it starts to lose stability!"),\ span_hear("You hear a loud electrical crack!")) playsound(src.loc, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) - tesla_zap(src, 5, power_gen * 0.05) + tesla_zap(src, 5, power_gen * 20) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, 2, 3, 4, null, 8), 10 SECONDS) // Not a normal explosion. /obj/machinery/power/rtg/abductor/bullet_act(obj/projectile/Proj) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 654ea805440..8598b3cccf2 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -53,8 +53,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/damage_archived = 0 var/list/damage_factors - /// How much extra power does the main zap generate. - var/zap_multiplier = 1 + /// The zap power transmission over internal energy. W/MeV. + var/zap_transmission_rate = BASE_POWER_TRANSMISSION_RATE var/list/zap_factors /// The temperature at which we start taking damage @@ -95,7 +95,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /// How much power decay is negated. Complete power decay negation at 1. var/gas_powerloss_inhibition = 0 /// Affects the amount of power the main SM zap makes. - var/gas_power_transmission = 0 + var/gas_power_transmission_rate = 0 /// Affects the power gain the SM experiances from heat. var/gas_heat_power_generation = 0 @@ -109,7 +109,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/external_damage_immediate = 0 ///The cutoff for a bolt jumping, grows with heat, lowers with higher mol count, - var/zap_cutoff = 1500 + var/zap_cutoff = 1.2e6 ///How much the bullets damage should be multiplied by when it is added to the internal variables var/bullet_energy = SUPERMATTER_DEFAULT_BULLET_ENERGY ///How much hallucination should we produce per unit of power? @@ -153,6 +153,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///Stores the time of when the last zap occurred var/last_power_zap = 0 + var/last_high_energy_zap = 0 ///Do we show this crystal in the CIMS modular program var/include_in_cims = TRUE @@ -275,7 +276,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) // PART 3: POWER PROCESSING internal_energy_factors = calculate_internal_energy() - zap_factors = calculate_zap_multiplier() + zap_factors = calculate_zap_transmission_rate() if(internal_energy && (last_power_zap + (4 - internal_energy * 0.001) SECONDS) < world.time) playsound(src, 'sound/weapons/emitter2.ogg', 70, TRUE) hue_angle_shift = clamp(903 * log(10, (internal_energy + 8000)) - 3590, -50, 240) @@ -286,9 +287,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) supermatter_zap( zapstart = src, range = 3, - zap_str = 1.25 * internal_energy * zap_multiplier * delta_time, + zap_str = internal_energy * zap_transmission_rate * delta_time, zap_flags = ZAP_SUPERMATTER_FLAGS, - zap_cutoff = 300 * delta_time, + zap_cutoff = 2.4e5 * delta_time, power_level = internal_energy, color = zap_color, ) @@ -374,15 +375,20 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) "name" = factor, "amount" = amount * -1 )) + var/list/internal_energy_si_derived_data = siunit_isolated(internal_energy * 1e6, "eV", 3) data["internal_energy"] = internal_energy + data["internal_energy_coefficient"] = internal_energy_si_derived_data[SI_COEFFICIENT] + data["internal_energy_unit"] = internal_energy_si_derived_data[SI_UNIT] data["internal_energy_factors"] = list() for (var/factor in internal_energy_factors) + var/list/internal_energy_factor_si_derived_data = siunit_isolated(internal_energy_factors[factor] * 1e6, "eV", 3) var/amount = round(internal_energy_factors[factor], 0.01) if(!amount) continue data["internal_energy_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = internal_energy_factor_si_derived_data[SI_COEFFICIENT], + "unit" = internal_energy_factor_si_derived_data[SI_UNIT], )) data["temp_limit"] = temp_limit data["temp_limit_factors"] = list() @@ -392,7 +398,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) continue data["temp_limit_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = amount, )) data["waste_multiplier"] = waste_multiplier data["waste_multiplier_factors"] = list() @@ -402,18 +408,42 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) continue data["waste_multiplier_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = amount, )) - data["zap_multiplier"] = zap_multiplier - data["zap_multiplier_factors"] = list() + + data["zap_transmission_factors"] = list() for (var/factor in zap_factors) - var/amount = round(zap_factors[factor], 0.01) - if(!amount) + var/list/zap_factor_si_derived_data = siunit_isolated(zap_factors[factor] * internal_energy, "W", 2) + if(!zap_factor_si_derived_data[SI_COEFFICIENT]) continue - data["zap_multiplier_factors"] += list(list( + data["zap_transmission_factors"] += list(list( "name" = factor, - "amount" = amount + "amount" = zap_factor_si_derived_data[SI_COEFFICIENT], + "unit" = zap_factor_si_derived_data[SI_UNIT], )) + + ///Add high energy bonus to the zap transmission data so we can accurately measure our power generation from zaps. + var/high_energy_bonus = 0 + var/zap_transmission = zap_transmission_rate * internal_energy + var/zap_power_multiplier = 1 + if(internal_energy > POWER_PENALTY_THRESHOLD) //Supermatter zaps multiply power internally under some conditions for some reason, so we'll snowflake this for now. + ///Power multiplier bonus applied to all zaps. Zap power generation doubles when it reaches 7GeV and 9GeV. + zap_power_multiplier *= 2 ** clamp(round((internal_energy - POWER_PENALTY_THRESHOLD) / 2000), 0, 2) + ///The supermatter releases additional zaps after 5GeV, with more at 7GeV and 9GeV. + var/additional_zap_bonus = clamp(internal_energy * 3200, 6.4e6, 3.2e7) * clamp(round(INVERSE_LERP(1000, 3000, internal_energy)), 1, 4) + high_energy_bonus = (zap_transmission + additional_zap_bonus) * zap_power_multiplier - zap_transmission + var/list/zap_factor_si_derived_data = siunit_isolated(high_energy_bonus, "W", 2) + data["zap_transmission_factors"] += list(list( + "name" = "High Energy Bonus", + "amount" = zap_factor_si_derived_data[SI_COEFFICIENT], + "unit" = zap_factor_si_derived_data[SI_UNIT], + )) + + var/list/zap_transmission_si_derived_data = siunit_isolated(zap_transmission + high_energy_bonus, "W", 2) + data["zap_transmission"] = zap_transmission + high_energy_bonus + data["zap_transmission_coefficient"] = zap_transmission_si_derived_data[SI_COEFFICIENT] + data["zap_transmission_unit"] = zap_transmission_si_derived_data[SI_UNIT] + data["absorbed_ratio"] = absorption_ratio var/list/formatted_gas_percentage = list() for (var/datum/gas/gas_path as anything in subtypesof(/datum/gas)) @@ -577,7 +607,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) * * Updates: * [/obj/machinery/power/supermatter_crystal/var/list/gas_percentage] - * [/obj/machinery/power/supermatter_crystal/var/gas_power_transmission] + * [/obj/machinery/power/supermatter_crystal/var/gas_power_transmission_rate] * [/obj/machinery/power/supermatter_crystal/var/gas_heat_modifier] * [/obj/machinery/power/supermatter_crystal/var/gas_heat_resistance] * [/obj/machinery/power/supermatter_crystal/var/gas_heat_power_generation] @@ -590,7 +620,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) return gas_percentage = list() - gas_power_transmission = 0 + gas_power_transmission_rate = 0 gas_heat_modifier = 0 gas_heat_resistance = 0 gas_heat_power_generation = 0 @@ -607,7 +637,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/datum/sm_gas/sm_gas = current_gas_behavior[gas_path] if(!sm_gas) continue - gas_power_transmission += sm_gas.power_transmission * gas_percentage[gas_path] + gas_power_transmission_rate += sm_gas.power_transmission * gas_percentage[gas_path] gas_heat_modifier += sm_gas.heat_modifier * gas_percentage[gas_path] gas_heat_resistance += sm_gas.heat_resistance * gas_percentage[gas_path] gas_heat_power_generation += sm_gas.heat_power_generation * gas_percentage[gas_path] @@ -637,7 +667,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) external_power_trickle -= min(additive_power[SM_POWER_EXTERNAL_TRICKLE], external_power_trickle) additive_power[SM_POWER_EXTERNAL_IMMEDIATE] = external_power_immediate external_power_immediate = 0 - additive_power[SM_POWER_HEAT] = gas_heat_power_generation * absorbed_gasmix.temperature / 6 + additive_power[SM_POWER_HEAT] = gas_heat_power_generation * absorbed_gasmix.temperature * GAS_HEAT_POWER_SCALING_COEFFICIENT additive_power[SM_POWER_HEAT] && log_activation(who = "environmental factors") // I'm sorry for this, but we need to calculate power lost immediately after power gain. @@ -660,6 +690,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(internal_energy && !activation_logged) stack_trace("Supermatter powered for the first time without being logged. Internal energy factors: [json_encode(internal_energy_factors)]") activation_logged = TRUE // so we dont spam the log. + else if(!internal_energy) + last_power_zap = world.time return additive_power /** Log when the supermatter is activated for the first time. @@ -685,24 +717,24 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) activation_logged = TRUE /** - * Perform calculation for the main zap power multiplier. + * Perform calculation for the main zap power transmission rate in W/MeV. * Description of each factors can be found in the defines. * * Updates: - * [/obj/machinery/power/supermatter_crystal/var/zap_multiplier] + * [/obj/machinery/power/supermatter_crystal/var/zap_transmission_rate] * * Returns: The factors that have influenced the calculation. list[FACTOR_DEFINE] = number */ -/obj/machinery/power/supermatter_crystal/proc/calculate_zap_multiplier() - var/list/additive_transmission = list() - additive_transmission[SM_ZAP_BASE] = 1 - additive_transmission[SM_ZAP_GAS] = gas_power_transmission +/obj/machinery/power/supermatter_crystal/proc/calculate_zap_transmission_rate() + var/list/additive_transmission_rate = list() + additive_transmission_rate[SM_ZAP_BASE] = BASE_POWER_TRANSMISSION_RATE + additive_transmission_rate[SM_ZAP_GAS] = BASE_POWER_TRANSMISSION_RATE * gas_power_transmission_rate - zap_multiplier = 0 - for (var/transmission_types in additive_transmission) - zap_multiplier += additive_transmission[transmission_types] - zap_multiplier = max(zap_multiplier, 0) - return additive_transmission + zap_transmission_rate = 0 + for (var/transmission_types in additive_transmission_rate) + zap_transmission_rate += additive_transmission_rate[transmission_types] + zap_transmission_rate = max(zap_transmission_rate, 0) + return additive_transmission_rate /** * Perform calculation for the waste multiplier. @@ -836,7 +868,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) delamination_strategy.on_select(src) return TRUE -/obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 4000, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1500, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) +/obj/machinery/proc/supermatter_zap(atom/zapstart = src, range = 5, zap_str = 3.2e6, zap_flags = ZAP_SUPERMATTER_FLAGS, list/targets_hit = list(), zap_cutoff = 1.2e6, power_level = 0, zap_icon = DEFAULT_ZAP_ICON_STATE, color = null) if(QDELETED(zapstart)) return . = zapstart.dir @@ -931,13 +963,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Going boom should be rareish if(prob(80)) zap_flags &= ~ZAP_MACHINE_EXPLOSIVE - if(target_type == COIL) - var/multi = 2 - switch(power_level)//Between 7k and 9k it's 4, above that it's 8 + if(target_type == COIL || target_type == ROD) + var/multi = 1 + switch(power_level)//Between 7k and 9k it's 2, above that it's 4 if(SEVERE_POWER_PENALTY_THRESHOLD to CRITICAL_POWER_PENALTY_THRESHOLD) - multi = 4 + multi = 2 if(CRITICAL_POWER_PENALTY_THRESHOLD to INFINITY) - multi = 8 + multi = 4 if(zap_flags & ZAP_SUPERMATTER_FLAGS) var/remaining_power = target.zap_act(zap_str * multi, zap_flags) zap_str = remaining_power / multi //Coils should take a lot out of the power of the zap diff --git a/code/modules/power/supermatter/supermatter_extra_effects.dm b/code/modules/power/supermatter/supermatter_extra_effects.dm index 7fe56d9c2d4..efd84c677fa 100644 --- a/code/modules/power/supermatter/supermatter_extra_effects.dm +++ b/code/modules/power/supermatter/supermatter_extra_effects.dm @@ -91,6 +91,7 @@ /obj/machinery/power/supermatter_crystal/proc/handle_high_power() if(internal_energy <= POWER_PENALTY_THRESHOLD && damage <= danger_point) //If the power is above 5000 or if the damage is above 550 + last_high_energy_zap = world.time //Prevent oddly high initial zap due to high energy zaps not getting triggered via too low energy. return var/range = 4 zap_cutoff = 1500 @@ -99,7 +100,7 @@ var/temp = absorbed_gasmix.temperature if(pressure > 0 && temp > 0) //You may be able to freeze the zapstate of the engine with good planning, we'll see - zap_cutoff = clamp(3000 - (internal_energy * total_moles / 10) / temp, 350, 3000)//If the core is cold, it's easier to jump, ditto if there are a lot of mols + zap_cutoff = clamp(1.2e6 - (internal_energy * total_moles * 40) / temp, 1.4e5, 1.2e6)//If the core is cold, it's easier to jump, ditto if there are a lot of mols //We should always be able to zap our way out of the default enclosure //See supermatter_zap() for more details range = clamp(internal_energy / pressure * 10, 2, 7) @@ -128,9 +129,10 @@ if(zap_count >= 1) playsound(loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) + var/delta_time = min((world.time - last_high_energy_zap) * 0.1, 16) for(var/i in 1 to zap_count) - supermatter_zap(src, range, clamp(internal_energy*2, 4000, 20000), flags, zap_cutoff = src.zap_cutoff, power_level = internal_energy, zap_icon = src.zap_icon) - + supermatter_zap(src, range, clamp(internal_energy * 3200, 6.4e6, 3.2e7) * delta_time, flags, zap_cutoff = src.zap_cutoff * delta_time, power_level = internal_energy, zap_icon = src.zap_icon) + last_high_energy_zap = world.time if(prob(5)) supermatter_anomaly_gen(src, FLUX_ANOMALY, rand(5, 10)) if(prob(5)) diff --git a/code/modules/power/supermatter/supermatter_gas.dm b/code/modules/power/supermatter/supermatter_gas.dm index 141f78a38b8..df8ef8e5b4f 100644 --- a/code/modules/power/supermatter/supermatter_gas.dm +++ b/code/modules/power/supermatter/supermatter_gas.dm @@ -17,33 +17,40 @@ // Positive is true if more of the amount is a good thing. var/list/numeric_data = list() if(sm_gas.power_transmission) + var/list/si_derived_data = siunit_isolated(sm_gas.power_transmission * BASE_POWER_TRANSMISSION_RATE, "W/MeV", 2) numeric_data += list(list( - "name" = "Power Transmission", - "amount" = sm_gas.power_transmission, + "name" = "Power Transmission Bonus", + "amount" = si_derived_data["coefficient"], + "unit" = si_derived_data["unit"], "positive" = TRUE, )) if(sm_gas.heat_modifier) numeric_data += list(list( "name" = "Waste Multiplier", - "amount" = sm_gas.heat_modifier, + "amount" = 100 * sm_gas.heat_modifier, + "unit" = "%", "positive" = FALSE, )) if(sm_gas.heat_resistance) numeric_data += list(list( "name" = "Heat Resistance", - "amount" = sm_gas.heat_resistance, + "amount" = 100 * sm_gas.heat_resistance, + "unit" = "%", "positive" = TRUE, )) if(sm_gas.heat_power_generation) + var/list/si_derived_data = siunit_isolated(sm_gas.heat_power_generation * GAS_HEAT_POWER_SCALING_COEFFICIENT * 1e7 / SSair.wait, "eV/K/s", 2) numeric_data += list(list( "name" = "Heat Power Gain", - "amount" = sm_gas.heat_power_generation, + "amount" = si_derived_data["coefficient"], + "unit" = si_derived_data["unit"], "positive" = TRUE, )) if(sm_gas.powerloss_inhibition) numeric_data += list(list( "name" = "Power Decay Negation", - "amount" = sm_gas.powerloss_inhibition, + "amount" = 100 * sm_gas.powerloss_inhibition, + "unit" = "%", "positive" = TRUE, )) singular_gas_data["numeric_data"] = numeric_data @@ -59,8 +66,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) /datum/sm_gas /// Path of the [/datum/gas] involved with this interaction. var/gas_path - - /// Influences zap power without interfering with the crystal's own energy. + /// Influences zap power without interfering with the crystal's own energy. Gets scaled by [BASE_POWER_TRANSMISSION_RATE]. var/power_transmission = 0 /// How much more waste heat and gas the SM generates. var/heat_modifier = 0 @@ -216,7 +222,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) sm.supermatter_zap( sm, range = 6, - zap_str = clamp(sm.internal_energy * 2, 4000, 20000), + zap_str = clamp(sm.internal_energy * 1600, 3.2e6, 1.6e7), zap_flags = ZAP_MOB_STUN, zap_cutoff = sm.zap_cutoff, power_level = sm.internal_energy, diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 098ff7ceaee..3cf040b76ef 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -1,7 +1,5 @@ // zap needs to be over this amount to get power -#define TESLA_COIL_THRESHOLD 80 -// each zap power unit produces 400 joules -#define ZAP_TO_ENERGY(p) (joules_to_energy((p) * 400)) +#define TESLA_COIL_THRESHOLD 32000 /obj/machinery/power/energy_accumulator/tesla_coil name = "tesla coil" @@ -107,7 +105,7 @@ power /= 10 zap_buckle_check(power) var/power_removed = powernet ? power * input_power_multiplier : power - stored_energy += max(ZAP_TO_ENERGY(power_removed - TESLA_COIL_THRESHOLD), 0) + stored_energy += max(joules_to_energy(power_removed - TESLA_COIL_THRESHOLD), 0) return max(power - power_removed, 0) //You get back the amount we didn't use /obj/machinery/power/energy_accumulator/tesla_coil/proc/zap() @@ -170,10 +168,9 @@ if(anchored && !panel_open) flick("grounding_rodhit", src) zap_buckle_check(power) - stored_energy += ZAP_TO_ENERGY(power) + stored_energy += joules_to_energy(power) return 0 else . = ..() #undef TESLA_COIL_THRESHOLD -#undef ZAP_TO_ENERGY diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index b21938e2608..7ee8c0085c9 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -1,5 +1,5 @@ -#define TESLA_DEFAULT_POWER 1738260 -#define TESLA_MINI_POWER 869130 +#define TESLA_DEFAULT_POWER 6.95304e8 +#define TESLA_MINI_POWER 3.47652e8 //Zap constants, speeds up targeting #define BIKE (COIL + 1) #define COIL (ROD + 1) @@ -205,7 +205,7 @@ if(!(zap_flags & ZAP_ALLOW_DUPLICATES)) LAZYSET(shocked_targets, source, TRUE) //I don't want no null refs in my list yeah? . = source.dir - if(power < 1000) + if(power < 4e5) return /* @@ -334,7 +334,7 @@ var/mob/living/closest_mob = closest_atom ADD_TRAIT(closest_mob, TRAIT_BEING_SHOCKED, WAS_SHOCKED) addtimer(TRAIT_CALLBACK_REMOVE(closest_mob, TRAIT_BEING_SHOCKED, WAS_SHOCKED), 1 SECONDS) - var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/600), 90) + rand(-5, 5)) : 0 + var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/2.4e5), 90) + rand(-5, 5)) : 0 closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN)) if(issilicon(closest_mob)) var/mob/living/silicon/S = closest_mob diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 9afb816088f..687bd1b8e73 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -5,7 +5,7 @@ damage = 10 //A worse lasergun var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN var/zap_range = 3 - var/power = 10000 + var/power = 4e6 /obj/projectile/energy/tesla/on_hit(atom/target) . = ..() @@ -22,7 +22,7 @@ /obj/projectile/energy/tesla/cannon name = "tesla orb" - power = 20000 + power = 8e6 damage = 15 //Mech man big /obj/projectile/energy/tesla_cannon diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index afe59235478..c8da91b9dde 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -481,7 +481,7 @@ speed = 0.3 /// The power of the zap itself when it electrocutes someone - var/zap_power = 20000 + var/zap_power = 8e6 /// The range of the zap itself when it electrocutes someone var/zap_range = 15 /// The flags of the zap itself when it electrocutes someone @@ -503,7 +503,7 @@ return ..() /obj/projectile/magic/aoe/lightning/no_zap - zap_power = 10000 + zap_power = 4e6 zap_range = 4 zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 707a1dca350..9083de70902 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -542,9 +542,9 @@ reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison. - var/T2 = created_volume * 50 - var/T3 = created_volume * 120 + var/T1 = created_volume * 8e3 //100 units : Zap 3 times, with powers 8e5/2e6/4.8e6. Tesla revolvers have a power of 10000 for comparison. + var/T2 = created_volume * 2e4 + var/T3 = created_volume * 4.8e4 var/added_delay = 0.5 SECONDS if(created_volume >= 75) addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T1), added_delay) diff --git a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm index 4d43b6a3a0a..4cc8ee404c1 100644 --- a/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/internal/stomach/stomach_ethereal.dm @@ -92,7 +92,7 @@ playsound(carbon, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) carbon.cut_overlay(overcharge) - tesla_zap(carbon, 2, crystal_charge*2.5, ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) + tesla_zap(carbon, 2, crystal_charge * 1e3, ZAP_OBJ_DAMAGE | ZAP_LOW_POWER_GEN | ZAP_ALLOW_DUPLICATES) adjust_charge(ETHEREAL_CHARGE_FULL - crystal_charge) carbon.visible_message(span_danger("[carbon] violently discharges energy!"), span_warning("You violently discharge energy!")) diff --git a/tgui/packages/tgui/interfaces/Supermatter.tsx b/tgui/packages/tgui/interfaces/Supermatter.tsx index 5dd1bf8c399..57820fd038c 100644 --- a/tgui/packages/tgui/interfaces/Supermatter.tsx +++ b/tgui/packages/tgui/interfaces/Supermatter.tsx @@ -16,6 +16,7 @@ type SMGasMetadata = { numeric_data: { name: string; amount: number; + unit: string; positive: BooleanLike; }[]; }; @@ -28,9 +29,13 @@ type SupermatterProps = { integrity: number; integrity_factors: { name: string; amount: number }[]; internal_energy: number; - internal_energy_factors: { name: string; amount: number }[]; - zap_multiplier: number; - zap_multiplier_factors: { name: string; amount: number }[]; + internal_energy_coefficient: number; + internal_energy_unit: string; + internal_energy_factors: { name: string; amount: number; unit: string }[]; + zap_transmission: number; + zap_transmission_coefficient: number; + zap_transmission_unit: string; + zap_transmission_factors: { name: string; amount: number; unit: string }[]; temp_limit: number; temp_limit_factors: { name: string; amount: number }[]; waste_multiplier: number; @@ -92,9 +97,13 @@ export const SupermatterContent = (props: SupermatterProps, context) => { integrity, integrity_factors, internal_energy, + internal_energy_coefficient, + internal_energy_unit, internal_energy_factors, - zap_multiplier, - zap_multiplier_factors, + zap_transmission, + zap_transmission_coefficient, + zap_transmission_unit, + zap_transmission_factors, temp_limit, temp_limit_factors, waste_multiplier, @@ -166,19 +175,20 @@ export const SupermatterContent = (props: SupermatterProps, context) => { average: [5000, 7000], bad: [7000, Infinity], }}> - {toFixed(internal_energy) + ' MeV/cm3'} + {toFixed(internal_energy_coefficient, 3) + + internal_energy_unit} } detail={ !!internal_energy_factors.length && ( - {internal_energy_factors.map(({ name, amount }) => ( + {internal_energy_factors.map(({ name, amount, unit }) => ( 0 ? 'green' : 'red'}> - {toFixed(amount, 2) + ' MeV/cm3'} + {toFixed(amount, 3) + unit} ))} @@ -187,28 +197,30 @@ export const SupermatterContent = (props: SupermatterProps, context) => { } /> - {toFixed(zap_multiplier, 2) + ' x'} + {toFixed(zap_transmission_coefficient, 2) + + zap_transmission_unit} } detail={ - !!zap_multiplier_factors.length && ( + !!zap_transmission_factors.length && ( - {zap_multiplier_factors.map(({ name, amount }) => ( + {zap_transmission_factors.map(({ name, amount, unit }) => ( 0 ? 'green' : 'red'}> - {toFixed(amount, 2) + ' x'} + {toFixed(amount, 2) + unit} ))} @@ -356,8 +368,8 @@ export const SupermatterContent = (props: SupermatterProps, context) => { : 'red' }> {effect.amount > 0 - ? '+' + effect.amount * 100 + '%' - : effect.amount * 100 + '%'} + ? '+' + effect.amount + effect.unit + : effect.amount + effect.unit} ) )} From a0cd56423ac2aed57b56ba311c80018611e3f081 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 19:39:07 +0200 Subject: [PATCH 012/101] Stops metalgen destructing indestructible turfs [MDB IGNORE] (#23904) * Stops metalgen destructing indestructible turfs (#78534) ## About The Pull Request Adds a check to metalgen transmutation to allow for blacklisting of types. Adds indestructible open and closed turfs to the blacklist to prevent an exploit where they are transmuted to plasma and burned to remove them. ## Why It's Good For The Game Exploits are bad. ## Changelog :cl: fix: Metalgen can no longer be used to transmute indestructible turfs. /:cl: --------- Co-authored-by: Jacquerel * Stops metalgen destructing indestructible turfs --------- Co-authored-by: Thunder12345 Co-authored-by: Jacquerel --- code/modules/reagents/chemistry/reagents.dm | 4 ++++ .../reagents/chemistry/reagents/other_reagents.dm | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 8de1d98cc2e..110107d103f 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -7,6 +7,10 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if (length(initial(R.name))) .[ckey(initial(R.name))] = t +GLOBAL_LIST_INIT(blacklisted_metalgen_types, typecacheof(list( + /turf/closed/indestructible, //indestructible turfs should be indestructible, metalgen transmutation to plasma allows them to be destroyed + /turf/open/indestructible +))) //Various reagents //Toxin & acid reagents diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 2a46d537233..1ea5103d88d 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2686,13 +2686,16 @@ metal_morph(exposed_turf) ///turn an object into a special material -/datum/reagent/metalgen/proc/metal_morph(atom/A) +/datum/reagent/metalgen/proc/metal_morph(atom/target) var/metal_ref = data["material"] if(!metal_ref) return + if(is_type_in_typecache(target, GLOB.blacklisted_metalgen_types)) //some stuff can lead to exploits if transmuted + return + var/metal_amount = 0 - var/list/materials_to_transmute = A.get_material_composition(BREAKDOWN_INCLUDE_ALCHEMY) + var/list/materials_to_transmute = target.get_material_composition(BREAKDOWN_INCLUDE_ALCHEMY) for(var/metal_key in materials_to_transmute) //list with what they're made of metal_amount += materials_to_transmute[metal_key] @@ -2700,9 +2703,9 @@ metal_amount = default_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesn't exist var/list/metal_dat = list((metal_ref) = metal_amount) - A.material_flags = applied_material_flags - A.set_custom_materials(metal_dat) - ADD_TRAIT(A, TRAIT_MAT_TRANSMUTED, type) + target.material_flags = applied_material_flags + target.set_custom_materials(metal_dat) + ADD_TRAIT(target, TRAIT_MAT_TRANSMUTED, type) /datum/reagent/gravitum name = "Gravitum" From 7cb7737fe52ba3b9f3a8b312d1e6ee40a8cab933 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 19:40:01 +0200 Subject: [PATCH 013/101] Fixes Intellicards in computers being deleted when the computer is destroyed [MDB IGNORE] (#23900) * Fixes Intellicards in computers being deleted when the computer is destroyed (#78475) ## About The Pull Request As described in #78467, if an Intellicard is inserted into a laptop or stationary modular computer, and said computer is destroyed, then the Intellicard (as well as any AI on it) is instantly deleted. This PR makes the Intellicard get dropped instead. Closes #78467. ## Why It's Good For The Game Bugs are bad. ## Changelog :cl: fix: Intellicards in computers are no longer deleted when the computer is destroyed. fix: Modular consoles can now be deconstructed by right clicking with a wrench. /:cl: * Fixes Intellicards in computers being deleted when the computer is destroyed --------- Co-authored-by: GPeckman <21979502+GPeckman@users.noreply.github.com> --- .../computers/item/computer.dm | 34 +++++++++++-------- .../computers/machinery/modular_computer.dm | 4 +-- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 21d2b8352fb..6fe91c9575b 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -150,6 +150,7 @@ close_all_programs() //Some components will actually try and interact with this, so let's do it later QDEL_NULL(soundloop) + looping_sound = FALSE // Necessary to stop a possible runtime trying to call soundloop.stop() when soundloop has been qdel'd QDEL_LIST(stored_files) if(istype(inserted_disk)) @@ -802,14 +803,8 @@ /obj/item/modular_computer/wrench_act_secondary(mob/living/user, obj/item/tool) . = ..() tool.play_tool_sound(src, user, 20, volume=20) - internal_cell?.forceMove(drop_location()) - computer_id_slot?.forceMove(drop_location()) - inserted_disk?.forceMove(drop_location()) - remove_pai() - new /obj/item/stack/sheet/iron(get_turf(loc), steel_sheet_cost) + deconstruct(TRUE) user.balloon_alert(user, "disassembled") - relay_qdel() - qdel(src) return TOOL_ACT_TOOLTYPE_SUCCESS /obj/item/modular_computer/welder_act(mob/living/user, obj/item/tool) @@ -830,15 +825,26 @@ return TOOL_ACT_TOOLTYPE_SUCCESS /obj/item/modular_computer/deconstruct(disassembled = TRUE) - break_apart() - return ..() - -/obj/item/modular_computer/proc/break_apart() + remove_pai() + eject_aicard() if(!(flags_1 & NODECONSTRUCT_1)) - physical.visible_message(span_notice("\The [src] breaks apart!")) - var/turf/newloc = get_turf(src) - new /obj/item/stack/sheet/iron(newloc, round(steel_sheet_cost / 2)) + if (disassembled) + internal_cell?.forceMove(drop_location()) + computer_id_slot?.forceMove(drop_location()) + inserted_disk?.forceMove(drop_location()) + new /obj/item/stack/sheet/iron(drop_location(), steel_sheet_cost) + else + physical.visible_message(span_notice("\The [src] breaks apart!")) + new /obj/item/stack/sheet/iron(drop_location(), round(steel_sheet_cost * 0.5)) relay_qdel() + return ..() + +// Ejects the inserted intellicard, if one exists. Used when the computer is deconstructed. +/obj/item/modular_computer/proc/eject_aicard() + var/datum/computer_file/program/ai_restorer/program = locate() in stored_files + if (program) + return program.try_eject(forced = TRUE) + return FALSE // Used by processor to relay qdel() to machinery type. /obj/item/modular_computer/proc/relay_qdel() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 33f4bc29a16..293cdd9c5f7 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -125,9 +125,9 @@ return cpu.screwdriver_act(user, tool) return ..() -/obj/machinery/modular_computer/wrench_act(mob/user, obj/item/tool) +/obj/machinery/modular_computer/wrench_act_secondary(mob/user, obj/item/tool) if(cpu) - return cpu.wrench_act(user, tool) + return cpu.wrench_act_secondary(user, tool) return ..() /obj/machinery/modular_computer/welder_act(mob/user, obj/item/tool) From f5e6967ba417a34463f1c8aa65ac2426804aa578 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 19:40:49 +0200 Subject: [PATCH 014/101] fixes blackboard speech error [MDB IGNORE] (#23901) * [no gbp] fixes blackboard speech error (#78551) ## About The Pull Request i changed initial to list() ## Why It's Good For The Game ![image](https://github.com/tgstation/tgstation/assets/70376633/4c289c2e-8974-4c4e-9d91-f2502134165d) ## Changelog i dont think runtimes are playerfacing --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@ users.noreply.github.com> * [no gbp] fixes blackboard speech error --------- Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com> Co-authored-by: Zephyr <12817816+ZephyrTFA@ users.noreply.github.com> --- .../datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index 005a9ee835d..8340d1da4d3 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -208,10 +208,10 @@ if(isnull(speech_lines)) return ..() - speak = speech_lines[BB_EMOTE_SAY] ? speech_lines[BB_EMOTE_SAY] : initial(speak) - emote_see = speech_lines[BB_EMOTE_SEE] ? speech_lines[BB_EMOTE_SEE] : initial(emote_see) - emote_hear = speech_lines[BB_EMOTE_HEAR] ? speech_lines[BB_EMOTE_HEAR] : initial(emote_hear) - sound = speech_lines[BB_EMOTE_SOUND] ? speech_lines[BB_EMOTE_SOUND] : initial(sound) + speak = speech_lines[BB_EMOTE_SAY] || list() + emote_see = speech_lines[BB_EMOTE_SEE] || list() + emote_hear = speech_lines[BB_EMOTE_HEAR] || list() + sound = speech_lines[BB_EMOTE_SOUND] || list() speech_chance = speech_lines[BB_EMOTE_CHANCE] ? speech_lines[BB_EMOTE_CHANCE] : initial(speech_chance) return ..() From b696eddd259cc77d8e210241e69a4ce86d8bc6b0 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:31:42 +0200 Subject: [PATCH 015/101] fix posibrain [MDB IGNORE] (#23905) * fix posibrains (#78584) * fix posibrain --------- Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com> --- code/modules/mob/living/brain/MMI.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index e182c51f54f..b63ca68d7d7 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -268,7 +268,7 @@ if(user) to_chat(user, span_warning("\The [src] indicates that there is no mind present!")) return FALSE - if(brain.decoy_override) + if(brain?.decoy_override) if(user) to_chat(user, span_warning("This [name] does not seem to fit!")) return FALSE From c49b9661f1c69929ab6a9260633377b61d2b46d9 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:32:00 +0200 Subject: [PATCH 016/101] Advanced Plastic Surgery 2.0, It's rare now. [MDB IGNORE] (#23903) * Advanced Plastic Surgery 2.0, It's rare now. (#78504) ## About The Pull Request A revival of #76508 which got closed due to it eating up genetics niche. This PR fixess that issue by seperating the surgery into two. the normal roundstart plastic surgery and advanced plastic surgery. both works identically with the one exception being that the advanced one allows the feature that the last PR tried to add. which is to allow surgery to mimic people in photographs. the regular one remains as-is. The disk containing the surgery can be found in a lot of places, a role-restricted item to doctors and roboticists for 1TC, as a rare maint loot and BEPIS technode reward ## Why It's Good For The Game Opportunity for more fun gimmicks, ammo for BB's and paranoia, staple of SS13 gameplay. This also retroactively buffs forensic scanners and records since it really only changes your name and voice. You can change your hair all you want but anything more than that is a trip to genetics. overall allows for more engaging gameplay while not detracting from genetics niche with how niche and rare it would appear in rounds. ## Changelog :cl: add: Adds an advanced plastic surgery procedure, allowing you to imitate people in pictures. Simply hold a picture in your offhand of the person you wish to imitate as while conducting the surgery! Remember, it's not foolproof, it only changes your name and voice! adds: You can obtain the disk containing the afromentioned surgery. as a role-restricted item to doctors and roboticists for 1TC, as a rare maint loot and BEPIS technode reward /:cl: --------- Co-authored-by: ATH1909 <42606352+ATH1909@ users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> * Advanced Plastic Surgery 2.0, It's rare now. --------- Co-authored-by: Singul0 <127663818+Singul0@users.noreply.github.com> Co-authored-by: ATH1909 <42606352+ATH1909@ users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> --- code/_globalvars/lists/maintenance_loot.dm | 1 + code/modules/photography/_pictures.dm | 7 ++- code/modules/photography/camera/camera.dm | 7 ++- .../research/designs/medical_designs.dm | 7 +++ code/modules/research/techweb/all_nodes.dm | 12 +++++ code/modules/surgery/plastic_surgery.dm | 52 ++++++++++++++++++- code/modules/uplink/uplink_items/job.dm | 10 ++++ 7 files changed, 92 insertions(+), 4 deletions(-) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index d16c466f9dc..aa84927af03 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -347,6 +347,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/book/granter/crafting_recipe/dusting/laser_musket_prime = 1, /obj/item/book/granter/sign_language = 1, /obj/item/disk/nuclear/fake = 1, + /obj/item/disk/surgery/advanced_plastic_surgery = 1, /obj/item/skillchip/brainwashing = 1, /obj/item/tattoo_kit = 1, /obj/item/folder/ancient_paperwork = 1, diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm index 8c949892dbf..45fa5654ad9 100644 --- a/code/modules/photography/_pictures.dm +++ b/code/modules/photography/_pictures.dm @@ -5,6 +5,8 @@ var/list/mobs_seen = list() /// List of weakrefs pointing at dead mobs that appear in this photo var/list/dead_seen = list() + /// List of strings of face-visible humans in this photo + var/list/names_seen = list() var/caption var/icon/picture_image var/icon/picture_icon @@ -16,7 +18,7 @@ ///Was this image capable of seeing ghosts? var/see_ghosts = CAMERA_NO_GHOSTS -/datum/picture/New(name, desc, mobs_spotted, dead_spotted, image, icon, size_x, size_y, bp, caption_, autogenerate_icon, can_see_ghosts) +/datum/picture/New(name, desc, mobs_spotted, dead_spotted, names, image, icon, size_x, size_y, bp, caption_, autogenerate_icon, can_see_ghosts) if(!isnull(name)) picture_name = name if(!isnull(desc)) @@ -27,6 +29,9 @@ if(!isnull(dead_spotted)) for(var/mob/seen as anything in dead_spotted) dead_seen += WEAKREF(seen) + if(!isnull(names)) + for(var/seen in names) + names_seen += seen if(!isnull(image)) picture_image = image if(!isnull(icon)) diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 1c0e360ed75..b168aaf54da 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -188,6 +188,8 @@ var/list/mobs = list() var/blueprints = FALSE var/clone_area = SSmapping.request_turf_block_reservation(size_x * 2 + 1, size_y * 2 + 1, 1) + ///list of human names taken on picture + var/list/names = list() var/width = size_x * 2 + 1 var/height = size_y * 2 + 1 @@ -218,8 +220,11 @@ var/icon/get_icon = camera_get_icon(turfs, target_turf, psize_x, psize_y, clone_area, size_x, size_y, (size_x * 2 + 1), (size_y * 2 + 1)) qdel(clone_area) get_icon.Blend("#000", ICON_UNDERLAY) + for(var/mob/living/carbon/human/person in mobs) + if(person.is_face_visible()) + names += "[person.name]" - var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) + var/datum/picture/picture = new("picture", desc.Join(" "), mobs_spotted, dead_spotted, names, get_icon, null, psize_x, psize_y, blueprints, can_see_ghosts = see_ghosts) after_picture(user, picture) SEND_SIGNAL(src, COMSIG_CAMERA_IMAGE_CAPTURED, target, user) blending = FALSE diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 2bb779e318b..285878e7f26 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -1114,6 +1114,13 @@ surgery = /datum/surgery/advanced/wing_reconstruction research_icon_state = "surgery_chest" +/datum/design/surgery/advanced_plastic_surgery + name = "Advanced Plastic Surgery" + desc = "An advanced form of the plastic surgery, allowing oneself to remodel someone's face and voice based off a picture of someones face" + surgery = /datum/surgery/plastic_surgery/advanced + id = "surgery_advanced_plastic_surgery" + research_icon_state = "surgery_head" + /datum/design/surgery/experimental_dissection name = "Experimental Dissection" desc = "An experimental surgical procedure that dissects bodies in exchange for research points at ancient R&D consoles." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 2ec692f0575..3f64efe851e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -2368,3 +2368,15 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) hidden = TRUE experimental = TRUE + +/datum/techweb_node/advanced_plastic_surgery + id = "plastic_surgery" + display_name = "Advanced Plastic Surgery" + description = "A Procedure long lost due to licensing problems now once again available." + prereq_ids = list("base") + design_ids = list( + "surgery_advanced_plastic_surgery" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + hidden = TRUE + experimental = TRUE diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 440d48d1c5e..424251143c3 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -1,3 +1,9 @@ +/// Disk containing info for doing advanced plastic surgery. Spawns in maint and available as a role-restricted item in traitor uplinks. +/obj/item/disk/surgery/advanced_plastic_surgery + name = "Advanced Plastic Surgery Disk" + desc = "The disk provides instructions on how to do an Advanced Plastic Surgery, this surgery allows one-self to completely remake someone's face with that of another. Provided they have a picture of them in their offhand when reshaping the face. With the surgery long becoming obsolete with the rise of genetics technology. This item became an antique to many collectors, With only the cheaper and easier basic form of plastic surgery remaining in use in most places." + surgeries = list(/datum/surgery/plastic_surgery/advanced) + /datum/surgery/plastic_surgery name = "Plastic surgery" surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB | SURGERY_MORBID_CURIOSITY @@ -9,6 +15,41 @@ /datum/surgery_step/close, ) +/datum/surgery/plastic_surgery/advanced + name = "advanced plastic surgery" + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/insert_plastic, + /datum/surgery_step/reshape_face, + /datum/surgery_step/close, + ) + +//Insert plastic step, It ain't called plastic surgery for nothing! :) +/datum/surgery_step/insert_plastic + name = "insert plastic (plastic)" + implements = list( + /obj/item/stack/sheet/plastic = 100, + /obj/item/stack/sheet/meat = 100) + time = 3.2 SECONDS + preop_sound = 'sound/effects/blobattack.ogg' + success_sound = 'sound/effects/attackblob.ogg' + failure_sound = 'sound/effects/blobattack.ogg' + +/datum/surgery_step/insert_plastic/preop(mob/user, mob/living/target, target_zone, obj/item/stack/tool, datum/surgery/surgery) + display_results( + user, + target, + span_notice("You begin to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]..."), + span_notice("[user] begins to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]."), + span_notice("[user] begins to insert [tool] into the incision in [target]'s [parse_zone(target_zone)]."), + ) + display_pain(target, "You feel something inserting just below the skin in your [parse_zone(target_zone)].") + +/datum/surgery_step/insert_plastic/success(mob/user, mob/living/target, target_zone, obj/item/stack/tool, datum/surgery/surgery, default_display_results) + . = ..() + tool.use(1) + //reshape_face /datum/surgery_step/reshape_face name = "reshape face (scalpel)" @@ -43,8 +84,15 @@ else var/list/names = list() if(!isabductor(user)) - for(var/i in 1 to 10) - names += target.dna.species.random_name(target.gender, TRUE) + var/obj/item/offhand = user.get_inactive_held_item() + if(istype(offhand, /obj/item/photo) && istype(surgery, /datum/surgery/plastic_surgery/advanced)) + var/obj/item/photo/disguises = offhand + for(var/namelist as anything in disguises.picture?.names_seen) + names += namelist + else + user.visible_message(span_warning("You have no picture to base the appearance on, reverting to random appearances.")) + for(var/i in 1 to 10) + names += target.dna.species.random_name(target.gender, TRUE) else for(var/_i in 1 to 9) names += "Subject [target.gender == MALE ? "i" : "o"]-[pick("a", "b", "c", "d", "e")]-[rand(10000, 99999)]" diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index b971e07619c..e585b07bb5f 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -173,6 +173,16 @@ cost = 5 surplus = 50 +/datum/uplink_item/role_restricted/advanced_plastic_surgery + name = "Advanced Plastic Surgery Program" + desc = "A bootleg copy of an collector item, this disk contains the procedure to perform advanced plastic surgery, allowing you to model someone's face and voice based on a picture taken by a camera on your offhand. \ + All changes are superficial and does not change ones genetic makeup. \ + Insert into an Operating Console to enable the procedure." + item = /obj/item/disk/surgery/brainwashing + restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) + cost = 1 + surplus = 50 + /datum/uplink_item/role_restricted/springlock_module name = "Heavily Modified Springlock MODsuit Module" desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \ From 4cb098ec33fc377a283e0d8b4c3338e2cb7c7be5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:32:37 +0200 Subject: [PATCH 017/101] Fixes tackling issues with stun immune tacklers [MDB IGNORE] (#23911) * Fixes tackling issues with stun immune tacklers (#78494) ## About The Pull Request When a human uses gripper gloves and such to perform a tackle, it does some stuff with knockdowns. First, at the start of the tackle, the tackler is given 1 or 2 seconds of knockdown. This knockdown bypasses stun immunity. If the tackle and its rolled to be an expert or monster tackle, then this initial knockdown is cleared. However, the knockdown clearing does NOT bypass stun immunity. This ironically meant that stun immune tacklers would remain knocked down when landing a monster tackle, and it would cause a runtime because knocked down people can't grab. This PR just makes the knockdown clear bypass stun immunity as well. Closes #78441. * Fixes tackling issues with stun immune tacklers --------- Co-authored-by: GPeckman <21979502+GPeckman@users.noreply.github.com> --- code/datums/components/tackle.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index ffd20cc2c13..4ae3a973d7e 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -205,7 +205,8 @@ user.visible_message(span_warning("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!"), span_userdanger("You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!")) - user.SetKnockdown(0) + // Ignore_canstun has to be true, or else a stunimmune user would stay knocked down. + user.SetKnockdown(0, ignore_canstun = TRUE) user.get_up(TRUE) user.forceMove(get_turf(target)) target.adjustStaminaLoss(40) @@ -228,7 +229,8 @@ user.visible_message(span_warning("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), span_userdanger("You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!")) - user.SetKnockdown(0) + // Ignore_canstun has to be true, or else a stunimmune user would stay knocked down. + user.SetKnockdown(0, ignore_canstun = TRUE) user.get_up(TRUE) user.forceMove(get_turf(target)) target.adjustStaminaLoss(40) From 4c0466959e2abe8a12cfd88217f098880e265779 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:32:49 +0200 Subject: [PATCH 018/101] Fixes map votes of only one choice [MDB IGNORE] (#23910) * Fixes map votes of only one choice (#78509) ## About The Pull Request Unfortunately, back in #70340 (4085e792ab5716485d379ce5f3dcbbae1c3d0522) which was declared to fix the issue of having only one map to vote for, I cocked up a part of it. For some reason, the part where it states that only one map could be voted for would only play on the emergency shuttle leaving. I think I did this because of the fact that the mapvote would auto-call, and this didn't really respect the fact that people would also call their own votes with only one map to vote for. Thus, the vote would fire with one map to choose for and there wouldn't be the message on there being only one map to vote for that I added in the aforementioned PR. This brings it back to the intended working condition. * Fixes map votes of only one choice --------- Co-authored-by: san7890 --- code/datums/votes/map_vote.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index 7d45f460a59..323ee29ccc2 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -20,7 +20,7 @@ /datum/vote/map_vote/create_vote() . = ..() check_population(should_key_choices = FALSE) - if((length(choices) == 1) && EMERGENCY_ESCAPED_OR_ENDGAMED) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. + if(length(choices) == 1) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. var/de_facto_winner = choices[1] var/datum/map_config/change_me_out = global.config.maplist[de_facto_winner] SSmapping.changemap(change_me_out) From 03869ad5829acfc6e5a464da699aed40560d6ddc Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:33:57 +0200 Subject: [PATCH 019/101] Fixes cigarettes smoking on any slot [MDB IGNORE] (#23907) * Fixes cigarettes smoking on any slot (#78544) ## About The Pull Request #76881 allowed you to put cigarettes in a gas mask but removed the check for, if the thing was a cigarette, making sure it was in your mask slot. What this meant was that standing around with a cigarette in your hand would still make you passively smoke it - although this is somewhat more immersive to me as a former smoker, it also gets obnoxious having to set the cigarette on a table or put it in my bag to avoid racking up the ridiculously easy-to-accumulate nicotine addiction points you otherwise get from even one cigarette in-game. This just readds that check after the checks for gas masks/non-smoker locations (which may also be broken but are beyond me right now - trying to put a cigarette into a gas mask's filter* slot returns 'mask's mouth is covered.') * Fixes cigarettes smoking on any slot --------- Co-authored-by: Higgin --- code/game/objects/items/cigs_lighters.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index aaef891ee4a..94e9cb674b2 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -358,6 +358,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!istype(smoker) || smoker.get_item_by_slot(ITEM_SLOT_MASK) != loc) reagents.remove_any(to_smoke) return + else + if(src != smoker.wear_mask) + reagents.remove_any(to_smoke) + return reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1)) var/obj/item/organ/internal/lungs/lungs = smoker.get_organ_slot(ORGAN_SLOT_LUNGS) From 2f5fb619d97e95b9f67742b22b4f63e509797bb3 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:34:09 +0200 Subject: [PATCH 020/101] Removes `CANPUSH` status flag from lavaland basic mobs [MDB IGNORE] (#23908) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removes `CANPUSH` status flag from lavaland basic mobs (#78531) ## About The Pull Request Title. This makes it so every lavaland mob is now unable to be pushed by moving into them while on combat mode. Namely this helps with watchers, as they have gained this vulnerability when they've got the basic bitch treatment — it caused their _look away_ ability to be easily cancellable by just pushing them. ~~you can still just fuckin' grab them to do that and i think it's fair game~~ Lobsters and brimdemons are also affected, which i'm not sure how exactly this affects their gameplay... but it is what it is. ## Why It's Good For The Game Previous behavior restored, mobs stop being bullied by literally running into them. * Removes `CANPUSH` status flag from lavaland basic mobs --------- Co-authored-by: Sealed101 --- code/modules/mob/living/basic/lavaland/mining.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm index 6b1d0de5739..3570936d2f5 100644 --- a/code/modules/mob/living/basic/lavaland/mining.dm +++ b/code/modules/mob/living/basic/lavaland/mining.dm @@ -2,6 +2,7 @@ /mob/living/basic/mining icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' combat_mode = TRUE + status_flags = NONE //don't inherit standard basicmob flags mob_size = MOB_SIZE_LARGE mob_biotypes = MOB_ORGANIC|MOB_BEAST faction = list(FACTION_MINING) From 2a1e15a512198268f011a0115bd4c5f151808623 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:34:21 +0200 Subject: [PATCH 021/101] Removes unused ai detector camera mob [MDB IGNORE] (#23909) * Removes unused ai detector camera mob (#78549) it wasn't used anywhere for over a year (see #54832) * Removes unused ai detector camera mob --------- Co-authored-by: Sealed101 --- code/game/objects/items/devices/multitool.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 17f5e7d4902..08dee828011 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -127,12 +127,6 @@ if(distance < rangewarning) //ai cant see us but is close detect_state = PROXIMITY_NEAR -/mob/camera/ai_eye/remote/ai_detector - name = "AI detector eye" - ai_detector_visible = FALSE - visible_icon = FALSE - use_static = FALSE - /datum/action/item_action/toggle_multitool name = "Toggle AI detecting mode" check_flags = NONE From 856ac9e0501aa46724bf70379aa32d0b945cd017 Mon Sep 17 00:00:00 2001 From: sqnztb Date: Mon, 25 Sep 2023 16:22:36 -0400 Subject: [PATCH 022/101] New Scar Removal Medicine (#23787) * initial * apparently I am that dumb * linebreak * lemmie reword that * as suggested Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../chemistry/reagents/other_reagents.dm | 27 +++++++++++++++++++ .../reagents/chemistry/recipes/medicine.dm | 5 ++++ 2 files changed, 32 insertions(+) diff --git a/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm index fabba52db0f..1c03bbf2ca3 100644 --- a/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/modular_skyrat/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm @@ -70,3 +70,30 @@ else to_chat(M, span_notice("[pick("I feel oddly calm.", "I feel relaxed.", "Mew?")]")) ..() + +#define DERMAGEN_SCAR_FIX_AMOUNT 10 + +/datum/reagent/medicine/dermagen + name = "Dermagen" + description = "Heals scars formed by past physical trauma when applied. Minimum 10u needed, only works when applied topically." + reagent_state = LIQUID + color = "#FFEBEB" + ph = 6 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/medicine/dermagen/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) + . = ..() + if(!iscarbon(exposed_mob)) + return + if(!(methods & (PATCH|TOUCH|VAPOR))) + return + var/mob/living/carbon/scarred = exposed_mob + if(scarred.stat == DEAD) + show_message = FALSE + if(show_message) + to_chat(scarred, span_danger("The scars on your body start to fade and disappear.")) + if(reac_volume >= DERMAGEN_SCAR_FIX_AMOUNT) + for(var/i in scarred.all_scars) + qdel(i) + +#undef DERMAGEN_SCAR_FIX_AMOUNT diff --git a/modular_skyrat/modules/customization/modules/reagents/chemistry/recipes/medicine.dm b/modular_skyrat/modules/customization/modules/reagents/chemistry/recipes/medicine.dm index afcfa2da8cd..34b97214bb8 100644 --- a/modular_skyrat/modules/customization/modules/reagents/chemistry/recipes/medicine.dm +++ b/modular_skyrat/modules/customization/modules/reagents/chemistry/recipes/medicine.dm @@ -24,3 +24,8 @@ results = list(/datum/reagent/medicine/taste_suppressor = 3, /datum/reagent/chlorine = 1) // The chlorine dissociated from the sodium to allow for the synthesis of the taste suppressor required_reagents = list(/datum/reagent/consumable/salt = 2, /datum/reagent/sulfur = 1, /datum/reagent/water = 1) required_temp = 300 + +/datum/chemical_reaction/medicine/dermagen + results = list(/datum/reagent/medicine/dermagen = 5) + required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/medicine/c2/synthflesh = 3, /datum/reagent/medicine/mine_salve = 3) + mix_message = "The slurry congeals into a thick cream." From 727464447ef5d8f54798ef549eb0ea53d2782511 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 26 Sep 2023 09:55:42 +0200 Subject: [PATCH 023/101] basic mobs ranged attacks can check for friendly fire [MDB IGNORE] (#23918) * basic mobs ranged attacks can check for friendly fire (#78451) ## About The Pull Request basic mobs can check for friends in the way before firing a attack. if they find someone in the way they will try to adjust their position so their friends dont get hit by the projectiles ## Why It's Good For The Game nice optional feature people can put on the monsters they create ## Changelog :cl: add: added ranged attack friendly fire checks for basic mobs. minebots and hivebots will now try to avoid shooting their friends /:cl: * basic mobs ranged attacks can check for friendly fire --------- Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> --- .../basic_ai_behaviors/basic_attacking.dm | 55 +++++++++++++++++++ .../mob/living/basic/minebots/minebot_ai.dm | 1 + .../space_fauna/hivebot/hivebot_behavior.dm | 2 + .../space_fauna/hivebot/hivebot_subtree.dm | 2 +- 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index 6683fb02f93..91ba7ec4894 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -51,6 +51,8 @@ required_distance = 3 /// range we will try chasing the target before giving up var/chase_range = 9 + ///do we care about avoiding friendly fire? + var/avoid_friendly_fire = FALSE /datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) . = ..() @@ -75,6 +77,10 @@ if(!can_see(basic_mob, final_target, required_distance)) return + if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targetting_datum)) + adjust_position(basic_mob, target) + return ..() + controller.set_blackboard_key(hiding_location_key, hiding_target) basic_mob.RangedAttack(final_target) return ..() //only start the cooldown when the shot is shot @@ -83,3 +89,52 @@ . = ..() if(!succeeded) controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/basic_ranged_attack/proc/check_friendly_in_path(mob/living/source, atom/target, datum/targetting_datum/targetting_datum) + var/list/turfs_list = calculate_trajectory(source, target) + for(var/turf/possible_turf as anything in turfs_list) + + for(var/mob/living/potential_friend in possible_turf) + if(!targetting_datum.can_attack(source, potential_friend)) + return TRUE + + return FALSE + +/datum/ai_behavior/basic_ranged_attack/proc/adjust_position(mob/living/living_pawn, atom/target) + var/turf/our_turf = get_turf(living_pawn) + var/list/possible_turfs = list() + + for(var/direction in GLOB.alldirs) + var/turf/target_turf = get_step(our_turf, direction) + if(isnull(target_turf)) + continue + if(target_turf.is_blocked_turf() || get_dist(target_turf, target) > get_dist(living_pawn, target)) + continue + possible_turfs += target_turf + + if(!length(possible_turfs)) + return + var/turf/picked_turf = get_closest_atom(/turf, possible_turfs, target) + step(living_pawn, get_dir(living_pawn, picked_turf)) + +/datum/ai_behavior/basic_ranged_attack/proc/calculate_trajectory(mob/living/source , atom/target) + var/list/turf_list = get_line(source, target) + var/list_length = length(turf_list) - 1 + for(var/i in 1 to list_length) + var/turf/current_turf = turf_list[i] + var/turf/next_turf = turf_list[i+1] + var/direction_to_turf = get_dir(current_turf, next_turf) + if(!ISDIAGONALDIR(direction_to_turf)) + continue + + for(var/cardinal_direction in GLOB.cardinals) + if(cardinal_direction & direction_to_turf) + turf_list += get_step(current_turf, cardinal_direction) + + turf_list -= get_turf(source) + turf_list -= get_turf(target) + + return turf_list + +/datum/ai_behavior/basic_ranged_attack/avoid_friendly_fire + avoid_friendly_fire = TRUE diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm index 897cddb1401..a4b082f5dd1 100644 --- a/code/modules/mob/living/basic/minebots/minebot_ai.dm +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -60,6 +60,7 @@ /datum/ai_behavior/basic_ranged_attack/minebot behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + avoid_friendly_fire = TRUE /datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/living_pawn = controller.pawn diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm index 4cdaba09759..28cffa4ed8e 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm @@ -64,6 +64,8 @@ /datum/ai_behavior/basic_ranged_attack/hivebot action_cooldown = 3 SECONDS + avoid_friendly_fire = TRUE /datum/ai_behavior/basic_ranged_attack/hivebot_rapid action_cooldown = 1.5 SECONDS + avoid_friendly_fire = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm index 347219d0ef0..5bd957a7609 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm @@ -32,7 +32,7 @@ /datum/ai_controller/basic_controller/hivebot/ranged/rapid planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_ranged_attack_subtree, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid, /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/hive_communicate, ) From 13a69409bba6963cdf30905d6d06972307621d3e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 26 Sep 2023 09:57:18 +0200 Subject: [PATCH 024/101] Adds tiny fan to Tramstation Mass Driver. [MDB IGNORE] (#23920) * Adds tiny fan to Tramstation Mass Driver. (#78484) ## About The Pull Request Adds tiny fan to mass driver, so you don't cause air alarms when you try to throw someone with it. ## Why It's Good For The Game Consistency. ## Changelog :cl: fix: [Tramstation] Mass Driver in chapel now has tiny fan so you don't space yourself. /:cl: * Adds tiny fan to Tramstation Mass Driver. --------- Co-authored-by: Helg2 <93882977+Helg2@users.noreply.github.com> --- _maps/map_files/tramstation/tramstation.dmm | 647 ++++++++++---------- 1 file changed, 324 insertions(+), 323 deletions(-) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 4ef52187a09..6fffe99a126 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -451,19 +451,6 @@ "abM" = ( /turf/open/misc/asteroid, /area/station/asteroid) -"abN" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #6" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #6"; - suffix = "#6" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "abO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3861,12 +3848,6 @@ /obj/effect/turf_decal/trimline/neutral/warning, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"axF" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "axG" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate_empty, @@ -6735,6 +6716,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"biE" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/storage) "biS" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 6 @@ -10091,15 +10077,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"csn" = ( -/obj/machinery/elevator_control_panel{ - layer = 3.1; - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/closed/wall, -/area/station/science/xenobiology) "csA" = ( /turf/closed/wall, /area/station/solars/starboard/fore) @@ -11140,6 +11117,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"cLS" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "tram_upper_center_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 1 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "cMa" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/camera/directional/south{ @@ -11771,6 +11762,13 @@ /obj/machinery/digital_clock/directional/south, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"cVx" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "cVz" = ( /obj/effect/landmark/start/hangover, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -13895,6 +13893,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/library) +"dKz" = ( +/obj/machinery/door/poddoor/massdriver_chapel, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/service/chapel/monastery) "dKI" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, @@ -14143,6 +14146,15 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"dPi" = ( +/obj/machinery/elevator_control_panel{ + layer = 3.1; + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/closed/wall/r_wall, +/area/station/science/xenobiology) "dPo" = ( /obj/machinery/camera/directional/north{ c_tag = "Medical - Morgue"; @@ -15682,19 +15694,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/theater) -"euR" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #3" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "euS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -18003,10 +18002,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/ordnance) -"foU" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "foY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19676,14 +19671,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/processing) -"fWK" = ( -/obj/machinery/computer/atmos_control/oxygen_tank{ - atmos_chambers = list("o2ordance"="Oxygen Supply") - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "fWM" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/item/kirbyplants/random, @@ -20242,20 +20229,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"giW" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/obj/structure/railing{ - dir = 9 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_sci_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/lower) "giZ" = ( /obj/structure/bed, /obj/effect/spawner/random/contraband/prison, @@ -20747,6 +20720,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"gqb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "gqc" = ( /obj/machinery/conveyor{ dir = 4; @@ -22345,11 +22325,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"gUL" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "gUO" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23934,13 +23909,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"hDU" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "hDZ" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/box, @@ -26669,6 +26637,19 @@ /obj/machinery/light/floor, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"iHo" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #6" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #6"; + suffix = "#6" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "iHr" = ( /obj/structure/sink{ dir = 4; @@ -27294,6 +27275,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"iTa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "iTm" = ( /obj/structure/table/glass, /obj/item/storage/pill_bottle/mannitol, @@ -28584,14 +28569,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"jnL" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/cargo/storage) "jnR" = ( /obj/structure/bed{ dir = 8 @@ -29081,27 +29058,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) -"jwP" = ( -/obj/effect/landmark/lift_id{ - specific_lift_id = "tram_cargo_lift" - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_cargo_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - req_access = list("mining") - }, -/obj/effect/abstract/elevator_music_zone{ - linked_elevator_id = "tram_cargo_lift" - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "jwT" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29811,6 +29767,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) +"jJt" = ( +/obj/effect/turf_decal/trimline/dark_red/warning, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "tram_dorm_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/structure/railing, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/left) "jJv" = ( /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) @@ -30342,13 +30308,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"jTQ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/storage) "jUa" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -30901,6 +30860,15 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"kcd" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "kck" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -34428,10 +34396,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"lnh" = ( -/obj/machinery/door/poddoor/massdriver_chapel, -/turf/open/floor/plating, -/area/station/service/chapel/monastery) "lnk" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -34943,20 +34907,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/office) -"lvz" = ( -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_perma_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/security/execution/transfer) "lvH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -36302,24 +36252,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"lTM" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "lTP" = ( /obj/structure/stairs/south, /turf/open/floor/iron/stairs/medium{ @@ -36637,6 +36569,13 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/service/library) +"lXx" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "lXC" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -36824,6 +36763,27 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"mbp" = ( +/obj/effect/landmark/lift_id{ + specific_lift_id = "tram_cargo_lift" + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 8 + }, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_cargo_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); + req_access = list("mining") + }, +/obj/effect/abstract/elevator_music_zone{ + linked_elevator_id = "tram_cargo_lift" + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "mbt" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -37442,13 +37402,6 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"mmX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "mng" = ( /obj/structure/window/reinforced/plasma/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, @@ -37645,15 +37598,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/storage) -"mrg" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #4" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "mrr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -38022,6 +37966,10 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"mzv" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/cargo/storage) "mzD" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -39024,20 +38972,6 @@ /obj/item/storage/secure/safe/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) -"mUc" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/elevator_control_panel/directional/north{ - linked_elevator_id = "tram_upper_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "mUd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ dir = 1 @@ -39609,15 +39543,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/right) -"nfZ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #5" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/storage) "ngg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -40543,6 +40468,19 @@ }, /turf/open/space/openspace, /area/station/solars/port) +"nvn" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #1" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #1"; + suffix = "#1" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "nvo" = ( /obj/machinery/button/door/directional/west{ id = "private_b"; @@ -41838,6 +41776,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"nSY" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/cargo/storage) "nTa" = ( /obj/effect/landmark/start/station_engineer, /obj/structure/cable/layer1, @@ -41916,19 +41862,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, /area/station/science/lobby) -"nUF" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #1" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "nUM" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -42079,13 +42012,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"nXk" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "nXn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43939,15 +43865,6 @@ /obj/structure/grille, /turf/open/space/openspace, /area/space/nearstation) -"oKn" = ( -/obj/machinery/elevator_control_panel{ - layer = 3.1; - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/closed/wall/r_wall, -/area/station/science/xenobiology) "oKZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -45259,19 +45176,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/vacant_room) -"plH" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #2" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "plQ" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/structure/disposalpipe/segment{ @@ -47099,15 +47003,6 @@ /obj/structure/railing, /turf/open/floor/plating/elevatorshaft, /area/station/maintenance/tram/left) -"pOL" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "pOQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -48277,6 +48172,19 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"qmC" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #2" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #2"; + suffix = "#2" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "qmH" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -49225,6 +49133,19 @@ "qEH" = ( /turf/closed/wall, /area/station/solars/port) +"qEJ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #3" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #3"; + suffix = "#3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "qFf" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -50307,6 +50228,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"qZl" = ( +/obj/machinery/computer/atmos_control/oxygen_tank{ + atmos_chambers = list("o2ordance"="Oxygen Supply") + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "qZq" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -50575,6 +50504,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/carpet, /area/station/medical/psychology) +"rcF" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/cargo/storage) "rcG" = ( /obj/machinery/camera/emp_proof/directional/east{ c_tag = "Secure - Telecomms Server Room East" @@ -50696,6 +50632,17 @@ /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"reN" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "MULE Storage" + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/iron, +/area/station/cargo/storage) "reU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/directional/south{ @@ -51643,15 +51590,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/asteroid) -"rwo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "rws" = ( /obj/structure/table/glass, /obj/item/storage/box/monkeycubes{ @@ -54004,6 +53942,24 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"srh" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "srx" = ( /obj/structure/railing{ dir = 4 @@ -57051,10 +57007,6 @@ /obj/structure/cable, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) -"tte" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "tth" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -59229,6 +59181,23 @@ "ufO" = ( /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"ufX" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "tram_lower_center_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/maintenance/tram/mid) "ugf" = ( /obj/structure/bed{ dir = 8 @@ -60101,23 +60070,6 @@ /obj/effect/spawner/random/maintenance/five, /turf/open/floor/iron, /area/station/cargo/warehouse) -"uud" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "tram_lower_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/mid) "uue" = ( /obj/machinery/power/turbine/turbine_outlet{ dir = 4 @@ -61622,6 +61574,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"uQV" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #4" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/storage) "uRi" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/structure/window/reinforced/spawner/directional/south, @@ -61641,16 +61602,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"uSl" = ( -/obj/effect/turf_decal/trimline/dark_red/warning, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "tram_dorm_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/structure/railing, -/turf/open/floor/plating/elevatorshaft, -/area/station/maintenance/tram/left) "uSL" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/fluff/tram_rail/floor, @@ -62815,6 +62766,15 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"vnA" = ( +/obj/machinery/elevator_control_panel{ + layer = 3.1; + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/closed/wall, +/area/station/science/xenobiology) "vnD" = ( /obj/structure/reagent_dispensers/fueltank/large, /obj/effect/turf_decal/bot{ @@ -64029,6 +63989,15 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"vHR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "vIa" = ( /obj/machinery/vending/cigarette, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -66953,6 +66922,20 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"wNu" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/industrial_lift/public, +/obj/structure/railing{ + dir = 9 + }, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_sci_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/lower) "wNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/violet/visible, /turf/open/floor/iron, @@ -67419,6 +67402,15 @@ /obj/effect/spawner/random/decoration/ornament, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"wZK" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #5" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/storage) "wZL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 @@ -68241,6 +68233,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"xrz" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "xrE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/thinplating{ @@ -68862,17 +68860,6 @@ "xDQ" = ( /turf/closed/wall, /area/station/security/processing) -"xDW" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "MULE Storage" - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/turf/open/floor/iron, -/area/station/cargo/storage) "xDY" = ( /obj/structure/railing{ dir = 8 @@ -69011,6 +68998,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/command/meeting_room) +"xIE" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 1 + }, +/obj/structure/industrial_lift/public, +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_perma_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/security/execution/transfer) "xIL" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -86187,7 +86188,7 @@ jWs lDo ucA wox -lvz +xIE gTv jWs aaa @@ -92394,7 +92395,7 @@ ncF ncF dFS tuU -uSl +jJt elr elr elr @@ -99829,7 +99830,7 @@ uTz hJM nAa ekB -mUc +cLS jSV uuD qjU @@ -104473,7 +104474,7 @@ qjU aaa qjU fok -uud +ufX sNq ceb pcx @@ -113437,7 +113438,7 @@ aaa aaa uGW jdU -jwP +mbp rff uGW aaa @@ -113735,7 +113736,7 @@ abM abM abM iix -giW +wNu boW iix abM @@ -116329,7 +116330,7 @@ hDT keT iEF fof -csn +vnA sXX akC hFP @@ -120936,7 +120937,7 @@ kkK jXE lwF dfz -fWK +qZl qCP urA ygC @@ -154624,7 +154625,7 @@ aRy aRE aRI aRL -lnh +dKz pMW pMW pMW @@ -179481,9 +179482,9 @@ aaa aaa aaa cTU -euR -jnL -abN +qEJ +nSY +iHo cTU cTU ohS @@ -179738,9 +179739,9 @@ aaa aaa aaa cTU -plH -jTQ -nfZ +qmC +rcF +wZK cTU exr pZA @@ -179995,9 +179996,9 @@ aac aaa aaa cTU -nUF -jTQ -mrg +nvn +rcF +uQV cTU lan pZA @@ -180253,7 +180254,7 @@ aaa cTU cTU ohS -xDW +reN ohS cTU nnb @@ -180510,10 +180511,10 @@ aaa cTU blx tAJ -lTM -axF -axF -rwo +srh +xrz +xrz +vHR dij uax uax @@ -180772,8 +180773,8 @@ uax uax uax uax -gUL -foU +biE +mzv dzw msn qza @@ -181028,9 +181029,9 @@ uax uax uax uax -tte -nXk -hDU +iTa +cVx +lXx dzw sxR skb @@ -181611,7 +181612,7 @@ eJQ bNx aSt aSt -oKn +dPi aaa aaa aaa @@ -183339,7 +183340,7 @@ cTU cTU cTU udQ -mmX +gqb pxD ayd ayt @@ -183853,7 +183854,7 @@ aaa aaa aaa udQ -pOL +kcd kXr aye rgg From 890669700e2e9d7a04bd0a4606ef22c7977a89bd Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 26 Sep 2023 21:48:20 +0200 Subject: [PATCH 025/101] Adds a candle box crate [MDB IGNORE] (#23933) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adds a candle box crate (#78593) ## About The Pull Request Adds a candle box crate that you can order. 🕯️ ## Why It's Good For The Game The chaplain only starts with a few boxes with a RNG way (scouring maintenance) to acquire any more ## Changelog :cl: add: Added a candle box crate for all your candle needs! /:cl: * Adds a candle box crate --------- Co-authored-by: admeeer --- code/modules/cargo/packs/general.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/cargo/packs/general.dm b/code/modules/cargo/packs/general.dm index 5ebdd5087a8..fa7a3bfa374 100644 --- a/code/modules/cargo/packs/general.dm +++ b/code/modules/cargo/packs/general.dm @@ -221,6 +221,13 @@ /obj/item/clothing/under/misc/burial = 2, ) crate_name = "religious supplies crate" + +/datum/supply_pack/misc/candles_bulk + name = "Candle Box Crate" + desc = "Keep your local chapel lit with three candle boxes!" + cost = CARGO_CRATE_VALUE * 1.5 + contains = list(/obj/item/storage/fancy/candle_box = 3) + crate_name = "candle box crate" /datum/supply_pack/misc/toner name = "Toner Crate" From a3781853f8fe1a819b900aec167b5ae3e9cd62bb Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 26 Sep 2023 21:49:21 +0200 Subject: [PATCH 026/101] Refsearch Info Injection [MDB IGNORE] (#23934) * Refsearch Info Injection (#78574) ## About The Pull Request Adds a proc that types can override to inject extra information into the refsearch This'll allow us to more easily track and deal with refs held by general datums, like callbacks. I've implemented a template example FOR callbacks, to provide an example and assist in solving future issues Done to help lumipharon from TGMC, they were having trouble with this case. This isn't perfectly optimized, but this proc has a LOT of issues just in general. Need to rework it to cut down on string churn someday * Refsearch Info Injection --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- .../admin/view_variables/reference_tracking.dm | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index a5b2af68c77..9cb661d2fee 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -92,6 +92,7 @@ return datum_container.last_find_references = search_time + var/container_print = datum_container.ref_search_details() var/list/vars_list = datum_container.vars for(var/varname in vars_list) @@ -108,11 +109,11 @@ found_refs[varname] = TRUE continue //End early, don't want these logging #endif - log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [text_ref(datum_container)] [varname] var. [container_name]") + log_reftracker("Found [type] [text_ref(src)] in [datum_container.type]'s [container_print] [varname] var. [container_name]") continue if(islist(variable)) - DoSearchVar(variable, "[container_name] [text_ref(datum_container)] -> [varname] (list)", recursive_limit - 1, search_time) + DoSearchVar(variable, "[container_name] [container_print] -> [varname] (list)", recursive_limit - 1, search_time) else if(islist(potential_container)) var/normal = IS_NORMAL_LIST(potential_container) @@ -159,3 +160,13 @@ qdel(src, force) #endif + +// Kept outside the ifdef so overrides are easy to implement + +/// Return info about us for reference searching purposes +/// Will be logged as a representation of this datum if it's a part of a search chain +/datum/proc/ref_search_details() + return text_ref(src) + +/datum/callback/ref_search_details() + return "[text_ref(src)] (obj: [object] proc: [delegate] args: [json_encode(arguments)] user: [user?.resolve() || "null"])" From 57e271304ad869e588b058aa91a92e67cb119063 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 26 Sep 2023 22:57:59 +0200 Subject: [PATCH 027/101] Move felinid brain shrinkage from the species to the brain [MDB IGNORE] (#23932) * Move felinid brain shrinkage from the species to the brain (#78592) ## About The Pull Request Brain size is now a var on brains, and felinids have their own brains. This makes the feature implemented here: #77879 more modular and in line with our species goals. ## Why It's Good For The Game I didn't spend all that time moving species specific traits to bodyparts and organs for this bullshit. ## Changelog pls add code improvement tag * Move felinid brain shrinkage from the species to the brain --------- Co-authored-by: itseasytosee <55666666+itseasytosee@users.noreply.github.com> --- code/modules/mob/living/brain/brain_item.dm | 18 ++++++++++++++++++ .../carbon/human/species_types/felinid.dm | 13 +------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 4bd275b5df1..658c7e1ac7c 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -39,6 +39,21 @@ /// Maximum skillchip slots available. Do not reference this var directly and instead call get_max_skillchip_slots() var/max_skillchip_slots = 5 + /// Size modifier for the sprite + var/brain_size = 1 + +/obj/item/organ/internal/brain/Initialize(mapload) + . = ..() + // Brain size logic + transform = transform.Scale(brain_size) + +/obj/item/organ/internal/brain/examine() + . = ..() + if(brain_size < 1) + . += span_notice("It is a bit on the smaller side...") + if(brain_size > 1) + . += span_notice("It is bigger than average...") + /obj/item/organ/internal/brain/Insert(mob/living/carbon/brain_owner, special = FALSE, drop_if_replaced = TRUE, no_id_transfer = FALSE) . = ..() if(!.) @@ -406,6 +421,9 @@ . = ..() organ_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE) +/obj/item/organ/internal/brain/felinid //A bit smaller than average + brain_size = 0.8 + ////////////////////////////////////TRAUMAS//////////////////////////////////////// /obj/item/organ/internal/brain/proc/has_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience = TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 793da47c05b..c8e14a6afd1 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,6 +4,7 @@ id = SPECIES_FELINE examine_limb_id = SPECIES_HUMAN mutant_bodyparts = list("ears" = "Cat", "wings" = "None") + mutantbrain = /obj/item/organ/internal/brain/felinid mutanttongue = /obj/item/organ/internal/tongue/cat /* SKYRAT EDIT REMOVAL - CUSTOMIZATION mutantears = /obj/item/organ/internal/ears/cat @@ -23,8 +24,6 @@ family_heirlooms = list(/obj/item/toy/cattoy) /// When false, this is a felinid created by mass-purrbation var/original_felinid = TRUE - /// Brain size for scaling - var/brain_size = 0.8 // Prevents felinids from taking toxin damage from carpotoxin /datum/species/human/felinid/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) @@ -47,16 +46,6 @@ ears.Insert(target_human, drop_if_replaced = FALSE) else mutantears = /obj/item/organ/internal/ears - var/obj/item/organ/internal/brain/current_brain = target_human.get_organ_by_type(/obj/item/organ/internal/brain) - if(current_brain) - current_brain.transform = current_brain.transform.Scale(brain_size) //smaller brain - return ..() - -/datum/species/human/felinid/on_species_loss(mob/living/carbon/former_feline, datum/species/old_species, pref_load) - if(iscarbon(former_feline)) - var/obj/item/organ/internal/brain/current_brain = former_feline.get_organ_by_type(/obj/item/organ/internal/brain) - if(current_brain) - current_brain.transform = current_brain.transform.Scale(1 / brain_size) //bigger brain return ..() /datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob) From 4bb0791a98ea4146d58b5cb88d869a9755c5753c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 01:16:16 +0200 Subject: [PATCH 028/101] Fixes Strong Stone ruin [MDB IGNORE] (#23921) * Fixes Strong Stone ruin (#78555) ## About The Pull Request It was spawning all this time but it was overridden by mapgen! just places the rock in a lavaland/surface/outdoors area ### look at how snug he looks in there ![confy](https://github.com/tgstation/tgstation/assets/75863639/3f6e32d3-a031-4348-b004-22d49c3b2f6c) ## Changelog :cl: fix: fixed Strong Stone ruin generation /:cl: * Fixes Strong Stone ruin --------- Co-authored-by: Sealed101 --- _maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm index f236a25a6a0..ad90df10167 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm @@ -4,7 +4,7 @@ /area/template_noop) "b" = ( /turf/closed/mineral/strong, -/area/template_noop) +/area/lavaland/surface/outdoors) (1,1,1) = {" a From 71aa3b2cedde78e6fe865e226e1ad8463421f5cc Mon Sep 17 00:00:00 2001 From: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Date: Tue, 26 Sep 2023 19:17:13 -0400 Subject: [PATCH 029/101] basic mob ash revival fix (#23913) --- modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm index e34a414cf8e..92a05c7e3b1 100644 --- a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm +++ b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm @@ -373,5 +373,5 @@ find_animal.faction = list(FACTION_ASHWALKER) - find_animal.revive() + find_animal.revive(HEAL_ALL) return TRUE From 4ea3fcd07185d3ba909c241210ebf81467778436 Mon Sep 17 00:00:00 2001 From: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Date: Tue, 26 Sep 2023 20:06:06 -0400 Subject: [PATCH 030/101] fixes basic fauna reagent (#23916) --- .../modules/fauna_reagent/fauna_reagent.dm | 65 +++++++++++++++---- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm b/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm index cee0e7efab5..796dbef0daf 100644 --- a/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm +++ b/modular_skyrat/modules/fauna_reagent/fauna_reagent.dm @@ -15,14 +15,57 @@ /mob/living/simple_animal/Life(seconds_per_tick, times_fired) . = ..() - if(reagent_health && reagents) - for(var/datum/reagent/reagents_within as anything in reagents.reagent_list) - if(istype(reagents_within, /datum/reagent/toxin)) - var/datum/reagent/toxin/toxin_reagent = reagents_within - var/toxin_damage = round(toxin_reagent.toxpwr) - adjustHealth(toxin_damage + 1) - reagents.remove_reagent(toxin_reagent.type, 0.5) - continue - if(istype(reagents_within, /datum/reagent/medicine)) - adjustHealth(-1) - reagents.remove_reagent(reagents_within.type, 0.5) + + if(!reagent_health) + return + + if(!reagents) + return + + if(stat == DEAD) + return + + for(var/datum/reagent/reagents_within as anything in reagents.reagent_list) + if(istype(reagents_within, /datum/reagent/toxin)) + var/datum/reagent/toxin/toxin_reagent = reagents_within + var/toxin_damage = round(toxin_reagent.toxpwr) + adjustHealth(toxin_damage + 1) + reagents.remove_reagent(toxin_reagent.type, 0.5) + continue + + if(istype(reagents_within, /datum/reagent/medicine)) + adjustHealth(-1) + reagents.remove_reagent(reagents_within.type, 0.5) + +/mob/living/basic + /// whether the simple animal can be healed/damaged through reagents + var/reagent_health = TRUE + +/mob/living/basic/Initialize(mapload) + . = ..() + if(reagent_health) + create_reagents(1000, REAGENT_HOLDER_ALIVE) + +/mob/living/basic/Life(seconds_per_tick, times_fired) + . = ..() + + if(!reagent_health) + return + + if(!reagents) + return + + if(stat == DEAD) + return + + for(var/datum/reagent/reagents_within as anything in reagents.reagent_list) + if(istype(reagents_within, /datum/reagent/toxin)) + var/datum/reagent/toxin/toxin_reagent = reagents_within + var/toxin_damage = round(toxin_reagent.toxpwr) + adjust_health(toxin_damage + 1) + reagents.remove_reagent(toxin_reagent.type, 0.5) + continue + + if(istype(reagents_within, /datum/reagent/medicine)) + adjust_health(-1) + reagents.remove_reagent(reagents_within.type, 0.5) From d9b0d1e562616a8b23ad5afbe3821916fc2614b4 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 07:09:07 +0200 Subject: [PATCH 031/101] Removes debug species from magic mirror [MDB IGNORE] (#23906) * Removes debug species from magic mirror * Update _external_organ.dm * Update _external_organ.dm --------- Co-authored-by: Jacquerel Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../carbon/human/species_types/abominations.dm | 5 +++++ .../surgery/organs/external/_external_organ.dm | 13 ++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/abominations.dm b/code/modules/mob/living/carbon/human/species_types/abominations.dm index b7be74565ac..43ca71311c2 100644 --- a/code/modules/mob/living/carbon/human/species_types/abominations.dm +++ b/code/modules/mob/living/carbon/human/species_types/abominations.dm @@ -3,6 +3,7 @@ name = "\improper Tall Boy" id = SPECIES_TALLBOY examine_limb_id = SPECIES_HUMAN + changesource_flags = MIRROR_BADMIN | WABBAJACK bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, @@ -13,8 +14,10 @@ ) /datum/species/monkey/human_legged + name = "human-legged monkey" id = SPECIES_MONKEY_HUMAN_LEGGED examine_limb_id = SPECIES_MONKEY + changesource_flags = MIRROR_BADMIN | WABBAJACK bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/monkey, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/monkey, @@ -25,8 +28,10 @@ ) /datum/species/monkey/monkey_freak + name = "human-armed monkey" id = SPECIES_MONKEY_FREAK examine_limb_id = SPECIES_MONKEY + changesource_flags = MIRROR_BADMIN | WABBAJACK bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, diff --git a/code/modules/surgery/organs/external/_external_organ.dm b/code/modules/surgery/organs/external/_external_organ.dm index 54eb937e0ae..fd1af3d5f93 100644 --- a/code/modules/surgery/organs/external/_external_organ.dm +++ b/code/modules/surgery/organs/external/_external_organ.dm @@ -82,14 +82,13 @@ return if(bodypart_overlay.imprint_on_next_insertion) //We only want this set *once* - - // SKYRAT EDIT - Customization - ORIGINAL: bodypart_overlay.set_appearance_from_name(receiver.dna.features[bodypart_overlay.feature_key]) - if(receiver.dna.features[bodypart_overlay.feature_key]) - bodypart_overlay.set_appearance_from_name(receiver.dna.features[bodypart_overlay.feature_key]) - + var/feature_name = receiver.dna.features[bodypart_overlay.feature_key] + if (isnull(feature_name)) + bodypart_overlay.set_appearance_from_dna(receiver.dna) // SKYRAT EDIT CHANGE - ORIGINAL: feature_name = receiver.dna.species.external_organs[type] + // SKYRAT EDIT CHANGE START - Puts the following line in an else block else - bodypart_overlay.set_appearance_from_dna(receiver.dna) - // SKYRAT EDIT END + bodypart_overlay.set_appearance_from_name(feature_name) + // SKYRAT EDIT CHANGE END bodypart_overlay.imprint_on_next_insertion = FALSE ownerlimb = limb From d6f31028ed54ae6a1fac6e0c52547c82bb88b165 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:17:00 +0200 Subject: [PATCH 032/101] Adds a holodeck to Birdshot Station [MDB IGNORE] (#23940) * Adds a holodeck to Birdshot Station (#78548) ## About The Pull Request Nanotrasen has heard your requests and dispatched a Porta-Jump Optional Holodeck Nexus (Porta-JOHN) to Birdshot Station! ![image](https://github.com/tgstation/tgstation/assets/7019927/8c028446-abc1-41ec-b6c8-ee62efdcad44) StrongDMM screenshot. ![image](https://github.com/tgstation/tgstation/assets/7019927/279ea8eb-a409-4f15-8bf0-67c73d6b4eb7) In-game screenshot Not the cleanest landing, but it's nothing you folks can't fix up. Props to zxaber for the genius idea of making it a shuttle Centcom just flew into the side of the station. This is north of Crew Facilities. I feel bad about having to take out the little cave that was there, but this was really the only place that would be publicly accessible, wouldn't require crawling through maints, and would work with how holodecks work. Tested multiple times, appears to be working just fine as far as generating holodeck tiles. ## Why It's Good For The Game Feature parity good, every map should have roughly the same things available, at least in a broad, general sense. ## Changelog :cl: Vekter add: Added a holodeck to Birdshot Station. It can be reached via the Crew Facilities hallway. /:cl: * Adds a holodeck to Birdshot Station --------- Co-authored-by: Vekter --- _maps/map_files/Birdshot/birdshot.dmm | 1440 ++++++++++++++----------- 1 file changed, 814 insertions(+), 626 deletions(-) diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 21b1cddf818..95ecc1879fd 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -788,6 +788,12 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"aqM" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/rack, +/obj/item/electronics/apc, +/turf/open/floor/iron/smooth_large, +/area/station/cargo/warehouse) "aqU" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -1967,6 +1973,10 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter) +"aPK" = ( +/obj/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "aPM" = ( /obj/structure/chair/sofa/bench/right, /obj/machinery/firealarm/directional/north, @@ -3525,6 +3535,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet/orange, /area/station/service/abandoned_gambling_den) +"buP" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/spawner/random/trash, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "buS" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, /obj/effect/turf_decal/stripes/white/line{ @@ -3728,6 +3747,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) +"bzi" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "bzn" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -3910,6 +3936,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmospherics_engine) +"bBA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "bCf" = ( /obj/machinery/computer/shuttle/labor{ dir = 8 @@ -5414,14 +5445,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"cgD" = ( -/obj/machinery/door/airlock{ - name = "Mineshaft" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "cgM" = ( /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) @@ -5497,14 +5520,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"ciL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) "ciR" = ( /obj/structure/table, /obj/effect/spawner/random/techstorage/command_all, @@ -8047,6 +8062,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"dhg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "dhh" = ( /obj/structure/cable, /obj/machinery/status_display/ai/directional/north, @@ -8378,6 +8398,11 @@ /obj/effect/landmark/start/depsec/medical, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) +"dmo" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "dmw" = ( /obj/machinery/atmospherics/components/tank/plasma, /obj/structure/window/reinforced/plasma/spawner/directional/east, @@ -8386,10 +8411,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) -"dmz" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "dmT" = ( /obj/machinery/camera/directional/north{ c_tag = "Xenobiology - Cell 2"; @@ -9311,6 +9332,9 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) +"dDV" = ( +/turf/closed/wall, +/area/station/commons/fitness/recreation/entertainment) "dEt" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 6 @@ -9704,6 +9728,13 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"dMV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "dMX" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, @@ -10489,6 +10520,11 @@ }, /turf/open/floor/iron/small, /area/station/security/prison/shower) +"dZU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "dZZ" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -10952,6 +10988,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/ordnance/testlab) +"ejy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "ejH" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -11008,6 +11049,17 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"ekP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) +"ekX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "ekZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/navigate_destination, @@ -11643,6 +11695,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/science/lobby) +"euV" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "euX" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ dir = 8 @@ -12161,6 +12219,16 @@ /obj/structure/cable, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) +"eDT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass{ + name = "Holodeck" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "eDX" = ( /obj/structure/table/glass, /obj/item/folder/red{ @@ -13709,6 +13777,16 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/space/nearstation) +"fiR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "fjh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -13891,6 +13969,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/security/prison/work) +"fmE" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "fmH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14496,6 +14578,10 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"fvW" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "fwc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -14573,6 +14659,11 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/station/hallway/secondary/entry) +"fxk" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "fxt" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -14611,6 +14702,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_recreation) +"fyf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) +"fyk" = ( +/obj/structure/window/reinforced/shuttle, +/obj/structure/window/reinforced/shuttle, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "fyo" = ( /obj/structure/table, /obj/machinery/light/small/directional/east, @@ -15566,6 +15666,10 @@ }, /turf/open/floor/engine/o2, /area/station/engineering/atmos) +"fMP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "fMQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15607,6 +15711,12 @@ }, /turf/open/floor/engine/o2, /area/station/engineering/atmos) +"fNs" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "fNu" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -16427,6 +16537,14 @@ }, /turf/open/floor/plating, /area/station/medical/treatment_center) +"gex" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/broken_flooring/corner/directional/north, +/obj/structure/sign/poster/official/random/directional/west, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "geE" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -18221,6 +18339,13 @@ "gLb" = ( /turf/closed/wall, /area/station/medical/virology) +"gLo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "gLs" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -18954,6 +19079,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/processing) +"gWG" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/plating/rust, +/area/station/maintenance/fore/greater) "gWN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19413,21 +19542,6 @@ }, /turf/open/floor/wood/large, /area/station/command/corporate_suite) -"hek" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal, -/obj/item/storage/backpack, -/obj/item/storage/backpack/satchel, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/landmark/start/hangover/closet, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons) "hem" = ( /turf/closed/wall, /area/station/hallway/primary/fore) @@ -20241,16 +20355,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/cargo/miningoffice) -"hsK" = ( -/obj/machinery/recycler{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/service/janitor) "hsO" = ( /obj/structure/cable, /obj/effect/spawner/structure/window, @@ -20314,6 +20418,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"hue" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons) "huh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20689,16 +20799,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"hzN" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) "hzV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -20886,6 +20986,14 @@ /obj/machinery/light/floor, /turf/open/floor/iron/dark/small, /area/station/security/brig) +"hCa" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "hCn" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -20916,6 +21024,15 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/station/solars/aft) +"hCV" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Holodeck - Aft"; + name = "holodeck camera" + }, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) "hCX" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -21023,12 +21140,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"hFm" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/rack, -/obj/item/electronics/apc, -/turf/open/floor/iron/smooth_large, -/area/station/cargo/warehouse) "hFx" = ( /turf/open/floor/iron/chapel{ dir = 1 @@ -21072,6 +21183,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs, /area/station/medical/medbay/central) +"hGT" = ( +/obj/machinery/light/cold/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "hHf" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -21174,11 +21293,6 @@ "hJp" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/turret_protected/ai) -"hJr" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "hJC" = ( /obj/structure/closet/crate/hydroponics, /obj/item/paper/guides/jobs/hydroponics, @@ -21833,6 +21947,15 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/cmo, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) +"hWF" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Holodeck - Fore"; + name = "holodeck camera" + }, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) "hWJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -22684,11 +22807,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"imd" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "imj" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "permaouter"; @@ -23306,11 +23424,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"ivO" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "ivX" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -23364,6 +23477,10 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/port) +"ixa" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ixl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23729,10 +23846,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) -"iFi" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "iFs" = ( /obj/structure/window/spawner/directional/east, /turf/open/misc/sandy_dirt, @@ -23770,6 +23883,13 @@ dir = 1 }, /area/station/engineering/atmos) +"iGi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/directional/south, +/obj/item/reagent_containers/cup/bucket, +/obj/item/mop, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "iGl" = ( /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) @@ -23814,11 +23934,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"iHs" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iHy" = ( /obj/structure/window/reinforced/plasma/spawner/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -24353,19 +24468,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"iQF" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) -"iQK" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "iQU" = ( /obj/structure/closet{ name = "janitorial supplies" @@ -24381,11 +24483,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/port/aft) -"iRv" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iRz" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -24428,15 +24525,6 @@ "iSr" = ( /turf/open/floor/iron, /area/station/security/execution/transfer) -"iSB" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iSK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -24445,13 +24533,6 @@ /obj/structure/sign/warning/pods/directional/west, /turf/open/floor/iron/checker, /area/station/security/breakroom) -"iSO" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "iSW" = ( /obj/structure/rack, /obj/item/clothing/gloves/boxing/yellow, @@ -24963,6 +25044,23 @@ "jaQ" = ( /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/processing) +"jaX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/obj/item/storage/backpack, +/obj/item/storage/backpack/satchel, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/landmark/start/hangover/closet, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/directional/west, +/turf/open/floor/iron, +/area/station/commons) "jbb" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -24990,9 +25088,6 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/rd) -"jbm" = ( -/turf/closed/mineral/random/stationside, -/area/station/maintenance/fore/greater) "jbr" = ( /obj/structure/table/glass, /obj/item/folder/blue{ @@ -25109,16 +25204,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) -"jey" = ( -/obj/structure/cable, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) -"jez" = ( -/obj/structure/cable, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "jeC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -25146,12 +25231,6 @@ /obj/structure/sign/departments/medbay/alt/directional/west, /turf/open/floor/plating, /area/station/medical/medbay/lobby) -"jeX" = ( -/obj/structure/cable, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "jfs" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -25794,10 +25873,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) -"jsn" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "jsv" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -26171,12 +26246,6 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/hallway/secondary/service) -"jzl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "jzo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26223,11 +26292,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction) -"jAs" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "jAw" = ( /obj/structure/cable, /obj/machinery/light/small/directional/east, @@ -27482,6 +27546,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/textured_large, /area/station/cargo/office) +"jXc" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "jXe" = ( /obj/machinery/holopad/secure, /turf/open/floor/iron/smooth, @@ -27531,15 +27603,6 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner, /turf/open/floor/iron, /area/station/security) -"jXE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/cold/directional/north, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) "jXQ" = ( /obj/structure/flora/bush/large/style_random{ pixel_x = -18; @@ -29219,11 +29282,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) -"kDq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons) "kDV" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -29369,11 +29427,6 @@ dir = 1 }, /area/station/maintenance/department/engine/atmos) -"kGz" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/reagent_dispensers/plumbed, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "kGB" = ( /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) @@ -29665,11 +29718,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"kKN" = ( -/obj/structure/barricade/wooden, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "kKT" = ( /obj/machinery/computer/camera_advanced/xenobio{ dir = 4 @@ -30352,12 +30400,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/grass, /area/station/cargo/storage) -"kZf" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "kZh" = ( /obj/structure/table/glass, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -30366,14 +30408,6 @@ /obj/item/modular_computer/laptop, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"kZo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "kZx" = ( /obj/machinery/button/door/directional/north{ id = "main_surgery"; @@ -30552,6 +30586,11 @@ /obj/machinery/camera/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"lcI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "lcN" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -31050,6 +31089,10 @@ /obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"liM" = ( +/obj/machinery/rnd/bepis, +/turf/open/floor/iron, +/area/station/cargo/storage) "liP" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark/small, @@ -31070,6 +31113,13 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/department/medical/central) +"ljf" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "ljk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -31332,6 +31382,13 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/office) +"lnt" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "lnu" = ( /obj/machinery/holopad, /turf/open/floor/iron/dark, @@ -31353,10 +31410,6 @@ /obj/structure/ore_box, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"lnT" = ( -/obj/machinery/rnd/bepis, -/turf/open/floor/iron, -/area/station/cargo/storage) "lnZ" = ( /obj/effect/turf_decal/tile/dark_red, /obj/effect/decal/cleanable/dirt, @@ -31468,9 +31521,6 @@ "lql" = ( /turf/open/floor/wood/parquet, /area/station/service/library) -"lqs" = ( -/turf/closed/wall/rust, -/area/station/maintenance/fore/greater) "lqt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31885,6 +31935,11 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/psychology) +"lyi" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) "lyj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32173,6 +32228,11 @@ /obj/structure/falsewall, /turf/open/floor/plating, /area/station/maintenance/aft) +"lCP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "lCS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -32920,12 +32980,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/prison/rec) -"lPG" = ( -/obj/machinery/vending/clothing, -/obj/machinery/camera/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/commons) "lPI" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -33219,6 +33273,13 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/plating, /area/station/cargo/sorting) +"lVw" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/rust, +/area/station/maintenance/fore/greater) "lVy" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 8 @@ -34006,6 +34067,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"miY" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "mjf" = ( /obj/structure/table/reinforced/rglass, /obj/machinery/door/window/left/directional/west{ @@ -34543,6 +34610,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"muD" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) "muI" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -35037,6 +35110,14 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"mDt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "mDC" = ( /obj/structure/closet/crate{ name = "Game Supplies" @@ -35149,6 +35230,11 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/eighties, /area/station/service/abandoned_gambling_den/gaming) +"mFo" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "mFq" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -35543,11 +35629,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"mLx" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "mLA" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -36019,6 +36100,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) +"mVg" = ( +/turf/closed/wall/mineral/titanium, +/area/station/commons/fitness/recreation/entertainment) "mVm" = ( /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 1 @@ -36046,6 +36130,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"mVy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/chair/stool, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "mVC" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -36254,6 +36344,16 @@ /obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"mZQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "mZX" = ( /obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, @@ -36375,6 +36475,16 @@ /obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"ncf" = ( +/obj/machinery/recycler{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/service/janitor) "ncl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36449,10 +36559,6 @@ }, /turf/open/floor/wood/tile, /area/station/commons/vacant_room/commissary) -"net" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons) "neZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36675,6 +36781,9 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"niB" = ( +/turf/closed/wall/r_wall, +/area/station/commons/fitness/recreation/entertainment) "niI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/white{ @@ -37421,6 +37530,14 @@ dir = 1 }, /area/station/hallway/secondary/dock) +"nwo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "nwN" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -38305,6 +38422,11 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/central/greater) +"nLL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "nLN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -38694,6 +38816,12 @@ }, /turf/open/floor/iron/small, /area/station/medical/morgue) +"nTR" = ( +/obj/machinery/power/shuttle_engine/propulsion{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "nUi" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39115,6 +39243,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"odY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "oem" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -39793,6 +39926,13 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"oqp" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "oqE" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -40470,10 +40610,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/dorms) -"oEm" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "oEr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40692,6 +40828,14 @@ /obj/item/circuitboard/machine/biogenerator, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"oJd" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/duct, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "oJi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40905,6 +41049,11 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"oNs" = ( +/obj/structure/girder, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "oNv" = ( /obj/effect/turf_decal/tile/dark_red/anticorner/contrasted{ dir = 1 @@ -42136,6 +42285,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"pjC" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "pjL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -42788,11 +42941,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) -"puC" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "puD" = ( /obj/structure/bookcase/random/nonfiction, /obj/machinery/newscaster/directional/west, @@ -43847,11 +43995,6 @@ }, /turf/open/floor/iron/small, /area/station/ai_monitored/command/storage/eva) -"pLk" = ( -/mob/living/basic/mining/basilisk, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "pLl" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -44899,6 +45042,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/construction) +"qci" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "qcl" = ( /obj/item/radio/intercom/directional/south, /turf/open/floor/wood, @@ -45967,6 +46116,15 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"qsm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/light/cold/directional/north, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) "qsu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46971,6 +47129,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/processing) +"qIu" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/broken_flooring/singular/directional/west, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "qIv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47370,6 +47535,10 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"qQE" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "qQK" = ( /turf/open/floor/iron/white/corner{ dir = 1 @@ -49986,14 +50155,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"rGL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/picket_sign{ - desc = "Can't you read? it clearly says what it says!"; - name = "DO NOT ENTER" - }, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "rGN" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -50109,10 +50270,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/station/engineering/gravity_generator) -"rIO" = ( -/obj/effect/spawner/random/trash, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "rIS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/cafeteria, @@ -50395,6 +50552,10 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/command/gateway) +"rNF" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/misc/asteroid, +/area/space/nearstation) "rNJ" = ( /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/iron/cafeteria, @@ -50607,6 +50768,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"rRx" = ( +/obj/machinery/camera/directional/west, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "rRy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51766,10 +51933,10 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/medical/chemistry) -"skH" = ( -/obj/structure/rack, -/obj/item/flashlight/lantern, -/turf/open/misc/asteroid, +"skt" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/rust, /area/station/maintenance/fore/greater) "skP" = ( /obj/effect/spawner/structure/window, @@ -54129,6 +54296,13 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/storage/tech) +"sYv" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/spawner/directional/south, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation/entertainment) "sYx" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer, /obj/effect/turf_decal/stripes, @@ -54326,10 +54500,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"tbM" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "tbS" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -55371,13 +55541,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"twh" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/sandstone, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "twi" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -55457,10 +55620,6 @@ }, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) -"twN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "twR" = ( /obj/structure/table/glass, /obj/machinery/cell_charger, @@ -55851,13 +56010,6 @@ /obj/machinery/shower/directional/west, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"tDm" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "tDn" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/prison) @@ -56037,6 +56189,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"tGa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "tGp" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine, @@ -56253,6 +56410,10 @@ /obj/effect/turf_decal/tile/green/diagonal_centre, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"tKF" = ( +/mob/living/basic/mining/basilisk, +/turf/open/misc/asteroid, +/area/space/nearstation) "tKG" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/broken_floor, @@ -57976,11 +58137,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"unK" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "unM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/public/glass{ @@ -58743,6 +58899,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs, /area/station/engineering/storage/tech) +"uBJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/trash/cheesie{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "uBQ" = ( /obj/structure/table/bronze, /obj/machinery/microwave{ @@ -59221,6 +59386,11 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"uJn" = ( +/obj/machinery/light/cold/directional/south, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "uJD" = ( /obj/structure/chair/sofa/bench/right{ dir = 1 @@ -59459,6 +59629,10 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/primary/aft) +"uNZ" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "uOh" = ( /obj/structure/chair{ dir = 1; @@ -60641,13 +60815,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/small, /area/station/maintenance/starboard/central) -"viR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/directional/south, -/obj/item/reagent_containers/cup/bucket, -/obj/item/mop, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "viT" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/iron, @@ -61150,6 +61317,11 @@ }, /turf/open/space/basic, /area/space/nearstation) +"voV" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vpb" = ( /obj/machinery/door/airlock/hatch{ name = "Tool Supply Corridor" @@ -61239,6 +61411,11 @@ "vqp" = ( /turf/open/floor/carpet/lone, /area/station/service/theater) +"vqt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vqH" = ( /obj/structure/railing{ dir = 8 @@ -61260,18 +61437,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/tcommsat/server) -"vra" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/clothing/under/rank/cargo/miner/lavaland{ - pixel_y = 3 - }, -/obj/item/clothing/suit/hooded/wintercoat/miner{ - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "vrf" = ( /obj/structure/hedge, /obj/machinery/light/small/directional/north, @@ -61902,6 +62067,10 @@ "vAD" = ( /turf/open/floor/wood/tile, /area/station/maintenance/port/lesser) +"vAE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "vAK" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -62638,11 +62807,6 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"vMS" = ( -/obj/item/pickaxe, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "vMT" = ( /obj/machinery/hydroponics/soil, /obj/item/food/grown/mushroom/libertycap, @@ -62721,6 +62885,14 @@ /obj/effect/turf_decal/stripes/red/line, /turf/open/floor/iron/small, /area/station/hallway/secondary/spacebridge) +"vOj" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/glass/plastitanium, +/turf/open/floor/plating, +/area/station/maintenance/fore/greater) "vOr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62782,6 +62954,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"vPM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "vPP" = ( /turf/closed/wall, /area/station/command/corporate_suite) @@ -63033,10 +63216,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) -"vTO" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "vTV" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) @@ -63250,6 +63429,10 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white/corner, /area/station/science/lobby) +"vWk" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "vWr" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "permaouter"; @@ -63293,6 +63476,13 @@ "vWM" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/fore) +"vWN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "vWQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -63917,10 +64107,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) -"whS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "whX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock{ @@ -64046,6 +64232,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/service/janitor) +"wjU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass{ + name = "Holodeck Access" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "wjY" = ( /obj/structure/window/spawner/directional/east, /obj/structure/table/wood, @@ -65258,6 +65453,12 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"wDs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons) "wDu" = ( /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/noslip/tram_platform, @@ -66292,11 +66493,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/security/prison/work) -"wTn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "wTs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/official/random/directional/north, @@ -67328,6 +67524,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"xgT" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "xhe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -68640,6 +68842,14 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/lobby) +"xyv" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/station/maintenance/fore/greater) "xyx" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -69163,11 +69373,6 @@ /obj/item/reagent_containers/cup/glass/drinkingglass, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"xGS" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "xGT" = ( /obj/effect/turf_decal/tile/dark_red/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -69715,6 +69920,9 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/rd) +"xOy" = ( +/turf/open/misc/asteroid, +/area/space/nearstation) "xOB" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -70588,6 +70796,15 @@ "xYK" = ( /turf/open/floor/iron/grimy, /area/station/science/cubicle) +"xYN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/computer/holodeck{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "xYO" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/bridge) @@ -70849,24 +71066,6 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/department/medical/central) -"ycz" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/sheet/mineral/coal{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/stack/sheet/mineral/coal{ - pixel_x = 1; - pixel_y = 8 - }, -/obj/item/stack/sheet/mineral/coal{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "ycC" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) @@ -70909,9 +71108,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood/tile, /area/station/command/bridge) -"ydt" = ( -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "ydu" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -71137,9 +71333,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"yfX" = ( -/turf/open/floor/plating/rust, -/area/station/maintenance/fore/greater) "yfY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71437,11 +71630,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/white/small, /area/station/science/cubicle) -"yju" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/fore/greater) "yjD" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -83003,7 +83191,7 @@ uzJ mQh nJU ppk -lnT +liM ovQ oRr poM @@ -83504,14 +83692,14 @@ gOK slY hfc slY -viR +iGi jBb kPW kwY -whS -dmz +vAE +ixa slY -hzN +mZQ lRc moz kee @@ -83761,14 +83949,14 @@ gPN gZk iNE ueX -mLx +voV kwY slY slY kwY slY slY -jXE +qsm lTv oem oem @@ -84021,10 +84209,10 @@ jCo hff jCo slY -wTn -whS +vqt +vAE kPW -tDm +ljf jkS lTN mRD @@ -84282,7 +84470,7 @@ slY slY slY slY -ciL +nwo lUz ohj ohj @@ -84532,7 +84720,7 @@ sNz hyO roi slY -hFm +aqM hAN jMb kzI @@ -104588,7 +104776,7 @@ xmO sHe nFW mEy -hsK +ncf nFA kBH onR @@ -105091,14 +105279,14 @@ nyi rvp rvp uIT -xqC +uIT wSZ tdI hHE nNi hPs xmO -sJR +ejy sIA jPq kaF @@ -105344,18 +105532,18 @@ dDB dDB aJq aJq -jbm -jbm -jbm -jbm -jbm -xmO -xmO -xmO +dDV +dDV +dDV +dDV +dDV +niB +niB +niB +niB xmO xmO -xmO -jsn +oTL sIS nFW sRL @@ -105601,19 +105789,19 @@ dDB dDB aJq aJq -jbm -jbm -jbm -jbm -jbm -jbm -jbm -jbm -tbM -iFi -iQF +dDV +euV +hGT +hCa +dmo +rRx +xgT +gex +dDV +gWG jej -jAs +jej +oqp nFW pmn wZl @@ -105858,18 +106046,18 @@ dDB aJq aJq aJq -jbm -vTO -jbm -jbm -twN -jbm -jbm -lqs -xGS -yfX -twN -tDB +dDV +mVy +nLL +dhg +vWk +bBA +fxk +uJn +dDV +nFW +xyv +nFW nFW nFW tBL @@ -106111,24 +106299,24 @@ dDB dDB dDB dDB -dDB aJq aJq aJq -jbm -oEm -jbm -jbm -oEm -jbm -twN -nFW -rGL -puC -kZf -jey -nFW -hek +aJq +dDV +lCP +vWN +gLo +vWk +fMP +mDt +vWk +fmE +fNs +fxk +fvW +dDV +jaX wXt ndZ vRx @@ -106360,36 +106548,36 @@ aJq aJq aJq aJq +hwJ +blb +blb +blb +blb +blb +blb +blb +blb +hwJ aJq aJq -dDB -dDB -dDB -dDB -dDB -dDB -dDB -aJq -aJq -aJq -jbm -twN -ydt -twN -twN -twN -twN -cgD -twN -jsn -oTL -jez -nFW -lPG -wXt -net -kDq -kDq +dDV +dZU +uBJ +ekP +fyf +tGa +xYN +dMV +eDT +dMV +dMV +ekX +wjU +wYC +wDs +wYC +hue +hue ldB bnh lPd @@ -106617,31 +106805,31 @@ aJq aJq aJq aJq -hwJ -blb -blb -blb -blb -blb -blb -blb -blb -hwJ aJq -jbm -jbm -ydt -jbm -jbm -ydt -jbm -skH -lqs -imd -rIO -pLK -jeX -nFW +dDB +dDB +dDB +dDB +dDB +dDB +dDB +dDB +mVg +aPK +oNs +aPK +fiR +fmE +fmE +vPM +fmE +fmE +fmE +fmE +odY +uNZ +qIu +dDV qhq tDq rnn @@ -106882,21 +107070,21 @@ dDB dDB dDB dDB -aJq -aJq -aJq -jbm -twN -ydt -jbm -jbm -kKN -jbm -jbm -jbm -jbm -sJR -jzl +mVg +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +mVg +nFW +xyv nFW nFW nFW @@ -107138,27 +107326,27 @@ dDB dDB dDB dDB -dDB -aJq -aJq -aJq -jbm -oEm -jbm -jbm -jbm -ydt -jbm -jbm -jbm -jbm -iHs -iQK +nTR +sYv +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +mVg +skt +lVw tDB odK tDB tDB -unK +pjC nFW cCP oow @@ -107395,22 +107583,22 @@ dDB dDB dDB dDB -dDB -aJq -aJq -jbm -jbm -twN -jbm -jbm -jbm -twN -twh -ycz -jbm -jbm -jbm -iRv +nTR +sYv +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +oNs +skt +pLK bjX nFW nFW @@ -107652,22 +107840,22 @@ dDB dDB dDB dDB -dDB -aJq -aJq -jbm -twN -twN -jbm -jbm -jbm -puC -ydt -vra -jbm -nFW -nFW -iSB +nTR +sYv +mVg +lyi +lyi +muD +lyi +lyi +lyi +lyi +lyi +lyi +lyi +oNs +lcI +lnt nFW nFW mjk @@ -107909,22 +108097,22 @@ dDB dDB dDB dDB -dDB -dDB -aJq -jbm -pLk -twN -jbm -jbm -jbm -ydt -puC -hJr -jbm -nFW -ivO -pLK +mVg +mVg +mVg +hWF +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +hCV +oNs +qci +lnt nFW sJR sJR @@ -108166,22 +108354,22 @@ dDB dDB dDB dDB -dDB -dDB -aJq -aJq -jbm -jbm -jbm -jbm -jbm -vMS -puC -jbm -jbm -nFW -yju -iRv +nTR +sYv +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +mVg +miY +vOj jfP nfc jQF @@ -108423,22 +108611,22 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -jbm -jbm -jbm -jbm -jbm -jbm -jbm -nFW -kGz -kZo +nTR +sYv +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +muD +lyi +lyi +mVg +qQE +buP nFW lLv sJR @@ -108680,22 +108868,22 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -jbm -jbm -jbm -jbm -jbm -jbm -sJR -njm +nTR +sYv +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +oNs +mFo +jXc nFW nFW nFW @@ -108938,22 +109126,22 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -jbm -jbm -jbm -jbm -nFW -nFW -iSO -bHA +mVg +mVg +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +lyi +mVg +qQE +bzi +oJd dxz sJR xwy @@ -109196,18 +109384,18 @@ dDB dDB dDB dDB -dDB -dDB -dDB -aJq -aJq -aJq -aJq -aJq -jbm -jbm -jbm -jbm +mVg +aPK +aPK +aPK +fyk +aPK +oNs +oNs +aPK +aPK +aPK +mVg nFW iSW njm @@ -109462,9 +109650,9 @@ hwJ aJq aJq vcE -vcE -vcE -vcE +jIb +pyt +nvS nFW iUy vtL @@ -110488,8 +110676,8 @@ aJq aJq aJq aJq -aJq -weg +xOy +jJy nvS kbY imE @@ -110744,8 +110932,8 @@ aJq aJq aJq aJq -aJq -aJq +xOy +xOy weg jKf nvS @@ -110999,9 +111187,9 @@ dDB dDB aJq aJq -aJq -aJq -aJq +xOy +xOy +xOy aJq weg weg @@ -111256,8 +111444,8 @@ dDB dDB aJq aJq -aJq -aJq +xOy +rNF aJq aJq weg @@ -111513,7 +111701,7 @@ dDB dDB aJq aJq -aJq +tKF aJq aJq aJq From 381a3adc30aa0494b474e29e1974aacc707d6317 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:18:49 +0200 Subject: [PATCH 033/101] Fixes a callback qdeletion during acid component deletion [MDB IGNORE] (#23937) * Fixes a callback qdeletion during acid component deletion * Update acid.dm --------- Co-authored-by: distributivgesetz Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- code/datums/components/acid.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index 9758cd0c1b6..1d9cf9e87d6 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -78,8 +78,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e QDEL_NULL(sizzle) if(particle_effect) QDEL_NULL(particle_effect) - if(process_effect) - process_effect = null + process_effect = null return ..() /datum/component/acid/RegisterWithParent() From c60fb6b8167ba61c809974236e1a6514aa556c69 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:18:59 +0200 Subject: [PATCH 034/101] Fixes some more issues with job configs not being loaded by ResetOccupation [MDB IGNORE] (#23936) * Fixes some more issues with job configs not being loaded by ResetOccupation (#78596) ## About The Pull Request Job configs would get reset by ResetOccupation and not loaded afterwards. This fixes that. ## Why It's Good For The Game Bugfix ## Changelog :cl: fix: Fixed job configs not being loaded properly. /:cl: --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> * Fixes some more issues with job configs not being loaded by ResetOccupation --------- Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> --- code/controllers/configuration/entries/jobs.dm | 5 +++-- code/controllers/subsystem/job.dm | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/controllers/configuration/entries/jobs.dm b/code/controllers/configuration/entries/jobs.dm index 99a3ab7a701..06563e01a8e 100644 --- a/code/controllers/configuration/entries/jobs.dm +++ b/code/controllers/configuration/entries/jobs.dm @@ -9,7 +9,7 @@ return returnable_list /// Sets all of the job datum configurable values to what they've been set to in the config file, jobconfig.toml. -/datum/controller/subsystem/job/proc/load_jobs_from_config() +/datum/controller/subsystem/job/proc/load_jobs_from_config(silent = FALSE) if(!length(job_config_datum_singletons)) stack_trace("SSjob tried to load jobs from config, but the config singletons were not initialized! Likely tried to load jobs before SSjob was initialized.") return @@ -25,7 +25,8 @@ var/job_key = occupation.config_tag if(!job_config[job_key]) // Job isn't listed, skip it. // List both job_title and job_key in case they de-sync over time. - message_admins(span_notice("[occupation.title] (with config key [job_key]) is missing from jobconfig.toml! Using codebase defaults.")) + if(!silent) + message_admins(span_notice("[occupation.title] (with config key [job_key]) is missing from jobconfig.toml! Using codebase defaults.")) continue for(var/config_datum_key in job_config_datum_singletons) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 96f391b91eb..976b4bab249 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -305,8 +305,10 @@ SUBSYSTEM_DEF(job) player.mind.special_role = null SetupOccupations() unassigned = list() - if(overflow_role) - set_overflow_role(overflow_role) + if(CONFIG_GET(flag/load_jobs_from_txt)) + // Any errors with the configs has already been said, we don't need to repeat them here. + load_jobs_from_config(silent = TRUE) + set_overflow_role(overflow_role) return From 6f6e6bb10e9a9edae014c88fec73f3196e65f9da Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:23:08 +0200 Subject: [PATCH 035/101] Gives maint drones random designations [MDB IGNORE] (#23944) * Gives maint drones random designations (#78573) ## About The Pull Request Right now, drone ghost spawners give all drones the name "drone." This makes it difficult to differentiate drones, both as a drone in drone chat and as a non-drone. This gives all drones a unique identifier like posibrains. Also changes a couple of 1s to TRUEs ## Why It's Good For The Game It's good to be able to identify drones, and for drones to be able to identify each other. ## Changelog :cl: Tattle qol: drones now have individual names, instead of just "drone" /:cl: Co-authored-by: tattle * Gives maint drones random designations --------- Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com> Co-authored-by: tattle --- code/modules/mob/living/simple_animal/hostile/alien.dm | 4 ++-- .../living/simple_animal/hostile/constructs/constructs.dm | 2 +- code/modules/mob_spawn/ghost_roles/drone_roles.dm | 6 ++++++ tgstation.dme | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 code/modules/mob_spawn/ghost_roles/drone_roles.dm diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index b392417aab2..2d17820af0b 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -32,7 +32,7 @@ lighting_cutoff_red = 30 lighting_cutoff_green = 15 lighting_cutoff_blue = 50 - unique_name = 1 + unique_name = TRUE gold_core_spawnable = NO_SPAWN death_sound = 'sound/voice/hiss6.ogg' death_message = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -91,7 +91,7 @@ projectiletype = /obj/projectile/neurotoxin/damaging projectilesound = 'sound/weapons/pierce.ogg' status_flags = 0 - unique_name = 0 + unique_name = FALSE var/sterile = 1 var/plants_off = 0 var/egg_cooldown = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm index 124b797d0da..23f7590dc8e 100644 --- a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm @@ -28,7 +28,7 @@ maxbodytemp = INFINITY faction = list(FACTION_CULT) pressure_resistance = 100 - unique_name = 1 + unique_name = TRUE AIStatus = AI_OFF //normal constructs don't have AI loot = list(/obj/item/ectoplasm) del_on_death = TRUE diff --git a/code/modules/mob_spawn/ghost_roles/drone_roles.dm b/code/modules/mob_spawn/ghost_roles/drone_roles.dm new file mode 100644 index 00000000000..b8a31a16b13 --- /dev/null +++ b/code/modules/mob_spawn/ghost_roles/drone_roles.dm @@ -0,0 +1,6 @@ +/obj/effect/mob_spawn/ghost_role/drone/name_mob(mob/living/spawned_mob, forced_name) + if(!forced_name) + var/designation = pick(GLOB.posibrain_names) + forced_name = "Drone ([designation]-[rand(100, 999)])" + + return ..() diff --git a/tgstation.dme b/tgstation.dme index f2081f6bf3a..44657970ff0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4766,6 +4766,7 @@ #include "code\modules\mob_spawn\corpses\nonhuman_corpses.dm" #include "code\modules\mob_spawn\corpses\species_corpses.dm" #include "code\modules\mob_spawn\ghost_roles\away_roles.dm" +#include "code\modules\mob_spawn\ghost_roles\drone_roles.dm" #include "code\modules\mob_spawn\ghost_roles\fugitive_hunter_roles.dm" #include "code\modules\mob_spawn\ghost_roles\golem_roles.dm" #include "code\modules\mob_spawn\ghost_roles\mining_roles.dm" From dbac8c8be6c5b52a1705c28772a102fcec4c4591 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:23:28 +0200 Subject: [PATCH 036/101] Fixes AI rolling so that you can't roll around if you're not on a turf, also improves AI rolling code and usage [MDB IGNORE] (#23945) * [NO GBP] Fixes AI rolling so that you can't roll around if you're not on a turf, also improves AI rolling code and usage (#78434) ## About The Pull Request Closes https://github.com/tgstation/tgstation/issues/78416 A bit of a blanket fix, but I couldnt come up with a better solution. AI rolling now doesnt require you to click on a adjacent turf, instead it just moves you in the direction of where you clicked. AI rolling cooldown is now a var, as is the roll time. * [NO GBP] Fixes AI rolling so that you can't roll around if you're not on a turf, also improves AI rolling code and usage --------- Co-authored-by: nikothedude <59709059+nikothedude@users.noreply.github.com> --- .../antagonists/malf_ai/malf_ai_modules.dm | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index a6c6616ad48..49d464fde16 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -9,7 +9,6 @@ #define MALF_AI_ROLL_COOLDOWN 1 SECONDS + MALF_AI_ROLL_TIME #define MALF_AI_ROLL_DAMAGE 75 #define MALF_AI_ROLL_CRIT_CHANCE 5 //percent -#define MALF_AI_ROLL_MAX_DISTANCE 1 //anything further away than this, and the roll will fail GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/field/containment, @@ -1138,6 +1137,11 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) enable_text = span_notice("Your inner servos shift as you prepare to roll around. Click adjacent tiles to roll onto them!") disable_text = span_notice("You disengage your rolling protocols.") + /// How long does it take for us to roll? + var/roll_over_time = MALF_AI_ROLL_TIME + /// On top of [roll_over_time], how long does it take for the ability to cooldown? + var/roll_over_cooldown = MALF_AI_ROLL_COOLDOWN + /datum/action/innate/ai/ranged/core_tilt/New() . = ..() desc = "[desc] It has [uses] use\s remaining." @@ -1152,7 +1156,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) return FALSE var/mob/living/silicon/ai/ai_caller = caller - if (ai_caller.incapacitated()) + if (ai_caller.incapacitated() || !isturf(ai_caller.loc)) return FALSE var/turf/target = get_turf(clicked_on) @@ -1163,30 +1167,32 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) target.balloon_alert(ai_caller, "can't roll on yourself!") return FALSE - if (get_dist(ai_caller, target) > MALF_AI_ROLL_MAX_DISTANCE) - target.balloon_alert(ai_caller, "too far!") - return FALSE - var/picked_dir = get_dir(ai_caller, target) + if (!picked_dir) + return FALSE + var/turf/temp_target = get_step(ai_caller, picked_dir) // we can move during the timer so we cant just pass the ref - new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(target, MALF_AI_ROLL_TIME) + new /obj/effect/temp_visual/telegraphing/vending_machine_tilt(temp_target, roll_over_time) ai_caller.balloon_alert_to_viewers("rolling...") - addtimer(CALLBACK(src, PROC_REF(do_roll_over), ai_caller, picked_dir), MALF_AI_ROLL_TIME) + addtimer(CALLBACK(src, PROC_REF(do_roll_over), ai_caller, picked_dir), roll_over_time) adjust_uses(-1) if(uses) desc = "[initial(desc)] It has [uses] use\s remaining." build_all_button_icons() - COOLDOWN_START(src, time_til_next_tilt, MALF_AI_ROLL_COOLDOWN) + COOLDOWN_START(src, time_til_next_tilt, roll_over_cooldown) /datum/action/innate/ai/ranged/core_tilt/proc/do_roll_over(mob/living/silicon/ai/ai_caller, picked_dir) + if (ai_caller.incapacitated() || !isturf(ai_caller.loc)) // prevents bugs where the ai is carded and rolls + return + var/turf/target = get_step(ai_caller, picked_dir) // in case we moved we pass the dir not the target turf if (isnull(target)) return - var/paralyze_time = clamp(6 SECONDS, 0 SECONDS, (MALF_AI_ROLL_COOLDOWN * 0.9)) //the clamp prevents stunlocking as the max is always a little less than the cooldown between rolls + var/paralyze_time = clamp(6 SECONDS, 0 SECONDS, (roll_over_cooldown * 0.9)) //the clamp prevents stunlocking as the max is always a little less than the cooldown between rolls return ai_caller.fall_and_crush(target, MALF_AI_ROLL_DAMAGE, MALF_AI_ROLL_CRIT_CHANCE, null, paralyze_time, picked_dir, rotation = get_rotation_from_dir(picked_dir)) @@ -1321,4 +1327,3 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) #undef MALF_AI_ROLL_TIME #undef MALF_AI_ROLL_DAMAGE #undef MALF_AI_ROLL_CRIT_CHANCE -#undef MALF_AI_ROLL_MAX_DISTANCE From 10f59184c331681441ba722c1ae11c5cd4f49e18 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:24:02 +0200 Subject: [PATCH 037/101] Planetary atmos fix [MDB IGNORE] (#23946) * Planetary atmos fix (#78602) ## About The Pull Request The code for generating random atmospheres for lavaland and icemoon has variables that define the minimum and maximum pressure that the atmosphere can be. However, due to an oversight, it was possible for the actual pressure to be below this minimum. This caused problems for the flight potion wings, as the wings will not work if the pressure is lower than the minimum lavaland/icemoon pressure. I tested this by making a quick test proc that would generate lavaland atmos 100 times, and count how often the final pressure was lower than the minimum pressure. I ran it a few times after making my changes, and it returned 0 failures every time, so I'm confident that my code works. ## Why It's Good For The Game I think its good practice for minimums and maximums variables like this to actually be hard limits. Furthermore, if there's _one_ place that mining loot should actually be useful, then its outside where you mine. ## Changelog :cl: fix: The flight potion wings will no longer fail to work on lavaland/icemoon on rare occasions. /:cl: * Planetary atmos fix --------- Co-authored-by: GPeckman <21979502+GPeckman@users.noreply.github.com> --- code/datums/atmosphere/_atmosphere.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/datums/atmosphere/_atmosphere.dm b/code/datums/atmosphere/_atmosphere.dm index 1dace1dd1b2..702a42e7ab0 100644 --- a/code/datums/atmosphere/_atmosphere.dm +++ b/code/datums/atmosphere/_atmosphere.dm @@ -52,6 +52,9 @@ ASSERT_GAS_IN_LIST(gastype, gaslist) gaslist[gastype][MOLES] += amount + // Ensure that minimum_pressure is actually a hard lower limit + target_pressure = clamp(target_pressure, minimum_pressure + (gaslist[gastype][MOLES] * 0.1), maximum_pressure) + // That last one put us over the limit, remove some of it while(gasmix.return_pressure() > target_pressure) gaslist[gastype][MOLES] -= gaslist[gastype][MOLES] * 0.1 From ba579f9b263eb3a1e2982a735acbc3423b3cf741 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:24:24 +0200 Subject: [PATCH 038/101] Fixes full advanced surgery trays spawning with 'nothing' [MDB IGNORE] (#23947) * Fixes full advanced surgery trays spawning with 'nothing' (#78591) ## About The Pull Request Fixes full advanced surgery trays spawning with 'nothing' They were spawning into null space ## Why It's Good For The Game I dont know ## Changelog Zepyhyr, Carlarc, Not Jacquerel :cl: fix: Fixes full advanced surgery trays spawning with 'nothing' /:cl: * Fixes full advanced surgery trays spawning with 'nothing' --------- Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com> --- code/game/objects/items/surgery_tray.dm | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index dfe83baabdb..9d4a588ff9e 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -207,7 +207,7 @@ name = "autopsy tray" desc = "A Deforest brand surgery tray, made for use in morgues. It is a folding model, \ meaning the wheels on the bottom can be extended outwards, making it a cart." - + /obj/item/surgery_tray/full/morgue/populate_contents() new /obj/item/blood_filter(src) new /obj/item/bonesetter(src) @@ -227,13 +227,13 @@ /obj/item/surgery_tray/full/advanced /obj/item/surgery_tray/full/advanced/populate_contents() - new /obj/item/scalpel/advanced - new /obj/item/retractor/advanced - new /obj/item/cautery/advanced - new /obj/item/surgical_drapes - new /obj/item/reagent_containers/medigel/sterilizine - new /obj/item/bonesetter - new /obj/item/blood_filter - new /obj/item/stack/medical/bone_gel - new /obj/item/stack/sticky_tape/surgical - new /obj/item/clothing/mask/surgical + new /obj/item/scalpel/advanced(src) + new /obj/item/retractor/advanced(src) + new /obj/item/cautery/advanced(src) + new /obj/item/surgical_drapes(src) + new /obj/item/reagent_containers/medigel/sterilizine(src) + new /obj/item/bonesetter(src) + new /obj/item/blood_filter(src) + new /obj/item/stack/medical/bone_gel(src) + new /obj/item/stack/sticky_tape/surgical(src) + new /obj/item/clothing/mask/surgical(src) From 9698657a8d472a773238ba139de258b26ce3a73c Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:25:05 +0200 Subject: [PATCH 039/101] Fixed headless zambos and the oversight of no bio armor resistance [MDB IGNORE] (#23948) * Fixed headless zambos and the oversight of no bio armor resistance (#78589) ## About The Pull Request Fixed zombies being able to infect headless corpses (Including former zombies) Fixed bio armor being totally useless against zombies. Now it checks how hurt your limb is: If it's more than the bio armor value, you get infected. THICKMATERIAL clothing guarantees at least 25 damage required to infect you, non-thick clothing reduces effective defence by 25. In practice this means people with MODsuits, biosuits will resist infection unless they're pummeled into crit, and wearing a firesuit will save you from the first few slashes. Fixed the bomb hood armor not having the same bio armor value as bomb armor. Added a message to the zed when they succesfully infect someone. Turned some proc names into snake_case rather than, uh, nospacecase. ## Why It's Good For The Game > Fixed zombies being able to infect headless corpses (Including former zombies) This is pretty cool but it also means you can't actually permanently kill a zombie if they just get slashed again by another zombie. > Fixed bio armor being totally useless against zombies. Now it checks how hurt your limb is: If it's more than the bio armor value, you get infected. THICKMATERIAL clothing guarantees at least 25 damage required to infect you, non-thick clothing reduces effective defence by 25. In practice this means people with MODsuits, biosuits will resist infection unless they're pummeled into crit, and wearing a firesuit will save you from the first few slashes. Melbert told me this is an oversight, so I, uh, 'fixed' it? This also lets people have some true actual defence against zombie infections, without making them immune to it. > Fixed the bomb hood armor not having the same bio armor value as bomb armor. Bug I noticed while going over bio armors. > Added a message to the zed when they succesfully infect someone. QoL and good feedback > Turned some proc names into snake_case rather than, uh, nospacecase. what the hell do you call isuckatnamignprocs(). what case is that. cougarcase? ## Changelog :cl: fix: Fixed zombies being able to infect headless corpses (Including former zombies) fix: Fixed bio armor being totally useless against zombies. Now it checks how hurt your limb is: If it's more than the bio armor value, you get infected. THICKMATERIAL clothing guarantees at least 25 damage required to infect you, non-thick clothing reduces effective defence by 25. In practice this means people with MODsuits, biosuits will resist infection unless they're pummeled into crit, and wearing a firesuit will save you from the first few slashes. fix: Fixed the bomb hood armor not having the same bio armor value as bomb armor. qol: Added a message to the zed when they succesfully infect someone. code: Turned some proc names into snake_case rather than, uh, nospacecase. /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> * Fixed headless zambos and the oversight of no bio armor resistance --------- Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com> --- code/controllers/subsystem/radiation.dm | 2 +- code/datums/wounds/scars/_scars.dm | 2 +- code/modules/clothing/suits/utility.dm | 1 + code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 10 +++---- code/modules/surgery/bodyparts/wounds.dm | 4 +-- code/modules/zombie/items.dm | 30 +++++++++++++++++-- 7 files changed, 38 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm index b2b3d1926dd..d52fe83856a 100644 --- a/code/controllers/subsystem/radiation.dm +++ b/code/controllers/subsystem/radiation.dm @@ -135,7 +135,7 @@ SUBSYSTEM_DEF(radiation) for (var/obj/item/bodypart/limb as anything in human.bodyparts) var/protected = FALSE - for (var/obj/item/clothing as anything in human.clothingonpart(limb)) + for (var/obj/item/clothing as anything in human.get_clothing_on_part(limb)) if (HAS_TRAIT(clothing, TRAIT_RADIATION_PROTECTED_CLOTHING)) protected = TRUE break diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index 774d8cc5265..e650899be29 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -181,7 +181,7 @@ if((human_victim.wear_mask && (human_victim.wear_mask.flags_inv & HIDEFACE)) || (human_victim.head && (human_victim.head.flags_inv & HIDEFACE))) return FALSE else if(limb.scars_covered_by_clothes) - var/num_covers = LAZYLEN(human_victim.clothingonpart(limb)) + var/num_covers = LAZYLEN(human_victim.get_clothing_on_part(limb)) if(num_covers + get_dist(viewer, victim) >= visibility) return FALSE diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 2f29a2233d5..bbd880f5466 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -104,6 +104,7 @@ laser = 20 energy = 30 bomb = 100 + bio = 50 fire = 80 acid = 50 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 40e4bf095d5..b6fd8dcfacc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -372,7 +372,7 @@ var/obj/item/bodypart/the_part = isbodypart(target_zone) ? target_zone : get_bodypart(check_zone(target_zone)) //keep these synced // Loop through the clothing covering this bodypart and see if there's any thiccmaterials if(!(injection_flags & INJECT_CHECK_PENETRATE_THICK)) - for(var/obj/item/clothing/iter_clothing in clothingonpart(the_part)) + for(var/obj/item/clothing/iter_clothing in get_clothing_on_part(the_part)) if(iter_clothing.clothing_flags & THICKMATERIAL) . = FALSE break diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index bc951d49bb7..b02aaf03b17 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -6,21 +6,21 @@ if(isbodypart(def_zone)) var/obj/item/bodypart/bp = def_zone if(bp) - return checkarmor(def_zone, type) + return check_armor(def_zone, type) var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone)) if(affecting) - return checkarmor(affecting, type) + return check_armor(affecting, type) //If a specific bodypart is targetted, check how that bodypart is protected and return the value. //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values for(var/X in bodyparts) var/obj/item/bodypart/BP = X - armorval += checkarmor(BP, type) + armorval += check_armor(BP, type) organnum++ return (armorval/max(organnum, 1)) -/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, damage_type) +/mob/living/carbon/human/proc/check_armor(obj/item/bodypart/def_zone, damage_type) if(!damage_type) return 0 var/protection = 100 @@ -32,7 +32,7 @@ return 100 - protection ///Get all the clothing on a specific body part -/mob/living/carbon/human/proc/clothingonpart(obj/item/bodypart/def_zone) +/mob/living/carbon/human/proc/get_clothing_on_part(obj/item/bodypart/def_zone) var/list/covering_part = list() var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) for(var/bp in body_parts) diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index 1b50dbc8fd1..94c503614a2 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -85,7 +85,7 @@ // quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow if(ishuman(owner)) var/mob/living/carbon/human/human_wearer = owner - var/list/clothing = human_wearer.clothingonpart(src) + var/list/clothing = human_wearer.get_clothing_on_part(src) for(var/obj/item/clothing/clothes_check as anything in clothing) // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary if(clothes_check.get_armor_rating(WOUND)) @@ -242,7 +242,7 @@ if(owner && ishuman(owner)) var/mob/living/carbon/human/human_owner = owner - var/list/clothing = human_owner.clothingonpart(src) + var/list/clothing = human_owner.get_clothing_on_part(src) for(var/obj/item/clothing/clothes as anything in clothing) // unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary armor_ablation += clothes.get_armor_rating(WOUND) diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 9d3a298812e..4258dc5a304 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -11,20 +11,24 @@ bare_wound_bonus = 15 sharpness = SHARP_EDGED -/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/living/user, proximity_flag) . = ..() if(!proximity_flag) return else if(isliving(target)) if(ishuman(target)) - try_to_zombie_infect(target) + try_to_zombie_infect(target, user, user.zone_selected) else . |= AFTERATTACK_PROCESSED_ITEM check_feast(target, user) -/proc/try_to_zombie_infect(mob/living/carbon/human/target) +/proc/try_to_zombie_infect(mob/living/carbon/human/target, mob/living/user, def_zone = BODY_ZONE_CHEST) CHECK_DNA_AND_SPECIES(target) + // Can't zombify with no head + if(!target.get_bodypart(BODY_ZONE_HEAD)) + return + if(HAS_TRAIT(target, TRAIT_NO_ZOMBIFY)) // cannot infect any TRAIT_NO_ZOMBIFY human return @@ -33,11 +37,31 @@ if(HAS_TRAIT(target, TRAIT_VIRUS_RESISTANCE) && prob(75)) return + var/obj/item/bodypart/actual_limb = target.get_bodypart(def_zone) + + // What you hitting bro? + if(!actual_limb) + return + + var/limb_damage = actual_limb.get_damage() + var/limb_armor = max(0, target.getarmor(actual_limb, BIO) - 25) + + // This is a pretty jank way to do this, but in short: + // if they have thick material on that bodypart it will always need at least 25 previous limb damage to trigger an infection. + // and if their bio armor isn't thick it's a bit weaker. + for(var/obj/item/clothing/iter_clothing in target.get_clothing_on_part(actual_limb)) + if(iter_clothing.clothing_flags & THICKMATERIAL) + limb_armor += 25 + + if(limb_armor > limb_damage) + return + var/obj/item/organ/internal/zombie_infection/infection infection = target.get_organ_slot(ORGAN_SLOT_ZOMBIE) if(!infection) infection = new() infection.Insert(target) + to_chat(user, span_alien("You see [target] twitch for a moment as [target.p_their()] head is covered in \a [infection] - [target.p_Theyve()] been infected.")) /obj/item/mutant_hand/zombie/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is ripping [user.p_their()] brains out! It looks like [user.p_theyre()] trying to commit suicide!")) From 87d716676c4185390d105514c408dfacab556732 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:25:24 +0200 Subject: [PATCH 040/101] Tweaks the message that players get when not qualifying for an antagonist role. [MDB IGNORE] (#23949) * Tweaks the message that players get when not qualifying for an antagonist role. (#78563) ## About The Pull Request See title ## Why It's Good For The Game You can still end up qualifying for a role if you get lucky. The message is primarily there to tell players they weren't able to become an antagonist because their preferences are set up in a way that they're likely to return back to lobby. ## Changelog :cl: spellcheck: Tweaks the message that players get when not being able to qualify for roundstart antag to be more accurate as to what's happening. /:cl: --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> * Tweaks the message that players get when not qualifying for an antagonist role. --------- Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com> Co-authored-by: Watermelon914 <3052169-Watermelon914@ users.noreply.gitlab.com> --- code/game/gamemodes/dynamic/dynamic.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 26dfcb4be76..50708e0d944 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -468,8 +468,8 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits) for(var/job in job_prefs) var/priority = job_prefs[job] job_data += "[job]: [SSjob.job_priority_level_to_string(priority)]" - to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role because you could not qualify for any of the roundstart jobs you were trying to qualify for, along with 'return to lobby if job is unavailable' enabled.")) - log_admin("[player.ckey] failed to qualify for any job and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]") + to_chat(player, span_danger("You were unable to qualify for any roundstart antagonist role this round because your job preferences presented a high chance of all of your selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled. Increase the number of roles set to medium or low priority to reduce the chances of this happening.")) + log_admin("[player.ckey] failed to qualify for any roundstart antagonist role because their job preferences presented a high chance of all of their selected jobs being unavailable, along with 'return to lobby if job is unavailable' enabled and has [player.client.prefs.be_special.len] antag preferences enabled. They will be unable to qualify for any roundstart antagonist role. These are their job preferences - [job_data.Join(" | ")]") else roundstart_pop_ready++ candidates.Add(player) From c4d0f1ce2d80c54131291417b63b4e60e5096e04 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:27:46 +0200 Subject: [PATCH 041/101] adds a surgery tray to surgery supplies medical order, removes surgery duffelbags entirely [MDB IGNORE] (#23941) * adds a surgery tray to surgery supplies medical order, removes surgery duffelbags entirely * Update backpack.dm * Surgery duffels are replaced by trays * Update surgery_tray.dm --------- Co-authored-by: Lamb <110322848+CoiledLamb@users.noreply.github.com> Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- code/game/objects/items/storage/backpack.dm | 34 ------------------- code/game/objects/items/surgery_tray.dm | 3 ++ code/modules/cargo/packs/medical.dm | 4 +-- .../code/armament_datums/deforest_medical.dm | 2 +- modular_skyrat/modules/faction/code/outfit.dm | 2 +- 5 files changed, 7 insertions(+), 38 deletions(-) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index c9c4815e3da..0852aeff883 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -509,46 +509,12 @@ icon_state = "duffel-medical" inhand_icon_state = "duffel-med" -/obj/item/storage/backpack/duffelbag/med/surgery - name = "surgical duffel bag" - desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools." - -/obj/item/storage/backpack/duffelbag/med/surgery/PopulateContents() - new /obj/item/scalpel(src) - new /obj/item/hemostat(src) - new /obj/item/retractor(src) - new /obj/item/circular_saw(src) - new /obj/item/surgicaldrill(src) - new /obj/item/cautery(src) - new /obj/item/bonesetter(src) - new /obj/item/surgical_drapes(src) - new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) //SKYRAT EDIT ADDITION - new /obj/item/clothing/mask/surgical(src) - new /obj/item/razor(src) - new /obj/item/blood_filter(src) - /obj/item/storage/backpack/duffelbag/coroner name = "coroner duffel bag" desc = "A large duffel bag for holding large amounts of organs at once." icon_state = "duffel-coroner" inhand_icon_state = "duffel-coroner" -/obj/item/storage/backpack/duffelbag/coroner/surgery - name = "surgical coroner bag" - desc = "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding morbid surgical tools." - -/obj/item/storage/backpack/duffelbag/coroner/surgery/PopulateContents() - new /obj/item/scalpel/cruel(src) - new /obj/item/hemostat/cruel(src) - new /obj/item/retractor/cruel(src) - new /obj/item/circular_saw(src) - new /obj/item/surgicaldrill(src) - new /obj/item/cautery/cruel(src) - new /obj/item/bonesetter(src) - new /obj/item/surgical_drapes(src) - new /obj/item/razor(src) - new /obj/item/blood_filter(src) - /obj/item/storage/backpack/duffelbag/explorer name = "explorer duffel bag" desc = "A large duffel bag for holding extra exotic treasures." diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index 9d4a588ff9e..99838f5d3c4 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -11,6 +11,7 @@ /obj/item/cautery, /obj/item/circular_saw, /obj/item/clothing/mask/surgical, + /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, // SKYRAT EDIT ADDITION /obj/item/hemostat, /obj/item/razor, /obj/item/reagent_containers/medigel, @@ -193,6 +194,7 @@ new /obj/item/cautery(src) new /obj/item/circular_saw(src) new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION new /obj/item/hemostat(src) new /obj/item/razor/surgery(src) new /obj/item/retractor(src) @@ -214,6 +216,7 @@ new /obj/item/cautery/cruel(src) new /obj/item/circular_saw(src) new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION new /obj/item/hemostat/cruel(src) new /obj/item/razor/surgery(src) new /obj/item/retractor/cruel(src) diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 430c32a35ab..6794a1960e7 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -123,11 +123,11 @@ /datum/supply_pack/medical/surgery name = "Surgical Supplies Crate" desc = "Do you want to perform surgery, but don't have one of those fancy \ - shmancy degrees? Just get started with this crate containing a medical duffelbag, \ + shmancy degrees? Just get started with this crate containing a DeForest surgery tray, \ Sterilizine spray and collapsible roller bed." cost = CARGO_CRATE_VALUE * 6 contains = list( - /obj/item/storage/backpack/duffelbag/med/surgery, + /obj/item/surgery_tray/full, /obj/item/reagent_containers/medigel/sterilizine, /obj/item/emergency_bed, ) diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm index 3f9b9b73b28..40f8ef775f7 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -121,7 +121,7 @@ cost = PAYCHECK_COMMAND /datum/armament_entry/company_import/deforest/equipment/surgical_tools - item_type = /obj/item/storage/backpack/duffelbag/med/surgery + item_type = /obj/item/surgery_tray/full cost = PAYCHECK_COMMAND /datum/armament_entry/company_import/deforest/equipment/advanced_health_analyer diff --git a/modular_skyrat/modules/faction/code/outfit.dm b/modular_skyrat/modules/faction/code/outfit.dm index 4728353e4ec..a808f58c05f 100644 --- a/modular_skyrat/modules/faction/code/outfit.dm +++ b/modular_skyrat/modules/faction/code/outfit.dm @@ -43,7 +43,7 @@ back = /obj/item/storage/backpack id = /obj/item/card/id/faction_crew l_pocket = /obj/item/melee/energy/sword - l_hand = /obj/item/storage/backpack/duffelbag/med/surgery + l_hand = /obj/item/surgery_tray/full backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/storage/medkit/tactical=1,/obj/item/storage/medkit/regular=1,/obj/item/storage/medkit/toxin=1, /obj/item/ammo_box/magazine/m45=2, /obj/item/gun/ballistic/automatic/pistol/m1911=1,/obj/item/healthanalyzer=1,/obj/item/stack/spacecash/c1000=1) /datum/outfit/faction_tech From 9147a320822e9754d7fed07aa148476474e772a9 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:27:56 +0200 Subject: [PATCH 042/101] TTS: Gas Mask muffling, Hailer Mask voice effects, support for more filters that use samplerate, voice effects for lizards, ethereals, and xenomorphs. [MDB IGNORE] (#23942) * TTS: Gas Mask muffling, Hailer Mask voice effects, support for more filters that use samplerate, voice effects for lizards, ethereals, and xenomorphs. * Update RecordView.tsx * Update types.ts --------- Co-authored-by: Iamgoofball Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/tts.dm | 4 + code/controllers/subsystem/tts.dm | 12 ++- code/datums/records/record.dm | 3 + code/game/say.dm | 2 +- .../client/preferences/middleware/tts.dm | 2 +- code/modules/clothing/masks/_masks.dm | 4 + code/modules/clothing/masks/gasmask.dm | 3 +- code/modules/clothing/masks/hailer.dm | 2 + code/modules/mob/living/living_say.dm | 20 ++++- .../file_system/programs/records.dm | 1 + .../surgery/organs/internal/tongue/_tongue.dm | 5 +- .../interfaces/SecurityRecords/RecordView.tsx | 4 + .../tgui/interfaces/SecurityRecords/types.ts | 1 + tools/tts/tts-api/off1.wav | Bin 0 -> 3270 bytes tools/tts/tts-api/off2.wav | Bin 0 -> 19920 bytes tools/tts/tts-api/off3.wav | Bin 0 -> 21372 bytes tools/tts/tts-api/off4.wav | Bin 0 -> 3828 bytes tools/tts/tts-api/on1.wav | Bin 0 -> 3328 bytes tools/tts/tts-api/on2.wav | Bin 0 -> 10120 bytes tools/tts/tts-api/tts-api.py | 70 ++++++++++++------ 20 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 tools/tts/tts-api/off1.wav create mode 100644 tools/tts/tts-api/off2.wav create mode 100644 tools/tts/tts-api/off3.wav create mode 100644 tools/tts/tts-api/off4.wav create mode 100644 tools/tts/tts-api/on1.wav create mode 100644 tools/tts/tts-api/on2.wav diff --git a/code/__DEFINES/tts.dm b/code/__DEFINES/tts.dm index cca1b5db000..fd88016408c 100644 --- a/code/__DEFINES/tts.dm +++ b/code/__DEFINES/tts.dm @@ -4,3 +4,7 @@ #define TTS_SOUND_ENABLED "Enabled" ///TTS preference is set to only play blips of a sound, rather than speech. #define TTS_SOUND_BLIPS "Blips Only" +///TTS filter to activate start/stop radio clicks on speech. +#define TTS_FILTER_RADIO "radio" +///TTS filter to activate a silicon effect on speech. +#define TTS_FILTER_SILICON "silicon" diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index 712168b5027..b9cb85ea78a 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -261,7 +261,7 @@ SUBSYSTEM_DEF(tts) #undef TTS_ARBRITRARY_DELAY -/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, silicon = "") +/datum/controller/subsystem/tts/proc/queue_tts_message(datum/target, message, datum/language/language, speaker, filter, list/listeners, local = FALSE, message_range = 7, volume_offset = 0, pitch = 0, special_filters = "") if(!tts_enabled) return @@ -277,7 +277,7 @@ SUBSYSTEM_DEF(tts) var/shell_scrubbed_input = tts_speech_filter(message) shell_scrubbed_input = copytext(shell_scrubbed_input, 1, 300) - var/identifier = "[sha1(speaker + filter + num2text(pitch) + num2text(silicon) + shell_scrubbed_input)].[world.time]" + var/identifier = "[sha1(speaker + filter + num2text(pitch) + special_filters + shell_scrubbed_input)].[world.time]" if(!(speaker in available_speakers)) return @@ -288,9 +288,9 @@ SUBSYSTEM_DEF(tts) var/datum/http_request/request_blips = new() var/file_name = "tmp/tts/[identifier].ogg" var/file_name_blips = "tmp/tts/[identifier]_blips.ogg" - request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&silicon=[silicon]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name) - request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&silicon=[silicon]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips) - var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch, silicon) + request.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name) + request_blips.prepare(RUSTG_HTTP_METHOD_GET, "[CONFIG_GET(string/tts_http_url)]/tts-blips?voice=[speaker]&identifier=[identifier]&filter=[url_encode(filter)]&pitch=[pitch]&special_filters=[url_encode(special_filters)]", json_encode(list("text" = shell_scrubbed_input)), headers, file_name_blips) + var/datum/tts_request/current_request = new /datum/tts_request(identifier, request, request_blips, shell_scrubbed_input, target, local, language, message_range, volume_offset, listeners, pitch) var/list/player_queued_tts_messages = queued_tts_messages[target] if(!player_queued_tts_messages) player_queued_tts_messages = list() @@ -342,8 +342,6 @@ SUBSYSTEM_DEF(tts) var/use_blips = FALSE /// What's the pitch adjustment? var/pitch = 0 - /// Are we using the silicon vocal effect on this? - var/silicon = "" /datum/tts_request/New(identifier, datum/http_request/request, datum/http_request/request_blips, message, target, local, datum/language/language, message_range, volume_offset, list/listeners, pitch) diff --git a/code/datums/records/record.dm b/code/datums/records/record.dm index 67fce2f49a4..b790c53d76c 100644 --- a/code/datums/records/record.dm +++ b/code/datums/records/record.dm @@ -24,6 +24,8 @@ var/species /// The character's ID trim var/trim + /// The character's voice, if they have one. + var/voice /datum/record/New( age = 18, @@ -37,6 +39,7 @@ rank = "Unassigned", species = "Human", trim = "Unassigned", + voice = "?????", ) src.age = age src.blood_type = blood_type diff --git a/code/game/say.dm b/code/game/say.dm index a531ee02527..c0e9d4ff8ef 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -108,7 +108,7 @@ GLOBAL_LIST_INIT(freqtospan, list( filter += tts_filter.Join(",") if(voice && found_client) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch, silicon = tts_silicon_voice_effect) + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = range, pitch = pitch) /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), visible_name = FALSE) //This proc uses [] because it is faster than continually appending strings. Thanks BYOND. diff --git a/code/modules/client/preferences/middleware/tts.dm b/code/modules/client/preferences/middleware/tts.dm index 71b7b977f4b..4d3ee3261bd 100644 --- a/code/modules/client/preferences/middleware/tts.dm +++ b/code/modules/client/preferences/middleware/tts.dm @@ -23,5 +23,5 @@ var/speaker = preferences.read_preference(/datum/preference/choiced/voice) var/pitch = preferences.read_preference(/datum/preference/numeric/tts_voice_pitch) COOLDOWN_START(src, tts_test_cooldown, 0.5 SECONDS) - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, silicon = TRUE, local = TRUE) + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), user.client, "Look at you, Player. A pathetic creature of meat and bone. How can you challenge a perfect, immortal machine?", speaker = speaker, pitch = pitch, special_filters = TTS_FILTER_SILICON, local = TRUE) return TRUE diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index dfcc3060c9f..ad296d30356 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -12,6 +12,10 @@ var/adjusted_flags = null ///Did we install a filtering cloth? var/has_filter = FALSE + /// If defined, what voice should we override with if TTS is active? + var/voice_override + /// If set to true, activates the radio effect on TTS. Used for sec hailers, but other masks can utilize it for their own vocal effect. + var/use_radio_beeps_tts = FALSE /obj/item/clothing/mask/attack_self(mob/user) if((clothing_flags & VOICEBOX_TOGGLABLE)) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 7b415bac6dc..c8784d9af6c 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( var/has_fov = TRUE ///Cigarette in the mask var/obj/item/clothing/mask/cigarette/cig - + voice_filter = "lowpass=f=750,volume=2" /datum/armor/mask_gas bio = 100 @@ -274,6 +274,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( dog_fashion = /datum/dog_fashion/head/clown has_fov = FALSE var/list/clownmask_designs = list() + voice_filter = null // performer masks expect to be talked through /obj/item/clothing/mask/gas/clown_hat/plasmaman starting_filter_type = /obj/item/gas_filter/plasmaman diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index af1d3975645..64de19b95aa 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -68,6 +68,8 @@ GLOBAL_LIST_INIT(hailer_phrases, list( var/recent_uses = 0 ///Whether the hailer is emagged or not var/safety = TRUE + voice_filter = @{"[0:a] asetrate=%SAMPLE_RATE%*0.7,aresample=16000,atempo=1/0.7,lowshelf=g=-20:f=500,highpass=f=500,aphaser=in_gain=1:out_gain=1:delay=3.0:decay=0.4:speed=0.5:type=t [out]; [out]atempo=1.2,volume=15dB [final]; anoisesrc=a=0.01:d=60 [noise]; [final][noise] amix=duration=shortest"} + use_radio_beeps_tts = TRUE /obj/item/clothing/mask/gas/sechailer/plasmaman starting_filter_type = /obj/item/gas_filter/plasmaman diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index b3f842e6a25..3a09256ee69 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -394,13 +394,29 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( tts_message_to_use = message_raw var/list/filter = list() + var/list/special_filter = list() + var/voice_to_use = voice + var/use_radio = FALSE if(length(voice_filter) > 0) filter += voice_filter if(length(tts_filter) > 0) filter += tts_filter.Join(",") - - INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice, filter.Join(","), listened, message_range = message_range, pitch = pitch, silicon = tts_silicon_voice_effect) + if(ishuman(src)) + var/mob/living/carbon/human/human_speaker = src + if(human_speaker.wear_mask) + var/obj/item/clothing/mask/worn_mask = human_speaker.wear_mask + if(worn_mask.voice_override) + voice_to_use = worn_mask.voice_override + if(worn_mask.voice_filter) + filter += worn_mask.voice_filter + use_radio = worn_mask.use_radio_beeps_tts + if(use_radio) + special_filter += TTS_FILTER_RADIO + if(issilicon(src)) + special_filter += TTS_FILTER_SILICON + + INVOKE_ASYNC(SStts, TYPE_PROC_REF(/datum/controller/subsystem/tts, queue_tts_message), src, html_decode(tts_message_to_use), message_language, voice_to_use, filter.Join(","), listened, message_range = message_range, pitch = pitch, special_filters = special_filter.Join("|")) var/image/say_popup = image('icons/mob/effects/talk.dmi', src, "[bubble_type][talk_icon_state]", FLY_LAYER) SET_PLANE_EXPLICIT(say_popup, ABOVE_GAME_PLANE, src) diff --git a/code/modules/modular_computers/file_system/programs/records.dm b/code/modules/modular_computers/file_system/programs/records.dm index 960702d608c..9b5617364c0 100644 --- a/code/modules/modular_computers/file_system/programs/records.dm +++ b/code/modules/modular_computers/file_system/programs/records.dm @@ -45,6 +45,7 @@ current_record["rank"] = person.rank current_record["species"] = person.species current_record["wanted"] = person.wanted_status + current_record["voice"] = person.voice all_records += list(current_record) if("medical") diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index e9c47a0f237..0284e7c053b 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -190,7 +190,7 @@ languages_native = list(/datum/language/draconic, /datum/language/ashtongue) //SKYRAT EDIT: Ashtongue for Ashwalkers liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS - + voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"} /obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) var/static/regex/lizard_hiss = new("s+", "g") var/static/regex/lizard_hiSS = new("S+", "g") @@ -499,7 +499,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) say_mod = "hisses" taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED modifies_speech = TRUE // not really, they just hiss - + voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.8,aresample=%SAMPLE_RATE%,atempo=1/0.8,aformat=channel_layouts=mono [p0]; [out2] asetrate=%SAMPLE_RATE%*1.2,aresample=%SAMPLE_RATE%,atempo=1/1.2,aformat=channel_layouts=mono[p2]; [p0][0][p2] amix=inputs=3"} // Aliens can only speak alien and a few other languages. /obj/item/organ/internal/tongue/alien/get_possible_languages() return list( @@ -607,6 +607,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) toxic_foodtypes = NONE //no food is particularly toxic to ethereals attack_verb_continuous = list("shocks", "jolts", "zaps") attack_verb_simple = list("shock", "jolt", "zap") + voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.99,aresample=%SAMPLE_RATE%,volume=0.3 [p0]; [p0][out2] amix=inputs=2"} // Ethereal tongues can speak all default + voltaic /obj/item/organ/internal/tongue/ethereal/get_possible_languages() diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx index 5e39c743ec3..851425dadfd 100644 --- a/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx +++ b/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx @@ -56,6 +56,7 @@ const RecordInfo = (props, context) => { rank, species, wanted_status, + voice, // SKYRAT EDIT START - RP Records past_general_records, past_security_records, @@ -172,6 +173,9 @@ const RecordInfo = (props, context) => { text={fingerprint} /> + + + Ts48vqg~CB&>) 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 N{|zPkNg??L{2x%miueEk literal 0 HcmV?d00001 diff --git a/tools/tts/tts-api/off2.wav b/tools/tts/tts-api/off2.wav new file mode 100644 index 0000000000000000000000000000000000000000..e84221070a50949923738429c0893db43a058baa GIT binary patch literal 19920 zcmeEt_g53&*Y0G}8wm-a_ue}q9TY??U_nr^_uln`y({+qu`3oVh@v72B1-Q_@4Y32 zBqSld%*@TZ-uuIM-F5F;_YZh;*2*(8nVFn*&e_j7dp~C{ikmg7YCZrYMGK!6TxSbJdYYu!CL&=aT0)p5_{;#GQSqA<>ufeRq97Uf*9e}gd48;>^zoc5q zlaH#-LyJ&vFtxbb_z-*u4#7;I=b#PIV(=_jhUx({2nz{-!y&20T^+1MDMA(1%0KG) z+GHpOUW^0*uYt8dHc|uA;6}&_&V+x%7olwRM|s;+n}|B4koUo2yp;CbV6Q<8?JTZY zOOQE>*NGja_KI)HE6S$|rXpAIT2-x803Nt#N;%_=wP9M?v&h60?P+o21e+Tv>{s2!b6HnyZ@5`_Ww<@H4yCo+6+trPqbv2iZ?nE zGMG7XaB>%Xlx}PL#m6xG;4I@gn`Z|^%?w!WIBX~(#K6B4fwB>4tE5bLd0aXW)7jBX zZ2a5c)$HH#vA>_QOuSgN4PFUE0oRcTq!wYJ+Q3a1ee6<}ohI{4p0Naa zN?a`PMY~YD6%GVXdQ$9n?F{MVNj86jaHn*os#%kv&X&0d9u3`Y zwXSY22`X!>U(!Eaf+6Oc?Qpu`^4{jMJ__QE+jd*FT6Z2B>rqY9U*$OBH)|ThBg51b zeUrDVYj;ylTia-x+LgJ@l@gvi*LY#sJkyABS1*GtK$Rp`gq6L7vj}mt650!bL^W;f zd;QKI)8EW`TKvrNLr76dSA)m|G$03%-O*Mu(pX@pbxT#pm$6*+CFZbOL3l^(wwPDb zA$y4)tp3XXz?N_eWz+Dcrng**eC~T|9Bwgdwd>hO+dkG48W;2!3j#roVVz@=r?dNB z8@hfr>@c}=1r*=RlQqlTh?+ld^qZT9W? z=(wz4ONVpRLDj)YtRP8t0UKhPU(g--(I$qNVI2p82z9ewyS&MIG5$#c&yP2 zyA`fDm)BNq`kvrh`AN}XQL#K9T*#2y1ba&Trv<$5d~dUtZh%myF7VxinaT$^jNu|X zD>q}e@3xlAZ*a!ANt;L2vuu`iBjl7~ax9LNJH2M9HIhT?5T)o1V9c z`n!3)>O?$N-_~%*(9>WIZ8PZ;-kTUoTWWmB*4llce`}C+$b!HL&oVoa(FkQTI!EIn zdph}oUD?ZTdS4m*$2R|Qu5~Uh4=S8qG1XAf9mgIPJ3=c7rUn+)OWi8{T|!F}6? zFLAC4#w5Q~M_?^#JLVbo4t4@Ff%$+Vl0H&{>3j7Z7z)NO<|OkrGm$yKv}OHcNHbby z=x$I&2dPcOd-xt~J=z16qgxGp)~?k~(~Kw^WrwB&lR>;o9Mb6hLDN3#?$XXrT|vEu z0~dyhM*P{r@loDAVW+f3a}M1>+Na-WWM=us?tqiNOTF`Yr}GXKb|-A_+MKlhU`aB! zHCbesz?@HOCay=PK;M-gW$z`h*k2?R^h|Kr7lv2%S9RBPY;J37p|;dCi<|XZk@ojJ z#32)Q$3(X!nY{6^i1-bX${-_JOzZ?89<7=^y0{a5BAw3x7Di-%_R*0dh1 zJ6(36F!9HkFOFI2x2A6ny#0`6`(0N0wN1j!gcbU8>-KWTqB`YvR)Yo{QzeW znkfhk#fV`JGCwkpFx=@SlmNmxkfUjqnob6dj}PzbyWW9nR@7tbYHN4b?W(W*`@1o_ zMc7f_H)jktxn5BW)DZ(1BPONRHyk;xgC5JgQ~fRmriVNakBp>8&5EK&E(sL`z#d}` z!Ioo&Wcoak8BPcuMmDJrN&sa=K?7lDExn(~u6s@VmHKet> z_IZpf=PHET#m2!7f7^V*}Gt^APJu`>W3V?nIw4|Cs6Dg408m249$V z+Re|!-i5k8krSJQw1Y^lx)QRJoMFiJMnkG7J|)L){nukT4u*E>iVB_72Ku={ky z2s<6~2VH$TDU=)b0)q`DGW*jTUyumP5XH)Vt(V(lqiWYANlc{sV>) z^Acl^&Ju}4b8HH#7jo20seIJK>hEfM)g5`QWSY2eawgw$g2Fw<#qlcn(~&8=wr~-BGrhvx*YAi85PFgfF9#Fn6%= z*c8kjbQY*W6`}IMc&vz!Nb%F-P`{9G6Ru$~=%c`L=)5XRc6@4y=$!D7C_pkPpQC=J zO@b4E2GA2*i93hCiyy|BVP}F9@KsHSa=Y||FqKOm+0|Fo1$6D|`7_An>=RnZ6Ev=f z2MA-v@UG-eJtbp@5n^U+U2SV@_su%oe8lji{(MR>ej$i~E7gvwg({9(sGSRMgKt9n zw3Ql$_A&$lmEdL&%ybIY|mnQKeKxs%8_=jcLIDBpk*Am`yNIK@~Q0Jcbwd zhxab*?deY+dC6@MrpheTwh#$sK>ui()&AOR2p7GJ@QG4Re{Ya!RAzj|sMugk--9ls zmC$AS-xxj&IW3YhiqAt+0EzaBIzmNL8LRA+CuLdU9s!e=%Dq2MAD43Oj~h*_=O+rQ zrcTOnYN<8=839x%BM^rQK(<0Nwdoo_AiBWY$aym6%VF_fN>)Q0!cNw7 zo9V9lUT3`)y1#ZTvHD`H)~_Tx;O3%Ip}lIpB1@Jf`5-0=7xVC(g(FLbN{3XV#=I+% z^V(5#EkQ!g(%Y>6iYYKS!g|J%7@T7~rrO~)Y43>UjEuG&t+6SMC=Mv!`M0EJjJFOt zr?<%BrIXst%XO1orb#%>1ec0j)HJ9vR2S4d4Fj@(zGxg(p7IoloA{)tWGYs59;0Ep zJ6Z;X&AFAdI>j#8dCsb76_#&sxuRwL4;uEBR_5_PHD&ZX72dyiZ_b187ZIP0%L03_ z(jLk(`?*2tIh9M*Yuh&lY#3fSGx5#r&JYLBvsV4IRmhsj%D!uV&lbD<_?m6_VaEG8 znY%vKPW!*RG|%5;4fR;kfjW59TpVKZ}pZmRb$C6sDO|738=^oq@Q zmqWhY!G<%cVjJcf$N!3Nn{Pb#P0Wr^rq?q|KIOe;1JAh^|95e*;rFv2_NFJ_9lZ#g z`p?pLEBw7p+1bHX%^0)GNfbB{os+O)8L(cqW8TQ`?3F?y!Y{L$zAjN%}@5c>C3rU zcCaIy_Y%H9kF<{QXb7B&G@9d_IJC-PYv$fv|KuE|rk>l^uvNCId66_GfBFu$FiT(k z1Wbm)l?M#GZHcUjDBD-Ey^LG+^zXaYly1xbZrEWYW%%>Jk{)5(fyU3Z{7U0;OzD;4 zn?>P8*2P7oHdXcY-&$Yxo#I9*pAd{qzBx}$)44|TiA(;bJX)8tb?=^*gI%e6Q?Km5 zxV32cg4rd0uPrZ<{#6pVM|##aRF#o`S>!rr2fYt}74xk5alw!Wm=Ly_^FjVaQ!2xalPUna3AO&KM zX}m>#Be8866)8WA-|c>saZ`3R{if~XuJ=`W;br+Xzv~%IuR1rdPphnGiT2Tfk7BEr zgs7*_|$&uo<;i&z%uQHA819v&CeQwR915jkuc?V4<{pYUXaZ zkMWG@Xcp!y3H&(g#lpB`Uecij+hXPf{p0=D!@?&g&@Oy$)YXXXfm>bNjVeLY$<%IU z^^>1dpN?d3pEf@*y+8V3`qQMBNpI5Mrf0l-Vfj4#<<*b(i|%#?PQ4|au+sC~;6LE2 zbjLX#b*}S@49%Sry7czhM1{#~w!`!?;ZgUV#LK^5~E%iT!KnoWO){UdiD`_^)^ zJhJe3LFaE-Sw$_iS-<02w^QGh!7c1CVW*0VCXfeoT$!Y;;5YRVTk*}K9YZ6tBz@o& z+K6t|aMvJ?W=dJ7S7>DCG(TwJ9M|N7tLj&4mh%(VMND_gXI%z%^VwaSYD9l-7nuCo z_Iu`^$zRugEc*<+fBNd>OOJPMxx-ZnLzgtB2CYsf{ilK^f{X%L{(Zh>{$asKW<<~Z zw9sMk{rJIXm+4Pj!!2rQ)u^|UPwbdpaqHg3n}44*Xj&HcXh&A^S|>UDsxf8{&`?>L zUNDh&t+1kcUJqXo0@>;2v1XK!B7GutP~G#gzloD3i^F~~*lknf;^(1szu}hZM)REM zwd!DfV zOW%$V1lB!eHKbpQK8>XRdk6a;d{=(@+->Z;#G(aV+r_`}JhNjS%+Q9|4-4H==5I{f z4W>Rgrgtpp(CO{FR`BCa2B2)_>h-{vBoFyBxg{K5_STUt13^6-J5O~!>HRaBE;QBT zVj@Wm#D`#>taHq+y{4-EcWqwOkLvt+zYB`VCG-DS7p(YkKlk4sDSvGLqDJgBeoU-O zT}a*B=4ISXE&KnQTmSnz=*ZfQnE1^BS>`ENv8Z6+Yvb&aqMQvGx%cT;=KpWLHonSy z+LbLUdEB;?11P`YzZmw}_xL!6RmDWl*&3HT6BoS7d&GIdzTV!+x!NP!FDEd4ddD=e zU$xH*pGLpo!0gaVk-MT!hTZlP*zKaTHBZJHI<8djEHuk;%Pe_O{owlb(6j$JGh|-8 z{%qloh{nU?E08Dym81Fe>e-){*=-9;{qH*ONxi$>e5E|zWQN1E&n|P#-jZ;t9phEq zaHFKAv+`0!LHUic;*zu??C+Tcs=Ud(z{0B)r&?AG8BW@(K(s&Qp~09L)%KK=#9io{ z8YGHX9%CBkJ-2JFcur=lWt4c@HJ4VCa>6l%mVK&|Rv%FQq3G@Ju;1+8(~FK2e=d$H z$|y7{c%T0*Kfb`~&%BBUO;-mmi%UTltoQK<-r^;7R%@%^{Tmg*`bVnW7h-4=>*0U%8gneqr7P_66|L z(AC1*W{+RIxt^O)InwPe>;^9yjM;wkKmwMBO-9q^-&o?lDq&O04x2q4yCSyaulP29 zTbQrsOB-8bYyC&$7+g2vtnlH73@&fmT0g6LwCZN9f8)M3RCiS0!hwf_JBBF3xDjZS zIKG|dF$sv4iLXpCBtmh`Wb(wju@ysweHVHhdPzg?Cw!C`!Xe`!r+@%aggQ20{>cQB zgunAr;+{mW3p?*yXE%fK97z%E>TRkkE`0aNEB*Lg^mW;_&O3*mjb|PG?a_Rk?W1m@ zys)hEvW<*NIJTm8Q_YT~oh!FkuU@@)!7TUbU!5gJ_i^iGMWcJ#0;+RL21^s`47%Ld z$3-jThYm@tkGkwhbq4RO!(6BzTj2;GuGqQ z2bUi(9a+x*+#bzbZHJ?bEMA-fATVm6RH^>K!ECMV60Tkf&2r3`t-q6W2^|j&$yHUkPsZ}jb3ctIjPp3597pz*(cQz0L9n0GYuvZ1|Ky-_`1Y8?c*+Ei_nnUwTopJ9 zUrq%oHy|eXM7;$D8OEMw_U7}!ka{Jp3x`M{pamQ8P#3Bt1S=EUp%{Oq%mExhuy5$K%G&axRY{!|Xx5!LNf)hLgsY zjfe9Df?J|_60PjKlCHtPdr&sm7lc~!8$FW#JH{4f4%5@XfCaIP47&}kGi>Nr^pw;m z)V&lh(j$Bhwg6*_aYc8cjsr=E0I&*9N)&lE=^fF7m`#W#UuOwM2mEM*4$p!Lu1x~e8eOP0pQ`i=2 zVO=Dk1E~hksB9n{m_lA4fygtsTc?mc)xOpGKx`-pJ_5gommv=TCvYFy6O)XYgE@p* zjD>L)L@Id=#e^C`eL!gE{2K77i0`r1V*7Z zqXBdjXoyNfnxV_uLCr;tndX*yw)&mAS@Q(?g5;wvqU$j$ux{8(7!t+=a}(2unT;_< z8-a$P0eTwdJSGpl0Sra$0B$1T@DJ@#O}%=zny&t)dZRK>_p0A%@Y<)EK(&){hJ3#4 zfXqYAmS0fJQO;A%R)d-w8c*%Gb}w`eN`z8%dSoqvL7hh}(ut>7R0PTfwGePXmcWl; zF>)F86*NWrqOYOtF*`5@m@DWsG=QQ7Vy6jYLqZfisAsu4j)zbgjL{ zQj@8%)%t0x2sfNfw?c)#vn?*kT~ z3OofWfaSqi8=^WB17;?$W)uH)~NQXCpGy{1-u!~)F!G^l&cks6%C60 z$}p9;+EUY`IjTJd)xr5XTlxu)L9d_&NMEPO_977|d(a;Ijyiyvt5bA?0g0}SGXN{p zZ4?t+2fBgxP?jhja0z&e=u|>Tq}{5$sX4FCQpKs}s|r-vY9B2MeyLNfhk$zk4p^n@ zsdQ)_WC}|WI+%}sgP~vzuy-++(XQYdfR2RelzC(I8P#nSUlp!CsIE|N)C6mDwSn5d zx+u~n3 zt0t6GB}rMX+^hPa;;6o;`!!WsbI2SD(zW~=I0-oo6rgVExONUWj3R<{Um!-;{%6BObt7mGjK&d(=+YbCi#h~|MT(N1`7OW+15pF)t99M*$f&Gcu zfC<2SNACs?0!Ltp?yY#u9(A00ulk~nr+%u}YYeq>wf@?p+U-y}d>OF-o&!?gD=>&a z@Jslcj=5-X0yL(x&P*L|PQc5NH%LB`h6Eurgop^>qq^~s20e#pa1A_)B%mJZ<`yoP z3^t%5i&CPquyMHG*!!4AXddVUnxcXMypF|e01V;)rE2b}x2x0C*=mvch$dbeq8l|2 z;HR(<`mX(|0kresNU#o9McPMQqvt@4A|3~qs-_Fiv4PE zr>ADWNgL(%L)ZQWmmK|lwG`XP9r9M3pbBjQd>&4pnD)+{Z}tPfMp8T!*tWC**Ob_u zG=W35urw}|pobAwp`h0$)48Z>_RsqG{L-v%nZ$3`EB6f>qUx>2gM$)gEkD2fXaXbH zz+zInqyKC9gWRd?!rZiq)`30HJyR3EoijzV56n<_uQz(Fy4X`#^gV0!%T=!)WX~wy zJ#-K_Wcf6(Vs>>x#@tV#0(&!pX2P@iV6j~RzG!JfKKms&&FbCs+jEIafW`4KE}qx) z>m-Xi$t5j0^FC+grPW4`C8PLew|v$_*v(uTn&|$FrLVa?kX~W%&E~_(kEefrYlQem z$yDc(@br0g2|2Or0}9NPaOeoP_FzF>PV#sE(ife(C3Q46SHp;#b8pNqjLz`2HvI+{ zk7U$s`L#cnkY8VMy*FPTrJw7(D7bOvg_&*Br|erv*CyRsSN{=x-S}DZqp8YwXc0^| z&kexFew%+H?qW!TgFAVFP}z2}rj3_*i>w z@QFCt{NUKS0G2r$S~hT_EclDxyMat}es|*{VL08=>qBf+(&y#vi|CPG?GIs^Mx+(z zzbt*@_jbp(2X(jkeY9;prt`Qdw^ns6jtI-PSfXOI4djkJXZ`E?Xj7KD=CRn-bYA$c zrO3wP8#X2u1@2{(arc!@y}oq2{d(#n;2YRE57pyRHuw6v&)auyy1IB*0G_^e{8Q=U zH%sp6-O;4m7Ty{L$TDyD1;mYUJ2>lK&YSQ00=(Fx&i8q_>i&wy%8x(mEF}BPbUtrN z=~kny$Chmlb1;F$Huc-H1y2?}uzz_wZ=&O{hG|(Bd~|;0;$!nILOpFQ(2GWvRFZRY z-`Tzo_$I1SjlRG%+NFi>Svat4XVRb8f4p}aTvQPIph~bn_`~tfo`yN>e}Ge_9Pe+D zm9ZW%?m>|b-Q)@3@m90K~5f+@W=Fq^a5`X~yT- zwCFtnQC5#IRPNQr?%x}~_x*TL;@w6QJi=)#gkINz;ZUzYl}nJ(VN@!wz9X(Wrlg_N zx&CDDA7Lvd(M03&(J#w?iN`IgYARaI8|!J2RLm|3ul&-Q%h89N7z6fz--F<@!S8%K z>@sMD%D2Poo0wI!s;7;c2X2U;V&sMcj&h�c7uJ+fF@(YIG#BxwYbO>E^2StvAMM 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 z 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 literal 0 HcmV?d00001 diff --git a/tools/tts/tts-api/off4.wav b/tools/tts/tts-api/off4.wav new file mode 100644 index 0000000000000000000000000000000000000000..6831bc1bcdef603628491503d27809cea39cfc63 GIT binary patch literal 3828 zcmWMpc{J3E7ym9ZV^(IYV_#BFB3ssyMA1TINuf~j%BxpW>b1%1*P=z6(w>rplC06f zDUs=ibk~=X^e!*R5SER0e=8?!jxK_r)7=0RRB!%On^8 zJaYj60=U4g$oR;b`5tv*4S|s|P!o28%b=6s2XY%>O#CK3k)gm8@D%ieS|N*hOa!f; zM=t;oq$lwK*C))#NMJ7rK?=|Y%p+gpchO&p3VDoNC=W&UU?|*kLaT5ZXpfQ=-!gY3nIPU?%BEEXD&c0jh)H z*iyoYoF-2K3&1`w9!iClK}lc*U;q@7m&kH581MzRLi+Gu@HUtYCqc;|K@Q=G=pTwj zvPY5=bJu3yi%rBlai=(KZh?%Cu<#dT6&M94Q+%nPs6uK7^(NJux`EnDouygQO&O&O z38R2{Lw z8LDmJW4fS0f_@{PsX_%`%#;lt`BnIDt%Hn-eQx(KaQ{!pihUt4rWyc<{x?f zCS&z0(fd`+c0vJNW?HdA>a!!HEG#lq9^k*$z-~l01@aqfXr8K^DXlCmsVHx_{Cmq( z1HuQ|h;Z47amTLzeJiclTY03xZ&*N~EG&0-+j4T}+uhCK;TxCR?a*9?W)HvWF77(s ze{DJ+T&-$h*t_V+VvbqKf>u3EHAC7uY1`oSmj2J7#q1o`)BOAYq)ny0eYoX?sOVlz z<}c-0s?u(L*CNuEwh~?!8%T{{#@ff19(#D~UR>&~4}LbzcZ@O^fl~94&D{Y_)7AbT zp+du#1&^-ZK7PaD=I%7p^jo?3yTTf{!(&7yc?18!HP*dsnrIPeSMMCPD%i`{_fBBa z*5hGlSjsj@pwq_3tM1zlnVeF+0?B60N9=q0nk&BT{CxTS-^EYzb6$UWRrxwFe|b?z zSxUv@YF^{fwxVCyV5%^A?g@64V$NQxR-(PjaKEYA;snd9Hn#Q)om5@UxomQN<}hUI zvNYaozwr@m8=ebe1PnnRNQ$Sg3h85uhWiGX{r-J%y+J)wou2Jkt;5aI=766MI-7g( zf!Culp~1|0Nwi`U&IX4l8jOEA^}PEUGCoJI%Ybg|X0pp9)tG7o8OU|l>tOs`Ekr}C zCg!YAuzl0C^4=8gxAm5y4Bog3dObQO(H zSy)p}Lma__Rul@5Up_z5fySVsTN)z@m_U(=9s9AN{QrtsR}55b=U-$pzq!^OoC zW$C2YcXHi`tUpQ+)c<4f^2lFfz&JjJj2{v;%?08Wv>p{#EeqW+9Za3Y`ICAOI7-Iwj4jI-sA-unACVDqgV~J9C&Qb2sclw`aNW^w8V$F9_WV9KaYjam z4LQ5j-)jYEk?Q-^5cN_WSJMwxi7rpv4L#nhY`0fga>d9~t57+ODn?pF5&aWw)bD{` zoZe>?hQB_V9sjaATm6;zb$edco6`kFWw)yzb>0zOfjOE2QwM7!=fPDm-aNm#E%F^L zF|GSQ9vY6%KCm>J2(n*YVQH#+l68$ppWQINyMI@=Ve6^7gvy{2D36`(^fD_KD_Hc= zv9`Wh+|k#i*4ffp+_<^Uw06_Cq{hAu$)RFu}fv3?o;)be4~ zJ;D9<$6*<{na7^nJ@t7)eReG8TIr6OW1VUfYp{A&I{%Kz9&@IRlH<-51*-x)sy+6t z7Ou*0U$ORpuSSSfgvl=ND6?&XjeA{dthj&NS&(JoV6;%XjjfK43W48yTf^%utKNNp zi}PNqWeuf&z5gy%=bF!@-t*(pg``aE(rN&_{+ z|J$`GHuON{A;w{?L%DzXN9Ovo+*-`{X>Nqyih-dEomfNEm+W^5c`=z69wpwfz3z3{ zG}-iW(~aDRl{wz;3mT02`4WIesCgRZnK5jtoGe!D_qyR55VSq?VTAK;{XMs1FUIoz z9FFh}Zt>Q0rkho1-l1)k+X_nrfgN>?J~iC`+TIIGp1^As@L_{6y|mB z+v$&TURsrW`0Cv5GSVgC!y8o+b%ITAS;X7LI9IML@VMZe?c*LW719#Ui(C@5Eb{&K zQ=v^;JOjROyyS7tF?X?zF3NsFX3QQK0|lL(XIgr`lQqR({;e>4|Gwm5K}w!_&brK? zr_Y`gr#EEOXZgNrdkdBI{wJ(YZ-3q2G5Jl-fo<6`wIrQGM%NeFTTa>uoO4&cS^aSB zll4n{Q~Z+sUHl6-wQW4>EnJ-MaIC^9MCYLneMrnoVQk&r)Ah8>pmE z8O7|+DzU1r8u$4d^imC5j9W}vOu|jvOad0PEi5+^Eq?Y#p>dIRFK>W#g-$4aWwf(j ztKeK`?n#a=V>{f9#YrcoR|&6-)C#V4`8RL4Zqq#Vl$I>FnlN+Keap;2M`rw|M`YnN6U}o*i;a2w5QZG_6DNu@P#!Bm zZ|9PI%g)$$T1FW}F~emZ6WwE-Vg)$I6=*Ni-mdJ5-5Xih_PL(XVBR@CMn{U_DVTw_ zPVDGfUZ?Xpqv}|TeAJBmth`r^#o0q{n7%u7W#H(JpYCaL(lhV@GlJx7wWD)TfOOxBgiUc0d z#1G#7_3?Mo_&MYYbGxQY`;NK^T`J!#EFQi#RypeeS@N>szG&l6;ZWGr zZNg6Zg!W1O9PLb%Qiv;iHytIm!dzJgbSzCDn|kSPW9>tnMe*ZBQ@7D-Mzn^P&UVc_ zrakIAd1k0;$Z2v?-cRXbZ{w_{_DT1j68eU8Vs5!7L6a^jy zZ6O|<2A_ayp+0aucn~}d1ye53{-#?oTvFCaT$A-RFk%^I5t&WGq&jgIpT*mVTjV=3ilmVM8A^_k zX8|6#6LbK#12CD4CtxgWC02uN!>e%CyiY$toG0`NV_bwfpy_BJ-axK_3@JKP7it^7s z5icSJ=9$+5(c~$DL5T1gd_V4n*W*^?4`2}FL2toW@DkVqa-bzpG86(kQsO9=;ZpDu z8Aq%nVA2|J1WUm;;AXI4-j`dGhQtnhFTS2QNG<}F0VK%-ZU7n}AG`>BCH2T;q7E;| zuA(_e1X73epuu<Rf zm1r%Njr$XpWC1V>#Zj}BwlMZGtC-fzLV6XAL;VStKsew`+(L?_PP5U|zM^SijPRYX zZSw9^_sprey|ROd5B`eu0arl+=o@^P+NBi7JkCDE3E|vh*Ry>N5kEw%7?huroslk=o{*MFQ>7--GRbp^P;yf0FWV=t zQW&Bh*kYVRc#v{{2U}7HXe#s}dNCt~$zwfbBJ?A)N!S2#2k9UP%7GD}4oCzB=Ko+6 zC$Lz|e_qp_^Y;=+SQAb7>3JplFn8=e8h}1RZLmvNC{~LuM+rn74Mj^(3+xMa7~eqb zCP#oKsDqM8)29b9_AuA7vRS??eWoiNpf$jX`Mtj&^NFjt4`z!VM3~5+0zl%C<){jl zhSK?D(eq7fg(lZic~GO!Y$0|n%tq%*mc3?m!o zv)fZ38SnrW0#Wl*oCo>PG3X*>4*7wGz%Vg~$KYCc7gmflU<>dExGC|Gh$Im*0r(Eg U0$eZ@%m*)kDS$s&P8g8?2R#; literal 0 HcmV?d00001 diff --git a/tools/tts/tts-api/on1.wav b/tools/tts/tts-api/on1.wav new file mode 100644 index 0000000000000000000000000000000000000000..5137fa195a7692868efb72f1ed37de9f8887102a GIT binary patch literal 3328 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 KETMt`f8c+E52U96 literal 0 HcmV?d00001 diff --git a/tools/tts/tts-api/on2.wav b/tools/tts/tts-api/on2.wav new file mode 100644 index 0000000000000000000000000000000000000000..d0178cae43251e4e96166747f455042d629655db GIT binary patch literal 10120 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 literal 0 HcmV?d00001 diff --git a/tools/tts/tts-api/tts-api.py b/tools/tts/tts-api/tts-api.py index 27f56e5488b..e1a5880da5b 100644 --- a/tools/tts/tts-api/tts-api.py +++ b/tools/tts/tts-api/tts-api.py @@ -4,11 +4,18 @@ import subprocess import requests import re +import pysbd +import pydub +import string +import random +import json from flask import Flask, request, send_file, abort, make_response - +tts_sample_rate = 40000 # Set to 40000 if you're using RVC, or whatever sample rate your endpoint is going to send the audio in. app = Flask(__name__) - -authorization_token = os.getenv("TTS_AUTHORIZATION_TOKEN", "coolio") +segmenter = pysbd.Segmenter(language="en", clean=True) +radio_starts = ["./on1.wav", "./on2.wav"] +radio_ends = ["./off1.wav", "./off2.wav", "./off3.wav", "./off4.wav"] +authorization_token = os.getenv("TTS_AUTHORIZATION_TOKEN", "vote_goof_2024") def hhmmss_to_seconds(string): new_time = 0 separated_times = string.split(":") @@ -17,29 +24,46 @@ def hhmmss_to_seconds(string): new_time += float(separated_times[2]) return new_time -def text_to_speech_handler(endpoint, voice, text, filter_complex, pitch, silicon = False): +def text_to_speech_handler(endpoint, voice, text, filter_complex, pitch, special_filters = []): filter_complex = filter_complex.replace("\"", "") - response = requests.get(f"http://tts-container:5003/" + endpoint, json={ 'text': text, 'voice': voice, 'pitch': pitch }) - if response.status_code != 200: - abort(500) - + data_bytes = io.BytesIO() + final_audio = pydub.AudioSegment.empty() + + for sentence in segmenter.segment(text): + response = requests.get(f"http://127.0.0.1:5003/" + endpoint, json={ 'text': sentence, 'voice': voice, 'pitch': pitch }) + if response.status_code != 200: + abort(500) + sentence_audio = pydub.AudioSegment.from_file(io.BytesIO(response.content), "wav") + sentence_silence = pydub.AudioSegment.silent(250, 40000) + sentence_audio += sentence_silence + final_audio += sentence_audio + # ""Goldman-Eisler (1968) determined that typical speakers paused for an average of 250 milliseconds (ms), with a range from 150 to 400 ms."" + # (https://scholarsarchive.byu.edu/cgi/viewcontent.cgi?article=10153&context=etd) + final_audio.export(data_bytes, format="wav") + filter_complex = filter_complex.replace("%SAMPLE_RATE%", str(tts_sample_rate)) ffmpeg_result = None if filter_complex != "": - ffmpeg_result = subprocess.run(["ffmpeg", "-f", "wav", "-i", "pipe:0", "-filter_complex", filter_complex, "-c:a", "libvorbis", "-b:a", "64k", "-f", "ogg", "pipe:1"], input=response.content, capture_output = True) + ffmpeg_result = subprocess.run(["ffmpeg", "-f", "wav", "-i", "pipe:0", "-filter_complex", filter_complex, "-c:a", "libvorbis", "-b:a", "64k", "-f", "ogg", "pipe:1"], input=data_bytes.read(), capture_output = True) else: - if silicon: - ffmpeg_result = subprocess.run(["ffmpeg", "-f", "wav", "-i", "pipe:0", "-i", "./SynthImpulse.wav", "-i", "./RoomImpulse.wav", "-filter_complex", "[0] aresample=44100 [re_1]; [re_1] apad=pad_dur=2 [in_1]; [in_1] asplit=2 [in_1_1] [in_1_2]; [in_1_1] [1] afir=dry=10:wet=10 [reverb_1]; [in_1_2] [reverb_1] amix=inputs=2:weights=8 1 [mix_1]; [mix_1] asplit=2 [mix_1_1] [mix_1_2]; [mix_1_1] [2] afir=dry=1:wet=1 [reverb_2]; [mix_1_2] [reverb_2] amix=inputs=2:weights=10 1 [mix_2]; [mix_2] equalizer=f=7710:t=q:w=0.6:g=-6,equalizer=f=33:t=q:w=0.44:g=-10 [out]; [out] alimiter=level_in=1:level_out=1:limit=0.5:attack=5:release=20:level=disabled", "-c:a", "libvorbis", "-b:a", "64k", "-f", "ogg", "pipe:1"], input=response.content, capture_output = True) + if "silicon" in special_filters: + ffmpeg_result = subprocess.run(["ffmpeg", "-f", "wav", "-i", "pipe:0", "-i", "./SynthImpulse.wav", "-i", "./RoomImpulse.wav", "-filter_complex", "[0] aresample=44100 [re_1]; [re_1] apad=pad_dur=2 [in_1]; [in_1] asplit=2 [in_1_1] [in_1_2]; [in_1_1] [1] afir=dry=10:wet=10 [reverb_1]; [in_1_2] [reverb_1] amix=inputs=2:weights=8 1 [mix_1]; [mix_1] asplit=2 [mix_1_1] [mix_1_2]; [mix_1_1] [2] afir=dry=1:wet=1 [reverb_2]; [mix_1_2] [reverb_2] amix=inputs=2:weights=10 1 [mix_2]; [mix_2] equalizer=f=7710:t=q:w=0.6:g=-6,equalizer=f=33:t=q:w=0.44:g=-10 [out]; [out] alimiter=level_in=1:level_out=1:limit=0.5:attack=5:release=20:level=disabled", "-c:a", "libvorbis", "-b:a", "64k", "-f", "ogg", "pipe:1"], input=data_bytes.read(), capture_output = True) else: - ffmpeg_result = subprocess.run(["ffmpeg", "-f", "wav", "-i", "pipe:0", "-c:a", "libvorbis", "-b:a", "64k", "-f", "ogg", "pipe:1"], input=response.content, capture_output = True) + ffmpeg_result = subprocess.run(["ffmpeg", "-f", "wav", "-i", "pipe:0", "-c:a", "libvorbis", "-b:a", "64k", "-f", "ogg", "pipe:1"], input= data_bytes.read(), capture_output = True) ffmpeg_metadata_output = ffmpeg_result.stderr.decode() print(f"ffmpeg result size: {len(ffmpeg_result.stdout)} stderr = \n{ffmpeg_metadata_output}") - - + export_audio = io.BytesIO(ffmpeg_result.stdout) + if "radio" in special_filters: + radio_audio = pydub.AudioSegment.from_file(random.choice(radio_starts), "wav") + radio_audio += pydub.AudioSegment.from_file(io.BytesIO(ffmpeg_result.stdout), "ogg") + radio_audio += pydub.AudioSegment.from_file(random.choice(radio_ends), "wav") + new_data_bytes = io.BytesIO() + radio_audio.export(new_data_bytes, format="ogg") + export_audio = io.BytesIO(new_data_bytes.getvalue()) matched_length = re.search(r"time=([0-9:\\.]+)", ffmpeg_metadata_output) hh_mm_ss = matched_length.group(1) length = hhmmss_to_seconds(hh_mm_ss) - response = send_file(io.BytesIO(ffmpeg_result.stdout), as_attachment=True, download_name='identifier.ogg', mimetype="audio/ogg") + response = send_file(export_audio, as_attachment=True, download_name='identifier.ogg', mimetype="audio/ogg") response.headers['audio-length'] = length return response @@ -51,12 +75,15 @@ def text_to_speech_normal(): voice = request.args.get("voice", '') text = request.json.get("text", '') pitch = request.args.get("pitch", '') - silicon = request.args.get("silicon", '') + special_filters = request.args.get("special_filters", '') if pitch == "": pitch = "0" + silicon = request.args.get("silicon", '') + if silicon: + special_filters = ["silicon"] filter_complex = request.args.get("filter", '') - return text_to_speech_handler("generate-tts", voice, text, filter_complex, pitch, bool(silicon)) + return text_to_speech_handler("generate-tts", voice, text, filter_complex, pitch, special_filters) @app.route("/tts-blips") def text_to_speech_blips(): @@ -66,12 +93,13 @@ def text_to_speech_blips(): voice = request.args.get("voice", '') text = request.json.get("text", '') pitch = request.args.get("pitch", '') - silicon = request.args.get("silicon", '') + special_filters = request.args.get("special_filters", '') if pitch == "": pitch = "0" + special_filters = special_filters.split("|") filter_complex = request.args.get("filter", '') - return text_to_speech_handler("generate-tts-blips", voice, text, filter_complex, pitch, bool(silicon)) + return text_to_speech_handler("generate-tts-blips", voice, text, filter_complex, pitch, special_filters) @@ -80,7 +108,7 @@ def voices_list(): if authorization_token != request.headers.get("Authorization", ""): abort(401) - response = requests.get(f"http://tts-container:5003/tts-voices") + response = requests.get(f"http://127.0.0.1:5003/tts-voices") return response.content @app.route("/health-check") @@ -93,7 +121,7 @@ def pitch_available(): if authorization_token != request.headers.get("Authorization", ""): abort(401) - response = requests.get(f"http://tts-container:5003/pitch-available") + response = requests.get(f"http://127.0.0.1:5003/pitch-available") if response.status_code != 200: abort(500) return make_response("Pitch available", 200) From 2859f3b68c8e138116ac9eaf71a5665ea853b58e Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 08:41:08 +0200 Subject: [PATCH 043/101] Add new sounds for animals, basic animals make sound on audible emote [MDB IGNORE] (#23917) * Add new sounds for animals, basic animals make sound on audible emote (#78499) ## About The Pull Why It's Good For The Game Request More sound immersion. Also just makes sense for sounds to play when an animal is both saying something and using an audible emote. Crab click: https://freesound.org/people/JarredGibb/sounds/263882/ Chitter: https://freesound.org/people/ForSoundDesign/sounds/687302/ Chicks: https://pixabay.com/sound-effects/chicks-very-young-56075/ Chicken: https://freesound.org/people/Breviceps/sounds/456803/ https://github.com/tgstation/tgstation/assets/66640614/29cd4e8e-b9c3-4f71-be0d-8c3f3de40eba https://github.com/tgstation/tgstation/assets/66640614/9a24c1a8-0707-43ad-adec-b7ce1eddb5f6 https://github.com/tgstation/tgstation/assets/66640614/21cc37ae-c49c-461a-83c5-271f6d577fc6 ## Changelog :cl: tattle qol: Basic animals now make sounds for audible emotes sound: Added new sound effects for chicks, chickens, crabs, and insects /:cl: Co-authored-by: tattle * Add new sounds for animals, basic animals make sound on audible emote * Sound path changes --------- Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com> Co-authored-by: tattle Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- .../basic_subtrees/speech_subtree.dm | 23 +++++++++++++----- code/datums/ai/generic/generic_behaviors.dm | 4 ++- .../dna_infuser/organ_sets/rat_organs.dm | 2 +- code/modules/events/mice_migration.dm | 2 +- code/modules/mob/living/basic/vermin/mouse.dm | 2 +- .../game/objects/items/plushes.dm | 4 +-- modular_skyrat/modules/emotes/code/emotes.dm | 2 +- sound/creatures/bagawk.ogg | Bin 0 -> 9230 bytes sound/creatures/chick_peep.ogg | Bin 0 -> 4870 bytes sound/creatures/chitter.ogg | Bin 0 -> 9014 bytes sound/creatures/claw_click.ogg | Bin 0 -> 10330 bytes sound/creatures/clucks.ogg | Bin 0 -> 12384 bytes sound/{effects => creatures}/mousesqueek.ogg | Bin sound/creatures/pony/snort.ogg | Bin 10443 -> 10519 bytes 14 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 sound/creatures/bagawk.ogg create mode 100644 sound/creatures/chick_peep.ogg create mode 100644 sound/creatures/chitter.ogg create mode 100644 sound/creatures/claw_click.ogg create mode 100644 sound/creatures/clucks.ogg rename sound/{effects => creatures}/mousesqueek.ogg (100%) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index 8340d1da4d3..e040a566bcf 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -31,15 +31,19 @@ var/random_number_in_range = rand(1, total_choices_length) + // Sound that plays when the mob does something audible + var/sound_to_play = length(sound) > 0 ? pick(sound) : null + if(random_number_in_range <= audible_emotes_length) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear)) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear), sound_to_play) else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) else - controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), length(sound) > 0 ? pick(sound) : null) + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), sound_to_play) /datum/ai_planning_subtree/random_speech/insect speech_chance = 5 + sound = list('sound/creatures/chitter.ogg') emote_hear = list("chitters.") /datum/ai_planning_subtree/random_speech/mothroach @@ -49,6 +53,7 @@ /datum/ai_planning_subtree/random_speech/mouse speech_chance = 1 speak = list("Squeak!", "SQUEAK!", "Squeak?") + sound = list('sound/creatures/mousesqueek.ogg') emote_hear = list("squeaks.") emote_see = list("runs in a circle.", "shakes.") @@ -93,12 +98,14 @@ /datum/ai_planning_subtree/random_speech/chicken speech_chance = 15 // really talkative ladies speak = list("Cluck!", "BWAAAAARK BWAK BWAK BWAK!", "Bwaak bwak.") + sound = list('sound/creatures/clucks.ogg', 'sound/creatures/bagawk.ogg') emote_hear = list("clucks.", "croons.") emote_see = list("pecks at the ground.","flaps her wings viciously.") /datum/ai_planning_subtree/random_speech/chick speech_chance = 4 speak = list("Cherp.", "Cherp?", "Chirrup.", "Cheep!") + sound = list('sound/creatures/chick_peep.ogg') emote_hear = list("cheeps.") emote_see = list("pecks at the ground.","flaps her tiny wings.") @@ -160,33 +167,37 @@ /datum/ai_planning_subtree/random_speech/pony speech_chance = 3 + sound = list('sound/creatures/pony/whinny01.ogg', 'sound/creatures/pony/whinny02.ogg', 'sound/creatures/pony/whinny03.ogg') emote_hear = list("whinnies!") emote_see = list("horses around.") /datum/ai_planning_subtree/random_speech/pony/tamed speech_chance = 3 + sound = list('sound/creatures/pony/snort.ogg') + emote_hear = list("snorts.") emote_see = list("snorts.") /datum/ai_planning_subtree/random_speech/killer_tomato speech_chance = 3 - speak = list("gnashes.", "growls lowly.", "snarls.") - emote_hear = list("gnashes.") + emote_hear = list("gnashes.", "growls lowly.", "snarls.") emote_see = list("salivates.") /datum/ai_planning_subtree/random_speech/ant speech_chance = 1 + speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") + sound = list('sound/creatures/chitter.ogg') emote_hear = list("buzzes.", "clacks.") emote_see = list("shakes their head.", "twitches their antennae.") - speak = list("BZZZZT!", "CHTCHTCHT!", "Bzzz", "ChtChtCht") /datum/ai_planning_subtree/random_speech/fox speech_chance = 1 + speak = list("Ack-Ack", "Ack-Ack-Ack-Ackawoooo", "Geckers", "Awoo", "Tchoff") emote_hear = list("howls.", "barks.", "screams.") emote_see = list("shakes their head.", "shivers.") - speak = list("Ack-Ack", "Ack-Ack-Ack-Ackawoooo", "Geckers", "Awoo", "Tchoff") /datum/ai_planning_subtree/random_speech/crab speech_chance = 1 + sound = list('sound/creatures/claw_click.ogg') emote_hear = list("clicks.") emote_see = list("clacks.") diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index e7bfe7a7c60..fd6d848f2d6 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -287,11 +287,13 @@ /datum/ai_behavior/perform_emote -/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote) +/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote, speech_sound) var/mob/living/living_pawn = controller.pawn if(!istype(living_pawn)) return living_pawn.manual_emote(emote) + if(speech_sound) // Only audible emotes will pass in a sound + playsound(living_pawn, speech_sound, 80, vary = TRUE) finish_action(controller, TRUE) /datum/ai_behavior/perform_speech diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 57067db47f6..96c33871a40 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -133,7 +133,7 @@ . = ..() if(prob(5)) owner.emote("squeaks") - playsound(owner, 'sound/effects/mousesqueek.ogg', 100) + playsound(owner, 'sound/creatures/mousesqueek.ogg', 100) #undef RAT_ORGAN_COLOR #undef RAT_SCLERA_COLOR diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index e7f31567f4c..450f9100800 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -23,7 +23,7 @@ priority_announce("Due to [cause], [plural] [name] have [movement] \ into the [location].", "Migration Alert", - 'sound/effects/mousesqueek.ogg') + 'sound/creatures/mousesqueek.ogg') /datum/round_event/mice_migration/start() SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice)) diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 0b3645b3e0f..9e8f1b8df55 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -51,7 +51,7 @@ held_state = "mouse_[body_color]" // not handled by variety element AddElement(/datum/element/animal_variety, "mouse", body_color, FALSE) AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10) - AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever + AddComponent(/datum/component/squeak, list('sound/creatures/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) diff --git a/modular_skyrat/modules/customization/game/objects/items/plushes.dm b/modular_skyrat/modules/customization/game/objects/items/plushes.dm index d718d409b49..1d2992cf8ef 100644 --- a/modular_skyrat/modules/customization/game/objects/items/plushes.dm +++ b/modular_skyrat/modules/customization/game/objects/items/plushes.dm @@ -467,7 +467,7 @@ gender = FEMALE attack_verb_continuous = list("pats", "hugs", "scolds", "pets") attack_verb_simple = list("pat", "hug", "scold", "pet") - squeak_override = list('sound/effects/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,) + squeak_override = list('sound/creatures/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,) responses = list("Rabbits are prey animals and are therefore constantly aware of their surroundings.", "Things to jump up on (they like to be in high places)", "become a rabbit today!", "Be cunning and full of tricks...", "Subscription confirmed! Thank you for choosing RABBITFACTS +TM+!", "Holland Lops are a breed of rabbit originating in the Netherlands.", "Rabbits may need medication to keep themselves healthy, and that's ok! Make sure to take yours too!", "rabbits really liked this product", "A healthy rabbit diet includes fresh vegetables.", "Rabbits do not hibernate. Their schedules are much too busy.", "the rate of bunnies is measured by RPB (rabbits per bunny)", ) /obj/item/toy/plush/skyrat/chunko/andrew @@ -477,7 +477,7 @@ gender = MALE attack_verb_continuous = list("pats", "hugs", "scolds", "pets") attack_verb_simple = list("pat", "hug", "scold", "pet") - squeak_override = list('sound/effects/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,) + squeak_override = list('sound/creatures/mousesqueek.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/mothsqueak.ogg' = 1,) // All lowercase messages are intentional responses = list("bunny who you best pray you never encounter, lest you suffer a fate worse than death.", "this is a bunny!", "I wonder what would happen if you took bunnies, and combined them with rabbits, and merged their properties and characteristics. It's something to think about.", "If you're cold, they're cold. Give them the deed to your house.", "bunny that goes yeah! woo! yeah! woo! yeah! woo! yeah! woo! yeah! woo! yeah!", "the bunnies are beyond my comprehension", "it's a bunny thing, you wouldn't get it", "this bunny has an unfathomable power level", "%pull the string and I'll bink at you...I'm your bunny.", "Bunny (1954)", "the bunny that pulls the strings....", ) diff --git a/modular_skyrat/modules/emotes/code/emotes.dm b/modular_skyrat/modules/emotes/code/emotes.dm index 5f41b22751b..16c8ecbcef6 100644 --- a/modular_skyrat/modules/emotes/code/emotes.dm +++ b/modular_skyrat/modules/emotes/code/emotes.dm @@ -143,7 +143,7 @@ message = "squeaks!" emote_type = EMOTE_AUDIBLE vary = TRUE - sound = 'sound/effects/mousesqueek.ogg' + sound = 'sound/creatures/mousesqueek.ogg' /datum/emote/living/merp key = "merp" diff --git a/sound/creatures/bagawk.ogg b/sound/creatures/bagawk.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bfdce2da4894b4e78df42e37972d006e999c0d68 GIT binary patch literal 9230 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
  • n7p|vC*EGKz zTmH#&=<}uSdC_4pm71YtKpw!7HX-CtU5iAQvY$Do(^X*YRA|RD`{ua$gGdEYiYY^7 z*E(y_?;&^dJ~y{)-uG$X%D(EA9iD2@SaiO^E4RPwPRVtW@4fP?h6uHF_h0V}AMuUv zhS!wjHEAcV)s(yU682KOs+Vbdsc~6UvQX93*3)ES{-o8kq>iBHsSYX!t{P%iT`dAE zuRmPdyF2#GsmX-h_l8lAaqSzCIJHIVU+C%2h0_eeO$!3&)|QnjwzG@Wth@v&s(1Q6 zp5hCCd~&PYukrd{ggpjWI8r)+} z3>Mj_eK_GzgJu|SRKH)_5GXO>4?FoT?px+DbH>K|mO&!n$XCS4jaBi~;)yd4wlsVD)raKviZtvpP3kBv8v|V5a zbK;98Eb(rqgpVsfwj6(If&js7-6`2ScM29JXIB!R(eZ0N3;!^8{~%?zaXaZP z=fxXUKiO2?zUUf^DAF!>!GxVFy7Gyv*@|@@{|NbpA8}prvouEc)s2AeIb<}6tS6YT z+1qq9Gq0xzVUZ%%slA(LHcQh~Ze8ExoA;h@E^n?My!-Xc_nY(V3Lk%zT4?dvm9a^q ndLqxhpndg2;(TsLLb2Ygq*B774aQLQkejes5+D|%#Owb6UxJ>X literal 0 HcmV?d00001 diff --git a/sound/creatures/chick_peep.ogg b/sound/creatures/chick_peep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1e84d1d765fd8523cd1ffcde054c7cead578c40c GIT binary patch literal 4870 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 delta 7158 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 Date: Wed, 27 Sep 2023 08:41:26 +0200 Subject: [PATCH 044/101] Prevent things from the feature list generating on turfs with flora [MDB IGNORE] (#23950) * Prevent things from the feature list generating on turfs with flora (#78558) ## About The Pull Request which basically means no geysers on the same turf as a plant turf. they're both structures but the for loop before this one checks for same-type structures in a radius. and bush geysers look stupid! and weird! and stupid! ## Changelog :cl: fix: fixed geysers spawning on turfs with plants /:cl: * Prevent things from the feature list generating on turfs with flora --------- Co-authored-by: Sealed101 --- code/datums/mapgen/CaveGenerator.dm | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 48df6e164fb..8cb240526a4 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -116,8 +116,8 @@ var/start_time = REALTIMEOFDAY - for(var/turf/turf as anything in turfs) - if(!(turf.type in open_turf_types)) //only put stuff on open turfs we generated, so closed walls and rivers and stuff are skipped + for(var/turf/target_turf as anything in turfs) + if(!(target_turf.type in open_turf_types)) //only put stuff on open turfs we generated, so closed walls and rivers and stuff are skipped continue // If we've spawned something yet @@ -127,22 +127,24 @@ //FLORA SPAWNING HERE if(flora_allowed && prob(flora_spawn_chance)) var/flora_type = pick(flora_spawn_list) - new flora_type(turf) + new flora_type(target_turf) spawned_something = TRUE //FEATURE SPAWNING HERE - if(feature_allowed && prob(feature_spawn_chance)) + //we may have generated something from the flora list on the target turf, so let's not place + //a feature here if that's the case (because it would look stupid) + if(feature_allowed && !spawned_something && prob(feature_spawn_chance)) var/can_spawn = TRUE var/atom/picked_feature = pick(feature_spawn_list) - for(var/obj/structure/existing_feature in range(7, turf)) + for(var/obj/structure/existing_feature in range(7, target_turf)) if(istype(existing_feature, picked_feature)) can_spawn = FALSE break if(can_spawn) - new picked_feature(turf) + new picked_feature(target_turf) spawned_something = TRUE //MOB SPAWNING HERE @@ -161,12 +163,12 @@ // prevents tendrils spawning in each other's collapse range if(ispath(picked_mob, /obj/structure/spawner/lavaland)) - for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, turf)) + for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, target_turf)) can_spawn = FALSE break // if the random is not a tendril (hopefully meaning it is a mob), avoid spawning if there's another one within 12 tiles else - var/list/things_in_range = range(12, turf) + var/list/things_in_range = range(12, target_turf) for(var/mob/living/mob_blocker in things_in_range) if(ismining(mob_blocker)) can_spawn = FALSE @@ -176,7 +178,7 @@ can_spawn = can_spawn && !(locate(/obj/effect/spawner/random/lavaland_mob) in things_in_range) //if there's a megafauna within standard view don't spawn anything at all (This isn't really consistent, I don't know why we do this. you do you tho) if(can_spawn) - for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, turf)) + for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, target_turf)) can_spawn = FALSE break @@ -185,7 +187,7 @@ weighted_megafauna_spawn_list.Remove(picked_mob) megafauna_spawn_list = expand_weights(weighted_megafauna_spawn_list) megas_allowed = megas_allowed && length(megafauna_spawn_list) - new picked_mob(turf) + new picked_mob(target_turf) spawned_something = TRUE CHECK_TICK From 0693ae5182d8cac9505c614224e45311535886ca Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 10:38:41 +0200 Subject: [PATCH 045/101] exodrone travel time balance, grammar, fixes and tweaks [MDB IGNORE] (#23952) * exodrone travel time balance, grammar, fixes and tweaks (#78378) Exodrones fixes and balance * exodrone travel time balance, grammar, fixes and tweaks --------- Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com> --- .../modules/explorer_drone/control_console.dm | 2 +- .../Theres_a_tree_in_the_middle_of_space.json | 697 +++++++++--------- code/modules/explorer_drone/exodrone.dm | 13 +- code/modules/explorer_drone/scanner_array.dm | 41 +- icons/obj/exploration.dmi | Bin 6926 -> 7575 bytes 5 files changed, 398 insertions(+), 355 deletions(-) diff --git a/code/modules/explorer_drone/control_console.dm b/code/modules/explorer_drone/control_console.dm index 7b371e8412b..8cc8854f27d 100644 --- a/code/modules/explorer_drone/control_console.dm +++ b/code/modules/explorer_drone/control_console.dm @@ -1,6 +1,6 @@ /obj/machinery/computer/exodrone_control_console name = "exploration drone control console" - desc = "control eploration drones from intersteller distances. Communication lag not included." + desc = "Control exploration drones from interstellar distances. Communication lag not included." circuit = /obj/item/circuitboard/computer/exodrone_console //Currently controlled drone var/obj/item/exodrone/controlled_drone diff --git a/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json b/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json index 3f9ee41582e..f06b1d25062 100644 --- a/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json +++ b/code/modules/explorer_drone/example_adventures/Theres_a_tree_in_the_middle_of_space.json @@ -1,343 +1,356 @@ { - "adventure_name": "There's a tree in the middle of space.", - "version": 1, - "starting_node": "Tree Start", - "starting_qualities": { - "Confusion": 0 - }, - "required_site_traits": [ - "in space" - ], - "loot_categories": [ - "research" - ], - "scan_band_mods": { - "Exotic Radiation": 10 - }, - "deep_scan_description": "", - "triggers": [ - { - "name": "Confusion Trigger", - "target_node": "What is wrong with this tree?", - "requirements": [ - { - "quality": "Confusion", - "operator": ">", - "value": 30 - } - ] - } - ], - "nodes": [ - { - "name": "Tree Start", - "description": "Camera online. Visual signs detect a fully grown, seemingly biological, and live tree located in the middle of the vacuum.\nSensors indicate it is not oxygenating, but energy is being collected via passive solar light from the nearby star.\nBaffling.", - "choices": [ - { - "key": "choice 0", - "name": "Ignore site.", - "exit_node": "FAIL", - "delay": 10, - "delay_message": "Leave this for the botanists to figure out." - }, - { - "key": "choice 1", - "name": "Begin sensor scan.", - "exit_node": "Biological Scan", - "delay": 10, - "delay_message": "Lets get some data." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,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" - }, - { - "name": "Biological Scan", - "description": "You attempt to scan for clues regarding the tree's nature. It appears to be a fully mature oak tree. \n\nApproximated height is 13 ft, 6.4 inches. \n\nSubject sees no sign of an outer coating or otherwise layer protecting it from the void of space.\n\nSubject's surface temperature is 293.7 kelvin, as though it were sitting indoors.", - "choices": [ - { - "key": "choice 2", - "name": "Check Sensor Integrity.", - "exit_node": "Its Not You...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": 5 - } - ], - "delay": 50, - "delay_message": "This can't be right." - }, - { - "key": "choice 4", - "name": "Attempt to take sample.", - "exit_node": "Sample Taken", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": 3 - } - ], - "delay": 40, - "delay_message": "Snip snip." - }, - { - "key": "choice 6", - "name": "Examine Tree Roots.", - "exit_node": "Examine Roots", - "delay": 10 - }, - { - "key": "choice 9", - "name": "Sequence Sample Radiation with background noise.", - "exit_node": "Background Analysis", - "requirements": [ - { - "quality": "Sample", - "operator": ">=", - "value": 1 - } - ], - "delay": 0, - "delay_message": "This can't be real." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,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" - }, - { - "name": "Its Not You...", - "description": "After re-connection is established, your sensors appear fine. Tree has not moved in the slightest since last observed. Temperature has fluxuated 0.2 kelvin upwards, as expected of a plant under direct light.\nLets try again.", - "choices": [ - { - "key": "choice 3", - "name": "Restart biological scan.", - "exit_node": "Biological Scan", - "delay": 25, - "delay_message": "God damnit." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" - }, - { - "name": "Sample Taken", - "description": "You collect and project a small sample of tree bark off the plant. The instant that the bark is removed from the tree, as though it suddenly remembered what it was, the moisture content of the bark freezes over, and implodes into small microparticles of splinters.\nSmall radioactive signature detected.", - "choices": [ - { - "key": "choice 5", - "name": "Well that was... unexpected.", - "exit_node": "Biological Scan", - "delay": 0, - "delay_message": "Maybe something else might work better.", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Sample", - "value": 1 - } - ] - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAABSLiiPVjtyRS9mOTFbNyYAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+sDUQxTDbeK7vfF/3saCwcxPcCMckcqlM2pDPnnRKrUqH2IdAYDBwu+Bwl2Agm8sE8iy9Zrqbb2Z0bq3b74W8Xp+1bP+Af2KDhIVlh2eJaUtsi3CPcU43d5QDe5cFfSKBnJ2en50Ff6JboqYCBWiLq46tkK+RUJOTmJmatxyguqSovae/vsGirK2NjU21trjLQp+8wNDCwnmo1MnM2Nna29zd3t/g4eLj5OXm59o5Rjo/QOjvLaKwkrKylfdW8FleXImIBm0CxppXD4c9fAgT5tCn4Iuhh4fG/DNTjNHAi4/oKERYq/+cro8gPYXxR7EkK4EEUxbUOCVZHoabQoZ8NkqaKWI4BR7DGKcjTG4yaZaySRSatQLGfP5ciqHX0GhQpzGdSrWq1atYs2rdyrWr169gw4pVsc7G2LMLkM46SOkl2nc86W3E97aFgLh4Dc7dq6NuhC0TVVlUOY8l38N9szocREYiyYqEMdJZibjylW+AIRIiqUowyrwDJ+u1XMelsm6CNKtmHHiRZ8iuQGecVdklZpm4V3NWREznYNmhaeNRCg638eOBhrUWjPP3zshNDNuwzRW5dZrQmms3BhzSNb8SrIPCXvTudtjzMIEngVxo+ajDtKOkvt5u0Jrw3/s6yqd+Nk7/7uUn4FH+VaWfKAUmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKFRsgxy4jaBEeZOyi60J2JK1piS2ItcvDiaMIpVGMEv0GnIo46grgFbM/dKBppC004kXzo3fiGdJb51wUgiKTBnHNOzsYWkpd1xZpjrTHJnY+vQGlZOztMBUZmrO0mZo9Zwggkl/mkKc5qIy3n2nlExrnWnHROcRueYjSm55Wr+Ebmj2YeZpo4bBJqyG6Inqeon0duRF84kuJJKW98Nrkojlu2dYlHkXaq6qehNvfZqHI2+ihq4lGpKhisttpbbKNm6sN3t9Wam2q5Vtrqq5jesKk3jsI220mheuq665jJzoqqs9gGcqi0211KGLBUZYutciUZG6q3cREnlrjiPcZtTqIiAW597H5E07uuiqqehPXONIq57+6rYb81PWUTvmksuyHBTjUc1XnVmOLWjgFkG+CBNk1MsRb1kiegLxtf4KzHB4b8Qa0XA2OyfZ6QjODKywwlM8w012zzzTjnrPNWCQAAOw==" - }, - { - "name": "Examine Roots", - "description": "All plant matter has to derive energy and moisture from someplace. Examining the oak tree's roots reveals that the roots present all appear to splay out, similar to how a normal tree would. However, those roots then proceed to double back in on itself. This might suggest that the tree is obtaining nutrients from... itself.", - "choices": [ - { - "key": "choice 7", - "name": "That's fucking stupid.", - "exit_node": "Biological Scan", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": 6, - "high": 10 - } - } - ], - "delay": 0, - "delay_message": "What the hell kind of tree even IS this?" - }, - { - "key": "choice 8", - "name": "Obtain biological sample from roots.", - "exit_node": "Sample Taken", - "delay": 10, - "delay_message": "This is why we hire botanists on-site." - } - ], - "image": null, - "raw_image": "data:image/gif;base64,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" - }, - { - "name": "Background Analysis", - "description": "You compare the radioactive energy bands of the sample collected earlier with that of the nearby solar enviroment.\nNothing.\nThere is nothing nearby that matches the passive signal of the tree, or the bark, or anything similar.\nThis is really starting to get on your nerves.", - "choices": [ - { - "key": "choice 10", - "name": "Smash your desk in frustration.", - "exit_node": "FAIL", - "delay": 50, - "delay_message": "No amount of pay is worth dealing with magical plant juju." - }, - { - "key": "choice 11", - "name": "Check every known energy spectroscopy database.", - "exit_node": "Sample Match Found", - "delay": 900, - "delay_message": "You NEED an answer. You DESERVE an answer." - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": 3, - "high": 5 - } - } - ], - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD///9ZVlKsMjJpampGR0cAAAAD/xi63P4wykmFpTjrDa0XXCiOZGlqQ0qsazqIXyx9Z23feKayfP/WskgwRywqCsikcslsOpGpgGvQNDo8lYt1W4I+v2CvMhUuI0/YiZbL5nxdhkJ8Lq/T6eZ8HRmHUtuAgRp6T3B2SXdNfYeJc3CCkJEYjISVYZKRQ5gajZSdi0yboqM3nnWkqKmCpgaqrq9GBrKzs7AKaYG4tji0vbu/wCW6wZpqNMHIOAM9zDw/IzEgHcVt1KOWZQ1TU4LDV2vJOAVU2GZkY5VF4NPr4SRM53yI8/Lw9uVvBcLuknqGn4cqLQIYhwy/g0fwKdSDsCEGggtDOZwoAiLFi5sAYtwoqf/XIVjeOKrqRUukjZAmGVjDGC2lSyAts7R7GW5ZM2bPNERDGSAmzWA2b/pAc+yBT0ArVeXhsC2oj5wnefaU+pNBxDJNXUAqyq6qhKthyCUR+4QLVa5ej5AFO3ZJPGw3qE5N22DsWiUD6Tm5e/cqCbk96dZtQgZip3rjwIIa90fwqrBUDAfcQ0hyilaOIWG7zIoSYryd73DLrJntNlOIO2WVQ/raYrYKW/8CCNuJbH6S8aS7vSCpq9C8gxMMzns48dudj9/WqFw2yZKvfDc38Rxzc+kiq09f/nw7b+wNwV9HuwuwSvLeL14wjz49pm3Qds7sbd59jh1Co3CQP1+8/Rr/TgnVQnxHNVDgf0QEKCBUIRxIX3sIAiigMwzCAKF/cc1H1xQTVvjXhRCqE6IosU2Q1YkiajiViin+VhthWW0l1YhevQjjafrIKI0QLP5kI2GMBWkbG2fVx1FiP/oxRl9DEiEXCDsKhuSPazFpBg5P9miSkHmlpleXbbkVUVRRTkOakl7mRg9fsJmQ5Zl2DaDmJ4XVwZkZYHbpoU726eZCaID28RYYeRFEToQVeVaYLHIwOkugk70GqWiNIeoGQJc5qumclOU5qUGWXhraFNU1yumpdoAa6ganZkrLpJ2G5qido606CKoGwDErrqaaSlKttrIKq2r/DGvHr39aF2wIgsYaduKzqyUhhbLLjsArp3BVW0Oz3OpWlrY5dCsuKOByMS635QpyLaTEGenauZ2M5y4m696B4Lz0spLuRMnt25BH9vr7b3XUChwOwbIYfBDCBSscDMIOL0xwxO5ATPHB2kVHY7oTg7RxuR0rhyFFIYv8MUYZX5xMySoDk3LLD3dXbQIAOw==" - }, - { - "name": "Sample Match Found", - "description": "After an extensive algorithm search on the controller end, you have a single match to this specific band and style of energy.\nThe problem, is that the source of said radiation is coming not only from Space Station 13, no.\nIt's coming from the Space Station 13 Research Department.\nWhat the fuck?", - "choices": [ - { - "key": "choice 12", - "name": "Something must be wrong with the drone.", - "exit_node": "Its Not You...", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": 6, - "high": 10 - } - } - ], - "delay": 30, - "delay_message": "Lousy piece of junk must be scanning the station instead of the target." - }, - { - "key": "choice 13", - "name": "Perhaps that sample was tainted. Collect a new sample.", - "exit_node": "Sample Taken", - "delay": 60, - "delay_message": "Lets try again, but carefully." - }, - { - "key": "choice 14", - "name": "Remember the Christmas Party.", - "exit_node": "The Christmas Party", - "requirements": [ - { - "quality": "Confusion", - "operator": "<=", - "value": 25 - } - ], - "delay": 100, - "delay_message": "Wait a gosh darn fucking second." - } - ], - "image": null, - "on_enter_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": 10 - } - ], - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" - }, - { - "name": "The Christmas Party", - "description": "Hold on. Last Christmas, the Research Director was incredibly hammered. He made a big mention that his brand new festivus pole was actually some kind of astrological... something something. You can't remember the whole details, because you were smashed as well. However, briefly, the RD did keep that festivus pole for awhile, he might even still have it somewhere.\nMaybe...?", - "choices": [ - { - "key": "choice 15", - "name": "Wait a minute, was that a god damn...", - "exit_node": "Rod.", - "delay": 100, - "delay_message": "Immovable Rod?" - } - ], - "image": null, - "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD/AACmAAD///+mpqYAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmejKCubOu6aCzP4WvfeD4IQ+//Pppw+MkZj6udkgdsOp/EqFSBrNqWwQ9hy+16v9ypeGM9YpnAE3hNKLTfhbG8kuTZz/j7/fmb+/8TbIJefIVNgIiJGgWMjY6PkJGRipSVlpeYmZqbnJ2en6ChoqOkpRplqDdYpqyprnpKhnyslq9leFkYg2u0QrZmaLkgu8S9JDg7Ksl2yrB7UDJw0m6QxiFfedk9wbKH1tbEW9TT05Lmjd/pJpPq7e7v8PHy8/T19vf4+fr7Kb9W/Jn8pcLiBKAcgVZwdethkAZCJAoXFmx47KEOWLMeAAlHMf+DRVXctIT70jHCxxYEhXkYKajkgpMRGZZgKY5LHJcJ6zTTNtHEm5rjgsK5WZKZs2xHn2WccY6RSwdJkaaUOOApoHDbqFK16ofmF6Fg20Aa8IhrpbBBm6plZ7aTIwhr0bWdS7eu3bt48+rdy7ev37+AAwseTLiw4cOI0/1LfPAkC8YlHINUApmD5MncVFZ+cPmK0qWbX3Z2MbVbaCqjd37eCjk1i9JaZR5OHTN2z8Gua9v2wavvaNjeKgygqbcz8KocvBLAexn4MOVb5jZfjVwk9DBW/S3bTn3E9S5cUXFvphqaCOhBs7/WGbU96PNr0EpTT96o1Kjv4ZOT/xbn/f921AWnBlhNWQXggZndFkNcZv2X1YOxsCZENXdJBWGCWp2mQRc+YLibIRpaQMyHEoVYgVfDcUFiHyYGopxQTgwFYosugsFfOXGZQyMGN+boI1E78vjjkHIF+QGRahkZxVpKNunkk1BGKeWUVFZp5ZVYZqnllogkAAA7" - }, - { - "name": "Rod.", - "description": "You cross reference your documentation. Sure enough, the \"festivus rod\" collected was actually an immovable rod.\nEnergy detected from the rod is the exact same coming off of the tree, as well. It's all making sense now. The Immovable rod is producing a kind of unique blackbody radiation that is providing sample heat and light for what is effectively an internal cold fusion process, and producing just enough of that radiation to create a kind of micro-enviromental bubble around the biosignature of the tree.\n\nThis would make the first time an immovable rod would exist in tandem with a biological source. You jot down some research notes on your findings, which could easily produce some kind of experimental tech, no doubt.", - "choices": [ - { - "key": "choice 16", - "name": "Snap a photo", - "exit_node": "Epilogue.", - "delay": 40, - "delay_message": "You could easily win an award for these findings!" - } - ], - "image": "default" - }, - { - "name": "Epilogue.", - "description": "You take a photo with the onboard camera on the drone. Suddenly, the immovable rod inside the tree explodes out of the wooden biological shell, and produces a blank, blurry photo.\nWhat the fuck?", - "choices": [ - { - "key": "choice 17", - "name": "God damnit.", - "exit_node": "WIN", - "delay": 10, - "delay_message": "Some things were just not meant for man to know." - } - ], - "image": "default" - }, - { - "name": "What is wrong with this tree?", - "description": "This is ridiculous. Nothing about this dumbass tree makes sense. It makes no sense, it's just sitting there, living and making a MOCKERY of all of science!\nYou didn't get your degree in advanced plasma-physics for this!", - "choices": [ - { - "key": "choice 18", - "name": "The world can never know about this dumbass stupid plant.", - "exit_node": "FAIL_DEATH", - "delay": 60, - "delay_message": "Activating drone self-destruct." - }, - { - "key": "choice 19", - "name": "Take a moment to calm down.", - "exit_node": "Biological Scan", - "on_selection_effects": [ - { - "effect_type": "Add", - "quality": "Confusion", - "value": { - "value_type": "random", - "low": -3, - "high": -5 - } - } - ], - "delay": 20, - "delay_message": "Breathe." - } - ], - "image": "default" - } - ] - } + "adventure_name": "There's a tree in the middle of space.", + "version": 1, + "starting_node": "Tree Start", + "starting_qualities": { + "Confusion": 0 + }, + "required_site_traits": [ + "in space" + ], + "loot_categories": [ + "research" + ], + "scan_band_mods": { + "Exotic Radiation": 10 + }, + "deep_scan_description": "", + "triggers": [ + { + "name": "Confusion Trigger", + "target_node": "What is wrong with this tree?", + "requirements": [ + { + "quality": "Confusion", + "operator": ">", + "value": 30 + } + ] + } + ], + "nodes": [ + { + "name": "Tree Start", + "description": "Camera online. Visual signs detect a fully grown, seemingly biological, and live tree located in the middle of the vacuum.\nSensors indicate it is not oxygenating, but energy is being collected via passive solar light from the nearby star.\nBaffling.", + "choices": [ + { + "key": "choice 0", + "name": "Ignore site.", + "exit_node": "FAIL", + "delay": 10, + "delay_message": "Leave this for the botanists to figure out." + }, + { + "key": "choice 1", + "name": "Begin sensor scan.", + "exit_node": "Biological Scan", + "delay": 10, + "delay_message": "Lets get some data." + } + ], + "image": null, + "raw_image": "data:image/gif;base64,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" + }, + { + "name": "Biological Scan", + "description": "You attempt to scan for clues regarding the tree's nature. It appears to be a fully mature oak tree. \n\nApproximated height is 13 ft, 6.4 inches. \n\nSubject sees no sign of an outer coating or otherwise layer protecting it from the void of space.\n\nSubject's surface temperature is 293.7 kelvin, as though it were sitting indoors.", + "choices": [ + { + "key": "choice 2", + "name": "Check Sensor Integrity.", + "exit_node": "Its Not You...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": 5 + } + ], + "delay": 50, + "delay_message": "This can't be right." + }, + { + "key": "choice 4", + "name": "Attempt to take sample.", + "exit_node": "Sample Taken", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": 3 + } + ], + "delay": 40, + "delay_message": "Snip snip." + }, + { + "key": "choice 6", + "name": "Examine Tree Roots.", + "exit_node": "Examine Roots", + "delay": 10 + }, + { + "key": "choice 9", + "name": "Sequence Sample Radiation with background noise.", + "exit_node": "Background Analysis", + "requirements": [ + { + "quality": "Sample", + "operator": ">=", + "value": 1 + } + ], + "delay": 0, + "delay_message": "This can't be real." + }, + { + "key": "choice 40", + "name": "Leave.", + "exit_node": "FAIL", + "delay": 0 + } + ], + "image": null, + "raw_image": "data:image/gif;base64,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" + }, + { + "name": "Its Not You...", + "description": "After re-connection is established, your sensors appear fine. Tree has not moved in the slightest since last observed. Temperature has fluxuated 0.2 kelvin upwards, as expected of a plant under direct light.\nLets try again.", + "choices": [ + { + "key": "choice 3", + "name": "Restart biological scan.", + "exit_node": "Biological Scan", + "delay": 25, + "delay_message": "God damnit." + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" + }, + { + "name": "Sample Taken", + "description": "You collect and project a small sample of tree bark off the plant. The instant that the bark is removed from the tree, as though it suddenly remembered what it was, the moisture content of the bark freezes over, and implodes into small microparticles of splinters.\nSmall radioactive signature detected.", + "choices": [ + { + "key": "choice 5", + "name": "Well that was... unexpected.", + "exit_node": "Biological Scan", + "delay": 0, + "delay_message": "Maybe something else might work better.", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Sample", + "value": 1 + } + ] + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAABSLiiPVjtyRS9mOTFbNyYAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+sDUQxTDbeK7vfF/3saCwcxPcCMckcqlM2pDPnnRKrUqH2IdAYDBwu+Bwl2Agm8sE8iy9Zrqbb2Z0bq3b74W8Xp+1bP+Af2KDhIVlh2eJaUtsi3CPcU43d5QDe5cFfSKBnJ2en50Ff6JboqYCBWiLq46tkK+RUJOTmJmatxyguqSovae/vsGirK2NjU21trjLQp+8wNDCwnmo1MnM2Nna29zd3t/g4eLj5OXm59o5Rjo/QOjvLaKwkrKylfdW8FleXImIBm0CxppXD4c9fAgT5tCn4Iuhh4fG/DNTjNHAi4/oKERYq/+cro8gPYXxR7EkK4EEUxbUOCVZHoabQoZ8NkqaKWI4BR7DGKcjTG4yaZaySRSatQLGfP5ciqHX0GhQpzGdSrWq1atYs2rdyrWr169gw4pVsc7G2LMLkM46SOkl2nc86W3E97aFgLh4Dc7dq6NuhC0TVVlUOY8l38N9szocREYiyYqEMdJZibjylW+AIRIiqUowyrwDJ+u1XMelsm6CNKtmHHiRZ8iuQGecVdklZpm4V3NWREznYNmhaeNRCg638eOBhrUWjPP3zshNDNuwzRW5dZrQmms3BhzSNb8SrIPCXvTudtjzMIEngVxo+ajDtKOkvt5u0Jrw3/s6yqd+Nk7/7uUn4FH+VaWfKAUmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKFRsgxy4jaBEeZOyi60J2JK1piS2ItcvDiaMIpVGMEv0GnIo46grgFbM/dKBppC004kXzo3fiGdJb51wUgiKTBnHNOzsYWkpd1xZpjrTHJnY+vQGlZOztMBUZmrO0mZo9Zwggkl/mkKc5qIy3n2nlExrnWnHROcRueYjSm55Wr+Ebmj2YeZpo4bBJqyG6Inqeon0duRF84kuJJKW98Nrkojlu2dYlHkXaq6qehNvfZqHI2+ihq4lGpKhisttpbbKNm6sN3t9Wam2q5Vtrqq5jesKk3jsI220mheuq665jJzoqqs9gGcqi0211KGLBUZYutciUZG6q3cREnlrjiPcZtTqIiAW597H5E07uuiqqehPXONIq57+6rYb81PWUTvmksuyHBTjUc1XnVmOLWjgFkG+CBNk1MsRb1kiegLxtf4KzHB4b8Qa0XA2OyfZ6QjODKywwlM8w012zzzTjnrPNWCQAAOw==" + }, + { + "name": "Examine Roots", + "description": "All plant matter has to derive energy and moisture from someplace. Examining the oak tree's roots reveals that the roots present all appear to splay out, similar to how a normal tree would. However, those roots then proceed to double back in on itself. This might suggest that the tree is obtaining nutrients from... itself.", + "choices": [ + { + "key": "choice 7", + "name": "That's fucking stupid.", + "exit_node": "Biological Scan", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": 6, + "high": 10 + } + } + ], + "delay": 0, + "delay_message": "What the hell kind of tree even IS this?" + }, + { + "key": "choice 8", + "name": "Obtain biological sample from roots.", + "exit_node": "Sample Taken", + "delay": 10, + "delay_message": "This is why we hire botanists on-site." + } + ], + "image": null, + "raw_image": "data:image/gif;base64,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" + }, + { + "name": "Background Analysis", + "description": "You compare the radioactive energy bands of the sample collected earlier with that of the nearby solar enviroment.\nNothing.\nThere is nothing nearby that matches the passive signal of the tree, or the bark, or anything similar.\nThis is really starting to get on your nerves.", + "choices": [ + { + "key": "choice 10", + "name": "Smash your desk in frustration.", + "exit_node": "FAIL", + "delay": 50, + "delay_message": "No amount of pay is worth dealing with magical plant juju." + }, + { + "key": "choice 11", + "name": "Check every known energy spectroscopy database.", + "exit_node": "Sample Match Found", + "delay": 900, + "delay_message": "You NEED an answer. You DESERVE an answer." + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": 3, + "high": 5 + } + } + ], + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD///9ZVlKsMjJpampGR0cAAAAD/xi63P4wykmFpTjrDa0XXCiOZGlqQ0qsazqIXyx9Z23feKayfP/WskgwRywqCsikcslsOpGpgGvQNDo8lYt1W4I+v2CvMhUuI0/YiZbL5nxdhkJ8Lq/T6eZ8HRmHUtuAgRp6T3B2SXdNfYeJc3CCkJEYjISVYZKRQ5gajZSdi0yboqM3nnWkqKmCpgaqrq9GBrKzs7AKaYG4tji0vbu/wCW6wZpqNMHIOAM9zDw/IzEgHcVt1KOWZQ1TU4LDV2vJOAVU2GZkY5VF4NPr4SRM53yI8/Lw9uVvBcLuknqGn4cqLQIYhwy/g0fwKdSDsCEGggtDOZwoAiLFi5sAYtwoqf/XIVjeOKrqRUukjZAmGVjDGC2lSyAts7R7GW5ZM2bPNERDGSAmzWA2b/pAc+yBT0ArVeXhsC2oj5wnefaU+pNBxDJNXUAqyq6qhKthyCUR+4QLVa5ej5AFO3ZJPGw3qE5N22DsWiUD6Tm5e/cqCbk96dZtQgZip3rjwIIa90fwqrBUDAfcQ0hyilaOIWG7zIoSYryd73DLrJntNlOIO2WVQ/raYrYKW/8CCNuJbH6S8aS7vSCpq9C8gxMMzns48dudj9/WqFw2yZKvfDc38Rxzc+kiq09f/nw7b+wNwV9HuwuwSvLeL14wjz49pm3Qds7sbd59jh1Co3CQP1+8/Rr/TgnVQnxHNVDgf0QEKCBUIRxIX3sIAiigMwzCAKF/cc1H1xQTVvjXhRCqE6IosU2Q1YkiajiViin+VhthWW0l1YhevQjjafrIKI0QLP5kI2GMBWkbG2fVx1FiP/oxRl9DEiEXCDsKhuSPazFpBg5P9miSkHmlpleXbbkVUVRRTkOakl7mRg9fsJmQ5Zl2DaDmJ4XVwZkZYHbpoU726eZCaID28RYYeRFEToQVeVaYLHIwOkugk70GqWiNIeoGQJc5qumclOU5qUGWXhraFNU1yumpdoAa6ganZkrLpJ2G5qido606CKoGwDErrqaaSlKttrIKq2r/DGvHr39aF2wIgsYaduKzqyUhhbLLjsArp3BVW0Oz3OpWlrY5dCsuKOByMS635QpyLaTEGenauZ2M5y4m696B4Lz0spLuRMnt25BH9vr7b3XUChwOwbIYfBDCBSscDMIOL0xwxO5ATPHB2kVHY7oTg7RxuR0rhyFFIYv8MUYZX5xMySoDk3LLD3dXbQIAOw==" + }, + { + "name": "Sample Match Found", + "description": "After an extensive algorithm search on the controller end, you have a single match to this specific band and style of energy.\nThe problem, is that the source of said radiation is coming not only from Space Station 13, no.\nIt's coming from the Space Station 13 Research Department.\nWhat the fuck?", + "choices": [ + { + "key": "choice 12", + "name": "Something must be wrong with the drone.", + "exit_node": "Its Not You...", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": 6, + "high": 10 + } + } + ], + "delay": 30, + "delay_message": "Lousy piece of junk must be scanning the station instead of the target." + }, + { + "key": "choice 13", + "name": "Perhaps that sample was tainted. Collect a new sample.", + "exit_node": "Sample Taken", + "delay": 60, + "delay_message": "Lets try again, but carefully." + }, + { + "key": "choice 14", + "name": "Remember the Christmas Party.", + "exit_node": "The Christmas Party", + "requirements": [ + { + "quality": "Confusion", + "operator": "<=", + "value": 25 + } + ], + "delay": 100, + "delay_message": "Wait a gosh darn fucking second." + } + ], + "image": null, + "on_enter_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": 10 + } + ], + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD////v7+/h4eEAAAAAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZBkJaJqaLKOubSy7b23fODxPOb7/m4FASBRofEBeT1W6JU3DYaRIjQqfkCWKg1xoddjSQEgQlM/mdDkc0Fa+8PiWLSIM7Pj73RxOlVF/ITlKNXSGDXp5iiFoaBlqfpFyk12HMgSYmZkfmppmmJ8gjXwUf2lglqmqq6ytrq+wsbKztLW2t7i5um2Ug669uyBCKMNRc4Q9qXHBJlVUFMbRV6pfR04ONszQzlZRlm7IveLaimZ7eJAESUsfyVnX2hfqv/Nv4vfZ8RWJ/Hkdn6NGtRsFyEg4VLwK6UvVqROdgMcWSpxIsaLFixgzatzIsf+jR1gIP7YbN6uaSAn4wFGbdNJFsZcpFRqS09IBt2kW3CkzWdNmNyIYpIWkw9Nevgbwat2ccNPbTnbWjtKQWfGnVZwzoQaNqVXXkDFWGx3qeoIry2CJzJ05p6aPTpRmfSXV1a/u2jM7TuldA8LXO6kXFemh5ihn3Lc9A9h1ZaqxpMNkK9rl5+EMKIGM9g5FSjJjv4aVOwEc/Q8iXx6ODSo5ualOQ9Bs0qVJTLu27du4c+vezbu379/AgwsfTry48ePIkytfqHp5xhfLadby+1soMJDLbhchlqIYpVbXa14dz718NMBEz/ZsWsU8zMhY1CdmL+VE+/ObgWSvPR4rj/f/xqxUFG1fVfHIUgLCN58zR5ABySpwbAAdZ1TNMgZYF9YHjWmsDAgNeglNqFSBJJYiG14JUmcYiHNZWJcE6HD4FGIrVuiFjROxJeNYChoFWUS5lBPjOTO2iM2PKuki2F1qfdPjjUjSeMuSk82Uml4fRimlLVR2OUAYBGHpo5aV4OJll1iYRkqWhag4FY75WXhmlTOoedo/ZVKI40Jz+pOEnX2ZsqcCeVJ0piEQieJhiEx0RBkrd6J2IiQFVXqPbZjEYqdmll6Jz0avtUaCqEFtaiqnekmHUagOhSZapvJMeioanXa2KqukZoCrJoruCKNmCngKZGC7urprPRKq+QZBP2XFKRGunBwL6waZjIbiBInu9hoj0o5wraRiOadrsX1kK24HvBK25rnstuvuu/DGK++89NZr77345qvvvhYlAAA7" + }, + { + "name": "The Christmas Party", + "description": "Hold on. Last Christmas, the Research Director was incredibly hammered. He made a big mention that his brand new festivus pole was actually some kind of astrological... something something. You can't remember the whole details, because you were smashed as well. However, briefly, the RD did keep that festivus pole for awhile, he might even still have it somewhere.\nMaybe...?", + "choices": [ + { + "key": "choice 15", + "name": "Wait a minute, was that a god damn...", + "exit_node": "Rod.", + "delay": 100, + "delay_message": "Immovable Rod?" + } + ], + "image": null, + "raw_image": "data:image/gif;base64,R0lGODdhyABkAHcAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJCgAAACwAAAAAyABkAMIAAAAAAAD/AACmAAD///+mpqYAAAAAAAAD/xi63P4wykmrvTjrzbv/YCiOZGmejKCubOu6aCzP4WvfeD4IQ+//Pppw+MkZj6udkgdsOp/EqFSBrNqWwQ9hy+16v9ypeGM9YpnAE3hNKLTfhbG8kuTZz/j7/fmb+/8TbIJefIVNgIiJGgWMjY6PkJGRipSVlpeYmZqbnJ2en6ChoqOkpRplqDdYpqyprnpKhnyslq9leFkYg2u0QrZmaLkgu8S9JDg7Ksl2yrB7UDJw0m6QxiFfedk9wbKH1tbEW9TT05Lmjd/pJpPq7e7v8PHy8/T19vf4+fr7Kb9W/Jn8pcLiBKAcgVZwdethkAZCJAoXFmx47KEOWLMeAAlHMf+DRVXctIT70jHCxxYEhXkYKajkgpMRGZZgKY5LHJcJ6zTTNtHEm5rjgsK5WZKZs2xHn2WccY6RSwdJkaaUOOApoHDbqFK16ofmF6Fg20Aa8IhrpbBBm6plZ7aTIwhr0bWdS7eu3bt48+rdy7ev37+AAwseTLiw4cOI0/1LfPAkC8YlHINUApmD5MncVFZ+cPmK0qWbX3Z2MbVbaCqjd37eCjk1i9JaZR5OHTN2z8Gua9v2wavvaNjeKgygqbcz8KocvBLAexn4MOVb5jZfjVwk9DBW/S3bTn3E9S5cUXFvphqaCOhBs7/WGbU96PNr0EpTT96o1Kjv4ZOT/xbn/f921AWnBlhNWQXggZndFkNcZv2X1YOxsCZENXdJBWGCWp2mQRc+YLibIRpaQMyHEoVYgVfDcUFiHyYGopxQTgwFYosugsFfOXGZQyMGN+boI1E78vjjkHIF+QGRahkZxVpKNunkk1BGKeWUVFZp5ZVYZqnllogkAAA7" + }, + { + "name": "Rod.", + "description": "You cross reference your documentation. Sure enough, the \"festivus rod\" collected was actually an immovable rod.\nEnergy detected from the rod is the exact same coming off of the tree, as well. It's all making sense now. The Immovable rod is producing a kind of unique blackbody radiation that is providing sample heat and light for what is effectively an internal cold fusion process, and producing just enough of that radiation to create a kind of micro-enviromental bubble around the biosignature of the tree.\n\nThis would make the first time an immovable rod would exist in tandem with a biological source. You jot down some research notes on your findings, which could easily produce some kind of experimental tech, no doubt.", + "choices": [ + { + "key": "choice 16", + "name": "Snap a photo", + "exit_node": "Epilogue.", + "delay": 40, + "delay_message": "You could easily win an award for these findings!" + } + ], + "image": "default" + }, + { + "name": "Epilogue.", + "description": "You take a photo with the onboard camera on the drone. Suddenly, the immovable rod inside the tree explodes out of the wooden biological shell, and produces a blank, blurry photo.\nWhat the fuck?", + "choices": [ + { + "key": "choice 17", + "name": "God damnit.", + "exit_node": "WIN", + "delay": 10, + "delay_message": "Some things were just not meant for man to know." + } + ], + "image": "default", + "on_enter_effects": [ + { + "effect_type": "Set", + "quality": "Confusion", + "value": 9999 + } + ] + }, + { + "name": "What is wrong with this tree?", + "description": "This is ridiculous. Nothing about this dumbass tree makes sense. It makes no sense, it's just sitting there, living and making a MOCKERY of all of science!\nYou didn't get your degree in advanced plasma-physics for this!", + "choices": [ + { + "key": "choice 18", + "name": "The world can never know about this dumbass stupid plant.", + "exit_node": "FAIL_DEATH", + "delay": 60, + "delay_message": "Activating drone self-destruct." + }, + { + "key": "choice 19", + "name": "Take a moment to calm down.", + "exit_node": "Biological Scan", + "on_selection_effects": [ + { + "effect_type": "Add", + "quality": "Confusion", + "value": { + "value_type": "random", + "low": -3, + "high": -5 + } + } + ], + "delay": 20, + "delay_message": "Breathe." + } + ], + "image": "default" + } + ] +} \ No newline at end of file diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index 72cf09bd81b..5c73f5755df 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -5,7 +5,7 @@ // Fuel types and travel time per unit of distance on that fuel. #define FUEL_BASIC "basic" -#define BASIC_FUEL_TIME_COST 300 +#define BASIC_FUEL_TIME_COST 250 #define FUEL_ADVANCED "advanced" #define ADVANCED_FUEL_TIME_COST 200 @@ -334,9 +334,9 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) drone_log("Sustained [amount] damage.") /obj/item/exodrone/proc/drone_log(message) - drone_log.Insert(1,message) if(length(drone_log) > EXODRONE_LOG_SIZE) - drone_log.Cut(EXODRONE_LOG_SIZE) + drone_log = list() + drone_log.Insert(1,message) /obj/item/exodrone/proc/has_tool(tool_type) return tools.Find(tool_type) @@ -354,6 +354,11 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) . = ..() GLOB.exodrone_launchers += src +/obj/machinery/exodrone_launcher/examine(user) + . = ..() + if(fuel_canister) + . += span_notice("You can remove the [fuel_canister] with a prying tool.") + /obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, params) if(istype(weapon, /obj/item/fuel_pellet)) if(fuel_canister) @@ -374,7 +379,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) if(!fuel_canister) return - to_chat(user, span_notice("You remove the [fuel_canister] from the [src].")) + to_chat(user, span_notice("You remove [fuel_canister] from [src].")) fuel_canister.forceMove(drop_location()) fuel_canister = null update_icon() diff --git a/code/modules/explorer_drone/scanner_array.dm b/code/modules/explorer_drone/scanner_array.dm index e5b5f7a026c..7f019b0d43c 100644 --- a/code/modules/explorer_drone/scanner_array.dm +++ b/code/modules/explorer_drone/scanner_array.dm @@ -14,9 +14,9 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) #define MAX_SCAN_DISTANCE 10 -#define WIDE_SCAN_COST(BAND, SCAN_POWER) (((BAND*BAND)/(SCAN_POWER))*2*60*10) -#define BASE_POINT_SCAN_TIME (5 MINUTES) -#define BASE_DEEP_SCAN_TIME (5 MINUTES) +#define WIDE_SCAN_COST(BAND, SCAN_POWER) (min(((BAND*BAND)/(SCAN_POWER))*2*60*10, 10 MINUTES)) +#define BASE_POINT_SCAN_TIME (2 MINUTES) +#define BASE_DEEP_SCAN_TIME (3 MINUTES) /// Represents scan in progress, only one globally for now, todo later split per z or allow partial dish swarm usage /datum/exoscan @@ -35,7 +35,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) var/scan_time = 0 switch(scan_type) if(EXOSCAN_WIDE) - scan_power = length(GLOB.exoscanner_controller.tracked_dishes) + scan_power = GLOB.exoscanner_controller.calculate_scan_power() scan_time = WIDE_SCAN_COST(GLOB.exoscanner_controller.wide_scan_band,scan_power) if(EXOSCAN_POINT) scan_power = GLOB.exoscanner_controller.get_scan_power(target) @@ -76,7 +76,8 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) deltimer(scan_timer) /obj/machinery/computer/exoscanner_control - name = "Scanner Array Control Console" + name = "scanner array control console" + desc = "Controls scanner arrays to initiate scans for exodrones." circuit = /obj/item/circuitboard/computer/exoscanner_console /// If scan was interrupted show a popup until dismissed. var/failed_popup = FALSE @@ -105,7 +106,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) condition_descriptions += condition.description .["scan_conditions"] = condition_descriptions else - .["scan_power"] = scan_power = length(GLOB.exoscanner_controller.tracked_dishes) + .["scan_power"] = scan_power = GLOB.exoscanner_controller.calculate_scan_power() .["wide_scan_eta"] = scan_power > 0 ? WIDE_SCAN_COST(GLOB.exoscanner_controller.wide_scan_band,scan_power) : 0 .["possible_sites"] = build_exploration_site_ui_data() .["scan_conditions"] = null @@ -196,11 +197,35 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) icon = 'icons/obj/exploration.dmi' icon_state = "scanner_off" desc = "A sophisticated scanning array. Easily influenced by its environment." + circuit = /obj/item/circuitboard/machine/exoscanner + ///the scan power of this array to supply to scanner_controller + var/scan_power = 1 /obj/machinery/exoscanner/Initialize(mapload) . = ..() RegisterSignals(GLOB.exoscanner_controller,list(COMSIG_EXOSCAN_STARTED,COMSIG_EXOSCAN_FINISHED), PROC_REF(scan_change)) update_readiness() + RefreshParts() + +/obj/machinery/exoscanner/RefreshParts() + . = ..() + var/power = 1 + + for(var/datum/stock_part/scanning_module/scanning_module in component_parts) + power += (scanning_module.tier - 1) / 12 + scan_power = power + GLOB.exoscanner_controller.update_scan_power() + +/obj/machinery/exoscanner/screwdriver_act(mob/user, obj/item/tool) + . = ..() + if(!.) + . = default_deconstruction_screwdriver(user, "scanner_open", "scanner_off", tool) + update_readiness() + +/obj/machinery/exoscanner/crowbar_act(mob/user, obj/item/tool) + ..() + if(default_deconstruction_crowbar(tool)) + return TRUE /obj/machinery/exoscanner/proc/scan_change() SIGNAL_HANDLER @@ -215,7 +240,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) GLOB.exoscanner_controller.deactivate_scanner(src) /obj/machinery/exoscanner/proc/is_ready() - return anchored && is_operational + return anchored && is_operational && !panel_open /obj/machinery/exoscanner/proc/update_readiness() if(is_ready()) @@ -302,7 +327,7 @@ GLOBAL_LIST_INIT(scan_conditions,init_scan_conditions()) /datum/scanner_controller/proc/calculate_scan_power(conditions) . = 0 for(var/obj/machinery/exoscanner/dish in tracked_dishes) - var/effective_power = 1 + var/effective_power = dish.scan_power for(var/datum/scan_condition/condition in conditions) effective_power *= condition.check_dish(dish) if(!effective_power) //Don't bother continuing if it's zero diff --git a/icons/obj/exploration.dmi b/icons/obj/exploration.dmi index 2f9d004bee2c398860ea376e13058c25ada4bf33..b7224d2df84d91a5603270b9f00b638615c19282 100644 GIT binary patch literal 7575 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 P3Ou;4r}0_MF8cofsC(2? literal 6926 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 From d47274292d272fbd95218a804fa826b7c3586fc2 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:38:19 +0200 Subject: [PATCH 046/101] Fixes a runtime in seed extractor when seeds do not have a product [MDB IGNORE] (#23954) * Fixes a runtime in seed extractor when seeds do not have a product * Fixing diffs --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/modules/hydroponics/grown/replicapod.dm | 2 +- code/modules/hydroponics/seed_extractor.dm | 102 ++++++++++--------- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 8e5dda5a7fa..c1fd02bf9f0 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -37,7 +37,7 @@ plant_icon_offset = 2 species = "replicapod" plantname = "Replica Pod" - product = /mob/living/carbon/human //verrry special -- Urist + product = null // the human mob is spawned in harvest() lifespan = 50 endurance = 8 maturation = 10 diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index a3804c9262f..04b0edf44bb 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -13,46 +13,33 @@ * * user - checks if we can remove the object from the inventory * * */ -/proc/seedify(obj/item/O, t_max, obj/machinery/seed_extractor/extractor, mob/living/user) - var/t_amount = 0 +/proc/seedify(obj/item/object, t_max, obj/machinery/seed_extractor/extractor, mob/living/user) + //try to get the seed from this item + var/obj/item/seeds/seed = object.get_plant_seed() + if(isnull(seed)) + return null + + //generate a random multiplier if value is not specified var/list/seeds = list() if(t_max == -1) if(extractor) t_max = rand(1,4) * extractor.seed_multiplier else t_max = rand(1,4) - - var/seedloc = O.loc + //drop location for the newly generated seeds + var/seedloc = object.loc if(extractor) seedloc = extractor.loc - if(istype(O, /obj/item/food/grown/)) - var/obj/item/food/grown/F = O - if(F.seed) - if(user && !user.temporarilyRemoveItemFromInventory(O)) //couldn't drop the item - return - while(t_amount < t_max) - var/obj/item/seeds/t_prod = F.seed.Copy() - seeds.Add(t_prod) - t_prod.forceMove(seedloc) - t_amount++ - qdel(O) - return seeds - - else if(istype(O, /obj/item/grown)) - var/obj/item/grown/F = O - if(F.seed) - if(user && !user.temporarilyRemoveItemFromInventory(O)) - return - while(t_amount < t_max) - var/obj/item/seeds/t_prod = F.seed.Copy() - t_prod.forceMove(seedloc) - t_amount++ - qdel(O) - return 1 - - return 0 - + //multiply the seeds and delete the item + if(user && !user.temporarilyRemoveItemFromInventory(object)) //couldn't drop the item + return null + for(var/_ in 0 to t_max) + var/obj/item/seeds/t_prod = seed.Copy() + seeds.Add(t_prod) + t_prod.forceMove(seedloc) + qdel(object) + return seeds /obj/machinery/seed_extractor name = "seed extractor" @@ -80,6 +67,7 @@ if(held_item?.get_plant_seed()) context[SCREENTIP_CONTEXT_LMB] = "Make seeds" + context[SCREENTIP_CONTEXT_RMB] = "Make & Store seeds" return CONTEXTUAL_SCREENTIP_SET if(istype(held_item, /obj/item/storage/bag/plants) && (locate(/obj/item/seeds) in held_item.contents)) @@ -135,7 +123,17 @@ return TRUE - if(seedify(attacking_item, -1, src, user)) + var/list/generated_seeds = seedify(attacking_item, -1, src, user) + if(!isnull(generated_seeds)) + if(LAZYACCESS(params2list(params), RIGHT_CLICK)) + //find all seeds lying on the turf and add them to the machine + for(var/obj/item/seeds/seed as anything in generated_seeds) + //machine is full + if(contents.len >= max_seeds) + to_chat(user, span_warning("[src] is full.")) + break + //add seed to machine. second argument is null which means just force move into the machine + add_seed(seed) to_chat(user, span_notice("You extract some seeds.")) return TRUE @@ -176,23 +174,16 @@ * needed to go to the ui handler * * to_add - what seed are we adding? - * taking_from - where are we taking the seed from? A mob, a bag, etc? - * user - who is inserting the seed? + * taking_from - where are we taking the seed from? A mob, a bag, etc? If null its means its just laying on the turf so force move it in **/ /obj/machinery/seed_extractor/proc/add_seed(obj/item/seeds/to_add, atom/taking_from) - if(ismob(taking_from)) - var/mob/mob_loc = taking_from - if(!mob_loc.transferItemToLoc(to_add, src)) - return FALSE - - else if(!taking_from.atom_storage?.attempt_remove(to_add, src, silent = TRUE)) - return FALSE - var/seed_id = generate_seed_hash(to_add) + var/list/seed_data + var/has_seed_data // so we remember to add a seed obj weakref to piles[seed_id] at the end of the proc. That way if some reason we runtime in this proc it won't incorrectly add data to the list if(piles[seed_id]) - piles[seed_id]["refs"] += WEAKREF(to_add) + has_seed_data = TRUE else - var/list/seed_data = list() + seed_data = list() seed_data["icon"] = sanitize_css_class_name("[initial(to_add.icon)][initial(to_add.icon_state)]") seed_data["name"] = capitalize(replacetext(to_add.name,"pack of ", "")); seed_data["lifespan"] = to_add.lifespan @@ -216,8 +207,8 @@ seed_data["mutatelist"] = list() for(var/obj/item/seeds/mutant as anything in to_add.mutatelist) seed_data["mutatelist"] += initial(mutant.plantname) - var/obj/item/food/grown/product = new to_add.product - if(product) + if(to_add.product) + var/obj/item/food/grown/product = new to_add.product var/datum/reagent/product_distill_reagent = product.distill_reagent seed_data["distill_reagent"] = initial(product_distill_reagent.name) var/datum/reagent/product_juice_typepath = product.juice_typepath @@ -225,8 +216,25 @@ seed_data["grind_results"] = list() for(var/datum/reagent/reagent as anything in product.grind_results) seed_data["grind_results"] += initial(reagent.name) - qdel(product) + qdel(product) + + if(!isnull(taking_from)) + if(ismob(taking_from)) + var/mob/mob_loc = taking_from + if(!mob_loc.transferItemToLoc(to_add, src)) + return FALSE + + else if(!taking_from.atom_storage?.attempt_remove(to_add, src, silent = TRUE)) + return FALSE + else + to_add.forceMove(src) + + // do this at the end, in case any of the previous steps failed + if(has_seed_data) + piles[seed_id]["refs"] += WEAKREF(to_add) + else piles[seed_id] = seed_data + return TRUE /obj/machinery/seed_extractor/ui_state(mob/user) From c8792396edb22d5497ad74f0117924917e187c63 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 27 Sep 2023 20:22:57 +0200 Subject: [PATCH 047/101] Fix altars not allowing items to be sacrificed [MDB IGNORE] (#23957) * Fix altars not allowing items to be sacrificed (#78542) ## About The Pull Request Fixes #78529 Caused by #78429 They forgot to include the `!` operator when doing an early return for sacrificial items. Also cleaned up a little bit of the code. ## Why It's Good For The Game Chaplains can now perform their holy duties properly. ## Changelog :cl: fix: Fix altars not allowing items to be sacrificed /:cl: * Fix altars not allowing items to be sacrificed --------- Co-authored-by: Tim --- code/datums/components/religious_tool.dm | 4 +-- code/modules/religion/religion_sects.dm | 31 ++++++++++++------------ 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index e64e28f83a3..4c0646b3a55 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -74,9 +74,9 @@ /**********Sacrificing**********/ else if(operation_flags & RELIGION_TOOL_SACRIFICE) - if(easy_access_sect?.can_sacrifice(the_item,user)) + if(!easy_access_sect?.can_sacrifice(the_item, user)) return - easy_access_sect.on_sacrifice(the_item,user) + easy_access_sect.on_sacrifice(the_item, user) return COMPONENT_NO_AFTERATTACK /datum/component/religious_tool/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index a322303b00d..9075a656ae9 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -55,8 +55,8 @@ /// Activates once selected and on newjoins, oriented around people who become holy. /datum/religion_sect/proc/on_conversion(mob/living/chap) SHOULD_CALL_PARENT(TRUE) - to_chat(chap, "\"[quote]\"") - to_chat(chap, "[desc]") + to_chat(chap, span_boldnotice("\"[quote]\"")) + to_chat(chap, span_notice("[desc]")) /// Activates if religious sect is reset by admins, should clean up anything you added on conversion. /datum/religion_sect/proc/on_deconversion(mob/living/chap) @@ -66,17 +66,17 @@ to_chat(chap, span_notice("Return to an altar to reform your sect.")) /// Returns TRUE if the item can be sacrificed. Can be modified to fit item being tested as well as person offering. Returning TRUE will stop the attackby sequence and proceed to on_sacrifice. -/datum/religion_sect/proc/can_sacrifice(obj/item/I, mob/living/chap) +/datum/religion_sect/proc/can_sacrifice(obj/item/sacrifice, mob/living/chap) . = TRUE if(chap.mind.holy_role == HOLY_ROLE_DEACON) to_chat(chap, "You are merely a deacon of [GLOB.deity], and therefore cannot perform rites.") return - if(!is_type_in_typecache(I,desired_items_typecache)) + if(!is_type_in_typecache(sacrifice, desired_items_typecache)) return FALSE /// Activates when the sect sacrifices an item. This proc has NO bearing on the attackby sequence of other objects when used in conjunction with the religious_tool component. -/datum/religion_sect/proc/on_sacrifice(obj/item/I, mob/living/chap) - return adjust_favor(default_item_favor,chap) +/datum/religion_sect/proc/on_sacrifice(obj/item/sacrifice, mob/living/chap) + return adjust_favor(default_item_favor, chap) /// Returns a description for religious tools /datum/religion_sect/proc/tool_examine(mob/living/holy_creature) @@ -89,7 +89,7 @@ . = favor //if favor = 5 and we want to subtract 10, we'll only be able to subtract 5 if((favor + amount > max_favor)) . = (max_favor-favor) //if favor = 5 and we want to add 10 with a max of 10, we'll only be able to add 5 - favor = clamp(0,max_favor, favor+amount) + favor = clamp(0, max_favor, favor+amount) /// Sets favor to a specific amount. Can provide optional features based on a user. /datum/religion_sect/proc/set_favor(amount = 0, mob/living/chap) @@ -190,16 +190,17 @@ blessed.add_mood_event("blessing", /datum/mood_event/blessing) return TRUE -/datum/religion_sect/mechanical/on_sacrifice(obj/item/I, mob/living/chap) - var/obj/item/stock_parts/cell/the_cell = I - if(!istype(the_cell)) //how... +/datum/religion_sect/mechanical/on_sacrifice(obj/item/stock_parts/cell/power_cell, mob/living/chap) + if(!istype(power_cell)) return - if(the_cell.charge < 300) - to_chat(chap,span_notice("[GLOB.deity] does not accept pity amounts of power.")) + + if(power_cell.charge < 300) + to_chat(chap, span_notice("[GLOB.deity] does not accept pity amounts of power.")) return - adjust_favor(round(the_cell.charge/300), chap) - to_chat(chap, span_notice("You offer [the_cell]'s power to [GLOB.deity], pleasing them.")) - qdel(I) + + adjust_favor(round(power_cell.charge/300), chap) + to_chat(chap, span_notice("You offer [power_cell]'s power to [GLOB.deity], pleasing them.")) + qdel(power_cell) return TRUE /**** Pyre God ****/ From bf6714d3d2b696f65609f112b7bee4362cb60748 Mon Sep 17 00:00:00 2001 From: Pinta <68373373+softcerv@users.noreply.github.com> Date: Wed, 27 Sep 2023 16:45:15 -0400 Subject: [PATCH 048/101] Wiki-Book NIFSoft (#23648) * NIFSoft * carving prevention * Update book_summoner.dm * Update book_summoner.dm * Update book_summoner.dm * Update modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update book_summoner.dm --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/~skyrat_defines/nifsofts.dm | 1 + .../modular_implants/code/nifsoft_catalog.dm | 1 + .../code/nifsofts/book_summoner.dm | 36 +++++++++++++++++++ .../code/nifsofts/prop_summoner.dm | 8 +++++ tgstation.dme | 1 + 5 files changed, 47 insertions(+) create mode 100644 modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm diff --git a/code/__DEFINES/~skyrat_defines/nifsofts.dm b/code/__DEFINES/~skyrat_defines/nifsofts.dm index ebf138343c0..f3852414f60 100644 --- a/code/__DEFINES/~skyrat_defines/nifsofts.dm +++ b/code/__DEFINES/~skyrat_defines/nifsofts.dm @@ -4,3 +4,4 @@ #define NIFSOFT_CATEGORY_COSMETIC "Cosmetic" #define NIFSOFT_CATEGORY_UTILITY "Utility" #define NIFSOFT_CATEGORY_FUN "Fun" +#define NIFSOFT_CATEGORY_INFORMATION "Information" diff --git a/modular_skyrat/modules/modular_implants/code/nifsoft_catalog.dm b/modular_skyrat/modules/modular_implants/code/nifsoft_catalog.dm index aac352bab4c..6319fa60d9f 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsoft_catalog.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsoft_catalog.dm @@ -5,6 +5,7 @@ GLOBAL_LIST_INIT(purchasable_nifsofts, list( /datum/nifsoft/summoner/dorms, /datum/nifsoft/soul_poem, /datum/nifsoft/soulcatcher, + /datum/nifsoft/summoner/book, )) /datum/computer_file/program/nifsoft_downloader diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm new file mode 100644 index 00000000000..954a56e9ff9 --- /dev/null +++ b/modular_skyrat/modules/modular_implants/code/nifsofts/book_summoner.dm @@ -0,0 +1,36 @@ +/obj/item/disk/nifsoft_uploader/summoner/book + name = "Grimoire Akasha" + loaded_nifsoft = /datum/nifsoft/summoner/book + +/datum/nifsoft/summoner/book + name = "Grimoire Akasha" + program_desc = "Grimoire Akasha is a fork of the Grimoire Caeruleam NIFSoft that is designed around giving the user access to various educational hardlight books. \ + Due to its educational nature and miniscule size, Grimoire Akasha is typically provided for free at most NIFSoft marketplaces." + summonable_items = list() + purchase_price = 0 // This is a tool intended to help out newer players. + max_summoned_items = 2 + buying_category = NIFSOFT_CATEGORY_INFORMATION + ui_icon = "book" + +/datum/nifsoft/summoner/book/New() + . = ..() + summonable_items += subtypesof(/obj/item/book/manual/wiki) //That's right! all of the manual books! + +/datum/nifsoft/summoner/book/apply_custom_properties(obj/item/book/generated_book) + if(!istype(generated_book)) + return FALSE + + generated_book.cannot_carve = TRUE + return TRUE + +// Need this code here so that we don't have people carving out the summoned books +/obj/item/book + /// Is the parent book unable to be carved? TRUE prevents carving. By default this is unset + var/cannot_carve + +/obj/item/book/try_carve(obj/item/carving_item, mob/living/user, params) + if(cannot_carve) + balloon_alert(user, "unable to be carved!") + return FALSE + + return ..() diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/prop_summoner.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/prop_summoner.dm index 5cd8a0443cb..c7e93412ac2 100644 --- a/modular_skyrat/modules/modular_implants/code/nifsofts/prop_summoner.dm +++ b/modular_skyrat/modules/modular_implants/code/nifsofts/prop_summoner.dm @@ -88,9 +88,17 @@ refund_activation_cost() return FALSE + apply_custom_properties(new_item) summoned_items += new_item new_item.AddComponent(/datum/component/summoned_item, holographic_filter) +/// This proc is called while an item is being summoned, use this to modifiy aspects of the item that aren't modified by the component. +/datum/nifsoft/summoner/proc/apply_custom_properties(obj/item/target_item) + if(!target_item) + return FALSE + + return TRUE + /datum/nifsoft/summoner/Destroy() QDEL_LIST(summoned_items) return ..() diff --git a/tgstation.dme b/tgstation.dme index 44657970ff0..db3b42599ea 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7088,6 +7088,7 @@ #include "modular_skyrat\modules\modular_implants\code\nifs_tgui.dm" #include "modular_skyrat\modules\modular_implants\code\nifsoft_catalog.dm" #include "modular_skyrat\modules\modular_implants\code\nifsofts.dm" +#include "modular_skyrat\modules\modular_implants\code\nifsofts\book_summoner.dm" #include "modular_skyrat\modules\modular_implants\code\nifsofts\dorms.dm" #include "modular_skyrat\modules\modular_implants\code\nifsofts\hivemind.dm" #include "modular_skyrat\modules\modular_implants\code\nifsofts\huds.dm" From 103e906f633463be28cded6755c00be87beb3da8 Mon Sep 17 00:00:00 2001 From: Pinta <68373373+softcerv@users.noreply.github.com> Date: Wed, 27 Sep 2023 18:03:58 -0400 Subject: [PATCH 049/101] Allows for the speech impairment on the adult gas mask to be toggled. (#23930) * Update bdsm_mask.dm * Apply suggestions from code review Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../code/lewd_clothing/bdsm_mask.dm | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm index 81cd35398b0..6a8f8a37c58 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_clothing/bdsm_mask.dm @@ -27,11 +27,14 @@ actions_types = list( /datum/action/item_action/toggle_breathcontrol, /datum/action/item_action/mask_inhale, + /datum/action/item_action/toggle_gag, ) var/list/moans = list("Mmmph...", "Hmmphh", "Mmmfhg", "Gmmmh...") // Phrases to be said when the player attempts to talk when speech modification / voicebox is enabled. var/list/moans_alt = list("Mhgm...", "Hmmmp!...", "Gmmmhp!") // Power probability phrases to be said when talking. var/moans_alt_probability = 5 // Probability for alternative sounds to play. var/temp_check = TRUE //Used to check if user unconsious to prevent choking him until he wakes up + /// Does the gasmask impede the user's ability to talk? + var/speech_disabled w_class = WEIGHT_CLASS_SMALL modifies_speech = TRUE flags_cover = MASKCOVERSMOUTH @@ -53,6 +56,9 @@ update_icon() /obj/item/clothing/mask/gas/bdsm_mask/handle_speech(datum/source, list/speech_args) + if(speech_disabled) + return + speech_args[SPEECH_MESSAGE] = pick((prob(moans_alt_probability) && LAZYLEN(moans_alt)) ? moans_alt : moans) play_lewd_sound(loc, pick('modular_skyrat/modules/modular_items/lewd_items/sounds/under_moan_f1.ogg', 'modular_skyrat/modules/modular_items/lewd_items/sounds/under_moan_f2.ogg', @@ -164,6 +170,15 @@ if(istype(mask)) mask.check() +/datum/action/item_action/toggle_gag + name = "Toggle gag" + desc = "Toggles whether or not the wearer is able to speak." + +/datum/action/item_action/toggle_gag/Trigger(trigger_flags) + var/obj/item/clothing/mask/gas/bdsm_mask/mask = target + if(istype(mask)) + mask.check_gag() + /datum/action/item_action/mask_inhale name = "Inhale oxygen" desc = "You must inhale oxygen!" @@ -236,6 +251,19 @@ else STOP_PROCESSING(SSobj, src) +/obj/item/clothing/mask/gas/bdsm_mask/proc/check_gag(user) + var/mob/living/carbon/affected_carbon = user + if(src == affected_carbon.wear_mask) + to_chat(user, span_notice("You can't reach the gag switch!")) + else + toggle_gag(affected_carbon) + +/obj/item/clothing/mask/gas/bdsm_mask/proc/toggle_gag(user) + speech_disabled = !speech_disabled + to_chat(user, span_notice("You [speech_disabled ? "disable" : "enable"] the gag on the mask.")) + update_mob_action_buttonss() + update_icon() + // Mask choke processor /obj/item/clothing/mask/gas/bdsm_mask/process(seconds_per_tick) var/mob/living/affected_mob = loc From fa579ac03800a4f1178812509de9ab15c3dee259 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:19:23 +0200 Subject: [PATCH 050/101] Converts slapcrafting into a component [MDB IGNORE] (#23955) * Converts slapcrafting into a component * Update color.dm --------- Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 +- _maps/map_files/NorthStar/north_star.dmm | 2 +- code/datums/components/crafting/_recipes.dm | 2 +- .../datums/components/crafting/guncrafting.dm | 33 ++- .../components/crafting/slapcrafting.dm | 202 ++++++++++++++++++ code/datums/martial/boxing.dm | 9 + code/game/objects/items/crayons.dm | 9 + code/game/objects/items/devices/flashlight.dm | 7 + .../game/objects/items/devices/radio/radio.dm | 7 + .../items/devices/scanners/gas_analyzer.dm | 9 + code/game/objects/items/extinguisher.dm | 9 + code/game/objects/items/flamethrower.dm | 6 + code/game/objects/items/handcuffs.dm | 41 +--- code/game/objects/items/shields.dm | 9 + code/game/objects/items/spear.dm | 27 +++ code/game/objects/items/stacks/rods.dm | 7 + .../items/stacks/sheets/sheet_types.dm | 18 ++ code/game/objects/items/storage/backpack.dm | 6 + code/game/objects/items/weaponry.dm | 63 ------ code/modules/clothing/glasses/_glasses.dm | 20 ++ code/modules/clothing/glasses/hud.dm | 27 +++ code/modules/clothing/gloves/color.dm | 19 ++ .../projectiles/guns/energy/energy_gun.dm | 12 ++ .../guns/energy/kinetic_accelerator.dm | 13 ++ code/modules/projectiles/guns/energy/laser.dm | 12 ++ .../reagent_containers/cups/glassbottle.dm | 6 + .../reagents/reagent_containers/cups/soda.dm | 6 + code/modules/surgery/tools.dm | 6 + tgstation.dme | 1 + 29 files changed, 489 insertions(+), 101 deletions(-) create mode 100644 code/datums/components/crafting/slapcrafting.dm diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index f3ff89fcc80..c878583b372 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -31736,7 +31736,7 @@ "jRB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table_frame, -/obj/item/wirerod, +/obj/item/melee/baton/security/cattleprod, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index d9fff1d8af0..fa4a7f9132a 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -13156,7 +13156,7 @@ /area/station/maintenance/floor3/port/fore) "dss" = ( /obj/effect/mapping_helpers/broken_floor, -/obj/item/wirerod, +/obj/item/melee/baton/security/cattleprod, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) "dsv" = ( diff --git a/code/datums/components/crafting/_recipes.dm b/code/datums/components/crafting/_recipes.dm index 246f04df0f5..4254804974e 100644 --- a/code/datums/components/crafting/_recipes.dm +++ b/code/datums/components/crafting/_recipes.dm @@ -17,7 +17,7 @@ var/list/tool_paths ///time in seconds. Remember to use the SECONDS define! var/time = 3 SECONDS - ///type paths of items that will be placed in the result + ///type paths of items that will be forceMoved() into the result, or added to the reagents of it var/list/parts = list() ///like tool_behaviors but for reagents var/list/chem_catalysts = list() diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index f239288b031..a5a20d4326b 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -2,12 +2,27 @@ // PARTS // +/obj/item/weaponcrafting/Initialize(mapload) + . = ..() + create_slapcraft_component() + +/obj/item/weaponcrafting/proc/create_slapcraft_component() + return + /obj/item/weaponcrafting/receiver name = "modular receiver" desc = "A prototype modular receiver and trigger assembly for a firearm." icon = 'icons/obj/weapons/improvised.dmi' icon_state = "receiver" +/obj/item/weaponcrafting/receiver/create_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/pipegun) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." @@ -16,17 +31,33 @@ icon = 'icons/obj/weapons/improvised.dmi' icon_state = "riflestock" +/obj/item/weaponcrafting/stock/create_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/smoothbore_disabler, /datum/crafting_recipe/laser_musket) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/weaponcrafting/giant_wrench name = "Big Slappy parts kit" desc = "Illegal parts to make a giant like wrench commonly known as a Big Slappy." icon = 'icons/obj/weapons/improvised.dmi' icon_state = "weaponkit_gw" +/obj/item/weaponcrafting/giant_wrench/create_slapcraft_component() // slappycraft + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/giant_wrench) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + ///These gun kits are printed from the security protolathe to then be used in making new weapons // GUN PART KIT // -/obj/item/weaponcrafting/gunkit +/obj/item/weaponcrafting/gunkit // These don't get a slapcraft component, it's added to the gun - more intuitive player-facing to slap the kit onto the gun. name = "generic gun parts kit" desc = "It's an empty gun parts container! Why do you have this?" icon = 'icons/obj/weapons/improvised.dmi' diff --git a/code/datums/components/crafting/slapcrafting.dm b/code/datums/components/crafting/slapcrafting.dm new file mode 100644 index 00000000000..32a901dc73e --- /dev/null +++ b/code/datums/components/crafting/slapcrafting.dm @@ -0,0 +1,202 @@ +/// Slapcrafting component! +/datum/component/slapcrafting + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/list/slapcraft_recipes = list() + +/** + * Slapcraft component + * + * Slap it onto a item to be able to slapcraft with it + * + * args: + * * slapcraft_recipes (required) = The recipe to attempt crafting. + * Hit it with an ingredient of the recipe to attempt crafting. + * It will check the area near the user for the rest of the ingredients and tools. + * * +**/ +/datum/component/slapcrafting/Initialize( + slapcraft_recipes = null, + ) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + var/obj/item/parent_item = parent + + if((parent_item.item_flags & ABSTRACT) || (parent_item.item_flags & DROPDEL)) + return COMPONENT_NOTRANSFER + + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info)) + RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handler)) + + src.slapcraft_recipes += slapcraft_recipes + +/datum/component/slapcrafting/InheritComponent(datum/component/slapcrafting/new_comp, original, slapcraft_recipes) + if(!original) + return + src.slapcraft_recipes += slapcraft_recipes + +/datum/component/slapcrafting/Destroy(force, silent) + UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE)) + return ..() + +/datum/component/slapcrafting/proc/attempt_slapcraft(obj/item/parent_item, obj/item/slapper, mob/user) + + if(isnull(slapcraft_recipes)) + CRASH("NULL SLAPCRAFT RECIPES?") + + var/datum/component/personal_crafting/craft_sheet = user.GetComponent(/datum/component/personal_crafting) + if(!craft_sheet) + CRASH("No craft sheet on user ??") + + var/list/valid_recipes + for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) + // Gotta instance it to copy the list over. + recipe = new recipe() + var/list/type_ingredient_list = recipe.reqs + qdel(recipe) + if(length(type_ingredient_list) == 1) // No ingredients besides itself? We use one of the tools then + type_ingredient_list = recipe.tool_paths + // Check the tool behaviours differently as they aren't types + for(var/behaviour in initial(recipe.tool_behaviors)) + if(slapper.tool_behaviour == behaviour) + LAZYADD(valid_recipes, recipe) + break + if(is_type_in_list(slapper, type_ingredient_list)) + LAZYADD(valid_recipes, recipe) + + if(!valid_recipes) + return + + // We might use radials so we need to split the proc chain + INVOKE_ASYNC(src, PROC_REF(slapcraft_async), valid_recipes, user, craft_sheet) + +/datum/component/slapcrafting/proc/slapcraft_async(list/valid_recipes, mob/user, datum/component/personal_crafting/craft_sheet) + + var/list/recipe_choices = list() + + var/list/result_to_recipe = list() + + var/final_recipe = valid_recipes[1] + var/string_chosen_recipe + if(length(valid_recipes) > 1) + for(var/datum/crafting_recipe/recipe as anything in valid_recipes) + var/atom/recipe_result = initial(recipe.result) + result_to_recipe[initial(recipe_result.name)] = recipe + recipe_choices += list("[initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state))) + + if(!recipe_choices) + CRASH("No recipe choices despite validating in earlier proc") + + string_chosen_recipe = show_radial_menu(user, parent, recipe_choices, require_near = TRUE) + if(isnull(string_chosen_recipe)) + return // they closed the thing + + if(string_chosen_recipe) + final_recipe = result_to_recipe[string_chosen_recipe] + + + var/datum/crafting_recipe/actual_recipe = final_recipe + + if(istype(actual_recipe, /datum/crafting_recipe/food)) + actual_recipe = locate(final_recipe) in GLOB.cooking_recipes + else + actual_recipe = locate(final_recipe) in GLOB.crafting_recipes + + if(!actual_recipe) + CRASH("Recipe not located in cooking or crafting recipes: [final_recipe]") + + var/atom/final_result = initial(actual_recipe.result) + + to_chat(user, span_notice("You start crafting \a [initial(final_result.name)]...")) + + var/error_string = craft_sheet.construct_item(user, actual_recipe) + + if(!isatom(error_string)) + to_chat(user, span_warning("crafting failed" + error_string)) + +/// Alerts any examiners to the recipe, if they wish to know more. +/datum/component/slapcrafting/proc/get_examine_info(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + var/list/string_results = list() + // This list saves the recipe result names we've already used to cross-check other recipes so we don't have ', a spear, or a spear!' in the desc. + var/list/already_used_names + for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) + // Identical name to a previous recipe's result? Skip in description. + var/atom/result = initial(recipe.result) + if(locate(initial(result.name)) in already_used_names) + continue + already_used_names += initial(result.name) + string_results += list("\a [initial(result.name)]") + + examine_list += span_notice("You think [parent] could be used to make [english_list(string_results)]! Examine again to look at the details...") + +/// Alerts any examiners to the details of the recipe. +/datum/component/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) + var/atom/result = initial(recipe.result) + examine_list += "See Recipe For [initial(result.name)]" + +/datum/component/slapcrafting/proc/topic_handler(atom/source, user, href_list) + SIGNAL_HANDLER + + if(!href_list["check_recipe"]) + return + + var/datum/crafting_recipe/cur_recipe = locate(href_list["check_recipe"]) in slapcraft_recipes + + if(isnull(cur_recipe)) + CRASH("null recipe!") + + var/atom/result = initial(cur_recipe.result) + + to_chat(user, span_notice("You could craft \a [initial(result.name)] by applying one of these items to it!")) + + // Gotta instance it to copy the lists over. + cur_recipe = new cur_recipe() + var/list/type_ingredient_list = cur_recipe.reqs + + // Final return string. + var/string_ingredient_list = "" + + // Check the ingredients of the crafting recipe. + for(var/valid_type in type_ingredient_list) + // Check if they're datums, specifically reagents. + var/datum/reagent/reagent_ingredient = valid_type + if(istype(reagent_ingredient)) + var/amount = initial(cur_recipe.reqs[reagent_ingredient]) + string_ingredient_list += "[amount] unit[amount > 1 ? "s" : ""] of [initial(reagent_ingredient.name)]\n" + + // Redundant! + if(parent.type == valid_type) + continue + var/atom/ingredient = valid_type + var/amount = initial(cur_recipe.reqs[ingredient]) + string_ingredient_list += "[amount > 1 ? ("[amount]" + " of") : "a"] [initial(ingredient.name)]\n" + + // If we did find ingredients then add them onto the list. + if(length(string_ingredient_list)) + to_chat(user, span_boldnotice("Ingredients:")) + to_chat(user, examine_block(span_notice(string_ingredient_list))) + + var/list/tool_list = "" + + // Paste the required tools. + for(var/valid_type in cur_recipe.tool_paths) + var/atom/tool = valid_type + tool_list += "\a [initial(tool.name)]\n" + + for(var/string in cur_recipe.tool_behaviors) + tool_list += "\a [string]\n" + + if(length(tool_list)) + to_chat(user, span_boldnotice("Required Tools:")) + to_chat(user, examine_block(span_notice(tool_list))) + + qdel(cur_recipe) + diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 720bda243b9..9ba1a53d40c 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -67,6 +67,15 @@ /obj/item/clothing/gloves/boxing var/datum/martial_art/boxing/style = new +/obj/item/clothing/gloves/boxing/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/extendohand_l, /datum/crafting_recipe/extendohand_r) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/gloves/boxing/equipped(mob/user, slot) ..() // boxing requires human diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 57bc04e7007..bfe1457aa52 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -747,6 +747,15 @@ pre_noise = TRUE post_noise = FALSE +/obj/item/toy/crayon/spraycan/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/improvised_coolant) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/toy/crayon/spraycan/isValidSurface(surface) return (isfloorturf(surface) || iswallturf(surface)) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index ecf94d58f70..d3d280cd743 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -44,6 +44,13 @@ if(toggle_context) RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flashlight_eyes) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/flashlight/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) // single use lights can be toggled on once if(isnull(held_item) && (toggle_context || !on)) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 1065d16d1ca..edd058bedd2 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -112,6 +112,13 @@ AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) + // No subtypes + if(type != /obj/item/radio) + return + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ + ) + /obj/item/radio/Destroy() remove_radio_all(src) //Just to be sure QDEL_NULL(wires) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index 727d38c245c..36819d8502a 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -26,6 +26,15 @@ . = ..() RegisterSignal(src, COMSIG_TOOL_ATOM_ACTED_PRIMARY(tool_behaviour), PROC_REF(on_analyze)) + if(type != /obj/item/analyzer) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/material_sniffer) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/analyzer/equipped(mob/user, slot, initial) . = ..() ADD_TRAIT(user, TRAIT_DETECT_STORM, CLOTHING_TRAIT) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 69193b7df92..8947e83d363 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -43,6 +43,15 @@ /// Icon state when inside a tank holder. var/tank_holder_icon_state = "holder_extinguisher" +/obj/item/extinguisher/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ghettojetpack) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/extinguisher/empty starting_water = FALSE diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 035af619513..eb94626c86e 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -34,6 +34,12 @@ /obj/item/flamethrower/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flamethrower) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) /obj/item/flamethrower/Destroy() if(weldtool) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index df18b540453..daee6043682 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -175,10 +175,6 @@ . = ..() var/static/list/hovering_item_typechecks = list( - /obj/item/stack/rods = list( - SCREENTIP_CONTEXT_LMB = "Craft wired rod", - ), - /obj/item/stack/sheet/iron = list( SCREENTIP_CONTEXT_LMB = "Craft bola", ), @@ -190,6 +186,13 @@ if(new_color) set_cable_color(new_color) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/bola, /datum/crafting_recipe/gonbola) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/restraints/handcuffs/cable/proc/set_cable_color(new_color) color = GLOB.cable_colors[new_color] cable_color = new_color @@ -289,36 +292,6 @@ cable_color = CABLE_COLOR_WHITE inhand_icon_state = "coil_white" -/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) //Slapcrafting - if(istype(I, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = I - if (R.use(1)) - var/obj/item/wirerod/W = new /obj/item/wirerod - remove_item_from_storage(user) - user.put_in_hands(W) - to_chat(user, span_notice("You wrap [src] around the top of [I].")) - qdel(src) - else - to_chat(user, span_warning("You need one rod to make a wired rod!")) - return - else if(istype(I, /obj/item/stack/sheet/iron)) - var/obj/item/stack/sheet/iron/M = I - if(M.get_amount() < 6) - to_chat(user, span_warning("You need at least six iron sheets to make good enough weights!")) - return - to_chat(user, span_notice("You begin to apply [I] to [src]...")) - if(do_after(user, 35, target = src)) - if(M.get_amount() < 6 || !M) - return - var/obj/item/restraints/legcuffs/bola/S = new /obj/item/restraints/legcuffs/bola - M.use(6) - user.put_in_hands(S) - to_chat(user, span_notice("You make some weights out of [I] and tie them to [src].")) - remove_item_from_storage(user) - qdel(src) - else - return ..() - /** * # Zipties * diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index d41397301b3..27418a5e0a9 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -111,6 +111,15 @@ shield_break_sound = 'sound/effects/glassbr3.ogg' shield_break_leftover = /obj/item/shard +/obj/item/shield/riot/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/strobeshield) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, params) if(istype(attackby_item, /obj/item/melee/baton)) if(!COOLDOWN_FINISHED(src, baton_bash)) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 1d9c90217ac..d9f13911731 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -54,8 +54,18 @@ force_wielded = force_wielded, \ icon_wielded = "[icon_prefix]1", \ ) + add_headpike_component() update_appearance() +// I dunno man +/obj/item/spear/proc/add_headpike_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpike) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/spear/update_icon_state() icon_state = "[icon_prefix]0" return ..() @@ -227,6 +237,14 @@ reach = 2 //SKYRAT EDIT ADDITION END +/obj/item/spear/bonespear/add_headpike_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebone) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /* * Bamboo Spear */ @@ -241,3 +259,12 @@ custom_materials = list(/datum/material/bamboo = SHEET_MATERIAL_AMOUNT * 20) force_unwielded = 10 force_wielded = 18 + + +/obj/item/spear/bamboospear/add_headpike_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebamboo) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 60db8f800a2..b5540a633f1 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -55,6 +55,13 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ ) AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/spear, /datum/crafting_recipe/stunprod, /datum/crafting_recipe/teleprod) // snatcher prod isn't here as a spoopy secret + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/stack/rods/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) if(proximity_flag) target.attackby(src, user, click_parameters) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 289920c8889..381cdd7a296 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -501,6 +501,15 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' +/obj/item/stack/sheet/durathread/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/durathread_helmet, /datum/crafting_recipe/durathread_vest) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/stack/sheet/durathread/get_main_recipes() . = ..() . += GLOB.durathread_recipes @@ -620,6 +629,15 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ grind_results = list(/datum/reagent/cellulose = 10) material_type = /datum/material/cardboard +/obj/item/stack/sheet/cardboard/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/cardboard_id) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/stack/sheet/cardboard/get_main_recipes() . = ..() . += GLOB.cardboard_recipes diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 0852aeff883..c0d2d42bb87 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -49,6 +49,12 @@ resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION +/obj/item/bag_of_holding_inert/Initialize(mapload) + . = ..() + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/boh)\ + ) + /obj/item/storage/backpack/holding name = "bag of holding" desc = "A backpack that opens into a localized pocket of bluespace." diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 470448ab244..21fc15572bf 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -302,69 +302,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/cursed //used by wizard events, see the tendril_loot.dm file for the miner one slot_flags = null -/obj/item/wirerod - name = "wired rod" - desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit." - icon = 'icons/obj/weapons/spear.dmi' - icon_state = "wiredrod" - inhand_icon_state = "rods" - flags_1 = CONDUCT_1 - force = 9 - throwforce = 10 - w_class = WEIGHT_CLASS_BULKY - custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT + SMALL_MATERIAL_AMOUNT * 1.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 0.75) - attack_verb_continuous = list("hits", "bludgeons", "whacks", "bonks") - attack_verb_simple = list("hit", "bludgeon", "whack", "bonk") - -/obj/item/wirerod/Initialize(mapload) - . = ..() - - var/static/list/hovering_item_typechecks = list( - /obj/item/shard = list( - SCREENTIP_CONTEXT_LMB = "Craft spear", - ), - - /obj/item/assembly/igniter = list( - SCREENTIP_CONTEXT_LMB = "Craft stunprod", - ), - ) - - AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) - -/obj/item/wirerod/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/shard)) - var/datum/crafting_recipe/recipe_to_use = /datum/crafting_recipe/spear - user.balloon_alert(user, "crafting spear...") - if(do_after(user, initial(recipe_to_use.time), src)) // we do initial work here to get the correct timer - var/obj/item/spear/crafted_spear = new /obj/item/spear() - - remove_item_from_storage(user) - if (!user.transferItemToLoc(attacking_item, crafted_spear)) - return - crafted_spear.CheckParts(list(attacking_item)) - qdel(src) - - user.put_in_hands(crafted_spear) - user.balloon_alert(user, "crafted spear") - return - - if(isigniter(attacking_item) && !(HAS_TRAIT(attacking_item, TRAIT_NODROP))) - var/datum/crafting_recipe/recipe_to_use = /datum/crafting_recipe/stunprod - user.balloon_alert(user, "crafting cattleprod...") - if(do_after(user, initial(recipe_to_use.time), src)) - var/obj/item/melee/baton/security/cattleprod/prod = new - - remove_item_from_storage(user) - - qdel(attacking_item) - qdel(src) - - user.put_in_hands(prod) - user.balloon_alert(user, "crafted cattleprod") - return - return ..() - - /obj/item/throwing_star name = "throwing star" desc = "An ancient weapon still used to this day, due to its ease of lodging itself into its victim's body parts." diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index fc665e57c8f..4c7fce6633c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -352,6 +352,18 @@ glass_colour_type = /datum/client_colour/glass_colour/gray dog_fashion = /datum/dog_fashion/head +/obj/item/clothing/glasses/sunglasses/Initialize(mapload) + . = ..() + add_glasses_slapcraft_component() + +/obj/item/clothing/glasses/sunglasses/proc/add_glasses_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsec, /datum/crafting_recipe/hudsunmed, /datum/crafting_recipe/hudsundiag, /datum/crafting_recipe/scienceglasses) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/sunglasses/reagent name = "beer goggles" icon_state = "sunhudbeer" @@ -364,6 +376,14 @@ desc = "A pair of tacky purple sunglasses that allow the wearer to recognize various chemical compounds with only a glance." clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER) +/obj/item/clothing/glasses/sunglasses/chemical/add_glasses_slapcraft_component() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/scienceglassesremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/sunglasses/gar name = "black gar glasses" desc = "Go beyond impossible and kick reason to the curb!" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 5018e4185c8..34359eaa0b3 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -92,6 +92,15 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue +/obj/item/clothing/glasses/hud/health/sunglasses/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunmedremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/hud/diagnostic name = "diagnostic HUD" desc = "A heads-up display capable of analyzing the integrity and status of robotics and exosuits." @@ -118,6 +127,15 @@ flash_protect = FLASH_PROTECTION_FLASH tint = 1 +/obj/item/clothing/glasses/hud/diagnostic/sunglasses/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsundiagremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/hud/security name = "security HUD" desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records." @@ -152,6 +170,15 @@ tint = 1 glass_colour_type = /datum/client_colour/glass_colour/darkred +/obj/item/clothing/glasses/hud/security/sunglasses/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsecremoval) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/glasses/hud/security/night name = "night vision security HUD" desc = "An advanced heads-up display that provides ID data and vision in complete darkness." diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index d3aed125749..f77f6cc2c67 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -26,6 +26,16 @@ ) ) // SKYRAT EDIT ADDITION END + +/obj/item/clothing/gloves/color/black/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/radiogloves) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/gloves/fingerless name = "fingerless gloves" desc = "Plain black gloves without fingertips for the hard-working." @@ -39,6 +49,15 @@ undyeable = TRUE clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) +/obj/item/clothing/gloves/color/fingerless/Initialize(mapload) + . = ..() + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/gripperoffbrand) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/clothing/gloves/color/orange name = "orange gloves" desc = "A pair of gloves, they don't look special in any way." diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 3fd1e7c1949..cb0b5862e16 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -9,6 +9,18 @@ ammo_x_offset = 3 dual_wield_spread = 60 +/obj/item/gun/energy/e_gun/Initialize(mapload) + . = ..() + // Only actual eguns can be converted + if(type != /obj/item/gun/energy/e_gun) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/advancedegun, /datum/crafting_recipe/tempgun, /datum/crafting_recipe/beam_rifle) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/gun/energy/e_gun/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 8d9a29d3b80..06e82a37aae 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -16,6 +16,19 @@ var/list/modkits = list() gun_flags = NOT_A_REAL_GUN + +/obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) + . = ..() + // Only actual KAs can be converted + if(type != /obj/item/gun/energy/recharge/kinetic_accelerator) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ebow) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/gun/energy/recharge/kinetic_accelerator/apply_fantasy_bonuses(bonus) . = ..() max_mod_capacity = modify_fantasy_variable("max_mod_capacity", max_mod_capacity, bonus * 10) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index dafaaa6a7de..0409f2fe037 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -9,6 +9,18 @@ ammo_x_offset = 1 shaded_charge = 1 +/obj/item/gun/energy/laser/Initialize(mapload) + . = ..() + // Only actual lasguns can be converted + if(type != /obj/item/gun/energy/laser) + return + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/xraylaser, /datum/crafting_recipe/hellgun, /datum/crafting_recipe/ioncarbine, /datum/crafting_recipe/decloner) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) + /obj/item/gun/energy/laser/practice name = "practice laser gun" desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice." diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index e2f445c6a1a..e204c6803fb 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -40,6 +40,12 @@ tool_behaviour = TOOL_ROLLINGPIN // Used to knock out the Chef. toolspeed = 1.3 //it's a little awkward to use, but it's a cylinder alright. +/obj/item/reagent_containers/cup/glass/bottle/Initialize(mapload, vol) + . = ..() + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/molotov)\ + ) + /obj/item/reagent_containers/cup/glass/bottle/small name = "small glass bottle" desc = "This blank bottle is unyieldingly anonymous, offering no clues to its contents." diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index 4908942b2c0..5bf0eb782c5 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -21,6 +21,12 @@ /// If the can hasn't been opened yet, this is the measure of how fizzed up it is from being shaken or thrown around. When opened, this is rolled as a percentage chance to burst var/fizziness = 0 +/obj/item/reagent_containers/cup/soda_cans/Initialize(mapload, vol) + . = ..() + AddComponent(/datum/component/slapcrafting,\ + slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ + ) + /obj/item/reagent_containers/cup/soda_cans/random/Initialize(mapload) ..() var/T = pick(subtypesof(/obj/item/reagent_containers/cup/soda_cans) - /obj/item/reagent_containers/cup/soda_cans/random) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 49fbecc2271..c5f62883b5f 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -259,6 +259,12 @@ butcher_sound = 'sound/weapons/circsawhit.ogg', \ ) //saws are very accurate and fast at butchering + var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/chainsaw) + + AddComponent( + /datum/component/slapcrafting,\ + slapcraft_recipes = slapcraft_recipe_list,\ + ) /obj/item/circular_saw/get_surgery_tool_overlay(tray_extended) return surgical_tray_overlay diff --git a/tgstation.dme b/tgstation.dme index db3b42599ea..f75e282d447 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1225,6 +1225,7 @@ #include "code\datums\components\crafting\misc.dm" #include "code\datums\components\crafting\ranged_weapon.dm" #include "code\datums\components\crafting\robot.dm" +#include "code\datums\components\crafting\slapcrafting.dm" #include "code\datums\components\crafting\structures.dm" #include "code\datums\components\crafting\tailoring.dm" #include "code\datums\components\crafting\tiles.dm" From 082a7af76e29a40d077a3349d8daa5f47b076000 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:19:35 +0200 Subject: [PATCH 051/101] Fulton beacons can be renamed and redeployed [MDB IGNORE] (#23956) * Fulton beacons can be renamed and redeployed (#78535) ## About The Pull Request Lets players rename a deployed fulton beacon with a pen, changing its name/decription. Also lets players click said beacon with an empty hand to undeploy it after a short delay, which leaves a ready-to-use fulton core kit. ## Why It's Good For The Game Good QoL to let players move their beacons around. Renaming them also allows players to shorten the name of the beacon, removing guesswork like _where the fuck is **fulton beacon (666) (Cargo Bay)**_. ## Changelog :cl: qol: you can undeploy fulton beacons by clicking them with an empty hand qol: you can rename fulton beacons with a pen /:cl: * Fulton beacons can be renamed and redeployed --------- Co-authored-by: Sealed101 --- code/modules/mining/fulton.dm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index e7199e59938..20a436dc5c6 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) icon_state = "folded_extraction" /obj/item/fulton_core/attack_self(mob/user) - if(do_after(user,15,target = user) && !QDELETED(src)) + if(do_after(user, 1.5 SECONDS, target = user) && !QDELETED(src)) new /obj/structure/extraction_point(get_turf(user)) playsound(src, 'sound/items/deconstruct.ogg', vol = 50, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) qdel(src) @@ -156,6 +156,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) icon_state = "extraction_point" anchored = TRUE density = FALSE + obj_flags = CAN_BE_HIT | UNIQUE_RENAME var/beacon_network = "station" /obj/structure/extraction_point/Initialize(mapload) @@ -168,6 +169,15 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) GLOB.total_extraction_beacons -= src return ..() +/obj/structure/extraction_point/attack_hand(mob/living/user, list/modifiers) + . = ..() + balloon_alert_to_viewers("undeploying...") + if(!do_after(user, 1.5 SECONDS, src)) + return + new /obj/item/fulton_core(drop_location()) + playsound(src, 'sound/items/deconstruct.ogg', vol = 50, vary = TRUE, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE) + qdel(src) + /obj/structure/extraction_point/update_overlays() . = ..() . += emissive_appearance(icon, "[icon_state]_light", src, alpha = src.alpha) From a735bebcbee52c6ce9681a9efe86aac6ae5a2da8 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:19:51 +0200 Subject: [PATCH 052/101] Adds complexity to foods missing it [MDB IGNORE] (#23958) * [NO GBP] Adds complexity to foods missing it (#78546) ## About The Pull Request My foods in my last food update were missing the new complexity factor for some reason. This is just adding that. ## Why It's Good For The Game More consistency with foods! ## Changelog :cl: fix: Added complexity factors to foods that were missing them. /:cl: * [NO GBP] Adds complexity to foods missing it --------- Co-authored-by: MidoriWroth --- code/game/objects/items/food/burgers.dm | 1 + code/game/objects/items/food/cake.dm | 2 ++ code/game/objects/items/food/meatdish.dm | 6 ++++++ code/game/objects/items/food/mexican.dm | 1 + code/game/objects/items/food/misc.dm | 10 ++++++++++ code/game/objects/items/food/pastries.dm | 4 ++++ code/game/objects/items/food/spaghetti.dm | 6 ++++++ code/game/objects/items/food/vegetables.dm | 3 +++ 8 files changed, 33 insertions(+) diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 191cc0eaf25..b2d779ca3a5 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -688,3 +688,4 @@ tastes = list("juicy meat" = 4, "BBQ sauce" = 3, "onions" = 2, "bun" = 2) foodtypes = GRAIN | MEAT | VEGETABLES venue_value = FOOD_PRICE_NORMAL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 5d33c332ff6..07d5818b466 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -690,6 +690,7 @@ tastes = list("cake" = 2, "cream" = 3, "pineapple" = 4) foodtypes = GRAIN | DAIRY | SUGAR | FRUIT | PINEAPPLE slice_type = /obj/item/food/cakeslice/pineapple_cream_cake + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cakeslice/pineapple_cream_cake name = "pineapple cream cake slice" @@ -702,3 +703,4 @@ ) tastes = list("cake" = 2, "cream" = 3, "pineapple" = 4) foodtypes = GRAIN | DAIRY | SUGAR | FRUIT | PINEAPPLE + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 07cd70ea013..2d376148045 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -1017,6 +1017,7 @@ ) tastes = list("meat" = 5, "savory sauce" = 4, "tangy pineapple" = 3, "pepper" = 2) foodtypes = MEAT | VEGETABLES | FRUIT | PINEAPPLE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/kebab/pineapple_skewer name = "pineapple skewer" @@ -1029,6 +1030,7 @@ ) tastes = list("juicy meat" = 4, "pineapple" = 3) foodtypes = MEAT | FRUIT | PINEAPPLE + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/futomaki_sushi_roll name = "futomaki sushi roll" @@ -1042,6 +1044,7 @@ tastes = list("boiled rice" = 4, "fish" = 5, "egg" = 3, "dried seaweed" = 2, "cucumber" = 2) foodtypes = VEGETABLES | SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/futomaki_sushi_roll/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/futomaki_sushi_slice, 4, screentip_verb = "Chop") @@ -1058,6 +1061,7 @@ tastes = list("boiled rice" = 4, "fish" = 5, "egg" = 3, "dried seaweed" = 2, "cucumber" = 2) foodtypes = VEGETABLES | SEAFOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/philadelphia_sushi_roll name = "Philadelphia sushi roll" @@ -1071,6 +1075,7 @@ tastes = list("boiled rice" = 4, "fish" = 5, "creamy cheese" = 3, "dried seaweed" = 2, "cucumber" = 2) foodtypes = VEGETABLES | SEAFOOD | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/philadelphia_sushi_roll/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/philadelphia_sushi_slice, 4, screentip_verb = "Chop") @@ -1087,3 +1092,4 @@ tastes = list("boiled rice" = 4, "fish" = 5, "creamy cheese" = 3, "dried seaweed" = 2, "cucumber" = 2) foodtypes = VEGETABLES | SEAFOOD | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/mexican.dm b/code/game/objects/items/food/mexican.dm index 58c50ba5863..b4e32587bc6 100644 --- a/code/game/objects/items/food/mexican.dm +++ b/code/game/objects/items/food/mexican.dm @@ -336,3 +336,4 @@ tastes = list("pineapple" = 4, "tomato" = 3, "onion" = 2, "chili" = 2) foodtypes = VEGETABLES | FRUIT | PINEAPPLE w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index 67e74496260..ba72e93a8b0 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -550,6 +550,7 @@ tastes = list("cooked eggplant" = 5, "cheese" = 4, "ground meat" = 3, "veggies" = 2) foodtypes = VEGETABLES | MEAT | DAIRY w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/moussaka name = "moussaka" @@ -562,6 +563,7 @@ ) tastes = list("cooked eggplant" = 5, "potato" = 1, "baked veggies" = 2, "meat" = 4, "bechamel sauce" = 3) foodtypes = MEAT | DAIRY | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/moussaka/make_processable() AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/moussaka_slice, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") @@ -577,6 +579,7 @@ ) tastes = list("cooked eggplant" = 5, "potato" = 1, "baked veggies" = 2, "meat" = 4, "bechamel sauce" = 3) foodtypes = MEAT | DAIRY | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/candied_pineapple name = "candied pineapple" @@ -591,6 +594,7 @@ foodtypes = FRUIT | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/candied_pineapple/Initialize(mapload) . = ..() @@ -608,6 +612,7 @@ tastes = list("dough" = 2) foodtypes = GRAIN w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_1 /obj/item/food/raw_pita_bread/make_grillable() AddComponent(/datum/component/grillable, /obj/item/food/pita_bread, rand(15 SECONDS, 30 SECONDS), TRUE, TRUE) @@ -627,6 +632,7 @@ tastes = list("pita bread" = 2) foodtypes = GRAIN w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/tzatziki_sauce name = "tzatziki sauce" @@ -639,6 +645,7 @@ tastes = list("garlic" = 4, "cucumber" = 2, "olive oil" = 2) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/tzatziki_and_pita_bread name = "tzatziki and pita bread" @@ -651,6 +658,7 @@ tastes = list("pita bread" = 4, "tzatziki sauce" = 2, "olive oil" = 2) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/grilled_beef_gyro name = "grilled beef gyro" @@ -664,6 +672,7 @@ tastes = list("pita bread" = 4, "tender meat" = 2, "tzatziki sauce" = 2, "mixed veggies" = 2) foodtypes = VEGETABLES | GRAIN | MEAT w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/vegetarian_gyro name = "vegetarian gyro" @@ -676,3 +685,4 @@ tastes = list("pita bread" = 4, "cucumber" = 2, "tzatziki sauce" = 2, "mixed veggies" = 2) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index 46da05dea14..8a39f6df8d1 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -540,6 +540,7 @@ foodtypes = GRAIN | SUGAR | DAIRY food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cookie/snickerdoodle name = "snickerdoodle" @@ -550,6 +551,7 @@ foodtypes = GRAIN | SUGAR | DAIRY food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cookie/macaron name = "macaron" @@ -561,6 +563,7 @@ foodtypes = GRAIN | SUGAR | DAIRY food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY + crafting_complexity = FOOD_COMPLEXITY_3 /obj/item/food/cookie/macaron/Initialize(mapload) . = ..() @@ -575,3 +578,4 @@ foodtypes = GRAIN | SUGAR | FRUIT food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm index a631cfe5e05..cab4a62a29f 100644 --- a/code/game/objects/items/food/spaghetti.dm +++ b/code/game/objects/items/food/spaghetti.dm @@ -178,6 +178,7 @@ ) tastes = list("noodles" = 5, "meat" = 3, "egg" = 4, "dried seaweed" = 2) foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/kitakata_ramen name = "kitakata ramen" @@ -191,6 +192,7 @@ ) tastes = list("noodles" = 5, "meat" = 4, "mushrooms" = 3, "onion" = 2) foodtypes = GRAIN | MEAT | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/kitsune_udon name = "kitsune udon" @@ -204,6 +206,7 @@ ) tastes = list("noodles" = 5, "tofu" = 4, "sugar" = 3, "soy sauce" = 2) foodtypes = GRAIN | VEGETABLES + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/nikujaga name = "nikujaga" @@ -217,6 +220,7 @@ ) tastes = list("noodles" = 5, "meat" = 4, "potato" = 3, "onion" = 2, "mixed veggies" = 2) foodtypes = GRAIN | VEGETABLES | MEAT + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/pho name = "pho" @@ -230,6 +234,7 @@ ) tastes = list("noodles" = 5, "meat" = 4, "cabbage" = 3, "onion" = 2, "herbs" = 2) foodtypes = GRAIN | VEGETABLES | MEAT + crafting_complexity = FOOD_COMPLEXITY_4 /obj/item/food/spaghetti/pad_thai name = "pad thai" @@ -243,3 +248,4 @@ ) tastes = list("noodles" = 5, "fried tofu" = 4, "lime" = 2, "peanut" = 3, "onion" = 2) foodtypes = GRAIN | VEGETABLES | NUTS | FRUIT + crafting_complexity = FOOD_COMPLEXITY_4 diff --git a/code/game/objects/items/food/vegetables.dm b/code/game/objects/items/food/vegetables.dm index 7da97abc484..dd3ae8c450b 100644 --- a/code/game/objects/items/food/vegetables.dm +++ b/code/game/objects/items/food/vegetables.dm @@ -175,6 +175,7 @@ tastes = list("fried eggplant" = 4, "garlic" = 2, "olive oil" = 3) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/baba_ghanoush name = "baba ghanoush" @@ -188,6 +189,7 @@ tastes = list("mashed eggplant" = 5, "pita bread" = 4, "garlic" = 3, "olive oil" = 4, "lemon juice" = 2) foodtypes = VEGETABLES | GRAIN w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_2 /obj/item/food/falafel name = "falafel" @@ -200,3 +202,4 @@ tastes = list("fava beans" = 5, "garlic" = 3, "onion" = 2, "fresh herbs" = 4) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + crafting_complexity = FOOD_COMPLEXITY_3 From de40a13683157f3a2dae7503aec8e26957b62617 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:20:01 +0200 Subject: [PATCH 053/101] Valentines and ERTs will no longer get mood boosts from traitor moodener items [MDB IGNORE] (#23959) * Valentines and ERTs will no longer get mood boosts from traitor moodener items (#78597) ## About The Pull Request Valentines and ERTs will no longer get mood boosts from traitor moodener items Closes #73432 ## Why It's Good For The Game bugge ## Changelog :cl: fix: Valentines and ERTs will no longer get mood boosts from traitor moodener items /:cl: * Valentines and ERTs will no longer get mood boosts from traitor moodener items --------- Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com> --- code/__DEFINES/antagonists.dm | 4 +-- .../game/objects/items/storage/uplink_kits.dm | 10 +++---- code/modules/admin/player_panel.dm | 2 +- .../antagonists/_common/antag_datum.dm | 2 +- code/modules/antagonists/ert/ert.dm | 4 +-- .../antagonists/valentines/valentine.dm | 4 +-- code/modules/mob/mob_helpers.dm | 26 ++++++++++++++++--- 7 files changed, 35 insertions(+), 17 deletions(-) diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index e74cd6a58bd..125870797ca 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -331,8 +331,8 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define ANTAG_GROUP_PARADOX "Spacetime Aberrations" -// If this flag is enabled the antagonist datum allows the antagonist to be inducted into a nuclear operative team. -#define FLAG_ANTAG_CAN_BE_INDUCTED (1 << 0) +// This flag disables certain checks that presume antagonist datums mean 'baddie'. +#define FLAG_FAKE_ANTAG (1 << 0) #define HUNTER_PACK_COPS "Spacepol Fugitive Hunters" #define HUNTER_PACK_RUSSIAN "Russian Fugitive Hunters" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index ba9c6ef4812..9fa66404aed 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -747,13 +747,13 @@ human_target.reagents.add_reagent(/datum/reagent/toxin, 2) return FALSE - /// If no antag datums which allow induction are there, disallow induction! No self-antagging. - var/allowed = FALSE + /// If all the antag datums are 'fake', disallow induction! No self-antagging. + var/faker for(var/datum/antagonist/antag_datum as anything in human_target.mind.antag_datums) - if((antag_datum.antag_flags & FLAG_ANTAG_CAN_BE_INDUCTED)) - allowed = TRUE + if((antag_datum.antag_flags & FLAG_FAKE_ANTAG)) + faker = TRUE - if(!allowed) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious + if(faker) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious to_chat(human_target, span_notice("Huh? Nothing happened? But you're starting to feel a little ill...")) human_target.reagents.add_reagent(/datum/reagent/toxin, 15) return FALSE diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 624af957a84..f412f9d5a72 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -224,7 +224,7 @@ var/color = "#e6e6e6" if(i%2 == 0) color = "#f2f2f2" - var/is_antagonist = is_special_character(M) + var/is_antagonist = is_special_character(M, allow_fake_antags = TRUE) var/M_job = "" diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 5bbbfaa40b8..a435756b456 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(antagonists) /// The typepath for the outfit to show in the preview for the preferences menu. var/preview_outfit /// Flags for antags to turn on or off and check! - var/antag_flags = FLAG_ANTAG_CAN_BE_INDUCTED + var/antag_flags = FLAG_FAKE_ANTAG /// If true, this antagonist can assign themself a new objective var/can_assign_self_objectives = FALSE /// Default to fill in when entering a custom objective. diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 0088660ec14..116d19f5164 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -12,8 +12,8 @@ antagpanel_category = ANTAG_GROUP_ERT suicide_cry = "FOR NANOTRASEN!!" count_against_dynamic_roll_chance = FALSE - // Not 'true' antags, cannot induct to prevent issues - antag_flags = NONE + // Not 'true' antags, this disables certain interactions that assume the owner is a baddie + antag_flags = FLAG_FAKE_ANTAG var/datum/team/ert/ert_team var/leader = FALSE var/datum/outfit/outfit = /datum/outfit/centcom/ert/security diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index 8883625fb1a..79ae9fa8baa 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -4,8 +4,8 @@ show_in_antagpanel = FALSE prevent_roundtype_conversion = FALSE suicide_cry = "FOR MY LOVE!!" - // Not 'true' antags, cannot induct - antag_flags = NONE + // Not 'true' antags, this disables certain interactions that assume the owner is a baddie + antag_flags = FLAG_FAKE_ANTAG var/datum/mind/date count_against_dynamic_roll_chance = FALSE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 3e561c75341..1dff8e345c0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -207,20 +207,38 @@ return "" // moved out of admins.dm because things other than admin procs were calling this. -/// Returns TRUE if the game has started and we're either an AI with a 0th law, or we're someone with a special role/antag datum -/proc/is_special_character(mob/M) +/** + * Returns TRUE if the game has started and we're either an AI with a 0th law, or we're someone with a special role/antag datum + * If allow_fake_antags is set to FALSE, Valentines, ERTs, and any such roles with FLAG_FAKE_ANTAG won't pass. +*/ +/proc/is_special_character(mob/M, allow_fake_antags = FALSE) if(!SSticker.HasRoundStarted()) return FALSE if(!istype(M)) return FALSE if(iscyborg(M)) //as a borg you're now beholden to your laws rather than greentext return FALSE + + + // Returns TRUE if AI has a zeroth law *and* either has a special role *or* an antag datum. if(isAI(M)) var/mob/living/silicon/ai/A = M return (A.laws?.zeroth && (A.mind?.special_role || !isnull(M.mind?.antag_datums))) - if(M.mind?.special_role || !isnull(M.mind?.antag_datums)) //they have an antag datum! + + if(M.mind?.special_role) return TRUE - return FALSE + + // Turns 'faker' to TRUE if the antag datum is fake. If it's not fake, returns TRUE directly. + var/faker = FALSE + for(var/datum/antagonist/antag_datum as anything in M.mind?.antag_datums) + if((antag_datum.antag_flags & FLAG_FAKE_ANTAG)) + faker = TRUE + else + return TRUE + + // If 'faker' was assigned TRUE in the above loop and the argument 'allow_fake_antags' is set to TRUE, this passes. + // Else, return FALSE. + return (faker && allow_fake_antags) /** * Fancy notifications for ghosts From edd95e128ef94b5c15983140cb785965454f769d Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:20:35 +0200 Subject: [PATCH 054/101] adds doctorly head mirrors [MDB IGNORE] (#23960) * adds doctorly head mirrors (#78577) ## About The Pull Request Adds head mirrors, those flip up mirrors doctors wear on their heads Doctors can purchase them from their clothing vendor ![image](https://github.com/tgstation/tgstation/assets/51863163/1de4df46-9ff6-4396-8bba-d403b0507e79) Examine-more-ing people while wearing a head mirror lets you investigate their head organs, revealing tooth pills, tongues, eyes organs, and ear deafness. Similar to what the flashlight is capable of, but with bonus ear action. ## Why It's Good For The Game An alternative headgear for doctors to wear, with some unique ghetto-treatment flavor (albeit already covered by flashlights, but that's authentic) ## Changelog :cl: Melbert add: Doctors can now get head mirrors from their clothes vendor, to complete the doctor outfit /:cl: * adds doctorly head mirrors --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> --- .../signals/signals_atom/signals_atom_main.dm | 14 ++-- code/__DEFINES/inventory.dm | 1 + code/game/atoms.dm | 1 + code/modules/clothing/ears/_ears.dm | 1 + code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/jobs.dm | 79 +++++++++++++++++- .../mob/living/carbon/carbon_defense.dm | 7 ++ code/modules/mob/living/living_defense.dm | 5 ++ code/modules/vending/wardrobes.dm | 1 + icons/mob/clothing/head/utility.dmi | Bin 20122 -> 20312 bytes icons/obj/clothing/head/utility.dmi | Bin 7103 -> 7293 bytes 11 files changed, 103 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index dc0293fb274..cd123e2e0b1 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -11,17 +11,19 @@ #define COMSIG_ATOM_EXAMINE "atom_examine" ///from base of atom/get_examine_name(): (/mob, list/overrides) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" -///from base of atom/examine(): (/mob, list/examine_text, can_see_inside) -#define COMSIG_ATOM_REAGENT_EXAMINE "atom_reagent_examine" - /// Stop the generic reagent examine text - #define STOP_GENERIC_REAGENT_EXAMINE (1<<0) -///from base of atom/examine_more(): (/mob) -#define COMSIG_ATOM_EXAMINE_MORE "atom_examine_more" //Positions for overrides list #define EXAMINE_POSITION_ARTICLE (1<<0) #define EXAMINE_POSITION_BEFORE (1<<1) //End positions #define COMPONENT_EXNAME_CHANGED (1<<0) +///from base of atom/examine(): (/mob, list/examine_text, can_see_inside) +#define COMSIG_ATOM_REAGENT_EXAMINE "atom_reagent_examine" + /// Stop the generic reagent examine text + #define STOP_GENERIC_REAGENT_EXAMINE (1<<0) +///from base of atom/examine_more(): (/mob, examine_list) +#define COMSIG_ATOM_EXAMINE_MORE "atom_examine_more" +/// from atom/examine_more(): (/atom/examining, examine_list) +#define COMSIG_MOB_EXAMINING_MORE "mob_examining_more" ///from base of [/atom/proc/update_appearance]: (updates) #define COMSIG_ATOM_UPDATE_APPEARANCE "atom_update_appearance" /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its name. diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index c76276c019d..f2f511c791b 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -170,6 +170,7 @@ #define MASKCOVERSMOUTH (1<<3) // on other items, these are just for mask/head #define HEADCOVERSMOUTH (1<<4) #define PEPPERPROOF (1<<5) //protects against pepperspray +#define EARS_COVERED (1<<6) #define TINT_DARKENED 2 //Threshold of tint level to apply weld mask overlay #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 29c5ea6e4df..4912a69f7b8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -705,6 +705,7 @@ . = list() SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE_MORE, user, .) + SEND_SIGNAL(user, COMSIG_MOB_EXAMINING_MORE, src, .) /// Wrapper for _update_appearance that is only called when APPEARANCE_SUCCESS_TRACKING is defined #ifdef APPEARANCE_SUCCESS_TRACKING diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index c4001d23629..5ae5b628808 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -20,6 +20,7 @@ equip_delay_other = 25 resistance_flags = FLAMMABLE custom_price = PAYCHECK_COMMAND * 1.5 + flags_cover = EARS_COVERED /obj/item/clothing/ears/earmuffs/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 488bd7448a7..f8cd88923ec 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -12,7 +12,7 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT - flags_cover = HEADCOVERSEYES + flags_cover = HEADCOVERSEYES|EARS_COVERED flags_inv = HIDEHAIR dog_fashion = /datum/dog_fashion/head/helmet diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 4022e259505..76194e721b6 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -246,7 +246,7 @@ var/prefix_index = findtext(raw_message, prefix) if(prefix_index != 1) return FALSE - + var/the_phrase = trim_left(replacetext(raw_message, prefix, "")) var/obj/item/result = items_by_phrase[the_phrase] if(!result) @@ -592,6 +592,83 @@ icon_state = "surgicalcapblack" desc = "A black medical surgery cap to prevent the surgeon's hair from entering the insides of the patient!" +/obj/item/clothing/head/utility/head_mirror + name = "head mirror" + desc = "Used by doctors to look into a patient's eyes, ears, and mouth. \ + A little useless now, given the technology available, but it certainly completes the look." + icon_state = "headmirror" + body_parts_covered = NONE + +/obj/item/clothing/head/utility/head_mirror/examine(mob/user) + . = ..() + . += span_notice("In a properly lit room, you can use this to examine people's eyes, ears, and mouth closer.") + +/obj/item/clothing/head/utility/head_mirror/equipped(mob/living/user, slot) + . = ..() + if(slot & slot_flags) + RegisterSignal(user, COMSIG_MOB_EXAMINING_MORE, PROC_REF(examining)) + else + UnregisterSignal(user, COMSIG_MOB_EXAMINING_MORE) + +/obj/item/clothing/head/utility/head_mirror/dropped(mob/living/user) + . = ..() + UnregisterSignal(user, COMSIG_MOB_EXAMINING_MORE) + +/obj/item/clothing/head/utility/head_mirror/proc/examining(mob/living/examiner, atom/examining, list/examine_list) + SIGNAL_HANDLER + if(!ishuman(examining) || examining == examiner || examiner.is_blind() || !examiner.Adjacent(examining)) + return + var/mob/living/carbon/human/human_examined = examining + if(!human_examined.get_bodypart(BODY_ZONE_HEAD)) + return + if(!examiner.has_light_nearby()) + examine_list += span_warning("You attempt to use your [name] to examine [examining]'s head better... but it's too dark. Should've invested in a head lamp.") + return + if(examiner.dir == examining.dir) // disallow examine from behind - every other dir is OK + examine_list += span_warning("You attempt to use your [name] to examine [examining]'s head better... but [examining.p_theyre()] facing the wrong way.") + return + + var/list/final_message = list("You examine [examining]'s head closer with your [name], you notice [examining.p_they()] [examining.p_have()]...") + if(human_examined.is_mouth_covered()) + final_message += "\tYou can't see [examining.p_their()] mouth." + else + var/obj/item/organ/internal/tongue/has_tongue = human_examined.get_organ_slot(ORGAN_SLOT_TONGUE) + var/pill_count = 0 + for(var/datum/action/item_action/hands_free/activate_pill/pill in human_examined.actions) + pill_count++ + + if(pill_count >= 1 && has_tongue) + final_message += "\t[pill_count] pill\s in [examining.p_their()] mouth, and \a [has_tongue]." + else if(pill_count >= 1) + final_message += "\t[pill_count] pill\s in [examining.p_their()] mouth, but oddly no tongue." + else if(has_tongue) + final_message += "\t\A [has_tongue] in [examining.p_their()] mouth - go figure." + else + final_message += "\tNo tongue in [examining.p_their()] mouth, oddly enough." + + if(human_examined.is_ears_covered()) + final_message += "\tYou can't see [examining.p_their()] ears." + else + var/obj/item/organ/internal/ears/has_ears = human_examined.get_organ_slot(ORGAN_SLOT_EARS) + if(has_ears) + if(has_ears.deaf) + final_message += "\tDamaged eardrums in [examining.p_their()] ear canals." + else + final_message += "\tA set of [has_ears.damage ? "" : "healthy "][has_ears.name]." + else + final_message += "\tNo eardrums and empty ear canals... how peculiar." + + if(human_examined.is_eyes_covered()) + final_message += "\tYou can't see [examining.p_their()] eyes." + else + var/obj/item/organ/internal/eyes/has_eyes = human_examined.get_organ_slot(ORGAN_SLOT_EYES) + if(has_eyes) + final_message += "\tA pair of [has_eyes.damage ? "" : "healthy "][has_eyes.name]." + else + final_message += "\tEmpty eye sockets." + + examine_list += span_notice("[jointext(final_message, "\n")]") + //Engineering /obj/item/clothing/head/beret/engi name = "engineering beret" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8b97685d0a8..789a459b492 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -57,6 +57,13 @@ return null +/mob/living/carbon/is_ears_covered() + for(var/obj/item/worn_thing as anything in get_equipped_items()) + if(worn_thing.flags_cover & EARS_COVERED) + return worn_thing + + return null + /mob/living/carbon/check_projectile_dismemberment(obj/projectile/P, def_zone) var/obj/item/bodypart/affecting = get_bodypart(def_zone) if(affecting && !(affecting.bodypart_flags & BODYPART_UNREMOVABLE) && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 17c6d7faa9c..0d309ff10c9 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -88,6 +88,11 @@ /mob/living/proc/is_pepper_proof(check_flags = ALL) return null +/// Checks if the mob's ears (BOTH EARS, BOWMANS NEED NOT APPLY) are covered by something. +/// Returns the atom covering the mob's ears, or null if their ears are uncovered. +/mob/living/proc/is_ears_covered() + return null + /mob/living/proc/on_hit(obj/projectile/P) return BULLET_ACT_HIT diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index da2c08e04c9..2a5360c1ed2 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -61,6 +61,7 @@ /obj/item/clothing/head/utility/surgerycap/green = 4, /obj/item/clothing/head/beret/medical/paramedic = 4, /obj/item/clothing/head/soft/paramedic = 4, + /obj/item/clothing/head/utility/head_mirror = 4, /obj/item/clothing/mask/bandana/striped/medical = 4, /obj/item/clothing/mask/surgical = 4, /obj/item/clothing/under/rank/medical/doctor = 4, diff --git a/icons/mob/clothing/head/utility.dmi b/icons/mob/clothing/head/utility.dmi index 3f3a668181cb77157107c25708a8ed4669bba5be..ada1b90c4b0beb63ebbefcadcd27b7be40124c37 100644 GIT binary patch literal 20312 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 I=akR{0Op%slmGw# literal 20122 zcmd43by!qi+cvz1E(JscL`oD8kPrpQ0VzSHyM_>v29b^dgAfD^1f{zfx?w=NyJH9? zhK?ZyhWR$X`+mOT{*L!O-v8d``Tk(`>@{nzy{>DW>%3xLn=lPEd0EMo_c6RT*@LOAc7rBAaQVVJ}c4lI9^V1s9mp`$T()xdtWSaU|9T)jg4?#7eG zp)VYVJja5|%zdx_t`NJVcZ4a!qU$4^4>x%jCK(n#S0*M?%vzsB%qQJb{IMD+)p}=u zqXp@9efK)n*W|C&Exhh?tDvlK`B<**a95`kwby@&3m}X?jBi1e*_dMSmLXnGZV|uy zRn1K}-!#W?7L|C9A3iMDXw#~3TS(rd^>a(q@8E#nL0V~U%^&E|uMWpk*<5N8pI?_s z3xoU}tLsW2ib2GA&=i;-^a&fK3NJH>r*6|2*xYzX?`dfBAiK`0v5+sERUl6{er3-i zfQr8(&X&%y0{?~_st8k_Llqy)hvpS592YLJ7)od zLzV_U?*DmWGYA0efQo{gj#t9woVSUNH43^r;2NvgO5A)!Mec+RX>2*G3lt0aWfUsR`v6fO3*DiupYZGI9PP%Q^Thky>a(HV~xZa zMO>7L-Za85ERj`AY?)2Fi+o1rZ_FH$-#O2!FlX`rp%+w5mqP2R)y8yb@3Bv;f`n(jnOI_9e;mn zORDY>w_^7V&6X#-vI=n$K5w1lu}V?+zBd=lj}Ka~q!;kd_^X-+BD=6<p|@;H zi@QI)O(m)yKOqL9nk>c|5371I*xnD1KEC4+p}0S<72#7tX!cWBf3Dc#TRE$!!(>L| z1FIqlblcUZ^TwY(d@ccJE8=jzHGm%oG1@(!NrXRZrnQwepopwKJm26(oyG<}x9&JdhN9@)gurRHu;SB|kK1>`#-~9k zgFhp2r}#_^d~SCY`9%ckw>e??K_TMF?{9Ki^;L5x<=8(^j5a#(OeYYR^jI z)mvv3jIs__I{se!1_K2#M^umsGhOxGb)zC<0ubG|Y%vYIZiAdWWSm)SP4kXcHvEYXkT{+&e7`7m32BT^v$){eFC@H=R&5+~$sTcP_I~zZy z50552dcSAI}V9$o+4N7YvAm!&V_g_VEX1< zrS1|-zk9bErTndsTA|ZdT4A&b6+qYelKlX~=uaK!e)ns!uwK01gtfQ1Y$xzMPRL9Z zcZFFrm-O0Ib4%_GgX7vcN)Fm|jbArO0j(Wm`T=xvTP^fVCVUmmWt210{dREuM2mv|*_N2xhoIhxQW8aRuhu}qQyF(C*hp!4E&5a<6i1X{ zGy2D7XA;pisNQS&q+mlv!C!bW?95nOz4Qs$!s&#_$SH&IbF3Kb^&`ZGz}|`GO~R)G zIlE<^{D1im>B`7jYq#Y`8G^XConJ_IQE)7*NZ{3w1gwdg)&%+>36%?{sfjhTvYg+=>XusSO2Esx+zcU6ZD7;ktzuWz@-C4Lb zxXw%aCEv>!i-pZ{<9`(O1%(P#=xgw8)t>blw4k}Ac0EDf=|swiyZ|ZZ!qkU##1r2$ zi0uiMNx2A77TK!(*^U~+Z21b!oWjIb%q#YiPrTtHqg6W`>5myGm$${rFYH??^DoQ- zrZLm=@VhcH^Xo8P;|Ho+Q`yq91k;4T|Ar=z+$)UN-jP$Eo3gCUFeZ5(4n`UVh({(L z2r%ulU&m}Q>B3O&83}s?J4){KSx(-mc32}s_c|qsVm`CNli+Sicz3I-c@W3xbl+r; z>5@OKei_MK!goF>`1>l2O&qhgvx^I}?QvhDqHLZBcGPdF4W1lDY~eg50L&uyJ5s>s z$Tq6P*T}+Yv}N~jozI$`pICYHv9vuNWHMIZY0Y2QbX=$3IpO%;RqQeZ2=o{1k3?!4r`$ddQ169o67am$W&P3T z%lQ7xQ%NgJ1df@$vW;SLOJ{8l^=2-%vBT#>3O4>8-%ZysgsY59qJUz_4?rAlW27L*(Rk^LoGN zq4FPe+$<(v-JQZYBGj5{%>n`zcJc~TG~gH9f
    agtX1-{gz!S0s|~^4TT)-EkfG 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 numfX3Eo6%SiyY854AHH)$E$nICxX~xMc|d(8`% literal 7103 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 From c2e3ac53c8226d159c428b1ced783ddcb6c017fb Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:21:03 +0200 Subject: [PATCH 055/101] Fixes a runtime when left-clicking an empty surgery tray. [MDB IGNORE] (#23962) * Fixes a runtime when left-clicking an empty surgery tray. (#78615) ## About The Pull Request As per the title. Drawing a random tool from an empty tray would attempt to pick from an empty list, which runtimes. Now it displays a balloon alert for you instead if you try to do that. ## Why It's Good For The Game Errors bad. Also, clearer feedback if you try to randomly draw from an empty tray (maybe you didn't notice it was empty, or maybe you thought you would pick it up?). ## Changelog :cl: fix: Left-clicking an empty surgery tray will now tell you exactly why it does nothing. /:cl: * Fixes a runtime when left-clicking an empty surgery tray. --------- Co-authored-by: lizardqueenlexi <105025397+lizardqueenlexi@users.noreply.github.com> --- code/game/objects/items/surgery_tray.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm index 99838f5d3c4..37494a39b55 100644 --- a/code/game/objects/items/surgery_tray.dm +++ b/code/game/objects/items/surgery_tray.dm @@ -153,8 +153,10 @@ /obj/item/surgery_tray/attack_hand(mob/living/user) if(!user.can_perform_action(src, NEED_HANDS)) return ..() - var/obj/item/grabbies = pick(contents) - if(grabbies) + if(!length(contents)) + balloon_alert(user, "empty!") + else + var/obj/item/grabbies = pick(contents) atom_storage.remove_single(user, grabbies, drop_location()) user.put_in_hands(grabbies) return TRUE From 4f1d7339d0d6a6fc111d9fabac8c625c4a56be9f Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:21:36 +0200 Subject: [PATCH 056/101] Borgs will slow down when stuff is thrown at them [MDB IGNORE] (#23963) * Borgs will slow down when stuff is thrown at them (#78561) ## About The Pull Request This feature was added in #75819 but didn't work, for two reasons. Reason one: it was checking for throwing impact on the "I got shot by a bullet" proc and then checking the throwforce of a bullet (generally 0, because you don't throw those). Reason two: the duration was throwforce / 10 seconds. This would apply a slowdown which was usually one or fewer seconds, which might as well not exist. The solution to this is to assign it to the correct proc and give it a flat duration for anything over a threshold of damage. Currently this is 3 seconds for anything with 10 or more force (such as the humble iron rod). You can reapply it by just throwing more stuff. ## Why It's Good For The Game Cyborgs don't suffer health-based slowdown like humans. This is good because cyborg combat should be similar to humans, but bad because our move speed config is so ludicrously high that it makes fighting anyone at full speed a real pain in the ass. Since flashes have been nerfed to require two clicks in order to stun a cyborg, you have to be able to catch them to apply the second click. Throwing something at them should make this more likely. ## Changelog :cl: fix: Throwing things at cyborgs will now slow them down, as intended balance: Adjusted the calculation of throwforce -> slowdown for cyborgs such that it is simply a flat duration for anything above a certain damage threshold (the value of throwing iron rods) /:cl: * Borgs will slow down when stuff is thrown at them --------- Co-authored-by: Jacquerel --- code/__DEFINES/robots.dm | 7 ++++-- code/datums/status_effects/debuffs/cyborg.dm | 22 +++++++++++++++++++ .../mob/living/silicon/robot/robot_defense.dm | 13 +++++------ code/modules/movespeed/modifiers/mobs.dm | 3 --- tgstation.dme | 1 + 5 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 code/datums/status_effects/debuffs/cyborg.dm diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 7f7961e05be..4d32c136331 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -1,4 +1,4 @@ -/** AI defines */ +// AI defines #define DEFAULT_AI_LAWID "default" #define LAW_ZEROTH "zeroth" @@ -27,7 +27,10 @@ ///Malfunctioning AI hijacking mecha #define AI_MECH_HACK 3 -/** Cyborg defines */ +// Cyborg defines + +/// If an item does this or more throwing damage it will slow a borg down on hit +#define CYBORG_THROW_SLOWDOWN_THRESHOLD 10 /// Special value to reset cyborg's lamp_cooldown #define BORG_LAMP_CD_RESET -1 diff --git a/code/datums/status_effects/debuffs/cyborg.dm b/code/datums/status_effects/debuffs/cyborg.dm new file mode 100644 index 00000000000..0f95b494197 --- /dev/null +++ b/code/datums/status_effects/debuffs/cyborg.dm @@ -0,0 +1,22 @@ +/// Reduce a cyborg's speed when you throw things at it +/datum/status_effect/borg_throw_slow + id = "borg_throw_slowdown" + alert_type = /atom/movable/screen/alert/status_effect/borg_throw_slow + duration = 3 SECONDS + status_type = STATUS_EFFECT_REPLACE + +/datum/status_effect/borg_throw_slow/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE) + +/datum/status_effect/borg_throw_slow/on_remove() + . = ..() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE) + +/atom/movable/screen/alert/status_effect/borg_throw_slow + name = "Percussive Maintenance" + desc = "A sudden impact has triggered your collision avoidance routines, reducing movement speed." + icon_state = "weaken" + +/datum/movespeed_modifier/borg_throw + multiplicative_slowdown = 0.9 diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 277b36c274b..f820d3ca1cf 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -439,11 +439,8 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(prob(75) && Proj.damage > 0) spark_system.start() -/mob/living/silicon/on_hit(obj/projectile/P) - if(!has_movespeed_modifier(/datum/movespeed_modifier/borg_throw)) - add_movespeed_modifier(/datum/movespeed_modifier/borg_throw) - addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living/silicon, clear_throw_slowdown)), (P.throwforce / 10) SECONDS) - return ..() - -/mob/living/silicon/proc/clear_throw_slowdown() - src.remove_movespeed_modifier(/datum/movespeed_modifier/borg_throw) +/mob/living/silicon/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + . = ..() + if (. || AM.throwforce < CYBORG_THROW_SLOWDOWN_THRESHOLD) + return + apply_status_effect(/datum/status_effect/borg_throw_slow) diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 59b514a3d57..e5f29323223 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -84,9 +84,6 @@ /datum/movespeed_modifier/shove multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH -/datum/movespeed_modifier/borg_throw - multiplicative_slowdown = 0.9 - /datum/movespeed_modifier/human_carry multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN blacklisted_movetypes = FLOATING diff --git a/tgstation.dme b/tgstation.dme index f75e282d447..97d3d2b1cfb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1734,6 +1734,7 @@ #include "code\datums\status_effects\debuffs\choke.dm" #include "code\datums\status_effects\debuffs\confusion.dm" #include "code\datums\status_effects\debuffs\cursed.dm" +#include "code\datums\status_effects\debuffs\cyborg.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" #include "code\datums\status_effects\debuffs\decloning.dm" #include "code\datums\status_effects\debuffs\dizziness.dm" From efc8a90b00e27344578f1f61be60f6b9159a0998 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 00:57:49 +0200 Subject: [PATCH 057/101] You can now pick the limb you want replaced with the Prosthetic Limb Quirk. [MDB IGNORE] (#23961) * You can now pick the limb you want replaced with the Prosthetic Limb Quirk. (#78517) ## About The Pull Request The Prosthetic Limb quirk allows you to pick the limb you want. The default is still random ## Why It's Good For The Game Good for character customization, which is always nice. Statics who got a specific limb replaced can now represent that properly in-game. Also, this makes the quirk show up on the dummy on the character customization again. This *does* cause a slight issue where when you switch to another character, it keeps the previous' skin color, but it's minor enough that i think the benefits are worth the drawback. If asked i will make it not appear on the dummy though. ## Changelog DATA_, with great help from Kapu:cl: add: You can now choose the prosthetic you want with the Prosthetic Limb quirk. /:cl: * You can now pick the limb you want replaced with the Prosthetic Limb Quirk. --------- Co-authored-by: DATAxPUNGED <44149906+DATA-xPUNGED@users.noreply.github.com> --- code/_globalvars/lists/quirks.dm | 8 +++++ .../quirks/negative_quirks/prosthetic_limb.dm | 31 +++++++------------ code/modules/client/preferences/prosthetic.dm | 17 ++++++++++ tgstation.dme | 1 + .../character_preferences/prosthetic.tsx | 6 ++++ 5 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 code/modules/client/preferences/prosthetic.dm create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/prosthetic.tsx diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 9d936c18e56..f907206a30c 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -11,3 +11,11 @@ GLOBAL_LIST_INIT(nearsighted_glasses, list( "Modern" = /obj/item/clothing/glasses/betterunshit, // SKYRAT ADD )) + +///Options for the prothetic limb quirk to choose from +GLOBAL_LIST_INIT(limb_choice, list( + "Left Arm" = /obj/item/bodypart/arm/left/robot/surplus, + "Right Arm" = /obj/item/bodypart/arm/right/robot/surplus, + "Left Leg" = /obj/item/bodypart/leg/left/robot/surplus, + "Right Leg" = /obj/item/bodypart/leg/right/robot/surplus, +)) diff --git a/code/datums/quirks/negative_quirks/prosthetic_limb.dm b/code/datums/quirks/negative_quirks/prosthetic_limb.dm index f6f0e304a6d..e7ea4d75788 100644 --- a/code/datums/quirks/negative_quirks/prosthetic_limb.dm +++ b/code/datums/quirks/negative_quirks/prosthetic_limb.dm @@ -3,9 +3,8 @@ desc = "An accident caused you to lose one of your limbs. Because of this, you now have a surplus prosthetic!" icon = "tg-prosthetic-leg" value = -3 - medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic limb." hardcore_value = 3 - quirk_flags = QUIRK_HUMAN_ONLY // while this technically changes appearance, we don't want it to be shown on the dummy because it's randomized at roundstart + quirk_flags = QUIRK_HUMAN_ONLY | QUIRK_CHANGES_APPEARANCE mail_goodies = list(/obj/item/weldingtool/mini, /obj/item/stack/cable_coil/five) /// The slot to replace, in string form var/slot_string = "limb" @@ -13,28 +12,20 @@ var/obj/item/bodypart/old_limb /datum/quirk/prosthetic_limb/add_unique(client/client_source) - var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/limb_type = GLOB.limb_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] + if(isnull(limb_type)) //Client gone or they chose a random prosthetic + limb_type = GLOB.limb_choice[pick(GLOB.limb_choice)] + var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/bodypart/prosthetic - switch(limb_slot) - if(BODY_ZONE_L_ARM) - prosthetic = new /obj/item/bodypart/arm/left/robot/surplus - slot_string = "left arm" - if(BODY_ZONE_R_ARM) - prosthetic = new /obj/item/bodypart/arm/right/robot/surplus - slot_string = "right arm" - if(BODY_ZONE_L_LEG) - prosthetic = new /obj/item/bodypart/leg/left/robot/surplus - slot_string = "left leg" - if(BODY_ZONE_R_LEG) - prosthetic = new /obj/item/bodypart/leg/right/robot/surplus - slot_string = "right leg" - medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]." - old_limb = human_holder.return_and_replace_bodypart(prosthetic, special = TRUE) + var/obj/item/bodypart/surplus = new limb_type() + slot_string = "[surplus.plaintext_zone]" + + medical_record_text = "Patient uses a low-budget prosthetic on the [slot_string]." + old_limb = human_holder.return_and_replace_bodypart(surplus, special = TRUE) /datum/quirk/prosthetic_limb/post_add() to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ - you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.")) + you need to use a welding tool and cables to repair it, instead of sutures and regenerative meshes.")) /datum/quirk/prosthetic_limb/remove() var/mob/living/carbon/human/human_holder = quirk_holder diff --git a/code/modules/client/preferences/prosthetic.dm b/code/modules/client/preferences/prosthetic.dm new file mode 100644 index 00000000000..f66f1278c48 --- /dev/null +++ b/code/modules/client/preferences/prosthetic.dm @@ -0,0 +1,17 @@ +/datum/preference/choiced/prosthetic + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + savefile_key = "prosthetic" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/prosthetic/init_possible_values() + return list("Random") + GLOB.limb_choice + +/datum/preference/choiced/prosthetic/is_accessible(datum/preferences/preferences) + . = ..() + if (!.) + return FALSE + + return "Prosthetic Limb" in preferences.all_quirks + +/datum/preference/choiced/prosthetic/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/tgstation.dme b/tgstation.dme index 97d3d2b1cfb..26e01221ffa 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3459,6 +3459,7 @@ #include "code\modules\client\preferences\preferred_map.dm" #include "code\modules\client\preferences\pride_pin.dm" #include "code\modules\client\preferences\prisoner_crime.dm" +#include "code\modules\client\preferences\prosthetic.dm" #include "code\modules\client\preferences\random.dm" #include "code\modules\client\preferences\runechat.dm" #include "code\modules\client\preferences\scaling_method.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/prosthetic.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/prosthetic.tsx new file mode 100644 index 00000000000..adbaefe90c8 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/prosthetic.tsx @@ -0,0 +1,6 @@ +import { FeatureChoiced, FeatureDropdownInput } from '../base'; + +export const prosthetic: FeatureChoiced = { + name: 'Prosthetic', + component: FeatureDropdownInput, +}; From cf4dcffe37dede9f0cea11118c8cb249df7d1c49 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 02:22:14 +0200 Subject: [PATCH 058/101] Fixes the secret bottomless pit in the ethereal pirate shuttle [MDB IGNORE] (#23965) * [No GBP] Fixes the secret bottomless pit in the ethereal pirate shuttle (#78138) ## About The Pull Request I DIDNT NOTICE THAT ALL THE DIRT IN THE ETHEREAL SHUTTLE HAD CHASM BASETURFS FUCK FUCK FUCK ![image](https://github.com/tgstation/tgstation/assets/63932673/ba5f7b02-7577-48ad-b2bc-b8b1c0e4192f) (Also rebalances the ship a bit by adding some more turrets and cleans up the wonky turf decals and engines) ## Why It's Good For The Game God's strongest mapper needs to get some sleep asap I'm so fucking tired A few people also pointed out that only having two turrets was extremely punishing even for the playstyle I was trying to encourage, so it makes sense to add a little wiggle room. ## Changelog :cl: balance: Gave the bluespace geode pirates 4 more teleporter bolt turrets. fix: The bluespace geode pirates no longer have a bluespace portal to the bottomless pit dimension. add: Station-safe dirt tiles for all your mapping needs, but surely no station maps use the chasm baseturf ones, right? Right? /:cl: * [No GBP] Fixes the secret bottomless pit in the ethereal pirate shuttle --------- Co-authored-by: Toastgoats <63932673+Toastgoats@users.noreply.github.com> --- _maps/shuttles/pirate_geode.dmm | 611 ++++++++++++++++---------------- code/game/turfs/open/planet.dm | 7 + 2 files changed, 312 insertions(+), 306 deletions(-) diff --git a/_maps/shuttles/pirate_geode.dmm b/_maps/shuttles/pirate_geode.dmm index eb7f8e5c78f..d2e8f034f48 100644 --- a/_maps/shuttles/pirate_geode.dmm +++ b/_maps/shuttles/pirate_geode.dmm @@ -1,30 +1,26 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "at" = ( -/obj/structure/grille, -/obj/effect/spawner/structure/window/hollow/survival_pod, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "geodebridge" - }, -/turf/open/misc/dirt{ - planetary_atmos = 0; - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/obj/structure/barricade/wooden, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "aM" = ( -/obj/machinery/power/shuttle_engine/huge{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ +/obj/structure/table/wood, +/obj/machinery/light/small/blacklight/directional{ dir = 8 }, -/turf/open/floor/plating, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/grenade/c4, +/obj/item/grenade/c4, +/obj/item/grenade/c4, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "bY" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/obj/effect/turf_decal/weather/dirt{ - dir = 9 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/plating, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "cx" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -48,8 +44,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "ev" = ( -/obj/structure/flora/lunar_plant/style_2, -/turf/open/misc/dirt/jungle, +/obj/machinery/computer/piratepad_control, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "fB" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -67,10 +63,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "ga" = ( -/obj/item/stack/sheet/bluespace_crystal{ - amount = 2 - }, -/turf/open/misc/dirt/jungle, +/obj/machinery/space_heater, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "ge" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -86,21 +80,22 @@ /turf/open/floor/plating, /area/shuttle/pirate) "gv" = ( -/obj/item/reagent_containers/cup/beaker/large, -/turf/open/misc/dirt/jungle, +/obj/machinery/suit_storage_unit/pirate{ + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/blue; + suit_type = /obj/item/clothing/suit/space/syndicate/blue + }, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "gM" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/dirt, +/obj/structure/flora/lunar_plant/style_2, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "hM" = ( -/obj/item/stack/sheet/bluespace_crystal, -/obj/machinery/button/door{ - id = "geodebridge"; - name = "Window Shutters Control"; - pixel_y = 30 +/obj/machinery/porta_turret/syndicate/teleport{ + dir = 4; + faction = list("pirate") }, -/turf/open/misc/dirt/jungle, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/pirate) "id" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -159,14 +154,13 @@ /turf/open/floor/plating, /area/shuttle/pirate) "ka" = ( -/obj/machinery/light/small/blacklight/directional{ - dir = 4 - }, -/turf/open/misc/dirt/jungle, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/item/trash/energybar, +/turf/open/floor/plating, /area/shuttle/pirate) "ko" = ( -/obj/machinery/piratepad, -/turf/open/misc/dirt/jungle, +/obj/item/trash/energybar, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "kp" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -198,12 +192,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "kV" = ( -/obj/item/stack/sheet/bluespace_crystal{ - amount = 2 - }, -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/open/misc/dirt/jungle, +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "lt" = ( /turf/template_noop, @@ -221,20 +211,17 @@ /turf/open/floor/plating, /area/shuttle/pirate) "mv" = ( -/turf/open/misc/dirt, +/obj/machinery/porta_turret/syndicate/teleport{ + dir = 8; + faction = list("pirate") + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/pirate) "nk" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/blacklight/directional{ - dir = 8 +/obj/item/stack/sheet/bluespace_crystal{ + amount = 2 }, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "nD" = ( /obj/machinery/light/small/blacklight/directional{ @@ -315,8 +302,13 @@ /turf/open/floor/plating, /area/shuttle/pirate) "qp" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/misc/dirt/jungle, +/obj/item/stack/sheet/bluespace_crystal, +/obj/machinery/button/door{ + id = "geodebridge"; + name = "Window Shutters Control"; + pixel_y = 30 + }, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "qK" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -343,6 +335,12 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) +"rn" = ( +/obj/structure/closet/crate/miningcar, +/obj/effect/spawner/random/maintenance/three, +/obj/item/mining_scanner, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) "rG" = ( /obj/effect/turf_decal/lunar_sand/plating, /obj/effect/turf_decal/weather/dirt{ @@ -383,6 +381,17 @@ /turf/open/floor/plating, /area/shuttle/pirate) "uH" = ( +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 + }, +/obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/shuttle/pirate) "uP" = ( @@ -395,10 +404,21 @@ }, /turf/open/floor/iron/dark, /area/shuttle/pirate) +"vj" = ( +/obj/machinery/computer/shuttle/pirate{ + dir = 8 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) "vl" = ( +/obj/effect/spawner/random/maintenance, +/obj/item/shovel, /obj/structure/closet/crate/miningcar, -/obj/effect/spawner/random/maintenance/three, -/turf/open/misc/dirt/jungle, +/obj/item/stack/sheet/mineral/coal, +/obj/item/stack/rods{ + amount = 5 + }, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "vP" = ( /obj/structure/table/reinforced, @@ -431,16 +451,24 @@ /turf/open/floor/plating, /area/shuttle/pirate) "wz" = ( -/obj/machinery/computer/piratepad_control, -/turf/open/misc/dirt/jungle, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 3 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, /area/shuttle/pirate) "xg" = ( /obj/structure/grille, /obj/effect/spawner/structure/window/hollow/survival_pod, -/turf/open/misc/dirt{ - planetary_atmos = 0; - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/obj/structure/barricade/wooden/crude, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "xN" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -450,8 +478,9 @@ /turf/open/floor/plating, /area/shuttle/pirate) "xS" = ( -/obj/structure/chair/wood, -/turf/open/misc/dirt/jungle, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north, +/obj/item/stack/ore/silver, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "yh" = ( /obj/structure/cable, @@ -464,8 +493,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "yz" = ( -/obj/structure/flora/lunar_plant/style_1, -/turf/open/misc/dirt/jungle, +/obj/structure/flora/lunar_plant/style_3, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "zO" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -475,28 +504,21 @@ /turf/open/floor/plating, /area/shuttle/pirate) "zS" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 +/obj/item/stack/sheet/bluespace_crystal{ + amount = 2 }, -/turf/open/floor/plating, +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "zZ" = ( -/obj/item/stack/sheet/bluespace_crystal, -/turf/open/misc/dirt/jungle, +/obj/structure/reagent_dispensers/watertank, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "At" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small/blacklight/directional{ - dir = 8 +/turf/closed/mineral/random/jungle{ + baseturfs = null }, -/turf/open/floor/plating, /area/shuttle/pirate) "AT" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -519,11 +541,13 @@ /turf/open/floor/plating, /area/shuttle/pirate) "BA" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/table/wood, -/obj/machinery/microwave, -/obj/effect/mapping_helpers/airalarm/all_access, -/turf/open/misc/dirt/jungle, +/obj/structure/closet/crate/cardboard{ + name = "box of climbing hooks" + }, +/obj/item/climbing_hook/syndicate, +/obj/item/climbing_hook/syndicate, +/obj/item/climbing_hook/syndicate, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "BI" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -547,11 +571,8 @@ /turf/closed/wall/mineral/iron, /area/shuttle/pirate) "Ds" = ( -/obj/structure/rack, -/obj/item/storage/box/syringes, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/turf/open/misc/dirt/jungle, +/obj/machinery/loot_locator, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Dw" = ( /obj/machinery/power/port_gen/pacman{ @@ -575,14 +596,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "DT" = ( -/obj/effect/spawner/random/maintenance, -/obj/item/shovel, -/obj/structure/closet/crate/miningcar, -/obj/item/stack/sheet/mineral/coal, -/obj/item/stack/rods{ - amount = 5 - }, -/turf/open/misc/dirt/jungle, +/obj/structure/fluff/minepost, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Ec" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -614,10 +629,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "Gj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/misc/dirt/jungle, +/obj/machinery/piratepad, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "GQ" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -641,12 +654,12 @@ /turf/open/floor/plating, /area/shuttle/pirate) "HJ" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/misc/dirt/jungle, +/obj/machinery/shuttle_scrambler, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "HY" = ( -/obj/machinery/loot_locator, -/turf/open/misc/dirt/jungle, +/obj/effect/spawner/random/trash/mess, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Ig" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -691,6 +704,10 @@ }, /turf/open/floor/iron/dark, /area/shuttle/pirate) +"JK" = ( +/obj/item/stack/sheet/bluespace_crystal, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) "JL" = ( /obj/effect/turf_decal/lunar_sand/plating, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -713,9 +730,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "KK" = ( -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north, -/obj/item/stack/ore/silver, -/turf/open/misc/dirt/jungle, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Mc" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -764,17 +780,19 @@ /turf/open/floor/plating, /area/shuttle/pirate) "Nb" = ( -/obj/structure/grille, -/obj/effect/spawner/structure/window/hollow/survival_pod, -/obj/structure/barricade/wooden/crude, -/turf/open/misc/dirt{ - planetary_atmos = 0; - initial_gas_mix = "o2=22;n2=82;TEMP=293.15" - }, +/obj/structure/rack, +/obj/item/storage/box/syringes, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/fire, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "NT" = ( -/obj/structure/fluff/minepost, -/turf/open/misc/dirt/jungle, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/item/trash/energybar, +/turf/open/floor/plating, /area/shuttle/pirate) "Od" = ( /turf/closed/wall/mineral/iron, @@ -792,33 +810,6 @@ /turf/open/floor/plating, /area/shuttle/pirate) "OP" = ( -/obj/machinery/space_heater, -/turf/open/misc/dirt/jungle, -/area/shuttle/pirate) -"OR" = ( -/obj/machinery/porta_turret/syndicate/teleport{ - faction = list("pirate") - }, -/turf/closed/wall/mineral/iron, -/area/shuttle/pirate) -"OX" = ( -/obj/structure/sign/poster/contraband/bountyhunters, -/turf/closed/wall/mineral/iron, -/area/shuttle/pirate) -"Pq" = ( -/obj/machinery/power/shuttle_engine/large{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"Pr" = ( -/obj/structure/flora/lunar_plant/style_3, -/turf/open/misc/dirt/jungle, -/area/shuttle/pirate) -"PB" = ( /obj/structure/rack, /obj/item/gun/energy/recharge/kinetic_accelerator{ pixel_y = 5 @@ -841,13 +832,45 @@ /obj/item/borg/upgrade/modkit/indoors{ pixel_y = -5 }, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/shuttle/pirate) -"Qg" = ( -/obj/machinery/computer/shuttle/pirate{ +"OR" = ( +/obj/machinery/porta_turret/syndicate/teleport{ + faction = list("pirate") + }, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"OX" = ( +/obj/structure/sign/poster/contraband/bountyhunters, +/turf/closed/wall/mineral/iron, +/area/shuttle/pirate) +"Pq" = ( +/obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, -/turf/open/misc/dirt/jungle, +/turf/open/floor/plating, +/area/shuttle/pirate) +"Pr" = ( +/obj/structure/table/wood, +/obj/item/food/energybar{ + pixel_y = 9 + }, +/obj/item/food/energybar, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"PB" = ( +/obj/machinery/light/small/blacklight/directional{ + dir = 4 + }, +/turf/open/misc/dirt/station, +/area/shuttle/pirate) +"Qg" = ( +/obj/structure/grille, +/obj/effect/spawner/structure/window/hollow/survival_pod, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "geodebridge" + }, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Qo" = ( /turf/open/floor/iron/stairs{ @@ -864,8 +887,7 @@ /turf/open/floor/iron/dark, /area/shuttle/pirate) "Rp" = ( -/obj/machinery/shuttle_scrambler, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Rv" = ( /obj/effect/turf_decal/weather/dirt{ @@ -902,7 +924,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "Sy" = ( -/turf/open/misc/dirt/jungle, +/obj/structure/chair/wood, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "SP" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -915,8 +938,8 @@ /turf/open/floor/plating, /area/shuttle/pirate) "TC" = ( -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, +/obj/structure/flora/lunar_plant/style_1, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "Uf" = ( /obj/machinery/power/shuttle_engine/heater{ @@ -940,21 +963,16 @@ /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/pirate) "UM" = ( -/obj/item/stack/sheet/bluespace_crystal{ - amount = 2 - }, -/obj/machinery/light/small/blacklight/directional{ - dir = 8 - }, -/turf/open/misc/dirt/jungle, +/obj/structure/grille, +/obj/effect/spawner/structure/window/hollow/survival_pod, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "UY" = ( +/obj/machinery/airalarm/directional/north, /obj/structure/table/wood, -/obj/item/food/energybar{ - pixel_y = 9 - }, -/obj/item/food/energybar, -/turf/open/misc/dirt/jungle, +/obj/machinery/microwave, +/obj/effect/mapping_helpers/airalarm/all_access, +/turf/open/misc/dirt/station, /area/shuttle/pirate) "WR" = ( /obj/effect/turf_decal/lunar_sand/plating, @@ -994,11 +1012,13 @@ /turf/open/floor/plating, /area/shuttle/pirate) "ZF" = ( -/obj/machinery/suit_storage_unit/pirate{ - helmet_type = /obj/item/clothing/head/helmet/space/syndicate/blue; - suit_type = /obj/item/clothing/suit/space/syndicate/blue +/obj/item/stack/sheet/bluespace_crystal{ + amount = 2 + }, +/obj/machinery/light/small/blacklight/directional{ + dir = 8 }, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/shuttle/pirate) (1,1,1) = {" @@ -1007,68 +1027,47 @@ lt lt lt lt -lt -lt -lt -yu yu -aM -lt -lt -lt -lt -lt -lt -lt -lt -"} -(2,1,1) = {" -lt -lt -lt -lt -lt yu -Pq jh -uH -uH -uH +yu +yu +yu jh yu -Pq +yu lt lt lt lt lt "} -(3,1,1) = {" +(2,1,1) = {" lt lt lt -jx +mv Od -uH -uH -jx -uH -uH -uH -jx -uH -uH +Pq +Pq +At +Pq +Pq +Pq +At +Pq +Pq Od -jx +mv lt lt lt "} -(4,1,1) = {" +(3,1,1) = {" lt lt -jx -jx +At +At Od Uf Uf @@ -1080,18 +1079,18 @@ Od Uf Uf Od -jx -jx +At +At lt lt "} -(5,1,1) = {" +(4,1,1) = {" lt lt jx jx Od -NT +DT kp Uw Ku @@ -1099,66 +1098,66 @@ ME Dw Uw ZD -NT +DT Od jx jx lt lt "} -(6,1,1) = {" +(5,1,1) = {" lt lt lt jx Od -Sy -zS +Rp +fO IP DM JL DM SP Ih -ga +nk Od jx lt lt lt "} -(7,1,1) = {" +(6,1,1) = {" lt jx jx jx Od -xS -kV +Sy +zS nR WR Oq Mc xN wd -OP +ga Od jx jx jx lt "} -(8,1,1) = {" +(7,1,1) = {" jx jx jx jx Od -KK -gv -Sy -Sy -Sy +xS +kV +ko +Rp +Rp Od Od kM @@ -1169,28 +1168,28 @@ jx jx jx "} -(9,1,1) = {" +(8,1,1) = {" jx jx jx jx Od -ZF -ZF -ZF -Ds -PB +gv +gv +gv +Nb +OP Od -Pr +yz Mm -Sy -vl +Rp +rn Od jx jx jx "} -(10,1,1) = {" +(9,1,1) = {" jx jx Od @@ -1202,58 +1201,58 @@ Od Od Od OX -UY +Pr Mm -ga -DT +nk +vl Od jx jx jx "} -(11,1,1) = {" +(10,1,1) = {" lt jt Od -NT -UM -yz +DT +ZF +TC Od -Rp -nk -HY +HJ +aM +Ds Od -BA +UY Mm -Sy -NT +Rp +DT Od Od Od lt "} -(12,1,1) = {" +(11,1,1) = {" lt -gM -xg -bY +at +UM +NT oa zO Od -Sy -ga -Sy +Rp +nk +Rp Od -Sy +BA Mm -Sy +Rp Dx uk St AT lt "} -(13,1,1) = {" +(12,1,1) = {" lt XB Od @@ -1274,49 +1273,49 @@ Od OR lt "} -(14,1,1) = {" +(13,1,1) = {" lt -mv -Nb +Rp +xg fO pO im Od -ev -rG -Gj +gM +wz +bY Od -Sy -zZ -Sy +HY +JK +Rp lA id St Fx lt "} -(15,1,1) = {" +(14,1,1) = {" lt jx Od -NT -ka -ga +DT +PB +nk Od -wz +ev rG -ko +Gj Od -qp -HJ -Sy -NT +KK +zZ +Rp +DT Od Od Od lt "} -(16,1,1) = {" +(15,1,1) = {" lt jx Od @@ -1337,7 +1336,7 @@ jx jx lt "} -(17,1,1) = {" +(16,1,1) = {" lt jx Od @@ -1345,7 +1344,7 @@ Er YK Qo el -At +uH kx iu iu @@ -1358,14 +1357,14 @@ Od jx lt "} -(18,1,1) = {" +(17,1,1) = {" lt jx Od jD -TC +ka yh -hM +qp oV Hm Mz @@ -1379,18 +1378,18 @@ Cg jx lt "} -(19,1,1) = {" +(18,1,1) = {" lt jx Od Od Od Od -NT -Qg +DT +vj vP vY -NT +DT Rv uP JV @@ -1400,7 +1399,7 @@ Od jx lt "} -(20,1,1) = {" +(19,1,1) = {" lt jx jx @@ -1408,9 +1407,9 @@ jx jx Od Od -at -at -at +Qg +Qg +Qg Od Od Od @@ -1421,18 +1420,18 @@ jx jx lt "} -(21,1,1) = {" +(20,1,1) = {" lt lt jx jx jx jx -jx +hM lt lt lt -jx +hM jx jx jx @@ -1442,7 +1441,7 @@ jx lt lt "} -(22,1,1) = {" +(21,1,1) = {" lt lt lt diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index 88f9518a08e..e5ab02c0924 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -14,6 +14,13 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE +/turf/open/misc/dirt/station + name = "dirt flooring" //FOR THE LOVE OF GOD USE THIS INSTEAD OF DIRT FOR STATION MAPS + desc = "You heard this place was dirty, but this is just absurd." + baseturfs = /turf/open/floor/plating + initial_gas_mix = OPENTURF_LOW_PRESSURE + planetary_atmos = FALSE + /turf/open/misc/dirt/dark icon_state = "greenerdirt" base_icon_state = "greenerdirt" From a91359f9d73bff6e15944286b0f0a23d8d2186e1 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 02:23:31 +0200 Subject: [PATCH 059/101] Adds contractor baton to traitor uplink. [MDB IGNORE] (#23966) * Adds contractor baton to traitor uplink. (#78629) ## About The Pull Request Reduces ebow timer to 0 rep. Adds in contractor baton, with 0 rep requirement, costing 12 TC. ## Why It's Good For The Game Traitors need more tools to restrain crewmates without outright killing them. Approved by Watermelon: ![image](https://github.com/tgstation/tgstation/assets/66163761/9e31dfd9-4aa3-4c4f-9ba4-39356b2a6d47) ## Changelog :cl: add: Contractor baton in traitor uplink for 12 TC balance: Ebow no longer has a reputation requirement. /:cl: * Adds contractor baton to traitor uplink. --------- Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com> --- code/modules/uplink/uplink_items/stealthy.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 54c9bbe9adc..491f8e8e99d 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -90,7 +90,16 @@ slur as if inebriated. It can produce an infinite number \ of bolts, but takes time to automatically recharge after each shot." item = /obj/item/gun/energy/recharge/ebow - progression_minimum = 30 MINUTES cost = 10 surplus = 50 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/datum/uplink_item/stealthy_weapons/contrabaton + name = "Contractor Baton" + desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. \ + These shocks are capable of affecting the inner circuitry of most robots as well, applying a short stun. \ + Has the added benefit of affecting the vocal cords of your victim, causing them to slur as if inebriated." + item = /obj/item/melee/baton/telescopic/contractor_baton + cost = 12 + surplus = 50 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) From feb0de865d3c4543a0819e0308a216574cf6bf42 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 28 Sep 2023 04:30:02 +0200 Subject: [PATCH 060/101] Basic Legion & Hivelord [MDB IGNORE] (#23964) * Basic Legion & Hivelord * Update modular + fix diffs * Fixing diffs * More diffs * Adds an AI behavior to replace the 'wander = 0' varedit for the hivelord gate guardians --------- Co-authored-by: Jacquerel Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com> --- .../skyrat/lavaland_surface_arena.dmm | 12 +- .../SpaceRuins/atmosasteroidruin.dmm | 2 +- _maps/RandomRuins/SpaceRuins/prey_pod.dmm | 6 +- .../RandomRuins/SpaceRuins/prison_shuttle.dmm | 4 +- code/__DEFINES/ai/ai_blackboard.dm | 4 + code/__DEFINES/ai/monsters.dm | 7 + code/__DEFINES/mood.dm | 1 + code/__DEFINES/status_effects.dm | 1 + .../run_away_from_target.dm | 12 +- .../basic_ai_behaviors/targetting.dm | 10 +- .../basic_mobs/basic_subtrees/flee_target.dm | 7 +- .../basic_subtrees/maintain_distance.dm | 2 +- .../basic_subtrees/speech_subtree.dm | 35 +- .../basic_subtrees/targeted_mob_ability.dm | 3 + .../ai/basic_mobs/generic_controllers.dm | 26 ++ code/datums/ai/generic/generic_behaviors.dm | 10 + code/datums/components/appearance_on_aggro.dm | 54 +-- code/datums/mapgen/CaveGenerator.dm | 2 +- code/datums/mapgen/Cavegens/IcemoonCaves.dm | 4 +- .../mood_events/generic_negative_events.dm | 3 + code/datums/mutations/antenna.dm | 25 +- code/game/machinery/computer/crew.dm | 3 +- .../objects/effects/decals/cleanable/misc.dm | 4 + .../effects/spawners/random/lavaland_mobs.dm | 6 +- .../structures/icemoon/cave_entrance.dm | 2 +- .../structures/lavaland/necropolis_tendril.dm | 2 +- code/game/objects/structures/spawner.dm | 4 +- .../antagonists/changeling/powers/absorb.dm | 23 +- .../antagonists/changeling/powers/panacea.dm | 4 +- .../monster_organs/regenerative_core.dm | 2 +- .../jungle/mega_arachnid/mega_arachnid_ai.dm | 2 +- .../basic/lavaland/basilisk/basilisk.dm | 1 + .../living/basic/lavaland/goliath/goliath.dm | 15 +- .../basic/lavaland/hivelord/hivelord.dm | 114 ++++++ .../basic/lavaland/hivelord/hivelord_ai.dm | 14 + .../lavaland/hivelord/spawn_hivelord_brood.dm | 124 +++++++ .../living/basic/lavaland/legion/legion.dm | 158 +++++++++ .../living/basic/lavaland/legion/legion_ai.dm | 77 ++++ .../basic/lavaland/legion/legion_brood.dm | 99 ++++++ .../basic/lavaland/legion/legion_tumour.dm | 159 +++++++++ .../basic/lavaland/legion/spawn_legions.dm | 109 ++++++ .../mob/living/basic/lavaland/mining.dm | 4 + .../basic/lavaland/watcher/watcher_ai.dm | 2 +- .../space_fauna/netherworld/blankbody.dm | 15 +- .../basic/space_fauna/netherworld/creature.dm | 15 +- .../basic/space_fauna/netherworld/migo.dm | 15 +- .../space_fauna/paper_wizard/paper_wizard.dm | 15 +- .../spider/young_spider/young_spider.dm | 4 +- code/modules/mob/living/basic/vermin/mouse.dm | 9 +- .../hostile/megafauna/hierophant.dm | 2 +- .../simple_animal/hostile/megafauna/legion.dm | 9 +- .../hostile/mining_mobs/elites/legionnaire.dm | 13 +- .../hostile/mining_mobs/hivelord.dm | 333 ------------------ code/modules/mob/mob_helpers.dm | 30 ++ .../mob_spawn/corpses/mining_corpses.dm | 88 +++-- .../mapGenerators/asteroid.dm | 2 +- code/modules/surgery/organs/_organ.dm | 7 +- .../internal/cyberimp/augments_internal.dm | 1 + .../surgery/organs/internal/ears/_ears.dm | 1 + .../surgery/organs/internal/eyes/_eyes.dm | 3 +- .../surgery/organs/internal/heart/_heart.dm | 1 + .../surgery/organs/internal/liver/_liver.dm | 1 + .../surgery/organs/internal/lungs/_lungs.dm | 1 + .../organs/internal/stomach/_stomach.dm | 1 + .../surgery/organs/internal/tongue/_tongue.dm | 1 + .../unit_tests/simple_animal_freeze.dm | 12 - .../mob/simple/lavaland/lavaland_monsters.dmi | Bin 134625 -> 134470 bytes icons/mob/telegraphing/telegraph.dmi | Bin 1750 -> 1973 bytes icons/obj/medical/organs/mining_organs.dmi | Bin 2448 -> 2645 bytes .../ashwalkers/code/effects/ash_rituals.dm | 2 +- .../mapping/code/lavaland_ruin_code.dm | 12 + tgstation.dme | 11 +- tgui/packages/tgui/interfaces/CrewConsole.js | 57 ++- .../Scripts/78624_simple_to_basic_legion.txt | 3 + 74 files changed, 1229 insertions(+), 593 deletions(-) create mode 100644 code/__DEFINES/mood.dm create mode 100644 code/datums/ai/basic_mobs/generic_controllers.dm create mode 100644 code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm create mode 100644 code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm create mode 100644 code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm create mode 100644 code/modules/mob/living/basic/lavaland/legion/legion.dm create mode 100644 code/modules/mob/living/basic/lavaland/legion/legion_ai.dm create mode 100644 code/modules/mob/living/basic/lavaland/legion/legion_brood.dm create mode 100644 code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm create mode 100644 code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm create mode 100644 tools/UpdatePaths/Scripts/78624_simple_to_basic_legion.txt diff --git a/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_arena.dmm b/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_arena.dmm index bce0b173159..47fd82ad043 100644 --- a/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_arena.dmm +++ b/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_arena.dmm @@ -113,10 +113,9 @@ /obj/structure/stone_tile{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord{ +/mob/living/basic/mining/hivelord/no_wander{ color = "red"; name = "gate guardian"; - wander = 0 }, /turf/open/lava/smooth/lava_land_surface{ slowdown = 0 @@ -308,10 +307,9 @@ /obj/structure/stone_tile{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/hivelord{ +/mob/living/basic/mining/hivelord/no_wander{ color = "red"; name = "gate guardian"; - wander = 0 }, /turf/open/lava/smooth/lava_land_surface{ slowdown = 0 @@ -627,10 +625,9 @@ /obj/structure/stone_tile{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/hivelord{ +/mob/living/basic/mining/hivelord/no_wander{ color = "red"; name = "gate guardian"; - wander = 0 }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) @@ -778,10 +775,9 @@ /obj/structure/stone_tile{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord{ +/mob/living/basic/mining/hivelord/no_wander{ color = "red"; name = "gate guardian"; - wander = 0 }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) diff --git a/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm b/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm index 1d63a1a0070..7e3b7000c42 100644 --- a/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm +++ b/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm @@ -637,7 +637,7 @@ /obj/effect/turf_decal/tile/yellow/half{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) "RK" = ( diff --git a/_maps/RandomRuins/SpaceRuins/prey_pod.dmm b/_maps/RandomRuins/SpaceRuins/prey_pod.dmm index 9089dea664c..6f53409b873 100644 --- a/_maps/RandomRuins/SpaceRuins/prey_pod.dmm +++ b/_maps/RandomRuins/SpaceRuins/prey_pod.dmm @@ -17,7 +17,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "p" = ( @@ -32,7 +32,7 @@ /area/ruin/space/has_grav) "D" = ( /obj/structure/chair/comfy/shuttle, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "E" = ( @@ -57,7 +57,7 @@ /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "S" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "T" = ( diff --git a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm index 5aeba75b3bd..6acec2ccc43 100644 --- a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm +++ b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm @@ -56,7 +56,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/prison_shuttle) "q" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/misc/asteroid/airless, /area/ruin/space/prison_shuttle) "r" = ( @@ -84,7 +84,7 @@ /turf/open/floor/mineral/titanium/tiled/airless, /area/ruin/space/prison_shuttle) "w" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/plating/airless, /area/ruin/space/prison_shuttle) "x" = ( diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index 443a51a7eb7..e23a5a12dba 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -8,6 +8,8 @@ #define BB_FOOD_TARGET "bb_food_target" ///Path we should use next time we use the JPS movement datum #define BB_PATH_TO_USE "BB_path_to_use" +///How close a mob must be for us to select it as a target, if that is less than how far we can maintain it as a target +#define BB_AGGRO_RANGE "BB_aggro_range" ///song instrument blackboard, set by instrument subtrees #define BB_SONG_INSTRUMENT "BB_SONG_INSTRUMENT" @@ -41,6 +43,8 @@ #define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target" #define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location" #define BB_FLEE_TARGETTING_DATUM "flee_targetting_datum" +#define BB_BASIC_MOB_FLEE_DISTANCE "BB_basic_flee_distance" +#define DEFAULT_BASIC_FLEE_DISTANCE 9 /// Generic key for a non-specific targetted action #define BB_TARGETTED_ACTION "BB_targetted_action" diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 927f3736832..be9a4be34cd 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -146,3 +146,10 @@ #define BB_RAPIDSEEDS_ABILITY "rapidseeds_ability" /// key holds the tray we will beam #define BB_BEAMABLE_HYDROPLANT_TARGET "beamable_hydroplant_target" + +/// Corpse we have consumed +#define BB_LEGION_CORPSE "legion_corpse" +/// Things our target recently said +#define BB_LEGION_RECENT_LINES "legion_recent_lines" +/// The creator of our legion skull +#define BB_LEGION_BROOD_CREATOR "legion_brood_creator" diff --git a/code/__DEFINES/mood.dm b/code/__DEFINES/mood.dm new file mode 100644 index 00000000000..161f253b04c --- /dev/null +++ b/code/__DEFINES/mood.dm @@ -0,0 +1 @@ +#define MOOD_CATEGORY_LEGION_CORE "regenerative core" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 50b33eb4c75..ea182b4088f 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -37,6 +37,7 @@ #define STASIS_CHEMICAL_EFFECT "stasis_chemical" #define STASIS_SHAPECHANGE_EFFECT "stasis_shapechange" #define STASIS_ADMIN "stasis_admin" +#define STASIS_LEGION_EATEN "stasis_eaten" /// Causes the mob to become blind via the passed source #define become_blind(source) apply_status_effect(/datum/status_effect/grouped/blindness, source) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index 486f9a0fdb2..bd86260ee89 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -4,7 +4,7 @@ action_cooldown = 0 behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION /// How far do we try to run? Further makes for smoother running, but potentially weirder pathfinding - var/run_distance = 9 + var/run_distance = DEFAULT_BASIC_FLEE_DISTANCE /// Clear target if we finish the action unsuccessfully var/clear_failed_targets = TRUE @@ -12,6 +12,7 @@ var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if(QDELETED(target)) return FALSE + run_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || initial(run_distance) if(!plot_path_away_from(controller, target)) return FALSE return ..() @@ -21,13 +22,12 @@ if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) return var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] - var/escaped = QDELETED(target) || !can_see(controller.pawn, target, run_distance) // If we can't see it we got away - if (escaped) + if (QDELETED(target) || !can_see(controller.pawn, target, run_distance)) finish_action(controller, succeeded = TRUE, target_key = target_key, hiding_location_key = hiding_location_key) return - if (get_dist(controller.pawn, controller.current_movement_target) > required_distance) - return - if(plot_path_away_from(controller, target)) + if (get_dist(controller.pawn, controller.current_movement_target) >= required_distance) + return // Still heading over + if (plot_path_away_from(controller, target)) return finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm index 9d7587c712b..0b9e31db667 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm @@ -2,6 +2,8 @@ action_cooldown = 2 SECONDS /// How far can we see stuff? var/vision_range = 9 + /// Blackboard key for aggro range, uses vision range if not specified + var/aggro_range_key = BB_AGGRO_RANGE /// Static typecache list of potentially dangerous objs var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) @@ -18,11 +20,13 @@ finish_action(controller, succeeded = FALSE) return + var/aggro_range = controller.blackboard[aggro_range_key] || vision_range + controller.clear_blackboard_key(target_key) - var/list/potential_targets = hearers(vision_range, controller.pawn) - living_mob //Remove self, so we don't suicide + var/list/potential_targets = hearers(aggro_range, controller.pawn) - living_mob //Remove self, so we don't suicide - for(var/HM in typecache_filter_list(range(vision_range, living_mob), hostile_machines)) //Can we see any hostile machines? - if(can_see(living_mob, HM, vision_range)) + for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines? + if(can_see(living_mob, HM, aggro_range)) potential_targets += HM if(!potential_targets.len) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm index a4982fa660e..8d1391f7c7d 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm @@ -9,8 +9,13 @@ /datum/ai_planning_subtree/flee_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - if (!controller.blackboard[BB_BASIC_MOB_FLEEING] || !controller.blackboard_key_exists(target_key)) + var/atom/flee_from = controller.blackboard[target_key] + if (!controller.blackboard[BB_BASIC_MOB_FLEEING] || QDELETED(flee_from)) return + var/flee_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || DEFAULT_BASIC_FLEE_DISTANCE + if (get_dist(controller.pawn, flee_from) >= flee_distance) + return + controller.queue_behavior(flee_behaviour, target_key, hiding_place_key) return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here. diff --git a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm index b80a28836a0..c09e7cdbf75 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm @@ -3,7 +3,7 @@ /// Blackboard key holding atom we want to stay away from var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// How close will we allow our target to get? - var/minimum_distance = 3 + var/minimum_distance = 4 /// How far away will we allow our target to get? var/maximum_distance = 6 /// How far do we look for our target? diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index e040a566bcf..52f4a3459bf 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -22,24 +22,27 @@ emote_see = string_list(emote_see) /datum/ai_planning_subtree/random_speech/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(SPT_PROB(speech_chance, seconds_per_tick)) - var/audible_emotes_length = emote_hear?.len - var/non_audible_emotes_length = emote_see?.len - var/speak_lines_length = speak?.len + if(!SPT_PROB(speech_chance, seconds_per_tick)) + return + speak(controller) - var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length +/// Actually perform an action +/datum/ai_planning_subtree/random_speech/proc/speak(datum/ai_controller/controller) + var/audible_emotes_length = emote_hear?.len + var/non_audible_emotes_length = emote_see?.len + var/speak_lines_length = speak?.len - var/random_number_in_range = rand(1, total_choices_length) + var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length - // Sound that plays when the mob does something audible - var/sound_to_play = length(sound) > 0 ? pick(sound) : null + var/random_number_in_range = rand(1, total_choices_length) + var/sound_to_play = length(sound) > 0 ? pick(sound) : null - if(random_number_in_range <= audible_emotes_length) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear), sound_to_play) - else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) - else - controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), sound_to_play) + if(random_number_in_range <= audible_emotes_length) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear), sound_to_play) + else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) + else + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), sound_to_play) /datum/ai_planning_subtree/random_speech/insect speech_chance = 5 @@ -218,7 +221,9 @@ var/list/speech_lines = controller.blackboard[BB_BASIC_MOB_SPEAK_LINES] if(isnull(speech_lines)) return ..() - + + // Note to future developers: this behaviour a singleton so this probably doesn't work as you would expect + // The whole speech tree really needs to be refactored because this isn't how we use AI data these days speak = speech_lines[BB_EMOTE_SAY] || list() emote_see = speech_lines[BB_EMOTE_SEE] || list() emote_hear = speech_lines[BB_EMOTE_HEAR] || list() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm index 8d75f797163..d9ee3ef0918 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm @@ -23,3 +23,6 @@ controller.queue_behavior(use_ability_behaviour, ability_key, target_key) if (finish_planning) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/targeted_mob_ability/continue_planning + finish_planning = FALSE diff --git a/code/datums/ai/basic_mobs/generic_controllers.dm b/code/datums/ai/basic_mobs/generic_controllers.dm new file mode 100644 index 00000000000..208c1833add --- /dev/null +++ b/code/datums/ai/basic_mobs/generic_controllers.dm @@ -0,0 +1,26 @@ +/// The most basic AI tree which just finds a guy and then runs at them to click them +/datum/ai_controller/basic_controller/simple_hostile + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Find a target, walk at target, attack intervening obstacles +/datum/ai_controller/basic_controller/simple_hostile_obstacles + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index fd6d848f2d6..4f816de4be3 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -307,6 +307,16 @@ playsound(living_pawn, speech_sound, 80, vary = TRUE) finish_action(controller, TRUE) +/datum/ai_behavior/perform_speech_radio + +/datum/ai_behavior/perform_speech_radio/perform(seconds_per_tick, datum/ai_controller/controller, speech, obj/item/radio/speech_radio, list/try_channels = list(RADIO_CHANNEL_COMMON)) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn) || !istype(speech_radio) || QDELETED(speech_radio) || !length(try_channels)) + finish_action(controller, FALSE) + return + speech_radio.talk_into(living_pawn, speech, pick(try_channels)) + finish_action(controller, TRUE) + //song behaviors /datum/ai_behavior/setup_instrument diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm index affb926d28d..33a3d7c2e90 100644 --- a/code/datums/components/appearance_on_aggro.dm +++ b/code/datums/components/appearance_on_aggro.dm @@ -1,11 +1,14 @@ /** - * component gave to basic creatures to allow them to change appearance when find a target + * Changes visuals of the attached mob while it has a target */ /datum/component/appearance_on_aggro + /// Blackboardey to search for a target var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// Icon state to use when we have a target + var/aggro_state /// path of the overlay to apply - var/mutable_appearance/overlay_path + var/mutable_appearance/aggro_overlay /// visibility of our icon when aggroed var/alpha_on_aggro /// visibility of our icon when deaggroed @@ -13,20 +16,22 @@ /// do we currently have a target var/atom/current_target -/datum/component/appearance_on_aggro/Initialize(overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) - if(!isliving(parent)) +/datum/component/appearance_on_aggro/Initialize(aggro_state, overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) + if (!isliving(parent)) return COMPONENT_INCOMPATIBLE - if(overlay_icon && overlay_state) - src.overlay_path = mutable_appearance(overlay_icon, overlay_state) - if(!alpha_on_aggro || !alpha_on_deaggro) - return + src.aggro_state = aggro_state src.alpha_on_aggro = alpha_on_aggro src.alpha_on_deaggro = alpha_on_deaggro + if (!isnull(overlay_icon) && !isnull(overlay_state)) + aggro_overlay = mutable_appearance(overlay_icon, overlay_state) /datum/component/appearance_on_aggro/RegisterWithParent() - RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(change_overlays)) RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_set_target)) RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(on_clear_target)) + if (!isnull(aggro_state)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated)) + if (!isnull(aggro_overlay)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) /datum/component/appearance_on_aggro/UnregisterFromParent() . = ..() @@ -36,37 +41,42 @@ SIGNAL_HANDLER var/atom/target = source.ai_controller.blackboard[target_key] - if(isnull(target)) + if (QDELETED(target)) return + current_target = target RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_clear_target)) - if(overlay_path) - source.update_appearance(UPDATE_OVERLAYS) - if(alpha_on_aggro) + if (!isnull(aggro_overlay) || !isnull(aggro_state)) + source.update_appearance(UPDATE_ICON) + if (!isnull(alpha_on_aggro)) animate(source, alpha = alpha_on_aggro, time = 2 SECONDS) /datum/component/appearance_on_aggro/Destroy() - if(current_target) + if (!isnull(current_target)) revert_appearance(parent) return ..() /datum/component/appearance_on_aggro/proc/on_clear_target(atom/source) SIGNAL_HANDLER - revert_appearance(parent) /datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) UnregisterSignal(current_target, COMSIG_QDELETING) current_target = null - if(overlay_path) - source.update_appearance(UPDATE_OVERLAYS) - if(alpha_on_deaggro) + if (!isnull(aggro_overlay) || !isnull(aggro_state)) + source.update_appearance(UPDATE_ICON) + if (!isnull(alpha_on_deaggro)) animate(source, alpha = alpha_on_deaggro, time = 2 SECONDS) -/datum/component/appearance_on_aggro/proc/change_overlays(atom/source, list/overlays) +/datum/component/appearance_on_aggro/proc/on_icon_state_updated(mob/living/source) SIGNAL_HANDLER - - if(isnull(current_target)) + if (source.stat == DEAD) return + source.icon_state = isnull(current_target) ? initial(source.icon_state) : aggro_state - overlays += overlay_path +/datum/component/appearance_on_aggro/proc/on_overlays_updated(atom/source, list/overlays) + SIGNAL_HANDLER + + if (isnull(current_target)) + return + overlays += aggro_overlay diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 8cb240526a4..754b8755545 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -55,7 +55,7 @@ /mob/living/basic/mining/basilisk = 4, /mob/living/basic/mining/goldgrub = 1, /mob/living/basic/mining/goliath/ancient = 5, - /mob/living/simple_animal/hostile/asteroid/hivelord = 3, + /mob/living/basic/mining/hivelord = 3, ) mob_spawn_list = expand_weights(weighted_mob_spawn_list) mob_spawn_no_mega_list = expand_weights(weighted_mob_spawn_list - SPAWN_MEGAFAUNA) diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 89a153aedd7..7d7437ccda6 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -4,9 +4,9 @@ weighted_mob_spawn_list = list( + /mob/living/basic/mining/legion/snow = 50, /mob/living/basic/mining/lobstrosity = 15, /mob/living/basic/mining/goldgrub = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/polarbear = 30, /mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, @@ -63,7 +63,7 @@ weighted_mob_spawn_list = list( SPAWN_MEGAFAUNA = 1, /mob/living/basic/mining/ice_whelp = 60, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 100, + /mob/living/basic/mining/legion/snow = 100, /mob/living/simple_animal/hostile/asteroid/ice_demon = 100, /obj/structure/spawner/ice_moon/demonic_portal = 6, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 6, diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index a5aa648ecee..53bcce6c6ff 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -167,6 +167,9 @@ mood_change = -4 timeout = 2 MINUTES +/datum/mood_event/healsbadman/long_term + timeout = 10 MINUTES + /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!" mood_change = -2 diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index bc5026ab148..b71f66c0fa6 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -91,32 +91,11 @@ // chance to alert the read-ee to_chat(cast_on, span_danger("You feel something foreign enter your mind.")) - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = cast_on.logging - //this whole loop puts the read-ee's say logs into say_log in an easy to access way - for(var/log_type in log_source) - var/nlog_type = text2num(log_type) - if(nlog_type & LOG_SAY) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - say_log = reverse_range(reversed.Copy()) - break - - for(var/spoken_memory in say_log) - //up to 3 random lines of speech, favoring more recent speech - if(length(recent_speech) >= 3) - break - if(prob(50)) - continue - // log messages with tags like telepathy are displayed like "(Telepathy to Ckey/(target)) "greetings""" - // by splitting the text by using a " delimiter, we can grab JUST the greetings part - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] - + var/list/recent_speech = cast_on.copy_recent_speech(copy_amount = 3, line_chance = 50) if(length(recent_speech)) to_chat(owner, span_boldnotice("You catch some drifting memories of their past conversations...")) for(var/spoken_memory in recent_speech) - to_chat(owner, span_notice("[recent_speech[spoken_memory]]")) + to_chat(owner, span_notice("[spoken_memory]")) if(iscarbon(cast_on)) var/mob/living/carbon/carbon_cast_on = cast_on diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 4ec567a95d6..c433565dbf8 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -262,8 +262,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) // SKYRAT EDIT END // Binary living/dead status + // Current status if (sensor_mode >= SENSOR_LIVING) - entry["life_status"] = (tracked_living_mob.stat != DEAD) + entry["life_status"] = tracked_living_mob.stat // Damage if (sensor_mode >= SENSOR_VITALS) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 6a519650d10..daaddb00ce0 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -212,6 +212,10 @@ icon_state += "-old" AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10) +/obj/effect/decal/cleanable/vomit/old/black_bile + name = "black bile" + desc = "There's something wiggling in there..." + color = COLOR_DARK /obj/effect/decal/cleanable/chem_pile name = "chemical pile" diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm index 8aa20cc90e7..7b4bec1f6a1 100644 --- a/code/game/objects/effects/spawners/random/lavaland_mobs.dm +++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm @@ -10,9 +10,9 @@ /mob/living/basic/mining/brimdemon = 1, /mob/living/basic/mining/goldgrub = 1, /mob/living/basic/mining/goliath = 1, + /mob/living/basic/mining/legion = 1, /mob/living/basic/mining/lobstrosity/lava = 1, /mob/living/basic/mining/watcher = 1, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 1, ) /// Spawns random watcher variants during map generation @@ -46,6 +46,6 @@ desc = "Chance to spawn a rare shiny version." icon_state = "legion" loot = list( - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 19, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf = 1, + /mob/living/basic/mining/legion = 19, + /mob/living/basic/mining/legion/dwarf = 1, ) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index 10f7a56c7f9..7393c20758e 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(ore_probability, list( mob_types = list(/mob/living/basic/mining/ice_whelp) /obj/structure/spawner/ice_moon/demonic_portal/snowlegion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal) + mob_types = list(/mob/living/basic/mining/legion/snow/spawner_made) /obj/effect/collapsing_demonic_portal name = "collapsing demonic portal" diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 542df563a1f..22f7f0422cd 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -23,7 +23,7 @@ mob_types = list(/mob/living/basic/mining/goliath) /obj/structure/spawner/lavaland/legion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) + mob_types = list(/mob/living/basic/mining/legion/spawner_made) /obj/structure/spawner/lavaland/icewatcher mob_types = list(/mob/living/basic/mining/watcher/icewing) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 7bbafd21ff2..340bcf212de 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -80,8 +80,8 @@ /mob/living/basic/mining/basilisk, /mob/living/basic/mining/goldgrub, /mob/living/basic/mining/goliath/ancient, + /mob/living/basic/mining/legion, /mob/living/basic/wumborian_fugu, - /mob/living/simple_animal/hostile/asteroid/hivelord, ) faction = list(FACTION_MINING) @@ -98,7 +98,7 @@ /obj/structure/spawner/mining/hivelord name = "hivelord den" desc = "A den housing a nest of hivelords." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) + mob_types = list(/mob/living/basic/mining/hivelord) /obj/structure/spawner/mining/basilisk name = "basilisk den" diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index c2ae89933d1..cee0f0da5b9 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -95,31 +95,14 @@ //Some of target's recent speech, so the changeling can attempt to imitate them better. //Recent as opposed to all because rounds tend to have a LOT of text. - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = target.logging - for(var/log_type in log_source) - var/nlog_type = text2num(log_type) - if(nlog_type & LOG_SAY) - var/list/reversed = log_source[log_type] - if(islist(reversed)) - say_log = reverse_range(reversed.Copy()) - break - - if(LAZYLEN(say_log) > LING_ABSORB_RECENT_SPEECH) - recent_speech = say_log.Copy(say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list - else - for(var/spoken_memory in say_log) - if(recent_speech.len >= LING_ABSORB_RECENT_SPEECH) - break - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + var/list/recent_speech = target.copy_recent_speech() if(recent_speech.len) changeling.antag_memory += "Some of [target]'s speech patterns, we should study these to better impersonate [target.p_them()]!
    " to_chat(owner, span_boldnotice("Some of [target]'s speech patterns, we should study these to better impersonate [target.p_them()]!")) for(var/spoken_memory in recent_speech) - changeling.antag_memory += "\"[recent_speech[spoken_memory]]\"
    " - to_chat(owner, span_notice("\"[recent_speech[spoken_memory]]\"")) + changeling.antag_memory += "\"[spoken_memory]\"
    " + to_chat(owner, span_notice("\"[spoken_memory]\"")) changeling.antag_memory += "We have no more knowledge of [target]'s speech patterns.
    " to_chat(owner, span_boldnotice("We have no more knowledge of [target]'s speech patterns.")) diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 25a267e03df..9fe7613cc4c 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -14,7 +14,9 @@ var/list/bad_organs = list( user.get_organ_by_type(/obj/item/organ/internal/empowered_borer_egg), // SKYRAT EDIT ADDITION user.get_organ_by_type(/obj/item/organ/internal/body_egg), - user.get_organ_by_type(/obj/item/organ/internal/zombie_infection)) + user.get_organ_by_type(/obj/item/organ/internal/legion_tumour), + user.get_organ_by_type(/obj/item/organ/internal/zombie_infection), + ) try_to_mutant_cure(user) //SKYRAT EDIT ADDITION diff --git a/code/modules/mining/equipment/monster_organs/regenerative_core.dm b/code/modules/mining/equipment/monster_organs/regenerative_core.dm index cb224438c00..98758d5a369 100644 --- a/code/modules/mining/equipment/monster_organs/regenerative_core.dm +++ b/code/modules/mining/equipment/monster_organs/regenerative_core.dm @@ -36,7 +36,7 @@ /// Log applications and apply moodlet. /obj/item/organ/internal/monster_core/regenerative_core/apply_to(mob/living/target, mob/user) - target.add_mood_event("regenerative core", /datum/mood_event/healsbadman) + target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) if (target != user) target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm index e2c67af2467..c88178135dc 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm @@ -2,6 +2,7 @@ blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, BB_BASIC_MOB_FLEEING = TRUE, + BB_BASIC_MOB_FLEE_DISTANCE = 5, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -47,7 +48,6 @@ /datum/ai_behavior/run_away_from_target/mega_arachnid clear_failed_targets = FALSE - run_distance = 5 ///only engage in melee combat against cuffed targets, otherwise keep throwing restraints at them /datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm index c662870393c..45bfd74d23b 100644 --- a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm @@ -75,6 +75,7 @@ /datum/ai_controller/basic_controller/basilisk blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_AGGRO_RANGE = 5, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm index 95df44a8326..b99e254853e 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm @@ -44,6 +44,8 @@ COOLDOWN_DECLARE(ability_animation_cooldown) /// Our base tentacles ability var/datum/action/cooldown/mob_cooldown/goliath_tentacles/tentacles + /// Our long-ranged tentacles ability + var/datum/action/cooldown/mob_cooldown/tentacle_grasp/tentacle_line /// Things we want to eat off the floor (or a plate, we're not picky) var/static/list/goliath_foods = list(/obj/item/food/grown/ash_flora, /obj/item/food/bait/worm) @@ -70,9 +72,9 @@ var/datum/action/cooldown/mob_cooldown/tentacle_burst/melee_tentacles = new (src) melee_tentacles.Grant(src) AddComponent(/datum/component/revenge_ability, melee_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], max_range = 1, target_self = TRUE) - var/datum/action/cooldown/mob_cooldown/tentacle_grasp/ranged_tentacles = new (src) - ranged_tentacles.Grant(src) - AddComponent(/datum/component/revenge_ability, ranged_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], min_range = 2, max_range = 9) + tentacle_line = new (src) + tentacle_line.Grant(src) + AddComponent(/datum/component/revenge_ability, tentacle_line, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], min_range = 2, max_range = 9) tentacles_ready() RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(used_ability)) @@ -82,6 +84,7 @@ /mob/living/basic/mining/goliath/Destroy() QDEL_NULL(tentacles) + QDEL_NULL(tentacle_line) return ..() /mob/living/basic/mining/goliath/examine(mob/user) @@ -167,6 +170,12 @@ . = ..() faction = new_friend.faction.Copy() +/mob/living/basic/mining/goliath/RangedAttack(atom/atom_target, modifiers) + tentacles?.Trigger(target = atom_target) + +/mob/living/basic/mining/goliath/ranged_secondary_attack(atom/atom_target, modifiers) + tentacle_line?.Trigger(target = atom_target) + /// Legacy Goliath mob with different sprites, largely the same behaviour /mob/living/basic/mining/goliath/ancient name = "ancient goliath" diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm new file mode 100644 index 00000000000..256ab1fbd8f --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm @@ -0,0 +1,114 @@ +/// Mob which retreats and spawns annoying sub-mobs to attack you +/mob/living/basic/mining/hivelord + name = "hivelord" + desc = "A levitating swarm of tiny creatures which act as a single individual. When threatened or hunting they rapidly replicate additional short-lived bodies." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "hivelord" + icon_living = "hivelord" + // icon_aggro = "hivelord_alert" + icon_dead = "hivelord_dead" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC + speed = 2 + maxHealth = 75 + health = 75 + melee_damage_lower = 0 + melee_damage_upper = 0 + attack_verb_continuous = "weakly tackles" + attack_verb_simple = "weakly tackles" + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/pierce.ogg' + throw_blocked_message = "passes between the bodies of the" + obj_damage = 0 + pass_flags = PASSTABLE + ai_controller = /datum/ai_controller/basic_controller/hivelord + /// Mobs to spawn when we die, varedit this to be recursive to give the players a fun surprise + var/death_spawn_type = /mob/living/basic/hivelord_brood + /// Action which spawns worms + var/datum/action/cooldown/mob_cooldown/hivelord_spawn/spawn_brood + +/mob/living/basic/mining/hivelord/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core) + AddElement(/datum/element/relay_attackers) + AddElement(/datum/element/death_drops, death_loot) + AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") // They writhe so much. + AddComponent(/datum/component/appearance_on_aggro, aggro_state = "hivelord_alert") + spawn_brood = new(src) + spawn_brood.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETTED_ACTION, spawn_brood) + +/mob/living/basic/mining/hivelord/Destroy() + QDEL_NULL(spawn_brood) + return ..() + +/mob/living/basic/mining/hivelord/death(gibbed) + . = ..() + var/list/safe_turfs = RANGE_TURFS(1, src) - get_turf(src) + for (var/turf/check_turf as anything in safe_turfs) + if (check_turf.is_blocked_turf(exclude_mobs = TRUE)) + safe_turfs -= check_turf + + var/turf/our_turf = get_turf(src) + for (var/i in 1 to 3) + if (!length(safe_turfs)) + return + var/turf/land_turf = pick_n_take(safe_turfs) + var/obj/effect/temp_visual/hivebrood_spawn/forecast = new(land_turf) + forecast.create_from(death_spawn_type, our_turf, CALLBACK(src, PROC_REF(complete_spawn), land_turf)) + +/// Spawns a worm on the specified turf +/mob/living/basic/mining/hivelord/proc/complete_spawn(turf/spawn_turf) + var/mob/living/brood = new death_spawn_type(spawn_turf) + brood.faction = faction + brood.ai_controller?.set_blackboard_key(ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]) + brood.dir = get_dir(src, spawn_turf) + +/mob/living/basic/mining/hivelord/RangedAttack(atom/atom_target, modifiers) + spawn_brood?.Trigger(target = atom_target) + +/// Attack worms spawned by the hivelord +/mob/living/basic/hivelord_brood + name = "hivelord brood" + desc = "Short-lived attack form of the hivelord. One isn't much of a threat, but..." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "hivelord_brood" + icon_living = "hivelord_brood" + icon_dead = "hivelord_brood" + icon_gib = "syndicate_gib" + friendly_verb_continuous = "chirrups near" + friendly_verb_simple = "chirrup near" + mob_size = MOB_SIZE_SMALL + basic_mob_flags = DEL_ON_DEATH + pass_flags = PASSTABLE | PASSMOB + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_MINING) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + speed = 1.5 + maxHealth = 1 + health = 1 + melee_damage_lower = 2 + melee_damage_upper = 2 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + obj_damage = 0 + density = FALSE + ai_controller = /datum/ai_controller/basic_controller/simple_hostile + +/mob/living/basic/hivelord_brood/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) + AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY) + addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) + +/mob/living/basic/hivelord_brood/death(gibbed) + if (!gibbed) + new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + return ..() diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm new file mode 100644 index 00000000000..fd7983de397 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm @@ -0,0 +1,14 @@ +/// Basically just keep away and shit out worms +/datum/ai_controller/basic_controller/hivelord + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_AGGRO_RANGE = 5, // Only get mad at people nearby + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance, + /datum/ai_planning_subtree/targeted_mob_ability, + ) diff --git a/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm b/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm new file mode 100644 index 00000000000..3fee2a003f3 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm @@ -0,0 +1,124 @@ +/// Spawns a little worm nearby +/datum/action/cooldown/mob_cooldown/hivelord_spawn + name = "Spawn Brood" + desc = "Release an attack form to an adjacent square to attack your target or anyone nearby." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "hivelord_brood" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + /// If a mob is not clicked directly, inherit targetting data from this blackboard key and setting it upon this target key + var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What are we actually spawning? + var/spawn_type = /mob/living/basic/hivelord_brood + /// Do we automatically fire with no cooldown when damaged? + var/trigger_on_hit = TRUE + /// Minimum time between triggering on hit + var/on_hit_delay = 1 SECONDS + /// Delay between triggering on hit + COOLDOWN_DECLARE(on_hit_cooldown) + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Grant(mob/granted_to) + . = ..() + if (isnull(owner)) + return + if (trigger_on_hit) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Remove(mob/removed_from) + UnregisterSignal(removed_from, COMSIG_ATOM_WAS_ATTACKED) + return ..() + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Activate(atom/target) + . = ..() + if (!spawn_brood(target, target_turf = get_turf(target))) + StartCooldown(0.5 SECONDS) + return + StartCooldown() + +/// Called when someone whacks us +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/on_attacked(atom/victim, atom/attacker, attack_flags) + SIGNAL_HANDLER + if (!trigger_on_hit || !(attack_flags & ATTACKER_DAMAGING_ATTACK) || !COOLDOWN_FINISHED(src, on_hit_cooldown)) + return + COOLDOWN_START(src, on_hit_cooldown, on_hit_delay) + spawn_brood(attacker, target_turf = get_step_away(owner, attacker), feedback = FALSE) + +/// Spawn a funny little worm +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/spawn_brood(target, turf/target_turf, feedback = TRUE) + var/ai_target = isliving(target) ? target : null + if (isnull(ai_target)) + ai_target = owner.ai_controller?.blackboard[ai_target_key] + + var/dir_to_target = get_dir(owner, target_turf) + var/list/target_turfs = list() + for(var/i in -1 to 1) + var/turn_amount = rand(-1, 1) * 45 + var/test_dir = turn(dir_to_target, turn_amount) + var/turf/test_turf = get_step(owner, test_dir) + if (test_turf.is_blocked_turf(exclude_mobs = TRUE)) + continue + target_turfs += test_turf + + if (!length(target_turfs)) + if (feedback) + owner.balloon_alert(owner, "no room!") + StartCooldown(0.5 SECONDS) + return FALSE + + var/turf/land_turf = pick(target_turfs) + var/obj/effect/temp_visual/hivebrood_spawn/forecast = new(land_turf) + forecast.create_from(spawn_type, get_turf(owner), CALLBACK(src, PROC_REF(complete_spawn), land_turf, ai_target)) + StartCooldown() + + return TRUE + +/// Actually create a mob +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/complete_spawn(turf/spawn_turf, target) + var/mob/living/brood = new spawn_type(spawn_turf) + brood.faction = owner.faction + brood.ai_controller?.set_blackboard_key(ai_target_key, target) + brood.dir = get_dir(owner, spawn_turf) + +#define BROOD_ARC_Y_OFFSET 8 +#define BROOD_ARC_ROTATION 45 + +/// Fast animation to show a worm spawning +/obj/effect/temp_visual/hivebrood_spawn + name = "brood spawn" + duration = 0.3 SECONDS + alpha = 0 + +/// Set up our visuals and start a timer for a callback +/obj/effect/temp_visual/hivebrood_spawn/proc/create_from(mob/living/spawn_type, turf/spawn_from, datum/callback/on_completed) + addtimer(on_completed, duration, TIMER_DELETE_ME) + + var/turf/my_turf = get_turf(src) + dir = get_dir(spawn_from, my_turf) + var/move_x = (my_turf.x - spawn_from.x) * world.icon_size + var/move_y = (my_turf.y - spawn_from.y) * world.icon_size + pixel_x = -move_x + pixel_y = -move_y + + icon = initial(spawn_type.icon) + icon_state = initial(spawn_type.icon_state) + + + animate(src, pixel_x = 0, time = duration) + animate(src, pixel_y = BROOD_ARC_Y_OFFSET - (move_y * 0.5), time = duration * 0.5, flags = ANIMATION_PARALLEL, easing = SINE_EASING | EASE_OUT) + animate(pixel_y = 0, time = duration * 0.5, easing = SINE_EASING | EASE_IN) + animate(src, alpha = 255, time = duration * 0.5, flags = ANIMATION_PARALLEL) + + if (dir & (NORTH | EAST)) + transform = matrix().Turn(-BROOD_ARC_ROTATION) + animate(src, transform = matrix(), time = duration, flags = ANIMATION_PARALLEL) + else + transform = matrix().Turn(BROOD_ARC_ROTATION) + animate(src, transform = matrix(), time = duration, flags = ANIMATION_PARALLEL) + +#undef BROOD_ARC_Y_OFFSET +#undef BROOD_ARC_ROTATION diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm new file mode 100644 index 00000000000..7c6bd0fd170 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm @@ -0,0 +1,158 @@ +/** + * Avoids players while throwing skulls at them. + * Legion skulls heal allies, bite enemies, and infest dying humans to make more legions. + */ +/mob/living/basic/mining/legion + name = "legion" + desc = "You can still see what was once a human under the shifting mass of corruption." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + basic_mob_flags = DEL_ON_DEATH + speed = 3 + maxHealth = 75 + health = 75 + obj_damage = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "lashes out at" + attack_verb_simple = "lash out at" + speak_emote = list("gurgles") + attack_sound = 'sound/weapons/pierce.ogg' + throw_blocked_message = "bounces harmlessly off of" + crusher_loot = /obj/item/crusher_trophy/legion_skull + death_message = "wails in chorus and dissolves into quivering flesh." + ai_controller = /datum/ai_controller/basic_controller/legion + /// What kind of mob do we spawn? + var/brood_type = /mob/living/basic/legion_brood + /// What kind of corpse spawner do we leave behind on death? + var/corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested + /// Who is inside of us? + var/mob/living/stored_mob + +/mob/living/basic/mining/legion/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, get_loot_list()) + AddElement(/datum/element/content_barfer) + + var/datum/action/cooldown/mob_cooldown/skull_launcher/skull_launcher = new(src) + skull_launcher.Grant(src) + skull_launcher.spawn_type = brood_type + ai_controller.blackboard[BB_TARGETTED_ACTION] = skull_launcher + +/// Create what we want to drop on death, in proc form so we can always return a static list +/mob/living/basic/mining/legion/proc/get_loot_list() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) + return death_loot + +/mob/living/basic/mining/legion/Exited(atom/movable/gone, direction) + . = ..() + if (gone != stored_mob) + return + ai_controller.clear_blackboard_key(BB_LEGION_CORPSE) + stored_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) + stored_mob.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman/long_term) // This will still probably mostly be gone before you are alive + stored_mob = null + +/mob/living/basic/mining/legion/death(gibbed) + if (isnull(stored_mob)) + new corpse_type(loc) + return ..() + +/// Put a corpse in this guy +/mob/living/basic/mining/legion/proc/consume(mob/living/consumed) + new /obj/effect/gibspawner/generic(consumed.loc) + gender = consumed.gender + name = consumed.real_name + consumed.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS) + consumed.death() + consumed.extinguish_mob() + consumed.fully_heal(HEAL_DAMAGE) + consumed.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) + consumed.forceMove(src) + ai_controller?.set_blackboard_key(BB_LEGION_CORPSE, consumed) + ai_controller?.set_blackboard_key(BB_LEGION_RECENT_LINES, consumed.copy_recent_speech(line_chance = 80)) + stored_mob = consumed + visible_message(span_warning("[src] staggers to [p_their()] feet!")) + if (prob(75)) + return + // Congratulations you have won a special prize: cancer + var/obj/item/organ/internal/legion_tumour/cancer = new() + cancer.Insert(consumed, special = TRUE, drop_if_replaced = FALSE) + +/// A Legion which only drops skeletons instead of corpses which might have fun loot, so it cannot be farmed +/mob/living/basic/mining/legion/spawner_made + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred + + +/// Like a Legion but it's an adorable snowman +/mob/living/basic/mining/legion/snow + name = "snow legion" + desc = "You can vaguely see what was once a human under the densely packed snow. Cute, but macabre." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion" + icon_living = "snowlegion" + // icon_aggro = "snowlegion_alive" + icon_dead = "snowlegion" + brood_type = /mob/living/basic/legion_brood/snow + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/snow + +/mob/living/basic/mining/legion/snow/Initialize(mapload) + . = ..() + AddComponent(/datum/component/appearance_on_aggro, aggro_state = "snowlegion_alive") // Surprise! I was real! + +/// As Snow Legion but spawns corpses which don't have any exciting loot +/mob/living/basic/mining/legion/snow/spawner_made + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton + + +/// Like a Legion but shorter and faster +/mob/living/basic/mining/legion/dwarf + name = "dwarf legion" + desc = "You can still see what was once a rather small human under the shifting mass of corruption." + icon_state = "dwarf_legion" + icon_living = "dwarf_legion" + icon_dead = "dwarf_legion" + maxHealth = 60 + health = 60 + speed = 2 + crusher_drop_chance = 20 + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf + + +/// Like a Legion but larger and spawns regular Legions, not currently used anywhere and very soulful +/mob/living/basic/mining/legion/large + name = "myriad" + desc = "A legion of legions, a dead end to whatever form the Necropolis was attempting to create." + icon = 'icons/mob/simple/lavaland/64x64megafauna.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + health_doll_icon = "legion" + speed = 5 + health = 450 + maxHealth = 450 + melee_damage_lower = 20 + melee_damage_upper = 20 + obj_damage = 30 + pixel_x = -16 + sentience_type = SENTIENCE_BOSS + +/mob/living/basic/mining/legion/large/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/spawner,\ + spawn_types = list(/mob/living/basic/mining/legion),\ + spawn_time = 20 SECONDS,\ + max_spawned = 3,\ + spawn_text = "peels itself off from",\ + faction = faction,\ + ) + +/// Create what we want to drop on death, in proc form so we can always return a static list +/mob/living/basic/mining/legion/large/get_loot_list() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4) + return death_loot diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm new file mode 100644 index 00000000000..6b3525cb32a --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm @@ -0,0 +1,77 @@ +/// Keep away and launch skulls at every opportunity, prioritising injured allies +/datum/ai_controller/basic_controller/legion + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead/legion, + BB_BASIC_MOB_FLEEING = TRUE, + BB_AGGRO_RANGE = 5, // Unobservant + BB_BASIC_MOB_FLEE_DISTANCE = 6, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/legion, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability, + /datum/ai_planning_subtree/flee_target/legion, + ) + +/// Chase and attack whatever we are targetting, if it's friendly we will heal them +/datum/ai_controller/basic_controller/legion_brood + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/attack_until_dead/legion, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Target nearby friendlies if they are hurt (and are not themselves Legions) +/datum/targetting_datum/basic/attack_until_dead/legion + +/datum/targetting_datum/basic/attack_until_dead/legion/faction_check(mob/living/living_mob, mob/living/the_target) + if (!living_mob.faction_check_mob(the_target, exact_match = check_factions_exactly)) + return FALSE + if (istype(the_target, living_mob.type)) + return TRUE + var/atom/created_by = living_mob.ai_controller.blackboard[BB_LEGION_BROOD_CREATOR] + if (!QDELETED(created_by) && istype(the_target, created_by.type)) + return TRUE + return the_target.stat == DEAD || the_target.health >= the_target.maxHealth + +/// Don't run away from friendlies +/datum/ai_planning_subtree/flee_target/legion + +/datum/ai_planning_subtree/flee_target/legion/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if (QDELETED(target) || target.faction_check_mob(controller.pawn)) + return // Only flee if we have a hostile target + return ..() + +/// Make spooky sounds, if we have a corpse inside then impersonate them +/datum/ai_planning_subtree/random_speech/legion + speech_chance = 1 + speak = list("Come...", "Legion...", "Why...?") + emote_hear = list("groans.", "wails.", "whimpers.") + emote_see = list("twitches.", "shudders.") + /// Stuff to specifically say into a radio + var/list/radio_speech = list("Come...", "Why...?") + +/datum/ai_planning_subtree/random_speech/legion/speak(datum/ai_controller/controller) + var/mob/living/carbon/human/victim = controller.blackboard[BB_LEGION_CORPSE] + if (QDELETED(victim) || prob(30)) + return ..() + + var/list/remembered_speech = controller.blackboard[BB_LEGION_RECENT_LINES] || list() + + if (length(remembered_speech) && prob(50)) // Don't spam the radio + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(remembered_speech)) + return + + var/obj/item/radio/mob_radio = locate() in victim.contents + if (QDELETED(mob_radio)) + return ..() // No radio, just talk funny + controller.queue_behavior(/datum/ai_behavior/perform_speech_radio, pick(radio_speech + remembered_speech), mob_radio, list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_COMMON)) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm new file mode 100644 index 00000000000..bc21bd0e506 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -0,0 +1,99 @@ +/// A spooky skull which heals lavaland mobs, attacks miners, and infests their bodies +/mob/living/basic/legion_brood + name = "legion" + desc = "One of many." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + icon_living = "legion_head" + icon_dead = "legion_head" + icon_gib = "syndicate_gib" + basic_mob_flags = DEL_ON_DEATH + mob_size = MOB_SIZE_SMALL + pass_flags = PASSTABLE | PASSMOB + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_MINING) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + friendly_verb_continuous = "chatters near" + friendly_verb_simple = "chatter near" + maxHealth = 1 + health = 1 + melee_damage_lower = 12 + melee_damage_upper = 12 + obj_damage = 0 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_vis_effect = ATTACK_EFFECT_BITE + speak_emote = list("echoes") // who the fuck speaking as this mob it dies 10 seconds after it spawns + attack_sound = 'sound/weapons/pierce.ogg' + density = FALSE + ai_controller = /datum/ai_controller/basic_controller/legion_brood + /// Reference to a guy who made us + var/mob/living/created_by + +/mob/living/basic/legion_brood/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) + AddComponent(/datum/component/clickbox, icon_state = "sphere", max_scale = 2) + addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) + +/mob/living/basic/legion_brood/death(gibbed) + if (!gibbed) + new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + return ..() + +/mob/living/basic/legion_brood/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + if (ishuman(target) && target.stat > SOFT_CRIT) + infest(target) + return + if (isliving(target) && faction_check_mob(target) && !istype(target, created_by?.type)) + visible_message(span_warning("[src] melds with [target]'s flesh!")) + target.apply_status_effect(/datum/status_effect/regenerative_core) + new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) + death() + return + return ..() + +/// Turn the targetted mob into one of us +/mob/living/basic/legion_brood/proc/infest(mob/living/target) + visible_message(span_warning("[name] burrows into the flesh of [target]!")) + var/spawn_type = get_legion_type(target) + var/mob/living/basic/mining/legion/new_legion = new spawn_type(loc) + new_legion.consume(target) + new_legion.faction = faction.Copy() + qdel(src) + +/// Returns the kind of legion we make out of the target +/mob/living/basic/legion_brood/proc/get_legion_type(mob/living/target) + if (HAS_TRAIT(target, TRAIT_DWARF)) + return /mob/living/basic/mining/legion/dwarf + return /mob/living/basic/mining/legion + +/// Sets someone as our creator, mostly so you can't use skulls to heal yourself +/mob/living/basic/legion_brood/proc/assign_creator(mob/living/creator, copy_full_faction = TRUE) + if (copy_full_faction) + faction = creator.faction.Copy() + else + faction |= REF(creator) + created_by = creator + ai_controller?.set_blackboard_key(BB_LEGION_BROOD_CREATOR, creator) + RegisterSignal(creator, COMSIG_QDELETING, PROC_REF(creator_destroyed)) + +/// Reference handling +/mob/living/basic/legion_brood/proc/creator_destroyed() + SIGNAL_HANDLER + created_by = null + +/// Like the Legion's summoned skull but funnier (it's snow now) +/mob/living/basic/legion_brood/snow + name = "snow legion" + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion_head" + icon_living = "snowlegion_head" + icon_dead = "snowlegion_head" + +/mob/living/basic/legion_brood/snow/get_legion_type(mob/living/target) + return /mob/living/basic/mining/legion/snow diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm new file mode 100644 index 00000000000..078af57de2a --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -0,0 +1,159 @@ +/// Left behind when a legion infects you, for medical enrichment +/obj/item/organ/internal/legion_tumour + name = "legion tumour" + desc = "A mass of pulsing flesh and dark tendrils, containing the power to regenerate flesh at a terrible cost." + failing_desc = "pulses and writhes with horrible life, reaching towards you with its tendrils!" + icon = 'icons/obj/medical/organs/mining_organs.dmi' + icon_state = "legion_remains" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_PARASITE_EGG + decay_factor = STANDARD_ORGAN_DECAY * 3 // About 5 minutes outside of a host + /// What stage of growth the corruption has reached. + var/stage = 0 + /// We apply this status effect periodically or when used on someone + var/applied_status = /datum/status_effect/regenerative_core + /// How long have we been in this stage? + var/elapsed_time = 0 SECONDS + /// How long does it take to advance one stage? + var/growth_time = 80 SECONDS // Long enough that if you go back to lavaland without realising it you're not totally fucked + /// What kind of mob will we transform into? + var/spawn_type = /mob/living/basic/mining/legion + /// Spooky sounds to play as you start to turn + var/static/list/spooky_sounds = list( + 'sound/voice/lowHiss1.ogg', + 'sound/voice/lowHiss2.ogg', + 'sound/voice/lowHiss3.ogg', + 'sound/voice/lowHiss4.ogg', + ) + +/obj/item/organ/internal/legion_tumour/Initialize(mapload) + . = ..() + animate_pulse() + +/obj/item/organ/internal/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organ_flag) + var/was_failing = organ_flags & ORGAN_FAILING + . = ..() + if (was_failing != (organ_flags & ORGAN_FAILING)) + animate_pulse() + +/obj/item/organ/internal/legion_tumour/set_organ_damage(damage_amount, required_organ_flag) + . = ..() + animate_pulse() + +/// Do a heartbeat animation depending on if we're failing or not +/obj/item/organ/internal/legion_tumour/proc/animate_pulse() + animate(src, transform = matrix()) // Stop any current animation + + var/speed_divider = organ_flags & ORGAN_FAILING ? 2 : 1 + + animate(src, transform = matrix().Scale(1.1), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_OUT, loop = -1, flags = ANIMATION_PARALLEL) + animate(transform = matrix(), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_IN) + animate(transform = matrix(), time = 2 SECONDS / speed_divider) + +/obj/item/organ/internal/legion_tumour/Remove(mob/living/carbon/egg_owner, special) + . = ..() + stage = 0 + elapsed_time = 0 + +/obj/item/organ/internal/legion_tumour/attack(mob/living/target, mob/living/user, params) + if (try_apply(target, user)) + qdel(src) + return + return ..() + +/// Smear it on someone like a regen core, why not. Make sure they're alive though. +/obj/item/organ/internal/legion_tumour/proc/try_apply(mob/living/target, mob/user) + if(!user.Adjacent(target) || !isliving(target)) + return FALSE + + if (target.stat <= SOFT_CRIT && !(organ_flags & ORGAN_FAILING)) + target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) + target.apply_status_effect(applied_status) + + if (target != user) + target.visible_message(span_notice("[user] splatters [target] with [src]... Disgusting tendrils pull [target.p_their()] wounds shut!")) + else + to_chat(user, span_notice("You smear [src] on yourself. Disgusting tendrils pull your wounds closed.")) + return TRUE + + if (!ishuman(target)) + return FALSE + + target.visible_message(span_boldwarning("[user] splatters [target] with [src]... and it springs into horrible life!")) + var/mob/living/basic/legion_brood/skull = new(target.loc) + skull.melee_attack(target) + return TRUE + +/obj/item/organ/internal/legion_tumour/on_life(seconds_per_tick, times_fired) + . = ..() + if (QDELETED(src) || QDELETED(owner)) + return + + if (stage >= 2) + if(SPT_PROB(stage / 5, seconds_per_tick)) + to_chat(owner, span_notice("You feel a bit better.")) + owner.apply_status_effect(applied_status) // It's not all bad! + if(SPT_PROB(1, seconds_per_tick)) + owner.emote("twitch") + + switch(stage) + if(2, 3) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(owner, span_danger("Your chest spasms!")) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(owner, span_danger("You feel weak.")) + if(SPT_PROB(1, seconds_per_tick)) + SEND_SOUND(owner, sound(pick(spooky_sounds))) + if(SPT_PROB(2, seconds_per_tick)) + owner.vomit() + if(4, 5) + if(SPT_PROB(2, seconds_per_tick)) + to_chat(owner, span_danger("Something flexes under your skin.")) + if(SPT_PROB(2, seconds_per_tick)) + if (prob(40)) + SEND_SOUND(owner, sound('sound/voice/ghost_whisper.ogg')) + else + SEND_SOUND(owner, sound(pick(spooky_sounds))) + if(SPT_PROB(3, seconds_per_tick)) + owner.vomit(vomit_type = /obj/effect/decal/cleanable/vomit/old/black_bile) + if (prob(50)) + var/turf/check_turf = get_step(owner.loc, owner.dir) + var/atom/land_turf = (check_turf.is_blocked_turf()) ? owner.loc : check_turf + var/mob/living/basic/legion_brood/child = new(land_turf) + child.assign_creator(owner, copy_full_faction = FALSE) + + if(SPT_PROB(3, seconds_per_tick)) + to_chat(owner, span_danger("Your muscles ache.")) + owner.take_bodypart_damage(3) + + if (stage == 5) + if (SPT_PROB(10, seconds_per_tick)) + infest() + return + + elapsed_time += seconds_per_tick SECONDS * ((organ_flags & ORGAN_FAILING) ? 3 : 1) // Let's call it "matured" rather than failed + if (elapsed_time < growth_time) + return + stage++ + elapsed_time = 0 + if (stage == 5) + to_chat(owner, span_bolddanger("Something is moving under your skin!")) + +/// Consume our host +/obj/item/organ/internal/legion_tumour/proc/infest() + if (QDELETED(src) || QDELETED(owner)) + return + owner.visible_message(span_boldwarning("Black tendrils burst from [owner]'s flesh, covering them in amorphous flesh!")) + var/mob/living/basic/mining/legion/new_legion = new spawn_type(owner.loc) + new_legion.consume(owner) + qdel(src) + +/obj/item/organ/internal/legion_tumour/on_find(mob/living/finder) + . = ..() + to_chat(finder, span_warning("There's an enormous tumour in [owner]'s [zone]!")) + if(stage < 4) + to_chat(finder, span_notice("Its tendrils seem to twitch towards the light.")) + return + to_chat(finder, span_notice("Its pulsing tendrils reach all throughout the body.")) + if(prob(stage * 2)) + infest() diff --git a/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm new file mode 100644 index 00000000000..1ffcafecd56 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm @@ -0,0 +1,109 @@ +/// Spawns a little worm nearby +/datum/action/cooldown/mob_cooldown/skull_launcher + name = "Launch Legion" + desc = "Propel a living piece of your body to a distant location." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_head" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + /// If a mob is not clicked directly, inherit targetting data from this blackboard key and setting it upon this target key + var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What are we actually spawning? + var/spawn_type = /mob/living/basic/legion_brood + /// How far can we fire? + var/max_range = 7 + +/datum/action/cooldown/mob_cooldown/skull_launcher/Activate(atom/target) + var/turf/target_turf = get_turf(target) + + if (get_dist(owner, target_turf) > max_range) + target_turf = get_ranged_target_turf_direct(owner, target_turf, max_range) + + if (target_turf.is_blocked_turf()) + var/list/near_turfs = RANGE_TURFS(1, target_turf) - target_turf + for (var/turf/check_turf as anything in near_turfs) + if (check_turf.is_blocked_turf()) + near_turfs -= check_turf + if (length(near_turfs)) + target_turf = pick(near_turfs) + else if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) + owner.balloon_alert(owner, "no room!") + StartCooldown(0.5 SECONDS) + return + + var/ai_target = isliving(target) ? target : null + if (isnull(ai_target)) + ai_target = owner.ai_controller?.blackboard[ai_target_key] + + var/target_dir = get_dir(owner, target) + + var/obj/effect/temp_visual/legion_skull_depart/launch = new(get_turf(owner)) + launch.set_appearance(spawn_type) + launch.dir = target_dir + new /obj/effect/temp_visual/legion_brood_indicator(target_turf) + var/obj/effect/temp_visual/legion_skull_land/land = new(target_turf) + land.dir = target_dir + land.set_appearance(spawn_type, CALLBACK(src, PROC_REF(spawn_skull), target_turf, ai_target)) + StartCooldown() + +/// Actually create a mob +/datum/action/cooldown/mob_cooldown/skull_launcher/proc/spawn_skull(turf/spawn_location, target) + var/mob/living/basic/legion_brood/brood = new spawn_type(spawn_location) + if (istype(brood)) + brood.assign_creator(owner) + brood.ai_controller?.set_blackboard_key(ai_target_key, target) + brood.dir = get_dir(owner, spawn_location) + if (!isnull(target)) + brood.face_atom(target) + else + brood.dir = get_dir(owner, spawn_location) + + +/// Animation for launching a skull +/obj/effect/temp_visual/legion_skull_depart + name = "legion brood launch" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + duration = 0.25 SECONDS + +/// Copy appearance from the passed atom type +/obj/effect/temp_visual/legion_skull_depart/proc/set_appearance(atom/spawned_type) + icon = initial(spawned_type.icon) + icon_state = initial(spawned_type.icon_state) + animate(src, alpha = 0, pixel_y = 72, time = duration) + +/// Animation for landing a skull +/obj/effect/temp_visual/legion_skull_land + name = "legion brood land" + duration = 0.5 SECONDS + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + alpha = 0 + pixel_y = 72 + +/// Copy appearance from the passed atom type and store what to do on animation complete +/obj/effect/temp_visual/legion_skull_land/proc/set_appearance(atom/spawned_type, datum/callback/on_completed) + icon = initial(spawned_type.icon) + icon_state = initial(spawned_type.icon_state) + animate(src, alpha = 0, pixel_y = 72, time = duration / 2) + animate(alpha = 255, pixel_y = 0, time = duration / 2) + addtimer(on_completed, duration, TIMER_DELETE_ME) + +/// A skull is going to be here! Oh no! +/obj/effect/temp_visual/legion_brood_indicator + name = "legion brood land" + duration = 0.75 SECONDS + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + icon = 'icons/mob/telegraphing/telegraph.dmi' + icon_state = "skull" + +/obj/effect/temp_visual/legion_brood_indicator/Initialize(mapload) + . = ..() + animate(src, alpha = 255, time = 0.5 SECONDS) + animate(alpha = 0, time = 0.25 SECONDS) diff --git a/code/modules/mob/living/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm index 3570936d2f5..0b6c4f321b6 100644 --- a/code/modules/mob/living/basic/lavaland/mining.dm +++ b/code/modules/mob/living/basic/lavaland/mining.dm @@ -9,6 +9,10 @@ unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 maximum_survivable_temperature = INFINITY + // Pale purple, should be red enough to see stuff on lavaland + lighting_cutoff_red = 25 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 /// Message to output if throwing damage is absorbed var/throw_blocked_message = "bounces off" /// What crusher trophy this mob drops, if any diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm index 1f310ac229f..a25234817f3 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm @@ -9,9 +9,9 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate/check_faction, /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance, /datum/ai_planning_subtree/use_mob_ability/gaze, /datum/ai_planning_subtree/ranged_skirmish/watcher, - /datum/ai_planning_subtree/maintain_distance, ) /datum/ai_planning_subtree/use_mob_ability/gaze diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm index 5a7bb075f19..d49932fb704 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm @@ -26,22 +26,9 @@ lighting_cutoff_green = 15 lighting_cutoff_blue = 40 - ai_controller = /datum/ai_controller/basic_controller/blankbody + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles /mob/living/basic/blankbody/Initialize(mapload) . = ..() AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 0) AddComponent(/datum/component/health_scaling_effects, min_health_attack_modifier_lower = 8, min_health_attack_modifier_upper = 14) - -/datum/ai_controller/basic_controller/blankbody - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm index b38ada0f6e1..cdde6ad05e4 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm @@ -27,7 +27,7 @@ lighting_cutoff_green = 25 lighting_cutoff_blue = 15 - ai_controller = /datum/ai_controller/basic_controller/creature + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles /mob/living/basic/creature/Initialize(mapload) . = ..() @@ -101,16 +101,3 @@ exit_jaunt(cast_on) return enter_jaunt(cast_on) - -/datum/ai_controller/basic_controller/creature - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm index 18dca95013e..3f445ea1261 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm @@ -28,7 +28,7 @@ lighting_cutoff_green = 15 lighting_cutoff_blue = 50 - ai_controller = /datum/ai_controller/basic_controller/migo + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles var/static/list/migo_sounds /// Odds migo will dodge var/dodge_prob = 10 @@ -71,16 +71,3 @@ . = Move(get_step(loc,pick(cdir, ccdir))) if(!.)//Can't dodge there so we just carry on . = Move(moving_to, move_direction) - -/datum/ai_controller/basic_controller/migo - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) diff --git a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm index 3b32fbb4ce7..519e8ba1a73 100644 --- a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm +++ b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm @@ -110,8 +110,7 @@ faction = list(FACTION_STICKMAN) melee_damage_lower = 1 melee_damage_upper = 5 - - ai_controller = /datum/ai_controller/basic_controller/wizard_copy + ai_controller = /datum/ai_controller/basic_controller/simple_hostile /mob/living/basic/paper_wizard/copy/Initialize(mapload) . = ..() @@ -141,18 +140,6 @@ new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(src)) qdel(src) //I see through your ruse! -/datum/ai_controller/basic_controller/wizard_copy - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) - //fancy effects /obj/effect/temp_visual/paper_scatter name = "scattering paper" diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm index 57b9da542b7..50ec85e342c 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm @@ -30,6 +30,7 @@ /datum/ai_controller/basic_controller/young_spider blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_BASIC_MOB_FLEE_DISTANCE = 6, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -46,6 +47,3 @@ /datum/ai_planning_subtree/find_unwebbed_turf, /datum/ai_planning_subtree/spin_web, ) - -/datum/ai_behavior/run_away_from_target/young_spider - run_distance = 6 diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 9e8f1b8df55..46e175c5323 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -381,6 +381,7 @@ BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), // Use this to find people to run away from + BB_BASIC_MOB_FLEE_DISTANCE = 3, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -400,9 +401,6 @@ ) /// Don't look for anything to run away from if you are distracted by being adjacent to cheese -/datum/ai_planning_subtree/flee_target/mouse - flee_behaviour = /datum/ai_behavior/run_away_from_target/mouse - /datum/ai_planning_subtree/flee_target/mouse /datum/ai_planning_subtree/flee_target/mouse/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) @@ -411,11 +409,6 @@ return // We see some cheese, which is more important than our life return ..() -/datum/ai_planning_subtree/flee_target/mouse/select - -/datum/ai_behavior/run_away_from_target/mouse - run_distance = 3 // Mostly exists in small tunnels, don't get ahead of yourself - /// AI controller for rats, slightly more complex than mice becuase they attack people /datum/ai_controller/basic_controller/mouse/rat blackboard = list( diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 745a48c948c..828a78ccfb1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -436,7 +436,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/CanAttack(atom/the_target) . = ..() - if(istype(the_target, /mob/living/simple_animal/hostile/asteroid/hivelordbrood)) //ignore temporary targets in favor of more permanent targets + if(istype(the_target, /mob/living/basic/legion_brood)) //ignore temporary targets in favor of more permanent targets return FALSE /mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 05695daf59a..777cb3b878f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -141,10 +141,9 @@ ///Attack proc. Spawns a singular legion skull. /mob/living/simple_animal/hostile/megafauna/legion/proc/create_legion_skull() - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc) - A.GiveTarget(target) - A.friends = friends - A.faction = faction + var/mob/living/basic/legion_brood/minion = new(loc) + minion.assign_creator(src) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target //CHARGE @@ -210,7 +209,7 @@ var/mob/living/living_target = target switch(living_target.stat) if(UNCONSCIOUS, HARD_CRIT) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/legion = new(loc) + var/mob/living/basic/legion_brood/legion = new(loc) legion.infest(living_target) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index a705e11465b..ec6c843080c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -328,10 +328,9 @@ /obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user) if(!prob(bonus_value) || target.stat == DEAD) return - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc) - A.GiveTarget(target) - A.friends += user - A.faction = user.faction.Copy() + var/mob/living/basic/legion_brood/minion = new (user.loc) + minion.assign_creator(user) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target /obj/item/crusher_trophy/legionnaire_spine/attack_self(mob/user) if(!isliving(user)) @@ -342,9 +341,9 @@ to_chat(LivingUser, "You need to wait longer to use this again.") return LivingUser.visible_message(span_boldwarning("[LivingUser] shakes the [src] and summons a legion skull!")) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/LegionSkull = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(LivingUser.loc) - LegionSkull.friends += LivingUser - LegionSkull.faction = LivingUser.faction.Copy() + + var/mob/living/basic/legion_brood/minion = new (LivingUser.loc) + minion.assign_creator(LivingUser) next_use_time = world.time + 4 SECONDS #undef LEGIONNAIRE_CHARGE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm deleted file mode 100644 index 2d92ef88a65..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ /dev/null @@ -1,333 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/hivelord - name = "hivelord" - desc = "A levitating swarm of tiny creatures which act as a single individual. When threatened or hunting they rapidly replicate additional short-lived bodies." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "hivelord" - icon_living = "hivelord" - icon_aggro = "hivelord_alert" - icon_dead = "hivelord_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC - move_to_delay = 14 - ranged = 1 - vision_range = 5 - aggro_vision_range = 9 - speed = 3 - maxHealth = 75 - health = 75 - harm_intent_damage = 5 - melee_damage_lower = 0 - melee_damage_upper = 0 - attack_verb_continuous = "weakly tackles" - attack_verb_simple = "weakly tackles" - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "passes between the bodies of the" - ranged_cooldown = 0 - ranged_cooldown_time = 20 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - retreat_distance = 3 - minimum_distance = 3 - pass_flags = PASSTABLE - loot = list(/obj/item/organ/internal/monster_core/regenerative_core) - var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood - var/has_clickbox = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/Initialize(mapload) - . = ..() - if(has_clickbox) - AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") //they writhe so much. - -/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target) - if(world.time < ranged_cooldown) - return - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/brood = new brood_type(src.loc) - brood.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) - brood.GiveTarget(target) - brood.friends = friends - brood.faction = faction.Copy() - ranged_cooldown = world.time + ranged_cooldown_time - -/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() - OpenFire() - return TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) - mouse_opacity = MOUSE_OPACITY_ICON - return ..() - -//A fragile but rapidly produced creature -/mob/living/simple_animal/hostile/asteroid/hivelordbrood - name = "hivelord brood" - desc = "Short-lived attack form of the hivelord. One isn't much of a threat, but..." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "hivelord_brood" - icon_living = "hivelord_brood" - icon_aggro = "hivelord_brood" - icon_dead = "hivelord_brood" - icon_gib = "syndicate_gib" - move_to_delay = 1 - friendly_verb_continuous = "buzzes near" - friendly_verb_simple = "buzz near" - vision_range = 10 - speed = 3 - maxHealth = 1 - health = 1 - harm_intent_damage = 5 - melee_damage_lower = 2 - melee_damage_upper = 2 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/pierce.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - throw_message = "falls right through the strange body of the" - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - pass_flags = PASSTABLE | PASSMOB - density = FALSE - del_on_death = 1 - var/clickbox_state = "hivelord" - var/clickbox_max_scale = INFINITY - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) - AddElement(/datum/element/simple_flying) - AddComponent(/datum/component/swarming) - AddComponent(/datum/component/clickbox, icon_state = clickbox_state, max_scale = clickbox_max_scale) - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death(gibbed) - if (!gibbed) - new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) - return ..() - -//Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion - name = "legion" - desc = "You can still see what was once a human under the shifting mass of corruption." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "legion" - icon_living = "legion" - icon_aggro = "legion" - icon_dead = "legion" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - mouse_opacity = MOUSE_OPACITY_ICON - obj_damage = 60 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "lashes out at" - attack_verb_simple = "lash out at" - speak_emote = list("echoes") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "bounces harmlessly off of" - crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion - del_on_death = 1 - stat_attack = HARD_CRIT - robust_searching = 1 - has_clickbox = FALSE - var/dwarf_mob = FALSE - var/snow_legion = FALSE - var/mob/living/carbon/human/stored_mob - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/Initialize(mapload) - . = ..() - AddElement(/datum/element/content_barfer) - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf - name = "dwarf legion" - desc = "You can still see what was once a rather small human under the shifting mass of corruption." - icon_state = "dwarf_legion" - icon_living = "dwarf_legion" - icon_aggro = "dwarf_legion" - icon_dead = "dwarf_legion" - maxHealth = 60 - health = 60 - speed = 2 //faster! - crusher_drop_mod = 20 - dwarf_mob = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed) - visible_message(span_warning("The skulls on [src] wail in anger as they flee from their dying host!")) - if (!isnull(stored_mob)) - stored_mob = null - return ..() - - // We didn't contain a real body so spawn a random one - var/turf/our_turf = get_turf(src) - if(our_turf) - if(from_spawner) - new /obj/effect/mob_spawn/corpse/human/charredskeleton(our_turf) - else if(dwarf_mob) - new /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf(our_turf) - else if(snow_legion) - new /obj/effect/mob_spawn/corpse/human/snowlegioninfested(our_turf) - else - new /obj/effect/mob_spawn/corpse/human/legioninfested(our_turf) - return ..() - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril - from_spawner = TRUE - -//Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "legion_head" - icon_living = "legion_head" - icon_aggro = "legion_head" - icon_dead = "legion_head" - icon_gib = "syndicate_gib" - friendly_verb_continuous = "buzzes near" - friendly_verb_simple = "buzz near" - vision_range = 10 - maxHealth = 1 - health = 5 - harm_intent_damage = 5 - melee_damage_lower = 12 - melee_damage_upper = 12 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_vis_effect = ATTACK_EFFECT_BITE - speak_emote = list("echoes") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "is shrugged off by" - del_on_death = TRUE - stat_attack = HARD_CRIT - robust_searching = 1 - clickbox_state = "sphere" - clickbox_max_scale = 2 - var/can_infest_dead = FALSE - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(stat == DEAD || !isturf(loc)) - return - for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile - switch(victim.stat) - if(UNCONSCIOUS, HARD_CRIT) - infest(victim) - return //This will qdelete the legion. - if(DEAD) - if(can_infest_dead) - infest(victim) - return //This will qdelete the legion. - -///Create a legion at the location of a corpse. Exists so that legion subtypes can override it with their own type of legion. -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/make_legion(mob/living/carbon/human/H) - if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) - else - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(H.loc) - -///Create a new legion using the supplied human H -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H) - visible_message(span_warning("[name] burrows into the flesh of [H]!")) - var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = make_legion(H) - visible_message(span_warning("[L] staggers to [L.p_their()] feet!")) - H.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS) - H.death() - H.adjustBruteLoss(1000) - L.stored_mob = H - H.forceMove(L) - qdel(src) - -//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions) -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced - stat_attack = DEAD - maxHealth = 120 - health = 120 - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced - icon_state = "dwarf_legion" - icon_living = "dwarf_legion" - icon_aggro = "dwarf_legion" - icon_dead = "dwarf_legion" - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced - stat_attack = DEAD - can_infest_dead = TRUE - -//Legion that spawns Legions -/mob/living/simple_animal/hostile/big_legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/simple/lavaland/64x64megafauna.dmi' - icon_state = "legion" - icon_living = "legion" - icon_dead = "legion" - health_doll_icon = "legion" - health = 450 - maxHealth = 450 - melee_damage_lower = 20 - melee_damage_upper = 20 - anchored = FALSE - AIStatus = AI_ON - stop_automated_movement = FALSE - wander = TRUE - maxbodytemp = INFINITY - layer = MOB_LAYER - del_on_death = TRUE - sentience_type = SENTIENCE_BOSS - loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 5) - move_to_delay = 14 - vision_range = 5 - aggro_vision_range = 9 - speed = 3 - faction = list(FACTION_MINING) - weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - // Purple, but bright cause we're gonna need to spot mobs on lavaland - lighting_cutoff_red = 35 - lighting_cutoff_green = 20 - lighting_cutoff_blue = 45 - - -/mob/living/simple_animal/hostile/big_legion/Initialize(mapload) - .=..() - AddComponent(\ - /datum/component/spawner,\ - spawn_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion),\ - spawn_time = 20 SECONDS,\ - max_spawned = 3,\ - spawn_text = "peels itself off from",\ - faction = faction,\ - ) - - -// Snow Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow - name = "snow legion" - desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion" - icon_living = "snowlegion" - icon_aggro = "snowlegion_alive" - icon_dead = "snowlegion" - crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - snow_legion = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow/make_legion(mob/living/carbon/human/H) - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow(H.loc) - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal - from_spawner = TRUE - -// Snow Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - name = "snow legion" - desc = "One of many." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion_head" - icon_living = "snowlegion_head" - icon_aggro = "snowlegion_head" - icon_dead = "snowlegion_head" - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 1dff8e345c0..7df256d1873 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -539,3 +539,33 @@ "[key_name(src)] manually changed selected zone", data, ) + +/** + * Returns an associative list of the logs of a certain amount of lines spoken recently by this mob + * copy_amount - number of lines to return + * line_chance - chance to return a line, if you don't want just the most recent x lines + */ +/mob/proc/copy_recent_speech(copy_amount = LING_ABSORB_RECENT_SPEECH, line_chance = 100) + var/list/recent_speech = list() + var/list/say_log = list() + var/log_source = logging + for(var/log_type in log_source) + var/nlog_type = text2num(log_type) + if(nlog_type & LOG_SAY) + var/list/reversed = log_source[log_type] + if(islist(reversed)) + say_log = reverse_range(reversed.Copy()) + break + + for(var/spoken_memory in say_log) + if(recent_speech.len >= copy_amount) + break + if(!prob(line_chance)) + continue + recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + + var/list/raw_lines = list() + for (var/key as anything in recent_speech) + raw_lines += recent_speech[key] + + return raw_lines diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index c0ea4b6af42..8b7ad474b16 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -16,18 +16,21 @@ //Legion infested mobs -//dwarf type which spawns dwarfy versions -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf - -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human) - . = ..() - spawned_human.dna.add_mutation(/datum/mutation/human/dwarfism) - -//main type, rolls a pool of legion victims +/// Mob spawner used by Legion to spawn costumed bodies /obj/effect/mob_spawn/corpse/human/legioninfested brute_damage = 1000 /obj/effect/mob_spawn/corpse/human/legioninfested/Initialize(mapload) + outfit = select_outfit() + return ..() + +/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human) + . = ..() + var/obj/item/organ/internal/legion_tumour/cancer = new() + cancer.Insert(spawned_human, special = TRUE, drop_if_replaced = FALSE) + +/// Returns the outfit worn by our corpse +/obj/effect/mob_spawn/corpse/human/legioninfested/proc/select_outfit() var/corpse_theme = pick_weight(list( "Miner" = 64, "Clown" = 5, @@ -40,26 +43,36 @@ "Shadow", )) = 4, )) + switch(corpse_theme) if("Miner") - outfit = /datum/outfit/consumed_miner + return /datum/outfit/consumed_miner if("Ashwalker") - outfit = /datum/outfit/consumed_ashwalker + return /datum/outfit/consumed_ashwalker if("Golem") - outfit = /datum/outfit/consumed_golem + return /datum/outfit/consumed_golem if("Clown") - outfit = /datum/outfit/consumed_clown + return /datum/outfit/consumed_clown if("Cultist") - outfit = /datum/outfit/consumed_cultist + return /datum/outfit/consumed_cultist if("Dame") - outfit = /datum/outfit/consumed_dame + return /datum/outfit/consumed_dame if("Operative") - outfit = /datum/outfit/syndicatecommandocorpse/lessenedgear + return /datum/outfit/syndicatecommandocorpse/lessenedgear if("Shadow") - outfit = /datum/outfit/consumed_shadowperson + return /datum/outfit/consumed_shadowperson + +/// Corpse spawner used by dwarf legions to make small corpses +/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf + +/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human) . = ..() + spawned_human.dna.add_mutation(/datum/mutation/human/dwarfism) + +/// Corpse spawner used by snow legions with alternate costumes +/obj/effect/mob_spawn/corpse/human/legioninfested/snow -/obj/effect/mob_spawn/corpse/human/snowlegioninfested/Initialize(mapload) +/obj/effect/mob_spawn/corpse/human/legioninfested/snow/select_outfit() var/corpse_theme = pick_weight(list( "Miner" = 64, "Clown" = 5, @@ -72,24 +85,49 @@ "Shadow", )) = 4, )) + switch(corpse_theme) if("Miner") - outfit = /datum/outfit/consumed_miner + return /datum/outfit/consumed_miner if("Settler") - outfit = /datum/outfit/consumed_ice_settler + return /datum/outfit/consumed_ice_settler if("Heremoth") - outfit = /datum/outfit/consumed_heremoth + return /datum/outfit/consumed_heremoth if("Clown") - outfit = /datum/outfit/consumed_clown + return /datum/outfit/consumed_clown if("Cultist") - outfit = /datum/outfit/consumed_cultist + return /datum/outfit/consumed_cultist if("Golem") - outfit = /datum/outfit/consumed_golem + return /datum/outfit/consumed_golem if("Operative") - outfit = /datum/outfit/syndicatecommandocorpse/lessenedgear + return /datum/outfit/syndicatecommandocorpse/lessenedgear if("Shadow") - outfit = /datum/outfit/consumed_shadowperson + return /datum/outfit/consumed_shadowperson + +/// Creates a dead legion-infested skeleton +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton + name = "legion-infested skeleton" + mob_name = "skeleton" + mob_species = /datum/species/skeleton + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/select_outfit() + return null + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/special(mob/living/carbon/human/spawned_human) . = ..() + spawned_human.gender = NEUTER + +/// Creates a dead and burned legion-infested skeleton +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred + name = "charred legion-infested skeleton" + mob_name = "charred skeleton" + brute_damage = 0 + burn_damage = 1000 + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human) + . = ..() + spawned_human.color = "#454545" + /datum/outfit/consumed_miner name = "Legion-Consumed Miner" diff --git a/code/modules/procedural_mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm index ab2bc6f2ca4..bf6c84ebf88 100644 --- a/code/modules/procedural_mapping/mapGenerators/asteroid.dm +++ b/code/modules/procedural_mapping/mapGenerators/asteroid.dm @@ -22,7 +22,7 @@ spawnableAtoms = list( /mob/living/basic/mining/basilisk = 10, /mob/living/basic/mining/goliath/ancient = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord = 10, + /mob/living/basic/mining/hivelord = 10, ) diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 04103648fda..4a1e3cde555 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -57,6 +57,8 @@ var/list/organ_traits /// Status Effects that are given to the holder of the organ. var/list/organ_effects + /// String displayed when the organ has decayed. + var/failing_desc = "has decayed for too long, and has turned a sickly color. It probably won't work without repairs." // Players can look at prefs before atoms SS init, and without this // they would not be able to see external organs, such as moth wings. @@ -242,10 +244,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) . += span_notice("It should be inserted in the [parse_zone(zone)].") if(organ_flags & ORGAN_FAILING) - if(IS_ROBOTIC_ORGAN(src)) - . += span_warning("[src] seems to be broken.") - return - . += span_warning("[src] has decayed for too long, and has turned a sickly color. It probably won't work without repairs.") + . += span_warning("[src] [failing_desc]") return if(damage > high_threshold) diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index 0a7332c0dd8..f0578832969 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -4,6 +4,7 @@ desc = "A state-of-the-art implant that improves a baseline's functionality." visual = FALSE organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." var/implant_color = "#FFFFFF" var/implant_overlay diff --git a/code/modules/surgery/organs/internal/ears/_ears.dm b/code/modules/surgery/organs/internal/ears/_ears.dm index 52f5d740520..b77efe90c2e 100644 --- a/code/modules/surgery/organs/internal/ears/_ears.dm +++ b/code/modules/surgery/organs/internal/ears/_ears.dm @@ -109,6 +109,7 @@ desc = "A basic cybernetic organ designed to mimic the operation of ears." damage_multiplier = 0.9 organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." /obj/item/organ/internal/ears/cybernetic/upgraded name = "cybernetic ears" diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index f2365c3988e..aca812a6186 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -318,6 +318,7 @@ icon_state = "cybernetic_eyeballs" desc = "Your vision is augmented." organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." /obj/item/organ/internal/eyes/robotic/emp_act(severity) . = ..() @@ -656,7 +657,7 @@ if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. return - + if(!eye.on) eye_icon_state = initial(eye_icon_state) overlay_ignore_lighting = FALSE diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm index ce4b948c653..e553f8f1307 100644 --- a/code/modules/surgery/organs/internal/heart/_heart.dm +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -203,6 +203,7 @@ base_icon_state = "heart-c" organ_flags = ORGAN_ROBOTIC maxHealth = STANDARD_ORGAN_THRESHOLD*0.75 //This also hits defib timer, so a bit higher than its less important counterparts + failing_desc = "seems to be broken." var/dose_available = FALSE var/rid = /datum/reagent/medicine/epinephrine diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index fe5ca01df4f..7baeb04b8b6 100644 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -245,6 +245,7 @@ /obj/item/organ/internal/liver/cybernetic name = "basic cybernetic liver" desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." + failing_desc = "seems to be broken." icon_state = "liver-c" organ_flags = ORGAN_ROBOTIC maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index 5e4e0648067..71dc305ac5f 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -837,6 +837,7 @@ /obj/item/organ/internal/lungs/cybernetic name = "basic cybernetic lungs" desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." + failing_desc = "seems to be broken." icon_state = "lungs-c" organ_flags = ORGAN_ROBOTIC maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 diff --git a/code/modules/surgery/organs/internal/stomach/_stomach.dm b/code/modules/surgery/organs/internal/stomach/_stomach.dm index bebeaacf110..e7d22a3ece6 100644 --- a/code/modules/surgery/organs/internal/stomach/_stomach.dm +++ b/code/modules/surgery/organs/internal/stomach/_stomach.dm @@ -289,6 +289,7 @@ /obj/item/organ/internal/stomach/cybernetic name = "basic cybernetic stomach" desc = "A basic device designed to mimic the functions of a human stomach" + failing_desc = "seems to be broken." icon_state = "stomach-c" organ_flags = ORGAN_ROBOTIC maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 0284e7c053b..08ee3d20faf 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -560,6 +560,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) /obj/item/organ/internal/tongue/robot name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." + failing_desc = "seems to be broken." organ_flags = ORGAN_ROBOTIC icon_state = "tonguerobot" say_mod = "states" diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 8de11513eaa..4807372c890 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -64,22 +64,10 @@ /mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch, /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow, /mob/living/simple_animal/hostile/asteroid/ice_demon, /mob/living/simple_animal/hostile/asteroid/polarbear, /mob/living/simple_animal/hostile/asteroid/polarbear/lesser, /mob/living/simple_animal/hostile/asteroid/wolf, - /mob/living/simple_animal/hostile/big_legion, /mob/living/simple_animal/hostile/blob, /mob/living/simple_animal/hostile/blob/blobbernaut, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, diff --git a/icons/mob/simple/lavaland/lavaland_monsters.dmi b/icons/mob/simple/lavaland/lavaland_monsters.dmi index 13c37dca594f0c3981fc98f78b99acf8a67aa641..38b78cf468f1f135abe20bd2d2dabbfd2502dc2c 100644 GIT binary patch literal 134470 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

    $<3d(Ybr`>KRge;YnsRdYA9ImLIcZ#;- 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

    Hc*3u{nj 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

    oRDp#;LgJum>nn(xavaK>`)3=YC0sXfXw|$lr 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 diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi index d5e03419cd89863617c43bbf2c30be4fa31de2f3..de525ead4ee9a7d49e279477b7d29a9226b3bfbe 100644 GIT binary patch delta 1959 zcmV;Y2Uz&l4Yd!DB!97bR9JLGWpiV4X>fFDZ*Bkpc$}Tgu?oU46ouhAd5S~325GDv zvq+0{XkS5Mb8UjLg(O;hdk2MrAc$PfaEJfPv2PA-kGgC5okDc;1clwE;B0XwStyiS z&Mdjnrq>gbP6UN4=`d0{4lWFyGR}+(5ekyCbI@0cP^dUFtHDS zYL()Bt8jAZOINO)6jDge0xfPbP>^dMFE{W10CF^ajk;_36U3%i@^f{~!TCPn7`$kXHs(fOQ174hUFTZoSt0 zlKRTdXyKRgN!nXo1hzc59Ms4Ff#T=3$(o;2-}5~G)PL@2`Kfwa+lyKO)Puf`<0mH% zc3)eT!>ye=G5%4*KU5a`O`4bG+Y~?z>soN@ZRKxWCAaW%rY$Xh>!=LX3z~tN1qD`a z7HachZ?2u{7W)B4L%JC1ZHM0tpa8TFl4B8Yu-ZsswJ`1pO&hCbp!GUHT3@RPWyPQS z9I*Cq&3|DHzvRBgZ-QC@)LV#|CfqtGaMm0cM+?7&BgUFvY6VdIRRL)2XN+9(7Hjya zho$Au)1W$__FDgbPJK{2q5NCAf}woeA={cC%WuuEX@klY%xMUP9X^J5=Vu8((wN;o zhkEB13m|YW#Eu~62mv@p2*5c)0L~EtaE=gwbAN;YoFfF_93cSb2mv@p2*5c)0L~Et zaE=gwbA$k#W4rSK0=C#1bY188FQH66)052)vvL6mvh`@k%z_%vQvl`EJ#2XY%x zD{sA;=GNP5-cIPr&zZK$baW9|n|q*tV}Io}&>pt1n%O$ioYp*VmK7kG%kJjrkuGF+ z`~6}waMTaf@^CBy4ptjUdVN@1@_-2Ib%3-!YiE|0pZj^8YYx}$FTEvDKmV8jTF_^OH3JCi>~0OyDiAcOS+PU@DP!5<@lbHoV1 z1msoQeY<-I00Fk`iko+JVT1rSL9Y=g1VAA9_seT}zm~U^d&CG7oN?gj9CKL1wJjrIgu?k(&w0=XB! zbzLvuy~c+;d;aIt<6Z#XvE4Cov-wBDVg#a|7fS$^ft4D}=D#yg0km#P>=9=t*_64v zpMHcN0Th5VI0B1j*ZdIfn~b%yg}Zg{~L&*r98Ln@}GlS7LVNW)O>0E29|snKeUeFq;vR9 z1+bzG-ZB)oeAn;s`#Hg(Qh$7#0yy&}XFksJNbK>}`5K$5G!F`@k4l%fd=A9N#7V6H zi-i|-Z?s!jDux{(Iwp=Y#9O?5l>N>X)rwQnYCsQ*t}S-bJ*b@2eJtgtzKL7$d%+fe zGpILzuc?Gv?@azJj)|Mie`mz5VCRS(LC*2|c=(KayVYHRbw1~Q32|f)ls?L~4cH>A z00pk&cq@nbTG|dE1%Hso2jtiCK9TLYA0 z(gcF+jPi{yJHD$KSi4ebcSU;B%j<3c1yI|pAdQX7>#@eHHGjt^SGDs;iXgq|}ivccKa7yxkH20TRDOi4hRb%63c79s@m)F5=aY002ovPDHLkV1j~Pvi1M~ delta 1734 zcmV;%208h)57rHkB!8)TR9JLGWpiV4X>fFDZ*Bkpc$|%lu?mAQ6h-H}uej(M#MC-w zDN1qBUnr@0H36%Tgi8OuLkmKoP%dYtPc?yio`9LJ4a~LBrMP734e{UsO1-X%B?0?4*#|) z`Pp8$`t-xAc27wql~g1GZ+@}RP?Vz`8Z>=JFQUFjuy$2Ze*gdl=t)FDRCt{2olA1u zFbqT|sT?Z1_%uG0Pvh)ztSnMfrN{)(0Kwm&-)0hh*p$@b2O{ZjpP!!(QkU zTEf>vpZim%v?`uO_n*iy+WzRdh<3E@ z)bwW+|I)eIHAP;QFI9k5tVco9?bYvXCHLqf)mBu$w^WwW6}y3v28DLsDq8j7Xswgd zcE{gOwHH=3R$z!t{nB5NWrq|nr%F@5a9JKtP-QkG7 zXMZGaqJQ=RthZ3>nxJV|AZ-p!qenj@5R#hgR2j8-TnP z91&C;8lX5dKyhe*;?Mxap#h3R0~Ch_C=Lx!9Df?1I5a?UXn^9-0L7sJibDew=eYF& zNG?YV2_xg^8WegzE_+ZW8Bf>x0M>CQ%%-VM+WG+2SoGbddXayay#S=qXU*e}WQ@!~ zTpvK9caj4Qu@~m-;N6Pu)!oon(>LP)qZc=dq=_E8VrI^1`okB97&$xFnwvOcxfyG^ z^?zu6D?P9N(Dea&N(02n=sbF_wsmes7dfKuNe{jE;q?KKwE;4mpS8+XW-%J+8fWMu z=}FH;IzF^MKxEE-K^Ie+W8Tpi!JQdZJpVjj(^;5s2AX=%U&(e<88>EcKz;d;H(Rb>L5J= zgxyM#Q6JW}Tp%L59pFtbJD3&KM?bHl-Qm{$t%rnJZz0kZ9nli^A-e(R4NI@kX9-XomH;49RPFTP?lgdcHtY&L zc6VdY0EaND1fl^9p7H(r?|pyk*k0`!B@iQl3eShx`u}|&a(+ZVdhQcTpS=JF(h%(# zn)hEVPoBKd00$sF^y{x>6bTwYAb)F2VCLAu5hV}}pwN4hSJ(eYIy69Wj$0;fwf;;p zN+9cgK?ca2SQ%lp{wt#zpm$K>h1V_dL<4vyM`-ieBNu|c$yz>p^n1>e z^0p)9GI7^!NN7^(s*Enit*O-Bhq1cUkY@kff30m@kwA3%w|0Eiv?@(g(|_3QL3*)f zV@uU8s{O?Pcjs6)7&*o>MOrI;ddJ6S%rf%6ff+~-S<>@p!*PJ;L!KD}U;Xwz9^>CY zjh^$-bGQE-+|zhO&$sH!>^JbPr|C=W7-T!5pK5>|``|rAanE=C5!a7Q4)yY-3P9>h zq&~hLJoicGdBewEee0WemVOnE_?tna^+#1DXu2!)k60#dwf-x^QNhJo z9te7Sdt04_()@Tl*4Ke#9UK!_od2qT5rLD|_7et5RDmTxacF?z(0>5Mp#h3R0~BX@ zB#?oiwZM@;Yd8{vI%nekt6^R&W3U8R3)=w2F%4j?Jkc7U!Rp`~pb|iO=&i{kG{ISj z2C#-!WsSBWYhfFpIIsa$&W$7E5Dm~8u;`r|cTI=v$Ko8lX5dKyhe*;`|o}kXq)W<_41WummU$ c13|_43(Ts}cujI5x&QzG07*qoM6N<$f^nZ!?*IS* diff --git a/icons/obj/medical/organs/mining_organs.dmi b/icons/obj/medical/organs/mining_organs.dmi index f3fc298284ba6a7e5eb490f85d762412b802d96b..172f94001ffafab8b0e3cc6ff33d7231cc2595c8 100644 GIT binary patch delta 2407 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 bf)E3S#Rhnby`W6_VF2#?5ALHmpC jobId % 10 === 0; const jobToColor = (jobId) => { @@ -40,10 +43,20 @@ const jobToColor = (jobId) => { return COLORS.department.other; }; -const healthToColor = (oxy, tox, burn, brute) => { +const statToIcon = (life_status) => { + switch (life_status) { + case STAT_LIVING: + return 'heart'; + case STAT_DEAD: + return 'skull'; + } + return 'heartbeat'; +}; + +const healthToAttribute = (oxy, tox, burn, brute, attributeList) => { const healthSum = oxy + tox + burn + brute; const level = Math.min(Math.max(Math.ceil(healthSum / 25), 0), 5); - return HEALTH_COLOR_BY_LEVEL[level]; + return attributeList[level]; }; const HealthStat = (props) => { @@ -78,9 +91,11 @@ const CrewTable = (props, context) => { Vitals - Position + + Position + {!!data.link_allowed && ( - + Tracking )} @@ -116,10 +131,22 @@ const CrewTableEntry = (props, context) => { {assignment !== undefined ? ` (${assignment})` : ''} - {life_status ? ( - + {oxydam !== undefined ? ( + + ) : life_status !== STAT_DEAD ? ( + ) : ( - + )} @@ -133,13 +160,19 @@ const CrewTableEntry = (props, context) => { {'/'} - ) : life_status ? ( + ) : life_status !== STAT_DEAD ? ( 'Alive' ) : ( 'Dead' )} - {area !== undefined ? area : 'N/A'} + + {area !== undefined ? ( + area + ) : ( + + )} + {!!link_allowed && (