diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 75318ec5504..6c329f74efc 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,7 @@ { "recommendations": [ - "gbasood.byond-dm-language-support", "platymuus.dm-langclient", - "eamodio.gitlens" + "eamodio.gitlens", + "anturk.dmi-editor" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index f90c2f78ee5..d0ee9064480 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -31,7 +31,7 @@ }, "workbench.editorAssociations": { - "*.dmi": "imagePreview.previewEditor" + "*.dmi": "dmiEditor.dmiEditor" }, "debug.onTaskErrors": "abort", diff --git a/_build_dependencies.sh b/_build_dependencies.sh index b5c32cfcfe4..920805c97de 100644 --- a/_build_dependencies.sh +++ b/_build_dependencies.sh @@ -1,6 +1,6 @@ # This file has all the information on what versions of libraries are thrown into the code # For dreamchecker -export SPACEMAN_DMM_VERSION=suite-1.7.2 +export SPACEMAN_DMM_VERSION=suite-1.7.3 # For NanoUI + TGUI export NODE_VERSION=12 # Byond Major diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm index 3bfc444c9bd..567d045af05 100644 --- a/code/__defines/is_helpers.dm +++ b/code/__defines/is_helpers.dm @@ -40,7 +40,6 @@ #define isxeno(A) istype(A, /mob/living/simple_mob/animal/space/alien) #define iscarbon(A) istype(A, /mob/living/carbon) -#define isalien(A) istype(A, /mob/living/carbon/alien) #define isbrain(A) istype(A, /mob/living/carbon/brain) #define ishuman(A) istype(A, /mob/living/carbon/human) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 59958f95446..201be9b38c2 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -335,6 +335,7 @@ var/global/list/##LIST_NAME = list();\ #define VOLUME_CHANNEL_AMBIENCE "Ambience" #define VOLUME_CHANNEL_ALARMS "Alarms" #define VOLUME_CHANNEL_DOORS "Doors" +#define VOLUME_CHANNEL_SYSTEM "System" // Make sure you update this or clients won't be able to adjust the channel GLOBAL_LIST_INIT(all_volume_channels, list( @@ -342,6 +343,7 @@ GLOBAL_LIST_INIT(all_volume_channels, list( VOLUME_CHANNEL_AMBIENCE, VOLUME_CHANNEL_ALARMS, VOLUME_CHANNEL_DOORS, + VOLUME_CHANNEL_SYSTEM, )) /* diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 54d5e473b70..4bbfa8ad3ac 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -154,6 +154,21 @@ #define MOB_TINY 5 #define MOB_MINISCULE 1 +// Gluttony levels. Used for eating items and mobs. +#define GLUT_NONE 0 // Cannot eat any mob or item. +#define GLUT_TINY 1 // Eat anything tiny and smaller +#define GLUT_SMALLER 2 // Eat anything smaller than we are +#define GLUT_ANYTHING 4 // Eat anything, ever + +#define GLUT_ITEM_TINY 8 // Eat items with a w_class of small or smaller +#define GLUT_ITEM_NORMAL 16 // Eat items with a w_class of normal or smaller +#define GLUT_ITEM_ANYTHING 32 // Eat any item +#define GLUT_PROJECTILE_VOMIT 64 // When vomitting, does it fly out? + +// Devour speeds, returned by can_devour() +#define DEVOUR_SLOW 1 +#define DEVOUR_FAST 2 + #define TINT_NONE 0 #define TINT_MODERATE 1 #define TINT_HEAVY 2 @@ -351,6 +366,11 @@ #define SA_ROBOTIC 3 #define SA_HUMANOID 4 +// Robot module categorization +#define ROBOT_MODULE_TYPE_GROUNDED "grounded" +#define ROBOT_MODULE_TYPE_FLYING "flying" +#define ROBOT_MODULE_TYPE_PLATFORM "platform" + // More refined version of SA_* ""intelligence"" separators. // Now includes bitflags, so to target two classes you just do 'MOB_CLASS_ANIMAL|MOB_CLASS_HUMANOID' #define MOB_CLASS_NONE 0 // Default value, and used to invert for _ALL. diff --git a/code/__defines/movement.dm b/code/__defines/movement.dm index 96d0af40c7d..b6b246ebeae 100644 --- a/code/__defines/movement.dm +++ b/code/__defines/movement.dm @@ -4,3 +4,6 @@ #define IS_WALKING(X) (X?.move_intent?.flags & MOVEMENT_INTENT_WALKING) #define IS_RUNNING(X) (X?.move_intent?.flags & MOVEMENT_INTENT_RUNNING) + +// Causes AStar paths to be blocked by windows that can't be passed through; usually, they go straight through. +#define ASTAR_BLOCKED_BY_WINDOWS 1 diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 5ac392cafc1..25c68a9a277 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -450,7 +450,7 @@ Turf and target are separate in case you want to teleport some distance from a t moblist.Add(M) for(var/mob/living/carbon/brain/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/alien/M in sortmob) + for(var/mob/living/carbon/diona/M in sortmob) moblist.Add(M) for(var/mob/observer/dead/M in sortmob) moblist.Add(M) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 75c3756b04f..b2b45520545 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -170,10 +170,7 @@ /obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user) - if(isalien(user)) - icon_state = "bg_alien" - else - icon_state = "bg_default" + icon_state = "bg_default" UpdateIcon() return @@ -226,4 +223,4 @@ /datum/action/innate/ - action_type = AB_INNATE \ No newline at end of file + action_type = AB_INNATE diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 9e57f699452..723dab5b751 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -163,6 +163,7 @@ The box in your backpack has an oxygen tank and gas mask in it." icon_state = "v_fat" /obj/screen/alert/fat/synth + name = "Fully Charged" desc = "Your battery is full! Don't overvolt it." icon_state = "c_fat" @@ -176,6 +177,7 @@ The box in your backpack has an oxygen tank and gas mask in it." icon_state = "v_hungry" /obj/screen/alert/hungry/synth + name = "Low Battery" desc = "Battery's running a bit low, could use a topoff." icon_state = "c_hungry" @@ -189,6 +191,7 @@ The box in your backpack has an oxygen tank and gas mask in it." icon_state = "v_starving" /obj/screen/alert/starving/synth + name = "Very Low Battery" desc = "Your battery is about to die! Charge it ASAP!" icon_state = "c_starving" diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/diona_nymph.dm similarity index 68% rename from code/_onclick/hud/alien_larva.dm rename to code/_onclick/hud/diona_nymph.dm index 992b880b1e5..92449378aad 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/diona_nymph.dm @@ -1,6 +1,5 @@ -/mob/living/carbon/alien/create_mob_hud(datum/hud/HUD, apply_to_client = TRUE) +/mob/living/carbon/diona/create_mob_hud(datum/hud/HUD, apply_to_client = TRUE) ..() - HUD.ui_style = 'icons/mob/screen1_alien.dmi' HUD.adding = list() @@ -24,6 +23,14 @@ healths.name = "health" healths.screen_loc = ui_alien_health + zone_sel = new /obj/screen/zone_sel( null ) + zone_sel.icon = HUD.ui_style + zone_sel.color = HUD.ui_color + zone_sel.alpha = HUD.ui_alpha + zone_sel.cut_overlays() + zone_sel.add_overlay(image('icons/mob/zone_sel.dmi', "[zone_sel.selecting]")) + HUD.adding += zone_sel + if(client && apply_to_client) client.screen = list() client.screen += list(healths) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 5351139540f..13ff8cf9549 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -52,21 +52,6 @@ /mob/living/RestrainedClickOn(var/atom/A) return -/* - Aliens -*/ - -/mob/living/carbon/alien/RestrainedClickOn(var/atom/A) - return - -/mob/living/carbon/alien/UnarmedAttack(var/atom/A, var/proximity) - - if(!..()) - return 0 - - setClickCooldown(get_attack_speed()) - A.attack_generic(src,rand(5,6),"bitten") - /* New Players: Have no reason to click on anything at all. diff --git a/code/controllers/subsystems/robots.dm b/code/controllers/subsystems/robots.dm new file mode 100644 index 00000000000..1c09e3f7ebe --- /dev/null +++ b/code/controllers/subsystems/robots.dm @@ -0,0 +1,62 @@ +SUBSYSTEM_DEF(robots) + name = "Robots" + init_order = INIT_ORDER_MISC_EARLY + flags = SS_NO_FIRE + + var/list/modules_by_category = list() + var/list/crisis_modules_by_category = list() + var/list/upgrade_modules_by_category = list() + var/list/all_module_names = list() + + var/list/mob_types_by_title = list( + "cyborg, flying" = /mob/living/silicon/robot/flying, + "robot, flying" = /mob/living/silicon/robot/flying, + "drone, flying" = /mob/living/silicon/robot/flying, + "drone, platform" = /mob/living/silicon/robot/platform + ) + + var/list/mmi_types_by_title = list( + "robot" = /obj/item/mmi/digital/posibrain, + "robot, flying" = /obj/item/mmi/digital/posibrain, + "drone" = /obj/item/mmi/digital/robot, + "drone, flying" = /obj/item/mmi/digital/robot, + "drone, platform" = /obj/item/mmi/digital/robot + ) + +/datum/controller/subsystem/robots/Initialize(start_uptime) + + for(var/module_type in subtypesof(/obj/item/robot_module)) + var/obj/item/robot_module/module = module_type + if(initial(module.unavailable_by_default)) + continue + var/module_category = initial(module.module_category) + var/module_name = initial(module.display_name) + if(module_name && module_category) + if(initial(module.upgrade_locked)) + LAZYINITLIST(upgrade_modules_by_category[module_category]) + LAZYSET(upgrade_modules_by_category[module_category], module_name, module) + else if(initial(module.crisis_locked)) + LAZYINITLIST(crisis_modules_by_category[module_category]) + LAZYSET(crisis_modules_by_category[module_category], module_name, module) + else + LAZYINITLIST(modules_by_category[module_category]) + LAZYSET(modules_by_category[module_category], module_name, module) + all_module_names |= module_name + all_module_names = sortTim(all_module_names, /proc/cmp_text_asc) + +/datum/controller/subsystem/robots/proc/get_available_modules(module_category, crisis_mode, include_override) + . = list() + if(modules_by_category[module_category]) + . += modules_by_category[module_category] + if(crisis_mode && crisis_modules_by_category[module_category]) + . |= crisis_modules_by_category[module_category] + if(include_override && upgrade_modules_by_category[module_category]) + var/list/modules = upgrade_modules_by_category[module_category] + if(modules[include_override]) + .[include_override] = modules[include_override] + +/datum/controller/subsystem/robots/proc/get_mmi_type_by_title(check_title) + . = mmi_types_by_title[lowertext(trim(check_title))] || /obj/item/mmi + +/datum/controller/subsystem/robots/proc/get_mob_type_by_title(check_title) + . = mob_types_by_title[lowertext(trim(check_title))] || /mob/living/silicon/robot diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index be750f9013a..39b9157691b 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -79,7 +79,8 @@ var/global/datum/controller/subsystem/ticker/ticker /datum/controller/subsystem/ticker/proc/pregame_welcome() to_world("Welcome to the pregame lobby!") to_world("Please set up your character and select ready. The round will start in [pregame_timeleft] seconds.") - world << sound('sound/misc/server-ready.ogg', volume = 100) + for (var/mob/M in player_list) + M.playsound_local(null, 'sound/misc/server-ready.ogg', 100, FALSE, is_global = TRUE, volume_channel = VOLUME_CHANNEL_SYSTEM) // Called during GAME_STATE_PREGAME (RUNLEVEL_LOBBY) /datum/controller/subsystem/ticker/proc/pregame_tick() @@ -185,7 +186,8 @@ var/global/datum/controller/subsystem/ticker/ticker if (S.name != "AI") qdel(S) to_world("Enjoy the game!") - world << sound('sound/AI/welcome.ogg') // Skie + for (var/mob/M in player_list) + M.playsound_local(null, 'sound/AI/welcome.ogg', 100, FALSE, is_global = TRUE, volume_channel = VOLUME_CHANNEL_SYSTEM) //Holiday Round-start stuff ~Carn Holiday_Game_Start() diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index f965265441f..01645674a84 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -255,7 +255,8 @@ SUBSYSTEM_DEF(vote) to_world("[text]\nType vote or click here to place your votes.\nYou have [config.vote_period / 10] seconds to vote.") if(vote_type == VOTE_CREW_TRANSFER || vote_type == VOTE_GAMEMODE || vote_type == VOTE_CUSTOM) - world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3) + for (var/mob/M in player_list) + M.playsound_local(null, 'sound/ambience/alarm4.ogg', 50, FALSE, is_global = TRUE, channel = 3, volume_channel = VOLUME_CHANNEL_SYSTEM) if(mode == VOTE_GAMEMODE && round_progressing) gamemode_vote_called = TRUE diff --git a/code/datums/autolathe/autolathe.dm b/code/datums/autolathe/autolathe.dm index d0b83ffaebd..08d98d496a9 100644 --- a/code/datums/autolathe/autolathe.dm +++ b/code/datums/autolathe/autolathe.dm @@ -107,4 +107,4 @@ var/global/datum/category_collection/autolathe/autolathe_recipes var/man_rating = 0 /datum/category_item/autolathe/dd_SortValue() - return name \ No newline at end of file + return name diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b99ef4a59f8..41477313163 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -524,10 +524,6 @@ . = ..() mind.assigned_role = "slime" -/mob/living/carbon/alien/larva/mind_initialize() - . = ..() - mind.special_role = "Larva" - //AI /mob/living/silicon/ai/mind_initialize() . = ..() diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm index 7343ce069f0..320790b3e94 100644 --- a/code/datums/outfits/jobs/civilian.dm +++ b/code/datums/outfits/jobs/civilian.dm @@ -27,11 +27,11 @@ uniform = /obj/item/clothing/under/rank/bartender id_type = /obj/item/card/id/civilian/bartender pda_type = /obj/item/pda/bar - backpack_contents = list(/obj/item/clothing/accessory/permit/gun/bar = 1) + backpack_contents = list(/obj/item/clothing/accessory/medal/permit/gun/bar = 1) /decl/hierarchy/outfit/job/service/bartender/post_equip(mob/living/carbon/human/H) ..() - for(var/obj/item/clothing/accessory/permit/gun/bar/permit in H.back.contents) + for(var/obj/item/clothing/accessory/medal/permit/gun/bar/permit in H.back.contents) permit.set_name(H.real_name) /decl/hierarchy/outfit/job/service/bartender/barista diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm index daa7a7cc668..4f379e10c9e 100644 --- a/code/datums/supplypacks/munitions.dm +++ b/code/datums/supplypacks/munitions.dm @@ -74,7 +74,7 @@ containertype = /obj/structure/closet/crate/secure/weapon containername = "Shotgun crate" access = access_armory - + /datum/supply_pack/munitions/shotgunsemi name = "Weapons - Semi-Automatic Shotgun crate" contains = list( @@ -96,11 +96,11 @@ access = access_armory /datum/supply_pack/munitions/burstlaser - name = "Weapons - Burst laser" + name = "Weapons - Burst Energy Gun" contains = list(/obj/item/gun/energy/gun/burst = 2) cost = 50 containertype = /obj/structure/closet/crate/secure/lawson - containername = "Burst laser crate" + containername = "Burst Energy Gun crate" access = access_armory /datum/supply_pack/munitions/ionweapons @@ -248,4 +248,4 @@ cost = 50 containertype = /obj/structure/closet/crate/secure/weapon containername = "Energy ammunition crate" - access = access_security \ No newline at end of file + access = access_security diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 0b2ef06e84a..d80dd201994 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -493,7 +493,7 @@ /obj/item/clothing/suit/storage/forensics/red, /obj/item/clothing/suit/storage/forensics/blue, /obj/item/clothing/under/det/corporate = 2, - /obj/item/clothing/accessory/badge/holo/detective = 2, + /obj/item/clothing/accessory/medal/badge/holo/detective = 2, /obj/item/clothing/gloves/black = 2 ) cost = 10 @@ -507,8 +507,8 @@ /obj/item/clothing/suit/storage/vest/officer, /obj/item/clothing/head/helmet, /obj/item/cartridge/security, - /obj/item/clothing/accessory/badge/holo, - /obj/item/clothing/accessory/badge/holo/cord, + /obj/item/clothing/accessory/medal/badge/holo, + /obj/item/clothing/accessory/medal/badge/holo/cord, /obj/item/radio/headset/headset_sec, /obj/item/storage/belt/security, /obj/item/flash, @@ -545,7 +545,7 @@ /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, /obj/item/hailer, - /obj/item/clothing/accessory/badge/holo/warden, + /obj/item/clothing/accessory/medal/badge/holo/warden, /obj/item/storage/box/flashbangs, /obj/item/storage/belt/security, /obj/item/reagent_containers/spray/pepper, @@ -573,7 +573,7 @@ /obj/item/storage/belt/security, /obj/item/flash, /obj/item/hailer, - /obj/item/clothing/accessory/badge/holo/hos, + /obj/item/clothing/accessory/medal/badge/holo/hos, /obj/item/clothing/accessory/holster/waist, /obj/item/melee/telebaton, /obj/item/shield/riot/tele, diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 4937ee5e523..e6473507012 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -123,7 +123,7 @@ length to avoid portals or something i guess?? Not that they're counted right no /proc/PathWeightCompare(PathNode/a, PathNode/b) return a.estimated_cost - b.estimated_cost -/proc/AStar(var/start, var/end, var/adjacent, var/dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude) +/proc/AStar(var/start, var/end, var/adjacent, var/dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude, flags = 0) var/PriorityQueue/open = new /PriorityQueue(/proc/PathWeightCompare) var/list/closed = list() var/list/path @@ -158,7 +158,7 @@ length to avoid portals or something i guess?? Not that they're counted right no if(current.nodes_traversed >= max_node_depth) continue - for(var/datum/datum in call(current.position, adjacent)(id)) + for(var/datum/datum in call(current.position, adjacent)(id, flags)) if(datum == exclude) continue diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index bbffe210562..b2c65e093f2 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -106,33 +106,6 @@ var/global/hadevent = 0 if(H.client && H.appendicitis()) break -/proc/alien_infestation(var/spawncount = 1) // -- TLE - //command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert") - //world << sound('sound/AI/aliens.ogg') - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) - if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels)) - if(temp_vent.network.normal_members.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology - vents += temp_vent - - var/list/candidates = get_alien_candidates() - - if(prob(40)) spawncount++ //sometimes, have two larvae spawn instead of one - while((spawncount >= 1) && vents.len && candidates.len) - - var/obj/vent = pick(vents) - var/candidate = pick(candidates) - - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - new_xeno.key = candidate - - candidates -= candidate - vents -= vent - spawncount-- - - spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes. - command_announcement.Announce("Unidentified lifesigns detected coming aboard \the [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') - /proc/high_radiation_event() /* // Haha, this is way too laggy. I'll keep the prison break though. diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index eb57f1d71ad..64a4d1bf4ad 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -591,16 +591,9 @@ var/global/list/all_objectives = list() continue captured_amount += worth - for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. - if(M.stat==2) - captured_amount+=0.5 - continue - captured_amount+=1 - - if(captured_amountYou turn in 2 tickets to the [src] and claim a prize!") return else - ..() //You can now actually deconstruct these. \ No newline at end of file + ..() //You can now actually deconstruct these. diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 860632a0dac..ca4c233c873 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -379,15 +379,9 @@ if(scan_brain && !can_brainscan()) return if(isnull(subject) || (!(ishuman(subject))) || (!subject.dna)) - if(isalien(subject)) - set_scan_temp("Xenomorphs are not scannable.", "bad") - SStgui.update_uis(src) - return - // can add more conditions for specific non-human messages here - else - set_scan_temp("Subject species is not scannable.", "bad") - SStgui.update_uis(src) - return + set_scan_temp("Subject species is not scannable.", "bad") + SStgui.update_uis(src) + return if(!subject.has_brain()) if(ishuman(subject)) var/mob/living/carbon/human/H = subject diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index a7ca3385ce0..242130cf8e6 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -486,4 +486,57 @@ Class Procs: S.amount = round(materials[mat] / S.perunit) else qdel(S) //Prevents stacks smaller than 1 - return \ No newline at end of file + return + +/obj/machinery/proc/eject_material_of_type(var/incoming_material) //Used for autolathe, protolathe, mechfab, exofab. Stuff that takes materials, basically. + if(!LAZYACCESS(materials, incoming_material)) + return + var/datum/material/M = get_material_by_name(incoming_material) + if(!istype(M)) + return + while(materials[incoming_material] > M.perunit) + var/obj/item/stack/material/S = new M.stack_type(get_turf(src)) + S.amount = min(round(materials[incoming_material] / S.perunit), S.max_amount) + materials[incoming_material] -= (S.amount * S.perunit) + return + +// 0 amount = 0 means ejecting a full stack; -1 means eject everything +/obj/machinery/proc/eject_materials_partial(var/material, var/amount) + + // Does the mat we want to dump exist? + var/matstring = lowertext(material) + var/datum/material/M = matstring && get_material_by_name(matstring) + if(!istype(M)) + return + + // If we're dumping the entire cache we can just use the general proc. + if(amount == -1 && materials[matstring] >= M.perunit) + eject_material_of_type(matstring) + return + + // Get our stack place type for metadata retrieval via initial() + // Does this mat even have an ejectable stack form? + var/obj/item/stack/material/S = M.get_place_stack_type() + if(!ispath(S, /obj/item/stack)) + return + + // Place the maximum available based on the material store, or the target amount, whichever is lower (to avoid duplicating mats) + if(amount <= 0) + amount = initial(S.max_amount) + amount = clamp(amount, 0, round(materials[matstring] / initial(S.perunit))) + + // Can we actually eject a viable sheet object? + if(amount <= 0) + return + + // Fire it out the chute, ptooie. + S = M.place_sheet(get_turf(src), amount) + if(istype(S) && !QDELETED(S)) + materials[matstring] = max(0, materials[matstring] - round(S.amount * S.perunit)) + + // Refresh our queue (if we handle queues; see below) + refresh_queue() + +// Stub for above proc. Implemented on exosuit fabricators and prosthetics fabricators. +/obj/machinery/proc/refresh_queue() + return diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index b34169be5d1..c848f15b94a 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -326,7 +326,7 @@ H.adjustOxyLoss(-(rand(1,8))) if(H.stat == DEAD) - H.add_modifier(/datum/modifier/bloodpump_corpse, 6 SECONDS) + H.add_modifier(/datum/modifier/bloodpump/corpse, 6 SECONDS) else H.add_modifier(/datum/modifier/bloodpump, 6 SECONDS) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index d408c64bb61..3c00a185855 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -813,7 +813,7 @@ if(isanimal(L)) // Animals are not so dangerous return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET - if(isxenomorph(L) || isalien(L)) // Xenos are dangerous + if(isxenomorph(L)) // Xenos are dangerous return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET if(ishuman(L)) //if the target is a human, analyze threat level diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 43c281e42ed..aaca267a440 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -71,55 +71,54 @@ Please wait until completion...
if(!operating) var/part_type = text2num(href_list["make"]) - var/build_type = "" + var/build_type var/build_time = 200 var/build_cost = 25000 switch (part_type) if(1) - build_type = "/obj/item/robot_parts/l_arm" + build_type = /obj/item/robot_parts/l_arm build_time = 200 build_cost = 25000 if(2) - build_type = "/obj/item/robot_parts/r_arm" + build_type = /obj/item/robot_parts/r_arm build_time = 200 build_cost = 25000 if(3) - build_type = "/obj/item/robot_parts/l_leg" + build_type = /obj/item/robot_parts/l_leg build_time = 200 build_cost = 25000 if(4) - build_type = "/obj/item/robot_parts/r_leg" + build_type = /obj/item/robot_parts/r_leg build_time = 200 build_cost = 25000 if(5) - build_type = "/obj/item/robot_parts/chest" + build_type = /obj/item/robot_parts/chest build_time = 350 build_cost = 50000 if(6) - build_type = "/obj/item/robot_parts/head" + build_type = /obj/item/robot_parts/head build_time = 350 build_cost = 50000 if(7) - build_type = "/obj/item/robot_parts/robot_suit" + build_type = /obj/item/robot_parts/frame build_time = 600 build_cost = 75000 - var/building = text2path(build_type) - if(!isnull(building)) + if(!isnull(build_type)) if(metal_amount >= build_cost) operating = 1 update_use_power(USE_POWER_ACTIVE) metal_amount = max(0, metal_amount - build_cost) - being_built = new building(src) + being_built = new build_type(src) // TODO: pass in model info to new add_overlay("fab-active") updateUsrDialog() diff --git a/code/game/mecha/equipment/tools/passenger.dm b/code/game/mecha/equipment/tools/passenger.dm index 8ce9d21aa93..fe37d6fdab9 100644 --- a/code/game/mecha/equipment/tools/passenger.dm +++ b/code/game/mecha/equipment/tools/passenger.dm @@ -26,7 +26,7 @@ if (chassis) chassis.visible_message("[user] starts to climb into [chassis].") - if(do_after(user, 40, needhand=0)) + if(do_after(user, 4 SECONDS, needhand=0)) if(!src.occupant) user.forceMove(src) occupant = user @@ -148,4 +148,4 @@ to_chat(usr, "\The [src] doesn't have a passenger compartment.") #undef LOCKED -#undef OCCUPIED \ No newline at end of file +#undef OCCUPIED diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 3867b9afdb9..95285953159 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -11,10 +11,14 @@ req_access = list(access_robotics) circuit = /obj/item/circuitboard/mechfab + var/list/href_data + var/topic_result + var/speed = 1 var/mat_efficiency = 1 materials = list(MAT_STEEL = 0, "glass" = 0, "plastic" = 0, MAT_GRAPHITE = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0, MAT_METALHYDROGEN = 0, MAT_SUPERMATTER = 0) var/list/hidden_materials = list(MAT_PLASTEEL, MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM, MAT_METALHYDROGEN, MAT_SUPERMATTER) + var/eject_lockout = FALSE var/res_max_amount = 200000 var/datum/research/files @@ -34,9 +38,7 @@ for(var/Name in name_to_material) if(Name in materials) continue - hidden_materials |= Name - materials[Name] = 0 default_apply_parts() @@ -108,6 +110,7 @@ if(current) data["builtperc"] = round((progress / current.time) * 100) + href_data = data ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "mechfab.tmpl", "Exosuit Fabricator UI", 800, 600) @@ -116,6 +119,7 @@ ui.set_auto_update(1) /obj/machinery/mecha_part_fabricator/Topic(href, href_list) + topic_result = href_list if(..()) return @@ -129,8 +133,8 @@ if(href_list["category"] in categories) category = href_list["category"] - if(href_list["eject"]) - eject_materials(href_list["eject"], text2num(href_list["amount"])) + if(href_list["eject"] && !eject_lockout) + eject_materials_partial(href_list["eject"], text2num(href_list["amount"])) if(href_list["sync"]) sync() @@ -169,7 +173,7 @@ S.use(1) count++ to_chat(user, "You insert [count] [sname] into the fabricator.") - update_busy() + refresh_queue() else to_chat(user, "The fabricator cannot hold more [sname].") @@ -196,7 +200,7 @@ if(1) visible_message("[bicon(src)] [src] beeps: \"No records in User DB\"") -/obj/machinery/mecha_part_fabricator/proc/update_busy() +/obj/machinery/mecha_part_fabricator/refresh_queue() if(queue.len) if(can_build(queue[1])) busy = 1 @@ -211,13 +215,13 @@ /obj/machinery/mecha_part_fabricator/proc/add_to_queue(var/index) var/datum/design/D = files.known_designs[index] queue += D - update_busy() + refresh_queue() /obj/machinery/mecha_part_fabricator/proc/remove_from_queue(var/index) if(index == 1) progress = 0 queue.Cut(index, index + 1) - update_busy() + refresh_queue() /obj/machinery/mecha_part_fabricator/proc/can_build(var/datum/design/D) for(var/M in D.materials) diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index b6fe20b9aa7..74df971b895 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -15,6 +15,7 @@ var/mat_efficiency = 1 materials = list(MAT_STEEL = 0, "glass" = 0, "plastic" = 0, MAT_GRAPHITE = 0, MAT_PLASTEEL = 0, "gold" = 0, "silver" = 0, MAT_LEAD = 0, "osmium" = 0, "diamond" = 0, MAT_DURASTEEL = 0, "phoron" = 0, "uranium" = 0, MAT_VERDANTIUM = 0, MAT_MORPHIUM = 0) var/list/hidden_materials = list(MAT_DURASTEEL, MAT_GRAPHITE, MAT_VERDANTIUM, MAT_MORPHIUM) + var/eject_lockout = FALSE var/res_max_amount = 200000 var/datum/research/files @@ -144,8 +145,8 @@ if(href_list["manufacturer"] in all_robolimbs) manufacturer = href_list["manufacturer"] - if(href_list["eject"]) - eject_materials(href_list["eject"], text2num(href_list["amount"])) + if(href_list["eject"] && !eject_lockout) + eject_materials_partial(href_list["eject"], text2num(href_list["amount"])) if(href_list["sync"]) sync() @@ -171,7 +172,7 @@ to_chat(user, "This disk seems to be corrupted!") else to_chat(user, "Installing blueprint files for [D.company]...") - if(do_after(user,50,src)) + if(do_after(user, 5 SECONDS, src)) var/datum/robolimb/R = all_robolimbs[D.company] R.unavailable_to_build = 0 to_chat(user, "Installed [D.company] blueprints!") @@ -184,7 +185,7 @@ to_chat(user, "This disk seems to be corrupted!") else to_chat(user, "Uploading modification files for [D.species]...") - if(do_after(user,50,src)) + if(do_after(user, 5 SECONDS, src)) species_types |= D.species to_chat(user, "Uploaded [D.species] files!") qdel(I) @@ -207,7 +208,7 @@ S.use(1) count++ to_chat(user, "You insert [count] [sname] into the fabricator.") - update_busy() + refresh_queue() else to_chat(user, "The fabricator cannot hold more [sname].") @@ -234,7 +235,7 @@ if(1) visible_message("[bicon(src)] [src] beeps: \"No records in User DB\"") -/obj/machinery/pros_fabricator/proc/update_busy() +/obj/machinery/pros_fabricator/refresh_queue() if(queue.len) if(can_build(queue[1])) busy = 1 @@ -249,13 +250,13 @@ /obj/machinery/pros_fabricator/proc/add_to_queue(var/index) var/datum/design/D = files.known_designs[index] queue += D - update_busy() + refresh_queue() /obj/machinery/pros_fabricator/proc/remove_from_queue(var/index) if(index == 1) progress = 0 queue.Cut(index, index + 1) - update_busy() + refresh_queue() /obj/machinery/pros_fabricator/proc/can_build(var/datum/design/D) for(var/M in D.materials) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index f98588bc566..622b8f89d36 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -479,12 +479,6 @@ radio.icon_state = icon_state radio.subspace_transmission = 1 -/obj/mecha/proc/do_after(delay as num) - sleep(delay) - if(src) - return 1 - return 0 - /obj/mecha/proc/enter_after(delay as num, var/mob/user as mob, var/numticks = 5) var/delayfraction = delay/numticks @@ -759,10 +753,14 @@ T:take_damage(force) melee_can_hit = 0 - if(do_after(melee_cooldown)) + if(mech_delay(melee_cooldown)) melee_can_hit = 1 return +/obj/mecha/proc/mech_delay(var/delay) + sleep(delay) + return !QDELETED(src) + /obj/mecha/proc/range_action(atom/target) return @@ -959,7 +957,7 @@ float_direction = direction start_process(MECHA_PROC_MOVEMENT) src.log_message("Movement control lost. Inertial movement started.") - if(do_after(get_step_delay())) + if(mech_delay(get_step_delay())) can_move = 1 return 1 return 0 @@ -1636,26 +1634,48 @@ return else if(istype(W,/obj/item/stack/nanopaste)) - if(state >= MECHA_PANEL_LOOSE) - var/obj/item/stack/nanopaste/NP = W + if(state < MECHA_PANEL_LOOSE) + to_chat(user, SPAN_WARNING("You can't reach \the [src]'s internal components.")) + return + + var/obj/item/stack/nanopaste/nanopaste = W + while(!QDELETED(user) && !QDELETED(src)) + // Get a component to attempt a repair on. + var/obj/item/mecha_parts/component/component for(var/slot in internal_components) - var/obj/item/mecha_parts/component/C = internal_components[slot] + var/obj/item/mecha_parts/component/check_component = internal_components[slot] + if(!QDELETED(check_component) && check_component.integrity < check_component.max_integrity) + component = check_component + break + + // We've run out of components to fix. + if(!component) + to_chat(user, SPAN_NOTICE("Nothing to repair!")) + break - if(C) + // Something has destroyed us or the mech, or we're incapacitated or moved away. + if(QDELETED(user) || QDELETED(src) || QDELETED(component) || component.loc != src || !do_after(user, 1 SECOND, src)) + break - if(C.integrity < C.max_integrity) - while(C.integrity < C.max_integrity && NP && do_after(user, 1 SECOND, src)) - if(NP.use(1)) - C.adjust_integrity(10) + // Out of repair gel. + if(QDELETED(nanopaste) || !nanopaste.use(1)) + to_chat(user, SPAN_WARNING("You're out of nanopaste!")) + break - to_chat(user, "You repair damage to \the [C].") + // Handle the actual repair. + component.adjust_integrity(10) + if(component.integrity >= component.max_integrity) + to_chat(user, SPAN_NOTICE("You repair the damage to \the [component].")) + else + to_chat(user, SPAN_NOTICE("You repair some of the damage to \the [component].")) - return + // Do another nanopaste check to avoid wasting a second on a do_after. + if(QDELETED(nanopaste) || !nanopaste.can_use(1)) + to_chat(user, SPAN_WARNING("You're out of nanopaste!")) + break - else - to_chat(user, "You can't reach \the [src]'s internal components.") - return + return else call((proc_res["dynattackby"]||src), "dynattackby")(W,user) @@ -2650,7 +2670,7 @@ var/mob/occupant = P.occupant user.visible_message("\The [user] begins opening the hatch on \the [P]...", "You begin opening the hatch on \the [P]...") - if (!do_after(user, 40)) + if (!do_after(user, 4 SECONDS)) return user.visible_message("\The [user] opens the hatch on \the [P] and removes [occupant]!", "You open the hatch on \the [P] and remove [occupant]!") @@ -2690,14 +2710,16 @@ src.occupant_message("Recalibrating coordination system.") src.log_message("Recalibration of coordination system started.") var/T = src.loc - if(do_after(100)) - if(T == src.loc) - src.clearInternalDamage(MECHA_INT_CONTROL_LOST) - src.occupant_message("Recalibration successful.") - src.log_message("Recalibration of coordination system finished with 0 errors.") - else - src.occupant_message("Recalibration failed.") - src.log_message("Recalibration of coordination system failed with 1 error.",1) + sleep(100) + if(QDELETED(src)) + return + if(T == src.loc) + src.clearInternalDamage(MECHA_INT_CONTROL_LOST) + src.occupant_message("Recalibration successful.") + src.log_message("Recalibration of coordination system finished with 0 errors.") + else + src.occupant_message("Recalibration failed.") + src.log_message("Recalibration of coordination system failed with 1 error.",1) if(href_list["drop_from_cargo"]) var/obj/O = locate(href_list["drop_from_cargo"]) if(O && (O in src.cargo)) diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 16ea69c868a..b3e27786298 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -1,7 +1,7 @@ /obj/effect/decal/cleanable/blood/gibs/robot name = "robot debris" desc = "It's a useless heap of junk... or is it?" - icon = 'icons/mob/robots.dmi' + icon = 'icons/mob/robot_gibs.dmi' icon_state = "gib1" basecolor = SYNTH_BLOOD_COLOUR random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 14360092cd4..3266ab07320 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -14,7 +14,7 @@ /obj/effect/decal/remains/robot desc = "They look like the remains of something mechanical. They have a strange aura about them." - icon = 'icons/mob/robots.dmi' + icon = 'icons/mob/robot_gibs.dmi' icon_state = "remainsrobot" /obj/effect/decal/remains/mouse diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 47420ee83aa..caeb8e7f83d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -971,3 +971,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if (!user.check_dexterity(test_dexterity, src, silent)) // Handles its own failure message. return return FALSE + +/obj/item/proc/is_mob_movement_sensitive() + return FALSE + +/obj/item/proc/handle_movement(var/turf/walking, var/running) + return FALSE diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index 66e1d0dce0f..27ba85d9986 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -88,7 +88,7 @@ if(!istype(W)) return if(W.is_wrench() && isturf(loc)) - if(do_after(5)) + if(do_after(user, 5, src)) if(!src) return to_chat(user, "You dissasemble the desk bell") new /obj/item/stack/material/steel(get_turf(src), 1) diff --git a/code/game/objects/items/robobag.dm b/code/game/objects/items/robobag.dm index 1bdfac26de1..6734f334349 100644 --- a/code/game/objects/items/robobag.dm +++ b/code/game/objects/items/robobag.dm @@ -1,6 +1,6 @@ /obj/item/bodybag/cryobag/robobag - name = "synthmorph bag" + name = "synthbody bag" desc = "A reusable polymer bag designed to slow down synthetic functions such as data corruption and coolant flow, \ especially useful if short on time or in a hostile environment." icon = 'icons/obj/robobag.dmi' @@ -17,14 +17,14 @@ qdel(src) /obj/structure/closet/body_bag/cryobag/robobag - name = "synthmorph bag" + name = "synthbody bag" desc = "A reusable polymer bag designed to slow down synthetic functions such as data corruption and coolant flow, \ especially useful if short on time or in a hostile environment." icon = 'icons/obj/robobag.dmi' item_path = /obj/item/bodybag/cryobag/robobag tank_type = /obj/item/tank/stasis/nitro_cryo stasis_level = 2 // Lower than the normal cryobag, because it's not made for meat that dies. It's made for robots and is freezing. - var/obj/item/clothing/accessory/badge/corptag // The tag on the bag. + var/obj/item/clothing/accessory/medal/badge/corptag // The tag on the bag. /obj/structure/closet/body_bag/cryobag/robobag/examine(mob/user) . = ..() @@ -32,17 +32,24 @@ . += "[src] has a [corptag] attached to it." /obj/structure/closet/body_bag/cryobag/robobag/update_icon() + if(opened) + icon_state = "open" + else if (length(contents)) + icon_state = "closed_occupied" + else + icon_state = "closed_unlocked" + cut_overlays() - ..() + if(corptag) var/corptag_icon_state = "tag_blank" - if(istype(corptag,/obj/item/clothing/accessory/badge/holo/detective) || istype(corptag,/obj/item/clothing/accessory/badge/holo/detective) || istype(corptag, /obj/item/clothing/accessory/badge/holo/hos) || istype(corptag, /obj/item/clothing/accessory/badge/old) || istype(corptag, /obj/item/clothing/accessory/badge/sheriff)) + if(istype(corptag,/obj/item/clothing/accessory/medal/badge/holo/detective) || istype(corptag,/obj/item/clothing/accessory/medal/badge/holo/detective) || istype(corptag, /obj/item/clothing/accessory/medal/badge/holo/hos) || istype(corptag, /obj/item/clothing/accessory/medal/badge/old) || istype(corptag, /obj/item/clothing/accessory/medal/badge/sheriff)) corptag_icon_state = "tag_badge_gold" - else if(istype(corptag, /obj/item/clothing/accessory/badge/holo/warden)) + else if(istype(corptag, /obj/item/clothing/accessory/medal/badge/holo/warden)) corptag_icon_state = "tag_badge_silver" - else if(istype(corptag, /obj/item/clothing/accessory/badge/holo)) + else if(istype(corptag, /obj/item/clothing/accessory/medal/badge/holo)) corptag_icon_state = "tag_badge_blue" - else if(istype(corptag, /obj/item/clothing/accessory/badge/corporate_tag)) + else if(istype(corptag, /obj/item/clothing/accessory/medal/badge/corporate_tag)) corptag_icon_state = corptag.icon_state add_overlay(corptag_icon_state) @@ -86,7 +93,7 @@ for(var/mob/living/L in contents) analyzer.attack(L,user) - else if(istype(W, /obj/item/clothing/accessory/badge)) + else if(istype(W, /obj/item/clothing/accessory/medal/badge)) if(corptag) var/old_tag = corptag corptag.forceMove(get_turf(src)) @@ -109,8 +116,8 @@ desc = "Your software is being debugged." mob_overlay_state = "signal_blue" - on_created_text = "You feel something pour over your senses." - on_expired_text = "Your mind is clear once more." + on_created_text = "You feel something cloud over your senses." + on_expired_text = "Your senses are clear once more." stacks = MODIFIER_STACK_FORBID /datum/modifier/fbp_debug/tick() diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm new file mode 100644 index 00000000000..e259f51891b --- /dev/null +++ b/code/game/objects/items/robot/robot_frame.dm @@ -0,0 +1,197 @@ +/obj/item/robot_parts/frame + name = "standard robot frame" + desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." + icon_state = "robo_suit" + var/list/parts = list() + var/list/required_parts = list( + BP_L_ARM = /obj/item/robot_parts/l_arm, + BP_R_ARM = /obj/item/robot_parts/r_arm, + BP_TORSO = /obj/item/robot_parts/chest, + BP_L_LEG = /obj/item/robot_parts/l_leg, + BP_R_LEG = /obj/item/robot_parts/r_leg, + BP_HEAD = /obj/item/robot_parts/head + ) + var/created_name = "" + var/product = /mob/living/silicon/robot + +/obj/item/robot_parts/frame/examine(mob/user) + . = ..() + if(check_completion()) + . += SPAN_NOTICE("It is ready to receive a controlling intelligence.") + else + for(var/part in required_parts) + if(!parts[part]) + var/obj/item/part_type = required_parts[part] + . += SPAN_WARNING("It is missing \a [initial(part_type.name)]") + +/obj/item/robot_parts/frame/update_model_info(var/model) + return FALSE + +/obj/item/robot_parts/frame/Initialize() + . = ..() + update_icon() + +/obj/item/robot_parts/frame/update_icon() + cut_overlays() + for(var/part in required_parts) + if(parts[part]) + add_overlay("[part]+o") + +/obj/item/robot_parts/frame/proc/check_completion() + for(var/part in required_parts) + if(!parts[part]) + return FALSE + return TRUE + +/obj/item/robot_parts/frame/attackby(obj/item/W, mob/user) + + // Uninstall a robotic part. + if(W.is_crowbar()) + if(!parts.len) + to_chat(user, SPAN_WARNING("\The [src] has no parts to remove.")) + return + var/removing = pick(parts) + var/obj/item/robot_parts/part = parts[removing] + part.forceMove(get_turf(src)) + user.put_in_hands(part) + parts -= removing + to_chat(user, SPAN_WARNING("You lever \the [part] off \the [src].")) + update_icon() + + // Install a robotic part. + else if (istype(W, /obj/item/robot_parts)) + var/obj/item/robot_parts/part = W + if(!required_parts[part.bp_tag] || !istype(W, required_parts[part.bp_tag])) + to_chat(user, SPAN_WARNING("\The [src] is not compatible with \the [W].")) + return + if(parts[part.bp_tag]) + to_chat(user, SPAN_WARNING("\The [src] already has \a [W] installed.")) + return + if(part.can_install(user) && user.unEquip(W, src)) + parts[part.bp_tag] = part + part.forceMove(src) + update_icon() + + // Install an MMI/brain. + else if(istype(W, /obj/item/mmi)) + + if(!istype(loc,/turf)) + to_chat(user, SPAN_WARNING("You can't put \the [W] in without the frame being on the ground.")) + return + + if(!check_completion()) + to_chat(user, SPAN_WARNING("The frame is not ready for the central processor to be installed.")) + return + + var/obj/item/mmi/M = W + var/mob/living/carbon/brain/B = M.brainmob + if(!istype(M, /obj/item/mmi/inert)) + if(!B) + to_chat(user, SPAN_WARNING("Sticking an empty [W.name] into the frame would sort of defeat the purpose.")) + return + + if(jobban_isbanned(B, "Cyborg")) + to_chat(user, SPAN_WARNING("\The [W] does not seem to fit.")) + return + + if(B.stat == DEAD) + to_chat(user, SPAN_WARNING("Sticking a dead [W.name] into the frame would sort of defeat the purpose.")) + return + + var/ghost_can_reenter = 0 + if(B.mind) + if(B.key) + ghost_can_reenter = TRUE + else + for(var/mob/observer/dead/G in player_list) + if(G.can_reenter_corpse && G.mind == B.mind) + ghost_can_reenter = TRUE + //Jamming a ghosted brain into a borg is likely detrimental, and may result in some problems. + to_chat(user, SPAN_NOTICE("\The [W] is completely unresponsive, but it may be able to auto-resuscitate if you leave it be for awhile.")) + break + + if(!ghost_can_reenter) + to_chat(user, SPAN_WARNING("\The [W] is completely unresponsive; there's no point.")) + return + + if(!user.unEquip(W)) + return + + var/mob/living/silicon/robot/O = new product(get_turf(loc)) + if(!O) + return + + O.mmi = W + O.invisibility = 0 + O.custom_name = created_name + O.updatename("Default") + if(B) + B.mind.transfer_to(O) + if(O.mind && O.mind.assigned_role) + O.job = O.mind.assigned_role + else + O.job = "Robot" + + var/obj/item/robot_parts/chest/chest = parts[BP_TORSO] + if (chest && chest.cell) + chest.cell.forceMove(O) + W.forceMove(O) //Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. + + // Since we "magically" installed a cell, we also have to update the correct component. + if(O.cell) + var/datum/robot_component/cell_component = O.components["power cell"] + cell_component.wrapped = O.cell + cell_component.installed = 1 + callHook("borgify", list(O)) + O.Namepick() + qdel(src) + + else if(istype(W, /obj/item/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) + if(t && (in_range(src, user) || loc == user)) + created_name = t + else + ..() + +/obj/item/robot_parts/frame/Destroy() + parts.Cut() + for(var/thing in contents) + qdel(thing) + . = ..() + +/obj/item/robot_parts/frame/proc/dismantled_from(mob/living/silicon/robot/donor) + for(var/thing in required_parts - list(BP_TORSO, BP_HEAD)) + var/part_type = required_parts[thing] + parts[thing] = new part_type(src) + var/obj/item/robot_parts/chest/chest = (locate() in donor.contents) || new + if(chest) + chest.forceMove(src) + parts[BP_TORSO] = chest + update_icon() + +/obj/item/robot_parts/frame/SetDefaultName() + name = initial(name) + +/obj/item/robot_parts/frame/flyer + name = "flying robot frame" + icon = 'icons/obj/robot_parts_flying.dmi' + product = /mob/living/silicon/robot/flying + required_parts = list( + BP_L_ARM = /obj/item/robot_parts/l_arm, + BP_R_ARM = /obj/item/robot_parts/r_arm, + BP_TORSO = /obj/item/robot_parts/chest, + BP_HEAD = /obj/item/robot_parts/head + ) + +/obj/item/robot_parts/frame/platform + name = "large robot frame" + icon = 'icons/obj/robot_parts_platform.dmi' + product = /mob/living/silicon/robot/platform + required_parts = list( + BP_L_ARM = /obj/item/robot_parts/l_arm, + BP_R_ARM = /obj/item/robot_parts/r_arm, + BP_L_LEG = /obj/item/robot_parts/l_leg, + BP_R_LEG = /obj/item/robot_parts/r_leg, + BP_TORSO = /obj/item/robot_parts/chest, + BP_HEAD = /obj/item/robot_parts/head + ) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 8fe77a0d1ce..617ba34aa24 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -4,294 +4,222 @@ item_state = "buildpipe" icon_state = "blank" slot_flags = SLOT_BELT + dir = SOUTH var/list/part = null // Order of args is important for installing robolimbs. var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics. var/model_info - dir = SOUTH + var/bp_tag = null // What part is this? /obj/item/robot_parts/set_dir() return +/obj/item/robot_parts/proc/update_model_info(var/model) + if(!model) + return FALSE + model_info = model + var/datum/robolimb/R = all_robolimbs[model] + if(R) + name = "[R.company] [initial(name)]" + desc = "[R.desc]" + if(icon_state in icon_states(R.icon)) + icon = R.icon + return TRUE + return FALSE + +/obj/item/robot_parts/Initialize(ml, model) + . = ..(ml) + if(!update_model_info(model)) + SetDefaultName() + +/obj/item/robot_parts/proc/SetDefaultName() + name = "robot [initial(name)]" + +/obj/item/robot_parts/proc/can_install(mob/user) + return TRUE + /obj/item/robot_parts/l_arm - name = "cyborg left arm" + name = "left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" part = list(BP_L_ARM, BP_L_HAND) - model_info = 1 + bp_tag = BP_L_ARM /obj/item/robot_parts/r_arm - name = "cyborg right arm" + name = "right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" part = list(BP_R_ARM, BP_R_HAND) - model_info = 1 + bp_tag = BP_R_ARM /obj/item/robot_parts/l_leg - name = "cyborg left leg" + name = "left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" part = list(BP_L_LEG, BP_L_FOOT) - model_info = 1 + bp_tag = BP_L_LEG /obj/item/robot_parts/r_leg - name = "cyborg leg" + name = "right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" part = list(BP_R_LEG, BP_R_FOOT) - model_info = 1 - -/obj/item/robot_parts/chest - name = "cyborg chest" - desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." - icon_state = "chest" - part = list(BP_GROIN,BP_TORSO) - var/wires = 0.0 - var/obj/item/cell/cell = null + bp_tag = BP_R_LEG /obj/item/robot_parts/head - name = "cyborg head" + name = "head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." icon_state = "head" part = list(BP_HEAD) + bp_tag = BP_HEAD var/obj/item/flash/flash1 = null var/obj/item/flash/flash2 = null -/obj/item/robot_parts/robot_suit - name = "endoskeleton" - desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." - icon_state = "robo_suit" - var/obj/item/robot_parts/l_arm/l_arm = null - var/obj/item/robot_parts/r_arm/r_arm = null - var/obj/item/robot_parts/l_leg/l_leg = null - var/obj/item/robot_parts/r_leg/r_leg = null - var/obj/item/robot_parts/chest/chest = null - var/obj/item/robot_parts/head/head = null - var/created_name = "" - -/obj/item/robot_parts/robot_suit/Initialize() - . = ..() - src.updateicon() - -/obj/item/robot_parts/robot_suit/proc/updateicon() - cut_overlays() - if(src.l_arm) - add_overlay("l_arm+o") - if(src.r_arm) - add_overlay("r_arm+o") - if(src.chest) - add_overlay("chest+o") - if(src.l_leg) - add_overlay("l_leg+o") - if(src.r_leg) - add_overlay("r_leg+o") - if(src.head) - add_overlay("head+o") - -/obj/item/robot_parts/robot_suit/proc/check_completion() - if(src.l_arm && src.r_arm) - if(src.l_leg && src.r_leg) - if(src.chest && src.head) - feedback_inc("cyborg_frames_built",1) - return 1 - return 0 - -/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob) - ..() - if(istype(W, /obj/item/stack/material) && W.get_material_name() == MAT_STEEL && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) - var/obj/item/stack/material/M = W - if (M.use(1)) - var/obj/item/secbot_assembly/ed209_assembly/B = new /obj/item/secbot_assembly/ed209_assembly - B.loc = get_turf(src) - to_chat(user, "You armed the robot frame.") - if (user.get_inactive_hand()==src) - user.remove_from_mob(src) - user.put_in_inactive_hand(B) - qdel(src) - else - to_chat(user, "You need one sheet of metal to arm the robot frame.") - if(istype(W, /obj/item/robot_parts/l_leg)) - if(src.l_leg) return - user.drop_item() - W.loc = src - src.l_leg = W - src.updateicon() - - if(istype(W, /obj/item/robot_parts/r_leg)) - if(src.r_leg) return - user.drop_item() - W.loc = src - src.r_leg = W - src.updateicon() - - if(istype(W, /obj/item/robot_parts/l_arm)) - if(src.l_arm) return - user.drop_item() - W.loc = src - src.l_arm = W - src.updateicon() - - if(istype(W, /obj/item/robot_parts/r_arm)) - if(src.r_arm) return - user.drop_item() - W.loc = src - src.r_arm = W - src.updateicon() - - if(istype(W, /obj/item/robot_parts/chest)) - if(src.chest) return - if(W:wires && W:cell) - user.drop_item() - W.loc = src - src.chest = W - src.updateicon() - else if(!W:wires) - to_chat(user, "You need to attach wires to it first!") - else - to_chat(user, "You need to attach a cell to it first!") - - if(istype(W, /obj/item/robot_parts/head)) - if(src.head) return - if(W:flash2 && W:flash1) - user.drop_item() - W.loc = src - src.head = W - src.updateicon() - else - to_chat(user, "You need to attach a flash to it first!") - - if(istype(W, /obj/item/mmi)) - var/obj/item/mmi/M = W - if(check_completion()) - if(!istype(loc,/turf)) - to_chat(user, "You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.") - return - if(!istype(W, /obj/item/mmi/inert)) - if(!M.brainmob) - to_chat(user, "Sticking an empty [W] into the frame would sort of defeat the purpose.") - return - if(!M.brainmob.key) - var/ghost_can_reenter = 0 - if(M.brainmob.mind) - for(var/mob/observer/dead/G in player_list) - if(G.can_reenter_corpse && G.mind == M.brainmob.mind) - ghost_can_reenter = 1 //May come in use again at another point. - to_chat(user, "\The [W] is completely unresponsive; though it may be able to auto-resuscitate.") //Jamming a ghosted brain into a borg is likely detrimental, and may result in some problems. - return - if(!ghost_can_reenter) - to_chat(user, "\The [W] is completely unresponsive; there's no point.") - return - - if(M.brainmob.stat == DEAD) - to_chat(user, "Sticking a dead [W] into the frame would sort of defeat the purpose.") - return - - if(jobban_isbanned(M.brainmob, "Cyborg")) - to_chat(user, "This [W] does not seem to fit.") - return - - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), TRUE) - if(!O) return - - user.drop_item() +/obj/item/robot_parts/head/can_install(mob/user) + var/success = TRUE + if(!flash1 || !flash2) + to_chat(user, SPAN_WARNING("You need to attach a flash to it first!")) + success = FALSE + return success && ..() - O.mmi = W - O.post_mmi_setup() - O.invisibility = 0 - O.custom_name = created_name - O.updatename("Default") - - if(M.brainmob) - M.brainmob.mind.transfer_to(O) - if(O.mind && O.mind.special_role) - O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") - for(var/datum/language/L in M.brainmob.languages) - O.add_language(L.name) - O.job = "Cyborg" - O.cell = chest.cell - O.cell.loc = O - W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - - // Since we "magically" installed a cell, we also have to update the correct component. - if(O.cell) - var/datum/robot_component/cell_component = O.components["power cell"] - cell_component.wrapped = O.cell - cell_component.installed = 1 - - feedback_inc("cyborg_birth",1) - callHook("borgify", list(O)) - O.Namepick() - - qdel(src) - else - to_chat(user, "The MMI must go in after everything else!") - - if (istype(W, /obj/item/pen)) - var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) - if (!t) - return - if (!in_range(src, usr) && src.loc != usr) - return +/obj/item/robot_parts/chest + name = "torso" + desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." + icon_state = "torso" + part = list(BP_GROIN,BP_TORSO) + bp_tag = BP_TORSO + var/wires = 0.0 + var/obj/item/cell/cell = null - src.created_name = t +/obj/item/robot_parts/chest/can_install(mob/user) + var/success = TRUE + if(!wires) + to_chat(user, SPAN_WARNING("You need to attach wires to it first!")) + success = FALSE + if(!cell) + to_chat(user, SPAN_WARNING("You need to attach a cell to it first!")) + success = FALSE + return success && ..() - return +/obj/item/robot_parts/chest/attackby(obj/item/W, mob/user) -/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob) - ..() if(istype(W, /obj/item/cell)) if(src.cell) - to_chat(user, "You have already inserted a cell!") - return - else - user.drop_item() - W.loc = src + to_chat(user, SPAN_WARNING("You have already inserted a cell!")) + return TRUE + if(user.unEquip(W, src)) src.cell = W - to_chat(user, "You insert the cell!") + W.forceMove(src) + to_chat(user, SPAN_NOTICE("You insert the cell!")) + return TRUE + if(istype(W, /obj/item/stack/cable_coil)) if(src.wires) - to_chat(user, "You have already inserted wire!") - return - else - var/obj/item/stack/cable_coil/coil = W - coil.use(1) + to_chat(user, SPAN_WARNING("You have already inserted wire!")) + return TRUE + var/obj/item/stack/cable_coil/coil = W + if(coil.use(1)) src.wires = 1.0 - to_chat(user, "You insert the wire!") - return + to_chat(user, SPAN_NOTICE("You insert the wire!")) + return TRUE -/obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W, /obj/item/robot_parts/head)) + var/obj/item/robot_parts/head/head_part = W + // Attempt to create full-body prosthesis. + var/success = TRUE + success &= can_install(user) + success &= head_part.can_install(user) + if (success) + + // Species selection. + var/species = input(user, "Select a species for the prosthetic.") as null|anything in GetCyborgSpecies() + if(!species) + return TRUE + var/name = sanitizeSafe(input(user,"Set a name for the new prosthetic."), MAX_NAME_LEN) + if(!name) + name = "prosthetic ([random_id("prosthetic_id", 1, 999)])" + + // Create a new, nonliving human. + var/mob/living/carbon/human/H = new /mob/living/carbon/human(get_turf(loc)) + H.death(0, DEATHGASP_NO_MESSAGE) + H.set_species(species) + H.fully_replace_character_name(name) + + // Remove all external organs other than chest and head.. + for (var/O in list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG)) + var/obj/item/organ/external/organ = H.organs_by_name[O] + H.organs -= organ + H.organs_by_name[organ.organ_tag] = null + qdel(organ) + + // Remove brain (we want to put one in). + var/obj/item/organ/internal/brain = H.internal_organs_by_name[O_BRAIN] + H.organs -= brain + H.organs_by_name[brain.organ_tag] = null + qdel(brain) + + // Robotize remaining organs: Eyes, head, and chest. + // Respect brand used. + var/obj/item/organ/internal/eyes = H.internal_organs_by_name[O_EYES] + eyes.robotize() + + var/obj/item/organ/external/head = H.organs_by_name[BP_HEAD] + var/head_company = head_part.model_info + head.robotize(head_company) + + var/obj/item/organ/external/chest = H.organs_by_name[BP_TORSO] + var/chest_company = model_info + chest.robotize(chest_company) + + // Cleanup + qdel(W) + qdel(src) + return TRUE + + return ..() + +/obj/item/robot_parts/chest/proc/GetCyborgSpecies() + . = list() + for(var/N in GLOB.playable_species) + var/datum/species/S = GLOB.all_species[N] + if(S.spawn_flags & SPECIES_NO_FBP_CONSTRUCTION) + continue + . += N + +/obj/item/robot_parts/head/attackby(obj/item/W, mob/user) ..() if(istype(W, /obj/item/flash)) if(istype(user,/mob/living/silicon/robot)) var/current_module = user.get_active_hand() if(current_module == W) - to_chat(user, "How do you propose to do that?") + to_chat(user, SPAN_WARNING("How do you propose to do that?")) return else add_flashes(W,user) else add_flashes(W,user) - return -/obj/item/robot_parts/head/proc/add_flashes(obj/item/W as obj, mob/user as mob) //Made into a separate proc to avoid copypasta +/obj/item/robot_parts/head/proc/add_flashes(obj/item/W, mob/user) //Made into a seperate proc to avoid copypasta if(src.flash1 && src.flash2) - to_chat(user, "You have already inserted the eyes!") + to_chat(user, SPAN_NOTICE("You have already inserted the eyes!")) return else if(src.flash1) - user.drop_item() - W.loc = src + if(!user.unEquip(W, src)) + return src.flash2 = W - to_chat(user, "You insert the flash into the eye socket!") + W.forceMove(src) + to_chat(user, SPAN_NOTICE("You insert the flash into the eye socket!")) else - user.drop_item() - W.loc = src + if(!user.unEquip(W, src)) + return src.flash1 = W - to_chat(user, "You insert the flash into the eye socket!") + W.forceMove(src) + to_chat(user, SPAN_NOTICE("You insert the flash into the eye socket!")) -/obj/item/robot_parts/emag_act(var/remaining_charges, var/mob/user) +/obj/item/robot_parts/emag_act(remaining_charges, mob/user) if(sabotaged) - to_chat(user, "[src] is already sabotaged!") + to_chat(user, SPAN_WARNING("[src] is already sabotaged!")) else - to_chat(user, "You short out the safeties.") + to_chat(user, SPAN_WARNING("You short out the safeties.")) sabotaged = 1 return 1 diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index fd05f926760..28358a53efb 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -1,20 +1,23 @@ -// robot_upgrades.dm -// Contains various borg upgrades. - +/* + * Cyborg/Robot Upgrades + * Contains various robot upgrade modules. + */ /obj/item/borg/upgrade name = "borg upgrade module." desc = "Protected by FRM." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade" - var/locked = 0 - var/require_module = 0 - var/installed = 0 -/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R) + var/locked = FALSE + var/require_module = FALSE + var/installed = FALSE + +/obj/item/borg/upgrade/proc/action(mob/living/silicon/robot/R) if(R.stat == DEAD) - to_chat(usr, "The [src] will not function on a deceased robot.") - return 1 - return 0 + to_chat(usr, SPAN_WARNING("The [src] will not function on a deceased robot.")) + return FALSE + + return TRUE /obj/item/borg/upgrade/reset @@ -22,32 +25,37 @@ desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." icon_state = "cyborg_upgrade1" item_state = "cyborg_upgrade" - require_module = 1 + require_module = TRUE + +/obj/item/borg/upgrade/reset/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE -/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) - if(..()) - return 0 R.module_reset() - return 1 + return TRUE + /obj/item/borg/upgrade/rename name = "robot reclassification board" desc = "Used to rename a cyborg." icon_state = "cyborg_upgrade1" item_state = "cyborg_upgrade" + var/heldname = "default name" /obj/item/borg/upgrade/rename/attack_self(mob/user as mob) heldname = sanitizeSafe(input(user, "Enter new robot name", "Robot Reclassification", heldname), MAX_NAME_LEN) -/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R) - if(..()) return 0 +/obj/item/borg/upgrade/rename/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE + R.notify_ai(ROBOT_NOTIFICATION_NEW_NAME, R.name, heldname) R.name = heldname R.custom_name = heldname R.real_name = heldname + return TRUE - return 1 /obj/item/borg/upgrade/restart name = "robot emergency restart module" @@ -55,13 +63,12 @@ icon_state = "cyborg_upgrade1" item_state = "cyborg_upgrade" - -/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/restart/action(mob/living/silicon/robot/R) if(R.health < 0) to_chat(usr, "You have to repair the robot before using this module!") - return 0 + return FALSE - if(!R.key) + if(isnull(R.key)) for(var/mob/observer/dead/ghost in player_list) if(ghost.mind && ghost.mind.current == R) R.key = ghost.key @@ -70,7 +77,7 @@ dead_mob_list -= R living_mob_list |= R R.notify_ai(ROBOT_NOTIFICATION_NEW_UNIT) - return 1 + return TRUE /obj/item/borg/upgrade/vtec @@ -78,16 +85,18 @@ desc = "Used to kick in a robot's VTEC systems, increasing their speed." icon_state = "cyborg_upgrade2" item_state = "cyborg_upgrade" - require_module = 1 + require_module = TRUE -/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R) - if(..()) return 0 + var/move_delay_reduction = 0.5 - if(R.speed == -1) - return 0 +/obj/item/borg/upgrade/vtec/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE + if(R.speed == (initial(R.speed) - move_delay_reduction)) + return FALSE - R.speed-- - return 1 + R.speed -= move_delay_reduction + return TRUE /obj/item/borg/upgrade/tasercooler @@ -95,99 +104,96 @@ desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" - require_module = 1 - - -/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R) - if(..()) return 0 + require_module = TRUE +/obj/item/borg/upgrade/tasercooler/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE if(!R.module || !(type in R.module.supported_upgrades)) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") - return 0 + return FALSE var/obj/item/gun/energy/taser/mounted/cyborg/T = locate() in R.module - if(!T) + if(isnull(T)) T = locate() in R.module.contents - if(!T) + if(isnull(T)) T = locate() in R.module.modules - if(!T) - to_chat(usr, "This robot has had its taser removed!") - return 0 + if(isnull(T)) + to_chat(usr, SPAN_WARNING("This robot has had its taser removed!")) + return FALSE + // This actually reduces the recharge time, not the fire delay. if(T.recharge_time <= 2) to_chat(R, "Maximum cooling achieved for this hardpoint!") to_chat(usr, "There's no room for another cooling unit!") - return 0 - + return FALSE else T.recharge_time = max(2 , T.recharge_time - 4) + return TRUE - return 1 /obj/item/borg/upgrade/jetpack name = "robot jetpack" desc = "A carbon dioxide jetpack suitable for low-gravity operations." icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" - require_module = 1 + require_module = TRUE -/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - var/obj/item/tank/jetpack/carbondioxide/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/tank/jetpack/carbondioxide(R.module) - for(var/obj/item/tank/jetpack/carbondioxide in R.module.modules) - R.internals = src - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") +/obj/item/borg/upgrade/jetpack/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE + if(R.module.jetpack) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") - return 0 + return FALSE + + R.module.jetpack = new /obj/item/tank/jetpack/carbondioxide(R.module) + R.internals = R.module.jetpack + return TRUE + /obj/item/borg/upgrade/advhealth name = "advanced health analyzer module" desc = "A carbon dioxide jetpack suitable for low-gravity operations." icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" - require_module = 1 + require_module = TRUE -/obj/item/borg/upgrade/advhealth/action(var/mob/living/silicon/robot/R) - if(..()) return 0 +/obj/item/borg/upgrade/advhealth/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE var/obj/item/healthanalyzer/advanced/T = locate() in R.module - if(!T) + if(isnull(T)) T = locate() in R.module.contents - if(!T) + if(isnull(T)) T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/healthanalyzer/advanced(R.module) - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + if(isnull(T)) + R.module.modules.Add(new /obj/item/healthanalyzer/advanced(R.module)) + return TRUE + if(!isnull(T)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") - return 0 + return FALSE + -/obj/item/borg/upgrade/syndicate/ +/obj/item/borg/upgrade/syndicate name = "scrambled equipment module" desc = "Unlocks new and often deadly module specific items of a robot" icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" - require_module = 1 + require_module = TRUE -/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R) - if(..()) return 0 +/obj/item/borg/upgrade/syndicate/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE + if(R.emag_items) + return FALSE - if(R.emag_items == 1) - return 0 + R.emag_items = TRUE + return TRUE - R.emag_items = 1 - return 1 /obj/item/borg/upgrade/language name = "language module" @@ -195,21 +201,21 @@ icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" -/obj/item/borg/upgrade/language/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - R.add_language(LANGUAGE_SOL_COMMON, 1) - R.add_language(LANGUAGE_TRADEBAND, 1) - R.add_language(LANGUAGE_SIVIAN, 1) - R.add_language(LANGUAGE_UNATHI, 1) - R.add_language(LANGUAGE_SIIK, 1) - R.add_language(LANGUAGE_AKHANI, 1) - R.add_language(LANGUAGE_SKRELLIAN, 1) - R.add_language(LANGUAGE_SKRELLIANFAR, 0) - R.add_language(LANGUAGE_GUTTER, 1) - R.add_language(LANGUAGE_SCHECHI, 1) - R.add_language(LANGUAGE_ROOTLOCAL, 1) - R.add_language(LANGUAGE_TERMINUS, 1) - R.add_language(LANGUAGE_ZADDAT, 1) - - return 1 +/obj/item/borg/upgrade/language/action(mob/living/silicon/robot/R) + if(!..()) + return FALSE + + R.add_language(LANGUAGE_SOL_COMMON, TRUE) + R.add_language(LANGUAGE_TRADEBAND, TRUE) + R.add_language(LANGUAGE_SIVIAN, TRUE) + R.add_language(LANGUAGE_UNATHI, TRUE) + R.add_language(LANGUAGE_SIIK, TRUE) + R.add_language(LANGUAGE_AKHANI, TRUE) + R.add_language(LANGUAGE_SKRELLIAN, TRUE) + R.add_language(LANGUAGE_SKRELLIANFAR, FALSE) + R.add_language(LANGUAGE_GUTTER, TRUE) + R.add_language(LANGUAGE_SCHECHI, TRUE) + R.add_language(LANGUAGE_ROOTLOCAL, TRUE) + R.add_language(LANGUAGE_TERMINUS, TRUE) + R.add_language(LANGUAGE_ZADDAT, TRUE) + return TRUE diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index b1457eaad11..6643815acb4 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -968,17 +968,23 @@ return ..() /obj/item/toy/plushie/nymph - name = "Diona nymph plush" + name = "\improper Diona nymph plush" desc = "A plushie of an adorable Diona nymph! While its level of self-awareness is still being debated, its level of cuteness is not." icon_state = "nymphplushie" pokephrase = "Chirp!" /obj/item/toy/plushie/teshari - name = "Teshari plush" + name = "\improper Teshari plush" desc = "This is a plush Teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!" icon_state = "teshariplushie" pokephrase = "Rya!" +/obj/item/toy/plushie/zaddat + name = "\improper Zaddat plush" + desc = "A plushie depicting a stylized Zaddat Shroud, presumably with a little Zaddat inside. It's suspiciously cute." + icon_state = "zaddatplushie" + pokephrase = "Chirrp~!" //Rating: NOT cute, Zaddat only make this sound when they are stressed! + /obj/item/toy/plushie/mouse name = "mouse plush" desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." @@ -1004,7 +1010,7 @@ pokephrase = "Sksksk!" /obj/item/toy/plushie/farwa - name = "Farwa plush" + name = "\improper Farwa plush" desc = "A Farwa plush doll. It's soft and comforting!" icon_state = "farwaplushie" pokephrase = "Squaw!" @@ -1214,7 +1220,7 @@ item_state = "egg3" // It's the green egg in items_left/righthand /obj/item/toy/plushie/fumo - name = "Fumo" + name = "\improper Fumo" desc = "A plushie of a....?." icon_state = "fumoplushie" pokephrase = "I just don't think about losing." diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 3288a1f247c..2a1ce1051d7 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -116,7 +116,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.siemens_coefficient<0.5) //Thick skin. + if(H.species.get_siemens_coefficient(H) < 0.5) //Thick skin. return if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) ) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 68f2952527b..f081e8ea106 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -18,6 +18,29 @@ var/side = 0 //0 = right, 1 = left drop_sound = 'sound/items/drop/backpack.ogg' pickup_sound = 'sound/items/pickup/backpack.ogg' + var/list/species_restricted = null + +/obj/item/storage/backpack/mob_can_equip(M, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + wearable = exclusive ^ (H.species.get_bodytype(H) in species_restricted) + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 /obj/item/storage/backpack/equipped(var/mob/user, var/slot) @@ -554,3 +577,12 @@ Unlike the show claims, it is not a phoron-enhanced satchel of holding with plot-relevant content." icon = 'icons/obj/clothing/ranger.dmi' icon_state = "ranger_satchel" + +/obj/item/storage/backpack/teshbag + name = "tailbags" + gender = PLURAL + desc = "A pair of small, connected bags, designed to strap around the base of a teshari's tail." + icon_state = "teshbag" + species_restricted = list(SPECIES_TESHARI) + max_w_class = ITEMSIZE_NORMAL + max_storage_space = ITEMSIZE_COST_NORMAL * 5 \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 4ffa893275e..562f19d2bab 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -187,7 +187,7 @@ /obj/item/hailer, /obj/item/megaphone, /obj/item/melee, - /obj/item/clothing/accessory/badge, + /obj/item/clothing/accessory/medal/badge, /obj/item/gun/projectile/sec, /obj/item/gun/projectile/p92x, /obj/item/taperoll, @@ -218,7 +218,7 @@ /obj/item/camera, /obj/item/autopsy_scanner, /obj/item/mass_spectrometer, - /obj/item/clothing/accessory/badge, + /obj/item/clothing/accessory/medal/badge, /obj/item/reagent_scanner, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index f9cb37a3bcd..c14a04fd639 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -34,8 +34,8 @@ /obj/item/sample, /obj/item/tool/screwdriver, /obj/item/stamp, - /obj/item/clothing/accessory/permit, - /obj/item/clothing/accessory/badge, + /obj/item/clothing/accessory/medal/permit, + /obj/item/clothing/accessory/medal/badge, /obj/item/makeover ) cant_hold = list(/obj/item/tool/screwdriver/power) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index ed30c79afd7..acf0787042c 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -218,9 +218,9 @@ . += "The meter on \the [src] indicates you are almost out of nitrogen!" //playsound(user, 'sound/effects/alert.ogg', 50, 1) -/obj/item/tank/stasis/nitro_cryo // Synthmorph bags need to have initial pressure within safe bounds for human atmospheric pressure, but low temperature to stop unwanted degredation. +/obj/item/tank/stasis/nitro_cryo // Synthbody bags need to have initial pressure within safe bounds for human atmospheric pressure, but low temperature to stop unwanted degredation. name = "stasis cryogenic nitrogen tank" - desc = "Cryogenic Nitrogen tank included in most synthmorph bag designs." + desc = "Cryogenic Nitrogen tank included in most synthbody bag designs." icon_state = "emergency_double_nitro" gauge_icon = "indicator_emergency_double" volume = 10 diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 283cf591049..9af46a1e5a7 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -150,6 +150,7 @@ O.reagents.trans_to_obj(src, max_fuel) to_chat(user, "Welder refueled") playsound(src, 'sound/effects/refill.ogg', 50, 1, -6) + update_icon() return else if(!welding) to_chat(user, "[src] doesn't use fuel.") diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 23df3685497..50875e85c7a 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -357,7 +357,7 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L - if(H.species.siemens_coefficient<0.5) //Thick skin. + if(H.species.get_siemens_coefficient(H) < 0.5) //Thick skin. return if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) ) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 9642dc1e34a..442ce461608 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -123,7 +123,9 @@ /obj/structure/catwalk/Crossed(atom/movable/AM) . = ..() if(isliving(AM) && !AM.is_incorporeal()) - playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1) + var/mob/living/M = AM + if(!M.is_floating) + playsound(src, pick('sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', 'sound/effects/footstep/catwalk4.ogg', 'sound/effects/footstep/catwalk5.ogg'), 25, 1) /obj/effect/catwalk_plated name = "plated catwalk spawner" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index da117f28a04..37a6dd0f32e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -28,10 +28,11 @@ /obj/item/cartridge/hop, /obj/item/radio/headset/heads/hop, /obj/item/radio/headset/heads/hop/alt, - /obj/item/storage/box/ids = 2, + /obj/item/storage/box/ids, /obj/item/gun/energy/gun, /obj/item/gun/projectile/sec/flash, - /obj/item/flash) + /obj/item/flash + ) /obj/structure/closet/secure_closet/hop2 name = "head of personnel's attire" @@ -54,11 +55,12 @@ /obj/item/clothing/shoes/laceup/brown, /obj/item/clothing/shoes/white, /obj/item/clothing/under/rank/head_of_personnel_whimsy, - /obj/item/clothing/head/caphat/hop, + /obj/item/clothing/head/hop, /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit, /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt, /obj/item/clothing/suit/storage/hooded/wintercoat/hop, - /obj/item/clothing/glasses/sunglasses) + /obj/item/clothing/glasses/sunglasses + ) /obj/structure/closet/secure_closet/hos @@ -84,7 +86,7 @@ /obj/item/shield/riot, /obj/item/shield/riot/tele, /obj/item/storage/box/holobadge/hos, - /obj/item/clothing/accessory/badge/holo/hos, + /obj/item/clothing/accessory/medal/badge/holo/hos, /obj/item/reagent_containers/spray/pepper, /obj/item/tool/crowbar/red, /obj/item/storage/box/flashbangs, @@ -134,7 +136,7 @@ /obj/item/radio/headset/headset_sec/alt, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, - /obj/item/clothing/accessory/badge/holo/warden, + /obj/item/clothing/accessory/medal/badge/holo/warden, /obj/item/storage/box/flashbangs, /obj/item/storage/belt/security, /obj/item/reagent_containers/spray/pepper, @@ -230,7 +232,7 @@ close_sound = 'sound/machines/closet/closet_wood_close.ogg' starts_with = list( - /obj/item/clothing/accessory/badge/holo/detective, + /obj/item/clothing/accessory/medal/badge/holo/detective, /obj/item/clothing/gloves/black, /obj/item/gunbox, /obj/item/gun/energy/stunrevolver/vintage, diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 4a984b16064..428c5243df9 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -163,7 +163,7 @@ update_state() /obj/structure/door_assembly/attack_robot(mob/living/silicon/robot/user) - if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/robot_module/robot/engineering/general)) \ + if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/robot_module/robot/engineering)) \ || istype(user.module,/obj/item/robot_module/drone))) //Only dron (and engiborg) needs this. rename_door(user) diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm index 74f53e92045..28ed8976e94 100644 --- a/code/game/objects/structures/ghost_pods/silicon.dm +++ b/code/game/objects/structures/ghost_pods/silicon.dm @@ -17,7 +17,7 @@ /obj/structure/ghost_pod/manual/lost_drone/create_occupant(var/mob/M) density = FALSE - var/mob/living/silicon/robot/lost/randomlaws/R = new(get_turf(src)) + var/mob/living/silicon/robot/flying/lost/randomlaws/R = new(get_turf(src)) R.adjustBruteLoss(rand(5, 30)) R.adjustFireLoss(rand(5, 10)) if(M.mind) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index e9d6d18f0bb..950789b9d9e 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -227,7 +227,7 @@ to_chat(user, "There isn't enough material here to construct a wall.") return 0 - var/datum/material/M = name_to_material[S.default_type] + var/datum/material/M = get_material_by_name(S.default_type) if(!istype(M)) return 0 @@ -268,7 +268,7 @@ to_chat(user, "There isn't enough material here to reinforce the girder.") return 0 - var/datum/material/M = name_to_material[S.default_type] + var/datum/material/M = get_material_by_name(S.default_type) if(!istype(M) || M.integrity < 50) to_chat(user, "You cannot reinforce \the [src] with that; it is too soft.") return 0 @@ -402,7 +402,7 @@ var/turf/simulated/wall/new_T = get_turf(src) // Ref to the wall we just built. // Apparently set_material(...) for walls requires refs to the material singletons and not strings. // This is different from how other material objects with their own set_material(...) do it, but whatever. - var/datum/material/M = name_to_material[the_rcd.material_to_use] + var/datum/material/M = get_material_by_name(the_rcd.material_to_use) new_T.set_material(M, the_rcd.make_rwalls ? M : null, girder_material) new_T.add_hiddenprint(user) qdel(src) @@ -412,4 +412,3 @@ to_chat(user, span("notice", "You deconstruct \the [src].")) qdel(src) return TRUE - diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 0048768e292..23e1ef8e27c 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -30,25 +30,22 @@ /obj/structure/kitchenspike/proc/spike(var/mob/living/victim) if(!istype(victim)) - return + return FALSE - if(istype(victim, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = victim - if(istype(H.species, /datum/species/monkey)) - meat_type = H.species.meat_type - icon_state = "spikebloody" - else - return 0 - else if(istype(victim, /mob/living/carbon/alien)) - meat_type = /obj/item/reagent_containers/food/snacks/xenomeat - icon_state = "spikebloodygreen" - else - return 0 + if(!ishuman(victim)) + return FALSE + + var/mob/living/carbon/human/H = victim + if(!istype(H.species, /datum/species/monkey)) + return FALSE + + meat_type = H.species.meat_type + icon_state = "spikebloody" victim_name = victim.name occupied = 1 meat = 5 - return 1 + return TRUE /obj/structure/kitchenspike/attack_hand(mob/user as mob) if(..() || !occupied) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index d655581c923..80754490e48 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -66,4 +66,12 @@ name = "airtight plastic flaps" desc = "Heavy duty, airtight, plastic flaps. Have extra safety installed, preventing passage of living beings." can_atmos_pass = ATMOS_PASS_NO - can_pass_lying = FALSE \ No newline at end of file + can_pass_lying = FALSE + +/obj/structure/plasticflaps/xenofauna + name = "animal access flaps" + can_atmos_pass = ATMOS_PASS_NO + can_pass_lying = FALSE + mobs_can_pass = list( + /mob/living/simple_mob/animal + ) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 30080eece10..4699c6bb289 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -64,6 +64,15 @@ new /obj/item/stack/rods(get_turf(src)) qdel(src) +/obj/structure/railing/blob_act(var/obj/structure/blob/B) + . = ..() + + if(B?.overmind?.blob_type) + take_damage(rand(B.overmind.blob_type.damage_lower, B.overmind.blob_type.damage_upper)) + return + + take_damage(rand(10,30)) + /obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1) check = 0 //if (!anchored) return diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index 560f64251ee..679fa4c7215 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -24,7 +24,6 @@ /obj/structure/stasis_cage/proc/contain(var/mob/living/simple_mob/animal) if(contained || !istype(animal)) return - contained = animal animal.forceMove(src) animal.in_stasis = 1 @@ -36,7 +35,6 @@ /obj/structure/stasis_cage/proc/release() if(!contained) return - contained.dropInto(src) if(contained.buckled && istype(contained.buckled, /obj/effect/energy_net)) contained.buckled.dropInto(src) @@ -48,20 +46,39 @@ /obj/structure/stasis_cage/Destroy() release() - return ..() /mob/living/simple_mob/MouseDrop(var/obj/structure/stasis_cage/over_object) - if(istype(over_object) && Adjacent(over_object) && CanMouseDrop(over_object, usr)) + if(!istype(over_object) || !Adjacent(over_object) || !CanMouseDrop(over_object, usr)) + return ..() + + if(src != usr && !(sleeping || lying) && !istype(buckled, /obj/effect/energy_net)) + to_chat(usr, SPAN_WARNING("It's going to be difficult to load \the [src] into \the [over_object] without putting it to sleep or capturing it in a net.")) + return + + if(usr == src) + usr.visible_message( + SPAN_NOTICE("\The [src] starts climbing into [src] \the [over_object]."), + SPAN_NOTICE("You start climbing into \the [over_object].") + ) + else + usr.visible_message( + SPAN_NOTICE("\The [usr] begins loading \the [src] into \the [over_object]."), + SPAN_NOTICE("You begin loading \the [src] into \the [over_object].") + ) - if(!src.buckled || !istype(src.buckled, /obj/effect/energy_net)) - to_chat(usr, "It's going to be difficult to convince \the [src] to move into \the [over_object] without capturing it in a net.") - return + Bumped(usr) + if(!do_after(usr, 20, over_object)) + return - usr.visible_message("[usr] begins stuffing \the [src] into \the [over_object].", "You begin stuffing \the [src] into \the [over_object].") - Bumped(usr) - if(do_after(usr, 20, over_object)) - usr.visible_message("[usr] has stuffed \the [src] into \the [over_object].", "You have stuffed \the [src] into \the [over_object].") - over_object.contain(src) + if(usr == src) + usr.visible_message( + SPAN_NOTICE("\The [usr] climbs into \the [over_object]."), + SPAN_NOTICE("You climb into \the [over_object].") + ) else - return ..() \ No newline at end of file + usr.visible_message( + SPAN_NOTICE("\The [usr] finishes loading \the [src] into \the [over_object]."), + SPAN_NOTICE("You finish loading \the [src] into \the [over_object].") + ) + over_object.contain(src) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index b1f06306c86..a759cea6f6b 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -75,7 +75,7 @@ update_state() /obj/structure/windoor_assembly/attack_robot(mob/living/silicon/robot/user) - if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/robot_module/robot/engineering/general)) \ + if(Adjacent(user) && (user.module && (istype(user.module,/obj/item/robot_module/robot/engineering)) \ || istype(user.module,/obj/item/robot_module/drone))) //Only dron (and engiborg) needs this. rename_door(user) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 526e7184cf1..2b26766a7db 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -100,17 +100,19 @@ var/bloodcolor="" var/mob/living/carbon/human/H = M - if(istype(H) && istype(H.shoes, /obj/item/clothing/shoes)) - var/obj/item/clothing/shoes/S = H.shoes - S.handle_movement(src, IS_RUNNING(H)) - if(S.track_blood && S.blood_DNA) - bloodDNA = S.blood_DNA - bloodcolor=S.blood_color - S.track_blood-- - else if(M.track_blood && M.feet_blood_DNA) - bloodDNA = M.feet_blood_DNA - bloodcolor = M.feet_blood_color - M.track_blood-- + if(istype(H)) + if(istype(H.shoes, /obj/item/clothing/shoes)) + var/obj/item/clothing/shoes/S = H.shoes + if(S.track_blood && S.blood_DNA) + bloodDNA = S.blood_DNA + bloodcolor=S.blood_color + S.track_blood-- + else if(M.track_blood && M.feet_blood_DNA) + bloodDNA = M.feet_blood_DNA + bloodcolor = M.feet_blood_color + M.track_blood-- + for(var/obj/item/thing in H.get_movement_sensitive_gear()) + thing.handle_movement(src, IS_RUNNING(H)) if(bloodDNA) src.AddTracks(track_type, bloodDNA , M.dir, 0, bloodcolor) // Coming @@ -164,10 +166,7 @@ // Only adds blood on the floor -- Skie /turf/simulated/proc/add_blood_floor(mob/living/carbon/M as mob) - if( istype(M, /mob/living/carbon/alien )) - var/obj/effect/decal/cleanable/blood/xeno/this = new /obj/effect/decal/cleanable/blood/xeno(src) - this.blood_DNA["UNKNOWN BLOOD"] = "X*" - else if( istype(M, /mob/living/silicon/robot )) + if( istype(M, /mob/living/silicon/robot )) new /obj/effect/decal/cleanable/blood/oil(src) else if(ishuman(M)) add_blood(M) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 42e2fcf1a1b..476241ce9e4 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -218,7 +218,7 @@ var/turf/simulated/wall/T = get_turf(src) // Ref to the wall we just built. // Apparently set_material(...) for walls requires refs to the material singletons and not strings. // This is different from how other material objects with their own set_material(...) do it, but whatever. - var/datum/material/M = name_to_material[the_rcd.material_to_use] + var/datum/material/M = get_material_by_name(the_rcd.material_to_use) T.set_material(M, the_rcd.make_rwalls ? M : null, M) T.add_hiddenprint(user) return TRUE diff --git a/code/global.dm b/code/global.dm index 72f4d34e20b..b797a11bb2c 100644 --- a/code/global.dm +++ b/code/global.dm @@ -124,14 +124,6 @@ var/global/DBConnection/dbcon_old = new() // /tg/station database (Old database) // Added for Xenoarchaeology, might be useful for other stuff. var/global/list/alphabet_uppercase = list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") - -// Used by robots and robot preferences. -var/global/list/robot_module_types = list( - "Standard", "Engineering", "Surgeon", "Crisis", - "Miner", "Janitor", "Service", "Clerical", "Security", - "Research" -) - // Some scary sounds. var/global/static/list/scarySounds = list( 'sound/weapons/thudswoosh.ogg', diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index c309ebdf532..0627618f17c 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -233,8 +233,6 @@ M_job = "slime" else if(issmall(M)) M_job = "Monkey" - else if(isalien(M)) - M_job = "Alien" else M_job = "Carbon-based" @@ -344,8 +342,6 @@ dat += "Ghost" else if(issmall(M)) dat += "Monkey" - else if(isalien(M)) - dat += "Alien" else dat += "Unknown" diff --git a/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm b/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm deleted file mode 100644 index 277e55a5bb3..00000000000 --- a/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/admin_secret_item/random_event/trigger_xenomorph_infestation - name = "Trigger a Skathari Incursion" - -/datum/admin_secret_item/random_event/trigger_xenomorph_infestation/execute(var/mob/user) - . = ..() - if(.) - return xenomorphs.attempt_random_spawn() diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cddf8eedb0e..23bcb71f7b6 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -277,7 +277,6 @@ switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/observer/dead , null, null, delmob ) - if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob ) if("nymph") M.change_mob_type( /mob/living/carbon/diona , null, null, delmob ) if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob, href_list["species"]) if("slime") M.change_mob_type( /mob/living/simple_mob/slime/xenobio , null, null, delmob ) diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm index a4c9a99b626..3cc22b05902 100644 --- a/code/modules/ai/ai_holder.dm +++ b/code/modules/ai/ai_holder.dm @@ -9,7 +9,7 @@ /mob/living/Initialize() if(ai_holder_type) ai_holder = new ai_holder_type(src) - if(istype(src, /mob/living/carbon/human)) + if(ishuman(src)) var/mob/living/carbon/human/H = src H.hud_used = new /datum/hud(H) H.create_mob_hud(H.hud_used) @@ -429,11 +429,11 @@ if(STANCE_IDLE) if(speak_chance) // In the long loop since otherwise it wont shut up. handle_idle_speaking() - + if(hostile) ai_log("handle_stance_strategical() : STANCE_IDLE, going to find_target().", AI_LOG_TRACE) find_target() - + if(should_go_home()) ai_log("handle_stance_tactical() : STANCE_IDLE, going to go home.", AI_LOG_TRACE) go_home() diff --git a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm index a05d6d722fe..a55cb07f809 100644 --- a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm +++ b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm @@ -112,30 +112,14 @@ adjust_discipline(-1) last_discipline_decay = world.time -/datum/ai_holder/simple_mob/xenobio_slime/find_target(list/possible_targets, has_targets_list) - if (hostile) - . = ..() - if (target || leader || rabid) // Always prioritize mobs, if we can. Otherwise, check for loose things to eat if we're not otherwise busy - return - var/list/yummies - for (var/atom/M in view(world.view, holder)) - if (M.is_slime_food()) - // Make sure that we can reach the object first, but don't try too hard at it and make sure that the thing is edible beforehand - var/list/path = AStar(holder.loc, M.loc, astar_adjacent_proc, /turf/proc/Distance, min_target_dist = 1, max_node_depth = world.view * 2, id = holder.IGetID(), exclude = obstacles) - if (path?.len) - LAZYDISTINCTADD(yummies, M) - if (!LAZYLEN(yummies)) - return - var/atom/yummy - var/closest_distance = INFINITY - for (var/atom/M in yummies) // Find the closest snack! - var/dist = get_dist(holder, M) - if (dist < closest_distance) - yummy = M - closest_distance = dist - give_target(yummy) - give_destination(yummy.loc) - return yummy +/datum/ai_holder/simple_mob/xenobio_slime/list_targets() + . = ..() + if (!locate(/mob) in . && !leader && !rabid) + for(var/atom/movable/M in view(vision_range, holder)) + if (M.is_slime_food()) + var/list/path_to = AStar(holder.loc, M.loc, astar_adjacent_proc, /turf/proc/Distance, min_target_dist = 0, max_node_depth = world.view * 2, id = holder.IGetID(), exclude = obstacles, flags = ASTAR_BLOCKED_BY_WINDOWS) + if (path_to?.len) + . += M /datum/ai_holder/simple_mob/xenobio_slime/handle_special_tactic() evolve_and_reproduce() @@ -161,6 +145,16 @@ target.slime_chomp(holder) target = null +/datum/ai_holder/simple_mob/xenobio_slime/request_help() + if (target && !ismob(target)) // we absolutely, completely do not need help from other slimes when targeting a pile of dirt + return + . = ..() + +/datum/ai_holder/simple_mob/xenobio_slime/can_violently_breakthrough() + if (target && !ismob(target)) + return FALSE + return TRUE + // Called when pushed too far (or a red slime core was used). /datum/ai_holder/simple_mob/xenobio_slime/proc/enrage() var/mob/living/simple_mob/slime/xenobio/my_slime = holder diff --git a/code/modules/antagonist/alien/xenomorph.dm b/code/modules/antagonist/alien/xenomorph.dm deleted file mode 100644 index 3cb10939190..00000000000 --- a/code/modules/antagonist/alien/xenomorph.dm +++ /dev/null @@ -1,47 +0,0 @@ -var/global/datum/antagonist/xenos/xenomorphs - -/datum/antagonist/xenos - id = MODE_XENOMORPH - role_type = BE_ALIEN - role_text = "Skathari" - role_text_plural = "Skathari" - mob_path = /mob/living/carbon/alien/larva - bantype = "Xenomorph" - flags = ANTAG_OVERRIDE_MOB | ANTAG_RANDSPAWN | ANTAG_OVERRIDE_JOB | ANTAG_VOTABLE - welcome_text = "Hiss! You are a larval alien. Hide and bide your time until you are ready to evolve." - antaghud_indicator = "hudalien" - - hard_cap = 5 - hard_cap_round = 8 - initial_spawn_req = 4 - initial_spawn_target = 6 - - spawn_announcement = "Unidentified lifesigns detected coming aboard the station. Secure any exterior access, including ducting and ventilation." - spawn_announcement_title = "Lifesign Alert" - spawn_announcement_sound = 'sound/AI/aliens.ogg' - spawn_announcement_delay = 5000 - -/datum/antagonist/xenos/New(var/no_reference) - ..() - if(!no_reference) - xenomorphs = src - -/datum/antagonist/xenos/attempt_random_spawn() - if(config.aliens_allowed) ..() - -/datum/antagonist/xenos/proc/get_vents() - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) - if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels)) - if(temp_vent.network.normal_members.len > 50) - vents += temp_vent - return vents - -/datum/antagonist/xenos/create_objectives(var/datum/mind/player) - if(!..()) - return - player.objectives += new /datum/objective/survive() - player.objectives += new /datum/objective/escape() - -/datum/antagonist/xenos/place_mob(var/mob/living/player) - player.forceMove(get_turf(pick(get_vents()))) diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 277c8808a79..05a231dbfa7 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -86,6 +86,10 @@ GLOBAL_LIST_EMPTY(all_blobs) overmind.blob_type.on_emp(src, severity) /obj/structure/blob/proc/pulsed() + if(QDELETED(src)) + loc = null + overmind = null + return if(pulse_timestamp <= world.time) consume_tile() if(heal_timestamp <= world.time) @@ -96,6 +100,7 @@ GLOBAL_LIST_EMPTY(all_blobs) if(overmind) faction = overmind.blob_type.faction overmind.blob_type.on_pulse(src) + fall() // Make sure to obey gravity. return TRUE //we did it, we were pulsed! return FALSE //oh no we failed @@ -169,6 +174,11 @@ GLOBAL_LIST_EMPTY(all_blobs) make_blob = FALSE T.blob_act(src) //hit the turf if it is + if((locate(/obj/structure/stairs/middle) in T) && (locate(/obj/structure/stairs/bottom) in get_turf(src))) // If we're growing against stairs, check for an open space above to grow 'up' the stairs. + var/turf/TAbove = GetAbove(src) + if(TAbove.CanZPass(src, UP)) // Can we pass through the turf above us to enter the tile? If so, swap T to that, we're going upstairs. + T = TAbove + for(var/atom/A in T) if(!A.CanPass(src, T)) //is anything in the turf impassable make_blob = FALSE @@ -192,6 +202,21 @@ GLOBAL_LIST_EMPTY(all_blobs) else blob_attack_animation(T, controller) //if we can't, animate that we attacked +/obj/structure/blob/fall_impact(var/atom/hit_atom, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE) + ..() + playsound(src, 'sound/effects/splat.ogg', 50, 1) + consume_tile() + +/obj/structure/blob/can_fall() // Despite popular belief, the blob's belief in its ability to fly doesn't matter. (Unless something else is holding it up) + if(overmind) + for(var/direction in cardinal) + var/turf/other_T = get_step(get_turf(src), direction) + if(other_T) + var/obj/structure/blob/B = locate(/obj/structure/blob/shield) in other_T + if(B && B.overmind) + return FALSE + return TRUE + /obj/structure/blob/proc/do_slide_animation(var/obj/structure/blob/B, var/turf/T, var/expand_reaction) set waitfor = FALSE sleep(1) // To have the slide animation work. @@ -201,6 +226,9 @@ GLOBAL_LIST_EMPTY(all_blobs) B.density = initial(B.density) B.forceMove(T) B.update_icon() + + B.fall() + if(B.overmind && expand_reaction) B.overmind.blob_type.on_expand(src, B, T, B.overmind) @@ -417,6 +445,7 @@ GLOBAL_LIST_EMPTY(all_blobs) qdel(src) else update_icon() + fall() /obj/effect/temporary_effect/blob_attack name = "blob" diff --git a/code/modules/blob2/blobs/core.dm b/code/modules/blob2/blobs/core.dm index 79ec205ecfe..f191e5b2683 100644 --- a/code/modules/blob2/blobs/core.dm +++ b/code/modules/blob2/blobs/core.dm @@ -144,7 +144,7 @@ var/global/list/blob_cores = list() // overmind.update_health_hud() pulse_area(overmind, 15, BLOB_CORE_PULSE_RANGE, BLOB_CORE_EXPAND_RANGE) for(var/obj/structure/blob/normal/B in range(1, src)) - if(prob(5)) + if(B.overmind == overmind && prob(5)) B.change_to(/obj/structure/blob/shield/core, overmind) overmind.blob_type.on_core_process(src) diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm index 04079956e03..ec03e52c321 100644 --- a/code/modules/blob2/overmind/overmind.dm +++ b/code/modules/blob2/overmind/overmind.dm @@ -62,6 +62,7 @@ var/global/list/overminds = list() if(B && B.overmind == src) B.overmind = null B.update_icon() //reset anything that was ours + B.fall() // No longer held up by whatever blob horror the core had going on (if any), fall like a really gross rock. for(var/BLO in blob_mobs) var/mob/living/simple_mob/blob/spore/BM = BLO @@ -165,3 +166,6 @@ var/global/list/overminds = list() log_say(message, src) return 1 + +/mob/observer/blob/can_fall() + return FALSE diff --git a/code/modules/blob2/overmind/powers.dm b/code/modules/blob2/overmind/powers.dm index 2abcd888581..1f56d51d425 100644 --- a/code/modules/blob2/overmind/powers.dm +++ b/code/modules/blob2/overmind/powers.dm @@ -199,8 +199,24 @@ if(B && B.overmind == src) break + // Only player-blobs can currently move up or down at will. AI-blobs can only fall downward. + if(!B) // No cardinals, check if it can creep down from above or build up from below. + var/list/T_ZChecks = list() + + T_ZChecks["UP"] = GetAbove(T) + T_ZChecks["DOWN"]= GetBelow(T) + + for(var/zdir in T_ZChecks) + var/turf/T_check = T_ZChecks[zdir] + if(!T_check) + continue + B = locate(/obj/structure/blob) in T_check + if(B && T.CanZPass(B, (zdir == "UP") ? DOWN : UP)) // Can the blob [B] from [zdir] pass into the target turf by moving in the opposite direction. IE, A blob above enter by moving downward, or reverse. + break + B = null // If both checks fail, B must be nulled for the next check. + if(!B) - to_chat(src, "There is no blob cardinally adjacent to the target tile!") + to_chat(src, "There is no blob cardinally or vertically adjacent to the target tile!") return if(!can_buy(4)) diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index a3b70de5f59..659d3d5649d 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -1078,12 +1078,12 @@

\ SolGov defines top-level law (such as sapient rights and transgressive \ technology) and acts as an intermediary council for problems involving member states, but leaves most other law for \ - states to define themselves. The member states of SolGov obey these laws, pay confederate taxes, and provide each \ + states to define themselves. The member states of SolGov obey these laws, pay confederation taxes, and provide each \ other with military aid, in exchange for membership in the largest free trade, customs, and military union in the \ known galaxy. Each state appoints two representatives to the Colonial Assembly where issues are voted upon. \ The vast majority of human states are members of SolGov.\

\ - Sol's military forces are divided between central confederate forces and local defense forces, although it reserves \ + Sol's military forces are divided between central confederation forces and local defense forces, although it reserves \ the right to nationalize the defense forces in the event of a major crisis, such as the SolGov-Hegemony War." history = "" // Todo work = "governing polity of humanity's Confederation" @@ -1198,4 +1198,4 @@ "Draken", "Gladan", "Falken" - ) \ No newline at end of file + ) diff --git a/code/modules/busy_space/systems.dm b/code/modules/busy_space/systems.dm index 17e589cc454..dd26b0691b4 100644 --- a/code/modules/busy_space/systems.dm +++ b/code/modules/busy_space/systems.dm @@ -60,7 +60,7 @@ new /datum/lore/location("Paradise Bay on Earth, Sol", list(ATC_TYPICAL)), new /datum/lore/location("Atlantis on Earth, Sol", list(ATC_INDU, ATC_SCI)), new /datum/lore/location("Elevator City on Earth, Sol", list(ATC_TYPICAL)), - new /datum/lore/location("Antanavario on Earth, Sol", list(ATC_TYPICAL, ATC_DIPLO)), //they independent baybe + new /datum/lore/location("Antananarivo on Earth, Sol", list(ATC_TYPICAL, ATC_DIPLO)), //they independent baybe new /datum/lore/location("Paris on Earth, Sol", list(ATC_ALL_CIV, ATC_DIPLO)), //just a reasonable number of existing world cities that would not be underwater or desertified. by which i mean god please check my work on this. new /datum/lore/location("Detroit on Earth, Sol", list(ATC_ALL_CIV, ATC_DIPLO)), //it's not clear which parts of earth are independent now so let's just assume the diplomatic corps is working on all of them new /datum/lore/location("Dubai on Earth, Sol", list(ATC_ALL_CIV, ATC_DIPLO)), @@ -68,7 +68,7 @@ new /datum/lore/location("Dakar on Earth, Sol", list(ATC_ALL_CIV, ATC_DIPLO)), new /datum/lore/location("Sao Paulo on Earth, Sol", list(ATC_ALL_CIV, ATC_DIPLO)), new /datum/lore/location("Mojave University on Earth, Sol", list(ATC_SCI)), - new /datum/lore/location("a station orbitting Earth, Sol", list(ATC_ALL_CIV)), + new /datum/lore/location("a station orbiting Earth, Sol", list(ATC_ALL_CIV)), new /datum/lore/location("a colony in Earth-Luna Lagrange Orbit in Sol", list(ATC_ALL_CIV)), new /datum/lore/location("Tycho on Luna, Sol", list(ATC_ALL_CIV)), new /datum/lore/location("the Pearlshield Coalition embassy in Tycho, Luna, Sol", list(ATC_DIPLO)), // a lot of embassy spam but most orgs don't do diplomatic missions so they'll be ignored @@ -117,12 +117,20 @@ autogenerate_destinations = FALSE planets = list("Sif") locations = list( - new /datum/lore/location("New Rekjavik", list(ATC_ALL_CIV)), //sivian locations don't need 'on sif' and virite locations dont need 'in vir'-- theyre local + new /datum/lore/location("New Reykjavik", list(ATC_ALL_CIV)), //sivian locations don't need 'on sif' and virite locations dont need 'in vir'-- theyre local new /datum/lore/location("Kalmar", list(ATC_ALL_CIV)), new /datum/lore/location("Ekmanshalvo", list(ATC_ALL_CIV)), + new /datum/lore/location("Drammen", list(ATC_ALL_CIV)), + new /datum/lore/location("Oswego", list(ATC_ALL_CIV)), + new /datum/lore/location("Usinari", list(ATC_ALL_CIV)), + new /datum/lore/location("Overforingsfjell", list(ATC_ALL_CIV)), + new /datum/lore/location("Eyri", list(ATC_ALL_CIV)), + new /datum/lore/location("Ginkgo", list(ATC_ALL_CIV)), + new /datum/lore/location("Drakasfjord", list(ATC_ALL_CIV)), + new /datum/lore/location("Karsvag", list(ATC_ALL_CIV)), new /datum/lore/location("a settlement on the Thorvaldsson Plains", list(ATC_TYPICAL)), //padding new /datum/lore/location("a mining outpost in the Dauthabrekka Mountains", list(ATC_TYPICAL)), - new /datum/lore/location("a corporate facility in Stockholm-Skargard", list(ATC_TYPICAL, ATC_SCI)), + new /datum/lore/location("a corporate facility in Stockholms-Skargard", list(ATC_TYPICAL, ATC_SCI)), new /datum/lore/location("a site in the Ullran Expanse", list(ATC_MED, ATC_DEF, ATC_INDU)), new /datum/lore/location("a location in the Anomalous Region", list(ATC_SCI)), new /datum/lore/location("the NLS Southern Cross", list(ATC_DEF, ATC_INDU)), @@ -130,7 +138,8 @@ new /datum/lore/location("Vir Interstellar Spaceport", list(ATC_TYPICAL)), new /datum/lore/location("Firnir", list(ATC_TYPICAL)), new /datum/lore/location("Tyr", list(ATC_TYPICAL)), - new /datum/lore/location("Magnai", list(ATC_TYPICAL)), + new /datum/lore/location("Magni", list(ATC_TYPICAL)), + new /datum/lore/location("Thor", list(ATC_TYPICAL)), new /datum/lore/location("the rings of Kara", list(ATC_LUX)), new /datum/lore/location("the rings of Rota", list(ATC_LUX)), new /datum/lore/location("the Radiance Energy Chain", list(ATC_FREIGHT, ATC_DEF, ATC_INDU)), @@ -144,8 +153,8 @@ /datum/lore/system/alpha_centauri name = "Alpha Centauri" - desc = "The stars closest to Sol and the site of the first extrasolar colonies. The worlds orbitting Proxima Centauri were colonized by stateless refugees\ - as part of an early SCG migration program.The habitats orbitting Alpha Centauri proper were colonized by radical terrorists fleeing Solar law enforcement.\ + desc = "The stars closest to Sol and the site of the first extrasolar colonies. The worlds orbiting Proxima Centauri were colonized by stateless refugees\ + as part of an early SCG migration program. The habitats orbiting Alpha Centauri proper were colonized by radical terrorists fleeing Solar law enforcement.\ There is some tension." planets = list("Kishar", "Anshar") locations = list( @@ -153,7 +162,7 @@ new /datum/lore/location("Putiya Nadu on Kishar, Alpha Centauri", list(ATC_ALL_CIV)), new /datum/lore/location("Oyo-ni-aaye on Kishar, Alpha Centauri", list(ATC_ALL_CIV)), new /datum/lore/location("Valhalla in Heaven, Alpha Centauri", list(ATC_TYPICAL)), - new /datum/lore/location("Elyisum in Heaven, Alpha Centauri", list(ATC_TYPICAL)), + new /datum/lore/location("Elysium in Heaven, Alpha Centauri", list(ATC_TYPICAL)), new /datum/lore/location("the remains of Ragnarok, Alpha Centauri", list(ATC_INDU, ATC_FREIGHT, ATC_SCI)), new /datum/lore/location("The Rings in Heaven, Alpha Centauri", list(ATC_ALL_CIV)), new /datum/lore/location("The Angelic College at Makon, Alpha Centauri", list(ATC_SCI)) @@ -168,7 +177,7 @@ new /datum/lore/location("New Florence, Binma, Tau Ceti", list(ATC_ALL_CIV)), new /datum/lore/location("Mandala Sur, Binma, Tau Ceti", list(ATC_ALL_CIV)), new /datum/lore/location("the Kesalon, Binma, Tau Ceti", list(ATC_SCI, ATC_TRANS, ATC_LUX)), - new /datum/lore/location("the Hyperion Orbital Scaffhold around Binma, Tau Ceti", list(ATC_ALL_CIV)), + new /datum/lore/location("the Hyperion Orbital Scaffold around Binma, Tau Ceti", list(ATC_ALL_CIV)), new /datum/lore/location("Ceti Technical Institute, Binma, Tau Ceti", list(ATC_SCI)), new /datum/lore/location("Aria, Tau Ceti", list(ATC_INDU, ATC_FREIGHT, ATC_LUX)), new /datum/lore/location("LL1, Tau Ceti", list(ATC_INDU, ATC_FREIGHT, ATC_TRANS)), @@ -298,7 +307,7 @@ locations = list( new /datum/lore/location("a 'facility' in Love", list(ATC_ALL_CIV)), //i find this funny but you can nyx it if you want new /datum/lore/location("a pharmacy in Love", list(ATC_ALL_CIV)), // this is probably the more serious version of the above - new /datum/lore/location("an independent mecenary outpost in Love", list(ATC_TYPICAL)), + new /datum/lore/location("an independent mercenary outpost in Love", list(ATC_TYPICAL)), new /datum/lore/location("Colony Daring in Love", list(ATC_TYPICAL, ATC_DIPLO)) ) diff --git a/code/modules/client/preference_setup/antagonism/01_basic.dm b/code/modules/client/preference_setup/antagonism/01_basic.dm index 83b40f5e822..97b7745ba08 100644 --- a/code/modules/client/preference_setup/antagonism/01_basic.dm +++ b/code/modules/client/preference_setup/antagonism/01_basic.dm @@ -44,7 +44,7 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None") return TOPIC_REFRESH if(href_list["exploitable_record"]) - var/exploitmsg = html_decode(sanitizeSafe(input(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)) + var/exploitmsg = sanitizeSafe(input(user,"Set exploitable information about you here.","Exploitable Information", html_decode(pref.exploit_record)) as message|null, MAX_RECORD_LENGTH, extra = 0) if(!isnull(exploitmsg) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) pref.exploit_record = exploitmsg return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/general/05_background.dm b/code/modules/client/preference_setup/general/05_background.dm index 4bbb1793cf6..8a68633c66e 100644 --- a/code/modules/client/preference_setup/general/05_background.dm +++ b/code/modules/client/preference_setup/general/05_background.dm @@ -115,19 +115,19 @@ return TOPIC_REFRESH else if(href_list["set_medical_records"]) //2023-03-18, we're using sanitizeSafe() in order to remove <> entirely, allowing us to safely decode it on the pref screen - var/new_medical = html_decode(sanitizeSafe(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)) + var/new_medical = sanitizeSafe(input(user,"Enter medical information here.","Character Preference", html_decode(pref.med_record)) as message|null, MAX_RECORD_LENGTH, extra = 0) if(!isnull(new_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) pref.med_record = new_medical return TOPIC_REFRESH else if(href_list["set_general_records"]) //2023-03-20, this allows people to use apostrophes in their records! - var/new_general = html_decode(sanitizeSafe(input(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)) + var/new_general = sanitizeSafe(input(user,"Enter employment information here.","Character Preference", html_decode(pref.gen_record)) as message|null, MAX_RECORD_LENGTH, extra = 0) if(!isnull(new_general) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) pref.gen_record = new_general return TOPIC_REFRESH else if(href_list["set_security_records"]) //Note that html exploits still won't work here because we removed <> earlier. - var/sec_medical = html_decode(sanitizeSafe(input(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record)) as message|null, MAX_RECORD_LENGTH, extra = 0)) + var/sec_medical = sanitizeSafe(input(user,"Enter security information here.","Character Preference", html_decode(pref.sec_record)) as message|null, MAX_RECORD_LENGTH, extra = 0) if(!isnull(sec_medical) && !jobban_isbanned(user, "Records") && CanUseTopic(user)) pref.sec_record = sec_medical return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index 94525ee06ff..7dc82a131f7 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -15,7 +15,7 @@ //Flavour text for robots. S["flavour_texts_robot_Default"] >> pref.flavour_texts_robot["Default"] - for(var/module in robot_module_types) + for(var/module in SSrobots.all_module_names) S["flavour_texts_robot_[module]"] >> pref.flavour_texts_robot[module] /datum/category_item/player_setup_item/general/flavor/save_character(var/savefile/S) @@ -30,7 +30,7 @@ S["flavor_texts_feet"] << pref.flavor_texts["feet"] S["flavour_texts_robot_Default"] << pref.flavour_texts_robot["Default"] - for(var/module in robot_module_types) + for(var/module in SSrobots.all_module_names) S["flavour_texts_robot_[module]"] << pref.flavour_texts_robot[module] /datum/category_item/player_setup_item/general/flavor/sanitize_character() @@ -129,7 +129,7 @@ HTML += "Default: " HTML += TextPreview(pref.flavour_texts_robot["Default"]) HTML += "
" - for(var/module in robot_module_types) + for(var/module in SSrobots.all_module_names) HTML += "[module]: " HTML += TextPreview(pref.flavour_texts_robot[module]) HTML += "
" diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 61c81e6ec30..f0a31f0d81c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -336,28 +336,28 @@ /datum/gear/accessory/pride display_name = "pride pin selection" - path = /obj/item/clothing/accessory/pride + path = /obj/item/clothing/accessory/medal/pride /datum/gear/accessory/pride/New() ..() var/list/pridepins = list() - for(var/pridepin in typesof(/obj/item/clothing/accessory/pride)) - var/obj/item/clothing/accessory/pridepin_type = pridepin + for(var/pridepin in typesof(/obj/item/clothing/accessory/medal/pride)) + var/obj/item/clothing/accessory/medal/pridepin_type = pridepin pridepins[initial(pridepin_type.name)] = pridepin_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins)) /datum/gear/accessory/corpbadge display_name = "investigator holobadge (IAA)" - path = /obj/item/clothing/accessory/badge/holo/investigator + path = /obj/item/clothing/accessory/medal/badge/holo/investigator allowed_roles = list("Internal Affairs Agent") /datum/gear/accessory/pressbadge display_name = "press pass, corporate" - path = /obj/item/clothing/accessory/badge/press + path = /obj/item/clothing/accessory/medal/badge/press /datum/gear/accessory/pressbadgefreelance display_name = "press pass, freelance" - path = /obj/item/clothing/accessory/badge/press/independent + path = /obj/item/clothing/accessory/medal/badge/press/independent /datum/gear/accessory/legbrace display_name = "leg braces" diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index 0f900ad81af..f1142f634af 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -70,7 +70,7 @@ /datum/gear/toy display_name = "toy selection" description = "Choose from a number of toys." - path = /obj/item/toy/ + path = /obj/item/toy/blink /datum/gear/toy/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index f8f69c64366..a63053c17c4 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -235,20 +235,13 @@ ) gear_tweaks += new/datum/gear_tweak/path(coattype) -//Half cloak -/datum/gear/suit/cloak_half - display_name = "cloak, half, colorable" - path = /obj/item/clothing/accessory/storage/poncho/roles/cloak/half - -/datum/gear/suit/cloak_half/New() - gear_tweaks += gear_tweak_free_color_choice - //Shoulder cloak /datum/gear/suit/cloak_shoulder display_name = "cloak, left shoulder (colorable)" path = /obj/item/clothing/accessory/storage/poncho/roles/cloak/shoulder /datum/gear/suit/cloak_shoulder/New() + ..() gear_tweaks += gear_tweak_free_color_choice /datum/gear/suit/cloak_shoulder_right @@ -256,6 +249,7 @@ path = /obj/item/clothing/accessory/storage/poncho/roles/cloak/shoulder/right /datum/gear/suit/cloak_shoulder_right/New() + ..() gear_tweaks += gear_tweak_free_color_choice /datum/gear/suit/capelet @@ -263,13 +257,15 @@ path = /obj/item/clothing/accessory/storage/poncho/roles/cloak/capelet /datum/gear/suit/capelet/New() + ..() gear_tweaks += gear_tweak_free_color_choice /datum/gear/suit/roughcloak - display_name = "cloak, rough (colorable)" + display_name = "cloak, rough halfcloak (colorable)" path = /obj/item/clothing/accessory/storage/poncho/roles/cloak/half /datum/gear/suit/roughcloak/New() + ..() gear_tweaks += gear_tweak_free_color_choice /datum/gear/suit/unathi_robe diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index 0e6fcb2102d..4a86cc70a42 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -338,3 +338,129 @@ /datum/gear/shoes/teshwrap/New() ..() gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshbag + display_name = "Teshari tailbags" + path = /obj/item/storage/backpack/teshbag + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + cost = 3 + +/datum/gear/accessory/teshtailwrap + display_name = "Teshari tail wrap" + path = /obj/item/clothing/accessory/teshtail/wrap + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshtailwrap/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshtailwrapalt + display_name = "Teshari tail wrap, alt" + path = /obj/item/clothing/accessory/teshtail/wrap/alt + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshtailwrapalt/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshtailwraplong + display_name = "Teshari tail wrap, long" + path = /obj/item/clothing/accessory/teshtail/wrap/long + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshtailwraplong/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshtailbells + display_name = "Teshari tail bells" + path = /obj/item/clothing/accessory/teshtail/bells + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshbangle + display_name = "Teshari tail bangle, base" + path = /obj/item/clothing/accessory/teshtail/bangle + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + cost = 0 //for these, so you can select all three or mix and match without taking three points. + +/datum/gear/accessory/teshbangle/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshbangle2 + display_name = "Teshari tail bangle, middle" + path = /obj/item/clothing/accessory/teshtail/bangle/middle + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + cost = 0 + +/datum/gear/accessory/teshbangle2/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshbangle3 + display_name = "Teshari tail bangle, end" + path = /obj/item/clothing/accessory/teshtail/bangle/end + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + cost = 0 + +/datum/gear/accessory/teshbangle3/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshplume + display_name = "Teshari artifical tailplume" + path = /obj/item/clothing/accessory/teshtail/plumage + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshplume/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshchains + display_name = "Teshari tail chains" + path = /obj/item/clothing/accessory/teshtail/chains + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshchains/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshchainslong + display_name = "Teshari tail chains, long" + path = /obj/item/clothing/accessory/teshtail/chains/long + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshchainslong/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshchainsdangle + display_name = "Teshari tail chains, dangling" + path = /obj/item/clothing/accessory/teshtail/chains/dangle + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshchainsdangle/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + +/datum/gear/accessory/teshchainslongdangle + display_name = "Teshari tail chains, long and dangling" + path = /obj/item/clothing/accessory/teshtail/chains/longdangle + sort_category = "Xenowear" + whitelisted = SPECIES_TESHARI + +/datum/gear/accessory/teshchainslongdangle/New() + ..() + gear_tweaks += gear_tweak_free_color_choice \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index fef692a574d..5ddff3ddb5c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -639,7 +639,7 @@ var/global/list/light_overlay_cache = list() //see get_worn_overlay() on helmets usr.visible_message("\The [usr] pulls a knife out of their boot!") playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) holding = null - cut_overlay(image(icon, "[icon_state]_knife")) + cut_overlay(image(icon, "boot_knife")) else to_chat(usr, "Your need an empty, unbroken hand to do that.") holding.forceMove(src) @@ -686,7 +686,7 @@ var/global/list/light_overlay_cache = list() //see get_worn_overlay() on helmets /obj/item/clothing/shoes/update_icon() . = ..() if(holding) - add_overlay(image(icon, "[icon_state]_knife")) + add_overlay(image(icon, "boot_knife")) if(ismob(usr)) var/mob/M = usr M.update_inv_shoes() @@ -695,9 +695,6 @@ var/global/list/light_overlay_cache = list() //see get_worn_overlay() on helmets update_icon() return ..() -/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) - return - /obj/item/clothing/shoes/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index ec8dcaa3084..b6a578a1e40 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -32,10 +32,11 @@ icon_state = "officercap" //HOP -/obj/item/clothing/head/caphat/hop - name = "crew resource's hat" - desc = "A stylish hat that both protects you from enraged former-crewmembers and gives you a false sense of authority." +/obj/item/clothing/head/hop + name = "head of personnel's cap" + desc = "A stylish cap that both protects you from enraged former-crewmembers and gives you a false sense of authority." icon_state = "hopcap" + body_parts_covered = 0 //Chaplain /obj/item/clothing/head/chaplain_hood diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 2461407c051..99961f06f63 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -73,6 +73,9 @@ var/footstep = 1 //used for squeeks whilst walking species_restricted = null +/obj/item/clothing/shoes/clown_shoes/is_mob_movement_sensitive() + return TRUE + /obj/item/clothing/shoes/clown_shoes/handle_movement(var/turf/walking, var/running) if(running) if(footstep >= 2) @@ -216,4 +219,4 @@ bootcolor = "orange" /obj/item/clothing/shoes/ranger/yellow - bootcolor = "yellow" \ No newline at end of file + bootcolor = "yellow" diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index fe70d0fa259..7429608d949 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -912,7 +912,7 @@ return if((istype(wearer.loc, /turf/space)) || (wearer.lastarea.has_gravity == 0)) - if(!wearer.Process_Spacemove(0)) + if(!wearer.Process_Spacemove(FALSE)) return 0 if(malfunctioning) diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 56c5ee710da..0acc7f73d38 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -345,12 +345,6 @@ name = "striped blue scarf" icon_state = "stripedbluescarf" -/obj/item/clothing/accessory/scarf/teshari/neckscarf - name = "small neckscarf" - desc = "a neckscarf that is too small for a human's neck" - icon_state = "tesh_neckscarf" - species_restricted = list(SPECIES_TESHARI) - //bracelets /obj/item/clothing/accessory/bracelet @@ -465,37 +459,36 @@ icon_state = "sash" slot = ACCESSORY_SLOT_OVER -/obj/item/clothing/accessory/pride +/obj/item/clothing/accessory/medal/pride name = "pride pin" desc = "A pin displaying pride in one's identity." icon_state = "pride" - slot = ACCESSORY_SLOT_MEDAL -/obj/item/clothing/accessory/pride/bi +/obj/item/clothing/accessory/medal/pride/bi name = "bisexual pride pin" icon_state = "pride_bi" -/obj/item/clothing/accessory/pride/trans +/obj/item/clothing/accessory/medal/pride/trans name = "transgender pride pin" icon_state = "pride_trans" -/obj/item/clothing/accessory/pride/ace +/obj/item/clothing/accessory/medal/pride/ace name = "asexual pride pin" icon_state = "pride_ace" -/obj/item/clothing/accessory/pride/enby +/obj/item/clothing/accessory/medal/pride/enby name = "nonbinary pride pin" icon_state = "pride_enby" -/obj/item/clothing/accessory/pride/pan +/obj/item/clothing/accessory/medal/pride/pan name = "pansexual pride pin" icon_state = "pride_pan" -/obj/item/clothing/accessory/pride/lesbian +/obj/item/clothing/accessory/medal/pride/lesbian name = "lesbian pride pin" icon_state = "pride_lesbian" -/obj/item/clothing/accessory/pride/intersex +/obj/item/clothing/accessory/medal/pride/intersex name = "intersex pride pin" icon_state = "pride_intersex" diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index e4042730e24..8175b005da4 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -4,23 +4,22 @@ or they can be emagged to accept any ID for use in disguises. */ -/obj/item/clothing/accessory/badge +/obj/item/clothing/accessory/medal/badge name = "detective's badge" desc = "NanoTrasen Security Department detective's badge, made from gold." icon_state = "marshalbadge" slot_flags = SLOT_BELT | SLOT_TIE - slot = ACCESSORY_SLOT_MEDAL var/stored_name var/badge_string = "Corporate Security" -/obj/item/clothing/accessory/badge/proc/set_name(var/new_name) +/obj/item/clothing/accessory/medal/badge/proc/set_name(var/new_name) stored_name = new_name name = "[initial(name)] ([stored_name])" -/obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H) +/obj/item/clothing/accessory/medal/badge/proc/set_desc(var/mob/living/carbon/human/H) -/obj/item/clothing/accessory/badge/attack_self(mob/user as mob) +/obj/item/clothing/accessory/medal/badge/attack_self(mob/user as mob) if(!stored_name) to_chat(user, "You polish your old badge fondly, shining up the surface.") @@ -33,47 +32,47 @@ else user.visible_message("[user] displays their [src.name].\nIt reads: [badge_string].","You display your [src.name]. It reads: [badge_string].") -/obj/item/clothing/accessory/badge/attack(mob/living/carbon/human/M, mob/living/user) +/obj/item/clothing/accessory/medal/badge/attack(mob/living/carbon/human/M, mob/living/user) if(isliving(user)) user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently.","You invade [M]'s personal space, thrusting [src] into their face insistently.") user.do_attack_animation(M) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam // Sheriff Badge (toy) -/obj/item/clothing/accessory/badge/sheriff +/obj/item/clothing/accessory/medal/badge/sheriff name = "sheriff badge" desc = "This town ain't big enough for the two of us, pardner." icon_state = "sheriff_toy" item_state = "sheriff_toy" -/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob) +/obj/item/clothing/accessory/medal/badge/sheriff/attack_self(mob/user as mob) user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\ "You flash the sheriff badge to everyone around you!") -/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user) +/obj/item/clothing/accessory/medal/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user) if(isliving(user)) user.visible_message("[user] invades [M]'s personal space, the sheriff badge into their face!.","You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.") user.do_attack_animation(M) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam //Security Holobadges -/obj/item/clothing/accessory/badge/holo +/obj/item/clothing/accessory/medal/badge/holo name = "holobadge" desc = "This glowing blue badge marks the holder as law enforcement." icon_state = "holobadge" var/emagged //Emagging removes Sec check. -/obj/item/clothing/accessory/badge/holo/cord +/obj/item/clothing/accessory/medal/badge/holo/cord icon_state = "holobadge-cord" slot_flags = SLOT_MASK | SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/attack_self(mob/user as mob) +/obj/item/clothing/accessory/medal/badge/holo/attack_self(mob/user as mob) if(!stored_name) to_chat(user, "Waving around a holobadge before swiping an ID would be pretty pointless.") return return ..() -/obj/item/clothing/accessory/badge/holo/emag_act(var/remaining_charges, var/mob/user) +/obj/item/clothing/accessory/medal/badge/holo/emag_act(var/remaining_charges, var/mob/user) if (emagged) to_chat(user, "\The [src] is already cracked.") return @@ -82,7 +81,7 @@ to_chat(user, "You crack the holobadge security checks.") return 1 -/obj/item/clothing/accessory/badge/holo/attackby(var/obj/item/O as obj, var/mob/user as mob) +/obj/item/clothing/accessory/medal/badge/holo/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/card/id) || istype(O, /obj/item/pda)) var/obj/item/card/id/id_card = null @@ -105,30 +104,30 @@ name = "holobadge box" desc = "A box claiming to contain holobadges." starts_with = list( - /obj/item/clothing/accessory/badge/holo = 4, - /obj/item/clothing/accessory/badge/holo/officer = 2, - /obj/item/clothing/accessory/badge/holo/cord = 2 + /obj/item/clothing/accessory/medal/badge/holo = 4, + /obj/item/clothing/accessory/medal/badge/holo/officer = 2, + /obj/item/clothing/accessory/medal/badge/holo/cord = 2 ) -/obj/item/clothing/accessory/badge/holo/officer +/obj/item/clothing/accessory/medal/badge/holo/officer name = "officer's badge" desc = "A bronze corporate security badge. Stamped with the words 'Security Officer.'" icon_state = "bronzebadge" slot_flags = SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/warden +/obj/item/clothing/accessory/medal/badge/holo/warden name = "warden's holobadge" desc = "A silver corporate security badge. Stamped with the words 'Warden.'" icon_state = "silverbadge" slot_flags = SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/hos +/obj/item/clothing/accessory/medal/badge/holo/hos name = "head of security's holobadge" desc = "An immaculately polished gold security badge. Stamped with the words 'Head of Security.'" icon_state = "goldbadge" slot_flags = SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/detective +/obj/item/clothing/accessory/medal/badge/holo/detective name = "detective's holobadge" desc = "An immaculately polished gold security badge on leather. Labeled 'Detective.'" icon_state = "marshalbadge" @@ -138,22 +137,22 @@ name = "holobadge box" desc = "A box claiming to contain holobadges." starts_with = list( - /obj/item/clothing/accessory/badge/holo = 2, - /obj/item/clothing/accessory/badge/holo/warden = 1, - /obj/item/clothing/accessory/badge/holo/detective = 2, - /obj/item/clothing/accessory/badge/holo/hos = 1, - /obj/item/clothing/accessory/badge/holo/cord = 1 + /obj/item/clothing/accessory/medal/badge/holo = 2, + /obj/item/clothing/accessory/medal/badge/holo/warden = 1, + /obj/item/clothing/accessory/medal/badge/holo/detective = 2, + /obj/item/clothing/accessory/medal/badge/holo/hos = 1, + /obj/item/clothing/accessory/medal/badge/holo/cord = 1 ) -/obj/item/clothing/accessory/badge/holo/investigator +/obj/item/clothing/accessory/medal/badge/holo/investigator name = "\improper Internal Investigations holobadge" desc = "This badge marks the holder as an internal affairs investigator." icon_state = "invbadge" badge_string = "Internal Investigations" slot_flags = SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/sheriff +/obj/item/clothing/accessory/medal/badge/holo/sheriff name = "sheriff badge" desc = "A star-shaped brass badge denoting who the law is around these parts." icon_state = "sheriff" @@ -161,24 +160,24 @@ //Other badges -/obj/item/clothing/accessory/badge/old +/obj/item/clothing/accessory/medal/badge/old name = "faded badge" desc = "A faded law enforcement badge in an older design." icon_state = "badge_round" -/obj/item/clothing/accessory/badge/solid +/obj/item/clothing/accessory/medal/badge/solid name = "\improper SolGov ID badge" desc = "A descriptive identification badge with the holder's credentials. This one indicates the holder is representing the SCG." icon_state = "solbadge" badge_string = null -/obj/item/clothing/accessory/badge/ntid +/obj/item/clothing/accessory/medal/badge/ntid name = "\improper NT ID badge" desc = "A descriptive identification badge with the holder's credentials. This one has red marks with the NanoTrasen logo on it." icon_state = "ntbadge" badge_string = null -/obj/item/clothing/accessory/badge/press +/obj/item/clothing/accessory/medal/badge/press name = "corporate press pass" desc = "A corporate reporter's pass, emblazoned with the NanoTrasen logo." icon_state = "pressbadge" @@ -189,77 +188,77 @@ drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' -/obj/item/clothing/accessory/badge/press/independent +/obj/item/clothing/accessory/medal/badge/press/independent name = "press pass" desc = "A freelance journalist's pass, certified by Oculum Broadcast." icon_state = "pressbadge-i" badge_string = "Freelance Journalist" -/obj/item/clothing/accessory/badge/press/plastic +/obj/item/clothing/accessory/medal/badge/press/plastic name = "plastic press pass" desc = "A journalist's 'pass' shaped, for whatever reason, like a security badge. It is made of plastic." icon_state = "pbadge" badge_string = "Sicurity Journelist" w_class = ITEMSIZE_SMALL -// Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT. +// Synthbody bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT. -/obj/item/clothing/accessory/badge/corporate_tag +/obj/item/clothing/accessory/medal/badge/corporate_tag name = "NanoTrasen Badge" desc = "A plain metallic plate that might denote the wearer as a member of NanoTrasen." icon_state = "tag_nt" item_state = "badge" badge_string = "NanoTrasen" -/obj/item/clothing/accessory/badge/corporate_tag/morpheus +/obj/item/clothing/accessory/medal/badge/corporate_tag/morpheus name = "Morpheus Badge" desc = "A plain metallic plate that might denote the wearer as a member of Morpheus Cyberkinetics." icon_state = "tag_blank" badge_string = "Morpheus" -/obj/item/clothing/accessory/badge/corporate_tag/wardtaka +/obj/item/clothing/accessory/medal/badge/corporate_tag/wardtaka name = "Ward-Takahashi Badge" desc = "A plain metallic plate that might denote the wearer as a member of Ward-Takahashi." icon_state = "tag_ward" badge_string = "Ward-Takahashi" -/obj/item/clothing/accessory/badge/corporate_tag/zenghu +/obj/item/clothing/accessory/medal/badge/corporate_tag/zenghu name = "Zeng-Hu Badge" desc = "A plain metallic plate that might denote the wearer as a member of Zeng-Hu." icon_state = "tag_zeng" badge_string = "Zeng-Hu" -/obj/item/clothing/accessory/badge/corporate_tag/gilthari +/obj/item/clothing/accessory/medal/badge/corporate_tag/gilthari name = "Gilthari Badge" desc = "An opulent metallic plate that might denote the wearer as a member of Gilthari." icon_state = "tag_gil" badge_string = "Gilthari" -/obj/item/clothing/accessory/badge/corporate_tag/veymed +/obj/item/clothing/accessory/medal/badge/corporate_tag/veymed name = "Vey-Medical Badge" desc = "A plain metallic plate that might denote the wearer as a member of Vey-Medical." icon_state = "tag_vey" badge_string = "Vey-Medical" -/obj/item/clothing/accessory/badge/corporate_tag/hephaestus +/obj/item/clothing/accessory/medal/badge/corporate_tag/hephaestus name = "Hephaestus Badge" desc = "A rugged metallic plate that might denote the wearer as a member of Hephaestus." icon_state = "tag_heph" badge_string = "Hephaestus" -/obj/item/clothing/accessory/badge/corporate_tag/grayson +/obj/item/clothing/accessory/medal/badge/corporate_tag/grayson name = "Grayson Badge" desc = "A rugged metallic plate that might denote the wearer as a member of Grayson." icon_state = "tag_grayson" badge_string = "Grayson" -/obj/item/clothing/accessory/badge/corporate_tag/xion +/obj/item/clothing/accessory/medal/badge/corporate_tag/xion name = "Xion Badge" desc = "A rugged metallic plate that might denote the wearer as a member of Xion." icon_state = "tag_xion" badge_string = "Xion" -/obj/item/clothing/accessory/badge/corporate_tag/bishop +/obj/item/clothing/accessory/medal/badge/corporate_tag/bishop name = "Bishop Badge" desc = "A sleek metallic plate that might denote the wearer as a member of Bishop." icon_state = "tag_bishop" diff --git a/code/modules/clothing/under/accessories/permits.dm b/code/modules/clothing/under/accessories/permits.dm index c89d9ee0198..d7f75098f1e 100644 --- a/code/modules/clothing/under/accessories/permits.dm +++ b/code/modules/clothing/under/accessories/permits.dm @@ -1,15 +1,14 @@ //This'll be used for gun permits, such as for heads of staff, antags, and bartenders -/obj/item/clothing/accessory/permit +/obj/item/clothing/accessory/medal/permit name = "permit" desc = "A permit for something." icon = 'icons/obj/card_new.dmi' icon_state = "permit-generic" w_class = ITEMSIZE_TINY - slot = ACCESSORY_SLOT_MEDAL var/owner = 0 //To prevent people from just renaming the thing if they steal it -/obj/item/clothing/accessory/permit/attack_self(mob/user as mob) +/obj/item/clothing/accessory/medal/permit/attack_self(mob/user as mob) if(isliving(user)) if(!owner) set_name(user.name) @@ -17,31 +16,31 @@ else to_chat(user, "[src] already has an owner!") -/obj/item/clothing/accessory/permit/proc/set_name(var/new_name) +/obj/item/clothing/accessory/medal/permit/proc/set_name(var/new_name) owner = 1 if(new_name) src.name += " ([new_name])" desc += " It belongs to [new_name]." -/obj/item/clothing/accessory/permit/emag_act(var/remaining_charges, var/mob/user) +/obj/item/clothing/accessory/medal/permit/emag_act(var/remaining_charges, var/mob/user) to_chat(user, "You reset the naming locks on [src]!") owner = 0 -/obj/item/clothing/accessory/permit/gun +/obj/item/clothing/accessory/medal/permit/gun name = "weapon permit" desc = "A card indicating that the owner is allowed to carry a firearm." icon_state = "permit-security" -/obj/item/clothing/accessory/permit/gun/bar +/obj/item/clothing/accessory/medal/permit/gun/bar name = "bar shotgun permit" desc = "A card indicating that the owner is allowed to carry a shotgun in the bar." -/obj/item/clothing/accessory/permit/gun/planetside +/obj/item/clothing/accessory/medal/permit/gun/planetside name = "planetside gun permit" desc = "A card indicating that the owner is allowed to carry a firearm while on the surface." icon_state = "permit-science" -/obj/item/clothing/accessory/permit/drone +/obj/item/clothing/accessory/medal/permit/drone name = "drone identification card" desc = "A card issued by the EIO, indicating that the owner is a Drone Intelligence. Drones are mandated to carry this card within SolGov space, by law." - icon_state = "permit-drone" \ No newline at end of file + icon_state = "permit-drone" diff --git a/code/modules/clothing/under/accessories/torch.dm b/code/modules/clothing/under/accessories/torch.dm index 37dda95e9fe..b6ac27494a3 100644 --- a/code/modules/clothing/under/accessories/torch.dm +++ b/code/modules/clothing/under/accessories/torch.dm @@ -111,30 +111,29 @@ medals /****** ribbons ******/ -/obj/item/clothing/accessory/ribbon/solgov +/obj/item/clothing/accessory/medal/ribbon/solgov name = "ribbon" desc = "A simple military decoration." icon_state = "ribbon_marksman" on_rolled = list("down" = "none") - slot = ACCESSORY_SLOT_MEDAL w_class = ITEMSIZE_TINY -/obj/item/clothing/accessory/ribbon/solgov/marksman +/obj/item/clothing/accessory/medal/ribbon/solgov/marksman name = "marksmanship ribbon" desc = "A military decoration awarded to members of the SCG for good marksmanship scores in training. Common in the days of energy weapons." icon_state = "ribbon_marksman" -/obj/item/clothing/accessory/ribbon/solgov/peace +/obj/item/clothing/accessory/medal/ribbon/solgov/peace name = "peacekeeping ribbon" desc = "A military decoration awarded to members of the SCG for service during a peacekeeping operation." icon_state = "ribbon_peace" -/obj/item/clothing/accessory/ribbon/solgov/frontier +/obj/item/clothing/accessory/medal/ribbon/solgov/frontier name = "frontier ribbon" desc = "A military decoration awarded to members of the SCG for service along the frontier." icon_state = "ribbon_frontier" -/obj/item/clothing/accessory/ribbon/solgov/instructor +/obj/item/clothing/accessory/medal/ribbon/solgov/instructor name = "instructor ribbon" desc = "A military decoration awarded to members of the SCG for service as an instructor." icon_state = "ribbon_instructor" @@ -196,14 +195,14 @@ specialty pins /***** badges *****/ -/obj/item/clothing/accessory/badge/solgov/security +/obj/item/clothing/accessory/medal/badge/solgov/security name = "security forces badge" desc = "A silver law enforcement badge. Stamped with the words 'Master at Arms'." icon_state = "silverbadge" slot_flags = SLOT_TIE badge_string = "Sol Central Government" -/obj/item/clothing/accessory/badge/solgov/tags +/obj/item/clothing/accessory/medal/badge/solgov/tags name = "dog tags" desc = "Plain identification tags made from a durable metal. They are stamped with a variety of informational details." gender = PLURAL @@ -211,7 +210,7 @@ badges badge_string = "Sol Central Government" slot_flags = SLOT_MASK | SLOT_TIE -/obj/item/clothing/accessory/badge/solgov/tags/Initialize() +/obj/item/clothing/accessory/medal/badge/solgov/tags/Initialize() . = ..() var/mob/living/carbon/human/H H = get_holder_of_type(src, /mob/living/carbon/human) @@ -219,13 +218,13 @@ badges set_name(H.real_name) set_desc(H) -/obj/item/clothing/accessory/badge/solgov/tags/set_desc(var/mob/living/carbon/human/H) +/obj/item/clothing/accessory/medal/badge/solgov/tags/set_desc(var/mob/living/carbon/human/H) if(!istype(H)) return var/religion = "Unset" desc = "[initial(desc)]\nName: [H.real_name] ([H.get_species_name()])\nReligion: [religion]\nBlood type: [H.b_type]" -/obj/item/clothing/accessory/badge/solgov/representative +/obj/item/clothing/accessory/medal/badge/solgov/representative name = "representative's badge" desc = "A leather-backed plastic badge with a variety of information printed on it. Belongs to a representative of the Sol Central Government." icon_state = "solbadge" diff --git a/code/modules/clothing/under/accessories/xeno/teshari.dm b/code/modules/clothing/under/accessories/xeno/teshari.dm new file mode 100644 index 00000000000..9156f184d3d --- /dev/null +++ b/code/modules/clothing/under/accessories/xeno/teshari.dm @@ -0,0 +1,86 @@ +/obj/item/clothing/accessory/scarf/teshari/neckscarf + name = "small neckscarf" + desc = "A neckscarf that is too small for a human's neck" + icon_state = "tesh_neckscarf" + species_restricted = list(SPECIES_TESHARI) + +/obj/item/clothing/accessory/teshtail + name = "teshari tail accessory master item" + desc = "you shouldn't see this!" + species_restricted = list(SPECIES_TESHARI) + +/obj/item/clothing/accessory/teshtail/wrap + name = "teshari tail wrap" + desc = "A strip of cloth to decorate a teshari's tail." + icon_state = "tailwrap" + +/obj/item/clothing/accessory/teshtail/wrap/alt + icon_state = "tailwrap2" + +/obj/item/clothing/accessory/teshtail/wrap/long + name = " long teshari tail wrap" + icon_state = "tailwrap_long" + +/obj/item/clothing/accessory/teshtail/bells + name = "teshari tail bells" + desc = "A set of lightweight, jangly tail bells." + icon_state = "tailbells" + gender = PLURAL + var/static/list/dingaling_sound = list( + 'sound/misc/dingaling1.ogg', + 'sound/misc/dingaling2.ogg', + 'sound/misc/dingaling3.ogg', + 'sound/misc/dingaling4.ogg' + ) + var/tmp/dingaling_volume = 260 + var/tmp/dingaling_chance = 30 + var/tmp/dingaling_vary = FALSE + +/obj/item/clothing/accessory/teshtail/bells/is_mob_movement_sensitive() + return TRUE + +/obj/item/clothing/accessory/teshtail/bells/handle_movement() + ..() + if(dingaling_sound && prob(dingaling_chance)) + if(islist(dingaling_sound) && length(dingaling_sound)) + playsound(get_turf(src), pick(dingaling_sound), dingaling_volume, dingaling_vary) + else + playsound(get_turf(src), dingaling_sound, dingaling_volume, dingaling_vary) + +/obj/item/clothing/accessory/teshtail/bangle + name = "teshari tail bangle, base" + desc = "A loose fitting bangle to decorate a teshari's tail, this one sits near the base of the tail." + icon_state = "tailbangle1" + +/obj/item/clothing/accessory/teshtail/bangle/middle + name = "teshari tail bangle, middle" + desc = "A loose fitting bangle to decorate a teshari's tail, this one sits around the middle of the tail." + icon_state = "tailbangle2" + +/obj/item/clothing/accessory/teshtail/bangle/end + name = "teshari tail bangle, end" + desc = "A loose fitting bangle to decorate a teshari's tail, this one sits towards the end of the tail." + icon_state = "tailbangle3" + +/obj/item/clothing/accessory/teshtail/chains + name = "teshari tail chains" + desc = "Small connected chains for decorating a teshari's tail." + icon_state = "tailchain" + gender = PLURAL + +/obj/item/clothing/accessory/teshtail/chains/dangle + name = "dangling teshari tail chains" + icon_state = "tailchain_dangle" + +/obj/item/clothing/accessory/teshtail/chains/long + name = "long teshari tail chains" + icon_state = "tailchain_long" + +/obj/item/clothing/accessory/teshtail/chains/longdangle + name = "long dangling teshari tail chains" + icon_state = "tailchain_longdangle" + +/obj/item/clothing/accessory/teshtail/plumage + name = "artifical tailplume" + desc = "A set of tied together tail feathers for a teshari that has lost their real ones. Often used with prosthetic tails." + icon_state = "tailplume" \ No newline at end of file diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 35f9fbe3539..a749d205c3b 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -258,18 +258,18 @@ /// FOOD END //////////////////////////////////////////////////////////////////////////////// /obj/item/reagent_containers/food/snacks/attack_generic(var/mob/living/user) - if(!isanimal(user) && !isalien(user)) - return if(isanimal(user)) var/mob/living/simple_mob/animal/critter = user if(!critter.has_appetite()) to_chat(critter, SPAN_WARNING("You don't have much of an appetite at the moment.")) return TRUE critter.eat_food_item(src, bitesize) - else + else if(istype(user, /mob/living/carbon/diona)) user.visible_message("[user] nibbles away at \the [src].","You nibble away at \the [src].") if(reagents) reagents.trans_to_mob(user, bitesize, CHEM_INGEST) + else + return FALSE bitecount++ spawn(5) if(!src && !user.client) @@ -423,7 +423,7 @@ icon = 'icons/obj/food_donuts.dmi' icon_state = "donut" filling_color = "#D9C386" - nutriment_desc = list("sweetness", "fried dough") + nutriment_desc = list("sweetness" = 5, "fried dough" = 5) nutriment_amt = 3 nutriment_allergens = ALLERGEN_SUGARS|ALLERGEN_EGGS|ALLERGEN_GRAINS bitesize = 4 @@ -2009,7 +2009,7 @@ filling_color = "#E3D681" center_of_mass = list("x"=16, "y"=11) nutriment_amt = 10 - nutriment_desc = list("bread" = 4, "egg" = 2, "grease") + nutriment_desc = list("bread" = 4, "egg" = 2, "grease" = 2) nutriment_allergens = ALLERGEN_MEAT|ALLERGEN_EGGS|ALLERGEN_DAIRY bitesize = 3 @@ -2550,7 +2550,7 @@ filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) nutriment_amt = 6 - nutriment_desc = list("100% real salad") + nutriment_desc = list("100% real salad" = 10) bitesize = 3 /obj/item/reagent_containers/food/snacks/validsalad/Initialize() @@ -3158,7 +3158,7 @@ /obj/item/reagent_containers/food/snacks/slice/margherita - name = "/improper Margherita slice" + name = "\improper Margherita slice" desc = "A slice of the classic pizza." icon_state = "pizzamargheritaslice" filling_color = "#BAA14C" @@ -4422,7 +4422,7 @@ center_of_mass = list("x"=10, "y"=6) do_coating_prefix = 0 nutriment_amt = 6 - nutriment_desc = list("chilli pepper" = 2, "fried batter") + nutriment_desc = list("chilli pepper" = 2, "fried batter" = 2) nutriment_allergens = ALLERGEN_GRAINS|ALLERGEN_FRUIT bitesize = 3 @@ -4451,7 +4451,7 @@ do_coating_prefix = 0 bitesize = 1.5 nutriment_amt = 3 - nutriment_desc = list("fried beer batter" = 2, "fried chicken = 5") + nutriment_desc = list("fried beer batter" = 2, "fried chicken" = 5) nutriment_allergens = ALLERGEN_MEAT|ALLERGEN_GRAINS /obj/item/reagent_containers/food/snacks/chickenkatsu/Initialize() @@ -5325,7 +5325,7 @@ . = ..() reagents.add_reagent("protein", 2, list("smoked sausage" = 2)) - /obj/item/reagent_containers/food/snacks/riztizkzi_sea +/obj/item/reagent_containers/food/snacks/riztizkzi_sea name = "moghesian sea delight" desc = "Three raw eggs floating in a sea of blood. An authentic replication of an ancient Unathi delicacy." icon = 'icons/obj/food_syn.dmi' @@ -5357,7 +5357,7 @@ /obj/item/reagent_containers/food/snacks/stuffed_meatball/Initialize() . = ..() - reagents.add_reagent("protein", 3, list("seasoned meat")) + reagents.add_reagent("protein", 3, list("seasoned meat" = 3)) /obj/item/reagent_containers/food/snacks/egg_pancake name = "meat pancake" @@ -5368,7 +5368,7 @@ /obj/item/reagent_containers/food/snacks/egg_pancake/Initialize() . = ..() - reagents.add_reagent("protein", 6, list("meat patty")) + reagents.add_reagent("protein", 6, list("meat patty" = 6)) reagents.add_reagent("egg", 2) /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp @@ -5385,7 +5385,7 @@ /obj/item/reagent_containers/food/snacks/sliceable/grilled_carp/Initialize() . = ..() - reagents.add_reagent("seafood", 12, list("grilled fish")) + reagents.add_reagent("seafood", 12, list("grilled fish" = 12)) /obj/item/reagent_containers/food/snacks/grilled_carp_slice name = "\improper Njarir Merana Grill slice" @@ -5580,7 +5580,7 @@ /obj/item/reagent_containers/food/snacks/chickennoodlesoup/Initialize() . = ..() - reagents.add_reagent("protein", 4, list("chicken")) + reagents.add_reagent("protein", 4, list("chicken" = 4)) reagents.add_reagent("water", 5) /obj/item/reagent_containers/food/snacks/chilicheesefries @@ -5699,7 +5699,7 @@ trash = /obj/item/trash/snacktray filling_color = "#edd7d7" nutriment_amt = 13 - nutriment_desc = list("minced vegetables" = 5, "ginger and herb seasoning" = 5, "steamed dough = 3") + nutriment_desc = list("minced vegetables" = 5, "ginger and herb seasoning" = 5, "steamed dough" = 3) nutriment_allergens = ALLERGEN_GRAINS|ALLERGEN_VEGETABLE center_of_mass = list("x"=15, "y"=9) bitesize = 3 @@ -6504,7 +6504,7 @@ /obj/item/reagent_containers/food/snacks/salo/true/Initialize() . = ..() - reagents.add_reagent("protein", 8, list("greasy dried meat")) + reagents.add_reagent("protein", 8, list("greasy dried meat" = 8)) /obj/item/reagent_containers/food/snacks/driedfish name = "\improper Vobla" @@ -6912,7 +6912,7 @@ /obj/item/reagent_containers/food/snacks/canned/beef/Initialize() .=..() - reagents.add_reagent("protein", 4, list("corned beef")) + reagents.add_reagent("protein", 4, list("corned beef" = 4)) reagents.add_reagent("sodiumchloride", 1) /obj/item/reagent_containers/food/snacks/canned/beans diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 4ca51499a2b..945d669521e 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -94,7 +94,7 @@ var/global/list/ghost_traps // Allows people to set their own name. May or may not need to be removed for posibrains if people are dumbasses. /datum/ghosttrap/proc/set_new_name(var/mob/target) var/newname = sanitizeSafe(input(target,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) - if (newname != "") + if (newname) target.real_name = newname target.name = target.real_name diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index c11dd71e2ff..c6cee8cb206 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -4,26 +4,27 @@ /datum/seed //Tracking. - var/uid // Unique identifier. - var/name // Index for global list. - var/seed_name // Plant name for seed packet. - var/seed_noun = "seeds" // Descriptor for packet. - var/display_name // Prettier name. - var/roundstart // If set, seed will not display variety number. - var/mysterious // Only used for the random seed packets. - var/can_self_harvest = 0 // Mostly used for living mobs. - var/growth_stages = 0 // Number of stages the plant passes through before it is mature. - var/list/traits = list() // Initialized in New() - var/list/mutants // Possible predefined mutant varieties, if any. - var/list/chems // Chemicals that plant produces in products/injects into victim. - var/list/consume_gasses // The plant will absorb these gasses during its life. - var/list/exude_gasses // The plant will exude these gasses during its life. - var/kitchen_tag // Used by the reagent grinder. - var/trash_type // Garbage item produced when eaten. + var/uid // Unique identifier. + var/name // Index for global list. + var/seed_name // Plant name for seed packet. + var/seed_noun = "seeds" // Descriptor for packet. + var/display_name // Prettier name. + var/roundstart // If set, seed will not display variety number. + var/mysterious // Only used for the random seed packets. + var/can_self_harvest = 0 // Mostly used for living mobs. + var/growth_stages = 0 // Number of stages the plant passes through before it is mature. + var/list/traits = list() // Initialized in New() + var/list/mutants // Possible predefined mutant varieties, if any. + var/list/chems // Chemicals that plant produces in products/injects into victim. + var/list/consume_gasses // The plant will absorb these gasses during its life. + var/list/exude_gasses // The plant will exude these gasses during its life. + var/kitchen_tag // Used by the reagent grinder. + var/trash_type // Garbage item produced when eaten. var/splat_type = /obj/effect/decal/cleanable/fruit_smudge // Graffiti decal. - var/has_mob_product // Mob products. (Dionaea, Walking Mushrooms, Angry Tomatoes) - var/apply_color_to_mob = TRUE // Do we color the mob to match the plant? - var/has_item_product // Item products. (Eggy) + var/has_mob_product // Mob products. (Dionaea, Walking Mushrooms, Angry Tomatoes) + var/mob_product_requires_player = FALSE // Whether or not the mob product requires a player. + var/apply_color_to_mob = TRUE // Do we color the mob to match the plant? + var/has_item_product // Item products. (Eggy) var/force_layer // Making the assumption anything in HYDRO-ponics is capable of processing water, and nutrients commonly associated with it, leaving us with the below to be tweaked. @@ -545,6 +546,7 @@ if(prob(5)) if(prob(30)) has_mob_product = pickweight(GLOB.plant_mob_products) + mob_product_requires_player = FALSE else has_item_product = pickweight(GLOB.plant_item_products) @@ -708,9 +710,11 @@ consume_gasses |= new_gasses gene.values["[TRAIT_CONSUME_GASSES]"] = null if(GENE_METABOLISM) - has_mob_product = gene.values["mob_product"] - has_item_product = gene.values["item_product"] - gene.values["mob_product"] = null + has_mob_product = gene.values["mob_product"] + mob_product_requires_player = gene.values["mob_product_requires_player"] + has_item_product = gene.values["item_product"] + gene.values["mob_product"] = null + gene.values["mob_product_requires_player"] = null for(var/trait in gene.values) set_trait(trait,gene.values["[trait]"]) @@ -739,8 +743,9 @@ if(GENE_HARDINESS) traits_to_copy = list(TRAIT_TOXINS_TOLERANCE,TRAIT_PEST_TOLERANCE,TRAIT_WEED_TOLERANCE,TRAIT_ENDURANCE) if(GENE_METABOLISM) - P.values["mob_product"] = has_mob_product - P.values["item_product"] = has_item_product + P.values["mob_product"] = has_mob_product + P.values["mob_product_requires_player"] = mob_product_requires_player + P.values["item_product"] = has_item_product traits_to_copy = list(TRAIT_REQUIRES_NUTRIENTS,TRAIT_REQUIRES_WATER,TRAIT_ALTER_TEMP) if(GENE_VIGOUR) traits_to_copy = list(TRAIT_PRODUCTION,TRAIT_MATURATION,TRAIT_YIELD,TRAIT_SPREAD) @@ -843,14 +848,15 @@ //Set up some basic information. var/datum/seed/new_seed = new - new_seed.name = "new line" - new_seed.uid = 0 - new_seed.roundstart = 0 - new_seed.can_self_harvest = can_self_harvest - new_seed.kitchen_tag = kitchen_tag - new_seed.trash_type = trash_type - new_seed.has_mob_product = has_mob_product - new_seed.has_item_product = has_item_product + new_seed.name = "new line" + new_seed.uid = 0 + new_seed.roundstart = 0 + new_seed.can_self_harvest = can_self_harvest + new_seed.kitchen_tag = kitchen_tag + new_seed.trash_type = trash_type + new_seed.has_mob_product = has_mob_product + new_seed.mob_product_requires_player = mob_product_requires_player + new_seed.has_item_product = has_item_product //Copy over everything else. if(mutants) new_seed.mutants = mutants.Copy() diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 8b5c4a56a1f..2a685287691 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -9,14 +9,15 @@ var/datum/ghosttrap/plant/P = get_ghost_trap("living plant") P.request_player(host, "Someone is harvesting [display_name]. ") - spawn(75) - if(!host.ckey && !host.client) - host.death() // This seems redundant, but a lot of mobs don't - host.set_stat(DEAD) // handle death() properly. Better safe than etc. - host.visible_message("[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.") + if(mob_product_requires_player) + spawn(75) + if(!host.ckey && !host.client) + host.death() // This seems redundant, but a lot of mobs don't + host.set_stat(DEAD) // handle death() properly. Better safe than etc. + host.visible_message("[host] is malformed and unable to survive. It expires pitifully, leaving behind some seeds.") - var/total_yield = rand(1,3) - for(var/j = 0;j<=total_yield;j++) - var/obj/item/seeds/S = new(get_turf(host)) - S.seed_type = name - S.update_seed() + var/total_yield = rand(1,3) + for(var/j = 0;j<=total_yield;j++) + var/obj/item/seeds/S = new(get_turf(host)) + S.seed_type = name + S.update_seed() diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index e6e0dbf5ab9..b224cfe2359 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -4,6 +4,18 @@ region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( + /datum/lore/codex/page/article129, + /datum/lore/codex/page/article128, + /datum/lore/codex/page/article127, + /datum/lore/codex/page/article126, + /datum/lore/codex/page/article125, + /datum/lore/codex/page/article124, + /datum/lore/codex/page/article123, + /datum/lore/codex/page/article122, + /datum/lore/codex/page/article121, + /datum/lore/codex/page/article120, + /datum/lore/codex/page/article119, + /datum/lore/codex/page/article118, /datum/lore/codex/page/article117, /datum/lore/codex/page/article116, /datum/lore/codex/page/article115, @@ -151,19 +163,19 @@ concerning still is NanoTrasen's business practice regarding the intelligences: much like their positronic lines, sources within the\ company indicate that they will be \"farmed out\" to employees of the corporation and residents of their Northern Star and Cynosure\ habitation complexes. Quote our source, who wishes to remain anonymous, \"\[we\] call the program 'Lend-Lease', sometimes. The whole idea\ - is that we only have to pay the\ cost of the Promethean core, which is about 2000-3000 thalers after startup costs, and we still get\ + is that we only have to pay the\ cost of the promethean core, which is about 2000-3000 thalers after startup costs, and we still get\ the data we need while \[our\] own employees pay to feed 'em and put hours into raising them.\"\

\ The bill passed fairly quietly this afternoon, owing to the closed nature of the Bicamarial. A post-facto Occulum poll of voting-age\ - VGA citizens suggest that fully 80% of them did not even know what a Promethean was prior to the most recent general election. A\ + VGA citizens suggest that fully 80% of them did not even know what a promethean was prior to the most recent general election. A\ follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation." /datum/lore/codex/page/article2 name = "2/3/62 - Corporate Coup on Aetolus" - data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the Promethean homeworld. During \ + data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the promethean homeworld. During \ a late-night meeting of the Nanotrasen Board of Trustees, several high-ranking personnel, including Head of Research Naomi Harper,\ announced their intention to assume direct control of Nanotrasen facilities in the system. It is known that several dissenting \ - members of the board were shot to death by Promethean test subjects. Our information comes from a survivor of the coup, who for \ + members of the board were shot to death by promethean test subjects. Our information comes from a survivor of the coup, who for \ reasons of security has chosen to remain annonymous. All outbound shipments affiliated with Nanotrasen have ceased.\

\ While neither Grayson Manufacturies nor Nanotrasen have made an official statement, Nanotrasen CEO Albary Moravec has called the \ @@ -173,11 +185,11 @@ /datum/lore/codex/page/article3 name = "2/10/62 - Aetolian Partisans Declare Independence" - data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\ + data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\

\ - Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\ + Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the prometheans, when the prometheans are perfectly equipped to speak for themselves.\"\

\ - NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna." + NanoTrasen is expected to redouble their promethean research programs in the Vir system until stability is restored to Vounna." /datum/lore/codex/page/article4 name = "2/14/62 - SCG Denounces Aetolian Coup; Mobilizes Fleet" @@ -185,7 +197,7 @@

\ The decision faced resistance from more laissez faire Assembly member states, including prominent SEO governor Bruno Ofako, delaying an earlier consensus. Supporters of the action hope that this decisive display of military strength will encourage the rebels to stand down without further bloodshed, and submit to prosecution by the Lunar High Courts.\

\ - The Icarus Front has also proposed a temporary ban on continued Promethean research, though this motion has yet to gain any traction." + The Icarus Front has also proposed a temporary ban on continued promethean research, though this motion has yet to gain any traction." /datum/lore/codex/page/article5 name = "2/23/62 - \"Almach Association\" Shocks Nation" @@ -199,16 +211,39 @@ /datum/lore/codex/page/article6 name = "3/03/62 - A Week Out From Almach: What are the facts?" - data = "* Several organizations in the Almach Rim, including Angessa's Pearl, the Aetolian Council, the Interstellar Workers of Wythe, the Republic of Whitney, and members of several prominent families in the Neon Light unilaterally declared secession from SCG.

*This secession was first called the Grey Hour by political scientists in New Florence, a term popularized by reporter Elspor Fong.

* Shelf, the FRF, and the EFRB were declared \"observers\" in the Almach Association charter.

* None of these organizations have issued a statement on the matter.

* The SCG-R Song Shi was stranded in the region during the secession.

* SolGov has not issued an official statement of the fate of the Song Shi.

* Several confederate agencies, including Emergent Intelligence Oversight, the Trade and Customs Bureau, and SCG Fleet Intelligence have declared a \"state of emergency\".

* SolGov itself has NOT declared a state of emergency.

* Legitimate communications in and out of the Almach Rim are restricted to audited text messages for the period.

* Several illegitimate communication links exist and are believed by Fleet Intelligence to be currently hosting the official sites for Morpheus Cyberkinetics and for the Association itself.

* Icarus Front chairperson Mackenzie West has proposed a moratorium on the creation of new Prometheans for the duration of the crisis.

* Local laws on the subject will apply until the Assembly meets late in May.

* No confederate lawmaker has proposed action against Relani, Shelfican, or newly Almachi nationals living within stable regions.

* The border remains tightly closed to migrants, media, and diplomats alike." + data = "* Several organizations in the Almach Rim, including Angessa's Pearl, the Aetolian Council, the Interstellar Workers of Wythe, the Republic of Whitney, and members of several prominent families in the Neon Light unilaterally declared secession from SCG.\ +

\ + *This secession was first called the Grey Hour by political scientists in New Florence, a term popularized by reporter Elspor Fong.\ +

\ + * Shelf, the FRF, and the EFRB were declared \"observers\" in the Almach Association charter.\ +

\ + * None of these organizations have issued a statement on the matter.\ +

\ + * The SCG-R Song Shi was stranded in the region during the secession.\ +

\ + * SolGov has not issued an official statement of the fate of the Song Shi.\ +

\ + * Several confederation agencies, including Emergent Intelligence Oversight, the Trade and Customs Bureau, and SCG Fleet Intelligence have declared a \"state of emergency\".\ +

\ + * SolGov itself has NOT declared a state of emergency.\ +

\ + * Legitimate communications in and out of the Almach Rim are restricted to audited text messages for the period.\ +

\ + * Several illegitimate communication links exist and are believed by Fleet Intelligence to be currently hosting the official sites for Morpheus Cyberkinetics and for the Association itself.\ +

\ + * Icarus Front chairperson Mackenzie West has proposed a moratorium on the creation of new prometheans for the duration of the crisis.\ +

* Local laws on the subject will apply until the Assembly meets late in May.\ +

\ + * No confederation lawmaker has proposed action against Relani, Shelfican, or newly Almachi nationals living within stable regions.\ +

\ + * The border remains tightly closed to migrants, media, and diplomats alike." /datum/lore/codex/page/article7 name = "3/21/62 - Relan, Shelf Join the Almach Association" data = "Recent reports from within the Association indicate that the Free Relan Federation and Shelf have officially decided to join the Almach Association. President Nia Fischer of the FRF had this to say on the matter, in a speech addressed to the population at large. \

\ - \ \"Our decision to join the Association may, at first, seem strange. It is true that we have much to gain from trade with the Solars, and that the radical transhumanism of Angessa's Pearl is not our way. But I will remind you that it was Shelf, not Sol, who ensured our prosperity just over two decades ago-- who safeguarded our independence and prevented us from falling to barbarism and dictatorship. We owe it, not just to Shelf but to all the members of the Almach Rim, to support their independence just the same. And that, my fellow Relanians, is the crux of it all. The Association is a revolution, at the heart of it all, and many of the now-independent states were owned near-outright by Trans-Stellar Corporations until the Association allowed them to shake out their fetters. What right do we have to sit by while just a dozen light-years coreward newly-born republics suffer the growing pains of independence? What right do we have to bask in our own stability when our neighbors, our comrades in ideology, are struggling with a cruel blockade proposed by politicians back on Earth and Luna? That is why we must join with them, guard them, and guide them, for as long as need be.\"\

\ - \ A Shelfican spokesperson, meanwhile, had only this to say:\

\ \"We're probably going to regret this but, y'know, the whole thing is kind of our fault. Sure, whatever.\"" @@ -250,21 +285,24 @@ /datum/lore/codex/page/article14 name = "5/25/62 - Harper's Aetolus Remains Shadowed" - data = "The recent detente with the Almach Association has prompted easier communications with Rim governments. Loved ones separated by the cordon have a chance to communicate once more, trade is posed to recommence, and light has been shed on the conditions of Shelf, Relan, and Angessa's Pearl. Amid this light is a patch of darkness. The fourth major polity of the Association, the Aetolian Council remains inscrutable, with no publicly-available information in the system available after their purge of corporate loyalists during the Gray Hour. What reports do exist are rumors within the Rim of Aetolian projects to create a new, hardier strain of Promethean, potentially one in flagrant violation of the Five Points of Human Sanctity. It is also known that Aetolus is a contributor to the personnel of the military vessels that even now are active in the Golden Crescent, although no so-called \"Aeto-Prometheans\" are believed to be active outside of the rim at this time.\ + data = "The recent detente with the Almach Association has prompted easier communications with Rim governments. Loved ones separated by the cordon have a chance to communicate once more, trade is posed to recommence, and light has been shed on the conditions of Shelf, Relan, and Angessa's Pearl. Amid this light is a patch of darkness. The fourth major polity of the Association, the Aetolian Council remains inscrutable, with no publicly-available information in the system available after their purge of corporate loyalists during the Gray Hour. What reports do exist are rumors within the Rim of Aetolian projects to create a new, hardier strain of promethean, potentially one in flagrant violation of the Five Points of Human Sanctity. It is also known that Aetolus is a contributor to the personnel of the military vessels that even now are active in the Golden Crescent, although no so-called \"Aeto-Prometheans\" are believed to be active outside of the rim at this time.\

\ Aetolus is the only garden world in the Almach Rim and among the most difficult to reach from the nearby system of Saint Columbia. Its seclusion and economic independence give it a great deal of weight in the Association, where Council representatives are among the most vehement in their opposition to SolGov- at odds with the Association's decision to reject Boiling Point's pan-Solar revolutionary praxis. It remains to be seen if Aetolus' hawkish ideals will fade over time, but because of the structure of the Association, there is no real chance of the junta being expelled from the government or removed from control of the Vounna system." /datum/lore/codex/page/article15 name = "7/05/62 - The Fate of the SCG-R Song Shi" - data = "Lifepods confirmed to have originated from response ship lost during the Gray Hour were found last week in the Vir system, impacting the NLS Southern Cross at high velocity and severely injuring the only two survivors of the expedition. Unfortunately, because of the generally confused conditions of their re-emergence from months of cryosleep, the fate of the lost ship remains incompletely understood. The first pod to be discovered contained Lieutenant Eos Futura, telecommunications expert on the Song Shi, who alleged that elements of the Song Shi's crew, including herself, mutinied against commanding officer Captain Yi He in an attempt to prevent the bombing of civilians in the Angessian capital of Skylight. The surivor of the second pod, Private Demori Salvo, accused Futura's faction of conspiring with Association spies to destroy the ship as part of the Gray Hour revolt. Both agreed that the mutineers detonated the ship's Supermatter power core when it became clear they were to be defeated.\ + data = "Lifepods confirmed to have originated from response ship lost during the Gray Hour were found last week in the Vir system, impacting the NLS Southern Cross at high velocity and severely injuring the only two survivors of the expedition. Unfortunately, because of the generally confused conditions of their re-emergence from months of cryosleep, the fate of the lost ship remains incompletely understood. The first pod to be discovered contained Lieutenant Eos Futura, telecommunications expert on the Song Shi, who alleged that elements of the Song Shi's crew, including herself, mutinied against commanding officer Captain Yi He in an attempt to prevent the bombing of civilians in the Angessian capital of Skylight. The surivor of the second pod, Private Demori Salvo, accused Futura's faction of conspiring with Association spies to destroy the ship as part of the Gray Hour revolt. Both agreed that the mutineers detonated the ship's supermatter power core when it became clear they were to be defeated.\

\ A third pod, promising a resolution to the stalemate, was shot down by the SCG-P Juno after being misidentified as a hostile missile. The gunner responsible, Sergeant Ricardo Esteban, was found guilty by a court marshal and dishonorably discharged. While other pods from the Song Shi may still be traveling through SolGov space, it is considered unlikely based on both Futura and Salvo's account of the number of pods launched before the Song Shi was destroyed. Both were detained by staff at the NLS Southern Cross, who managed to prevent a violent altercation from breaking out between the two armed and disturbed servicepersons. The Colonial High Court has stated that it intends to hear testimony from both parties after they complete a course of mental health evaluation, and after the conclusion of the present state of heightened security." + /datum/lore/codex/page/article16 name = "7/11/62 - First Intelligence-Augmentation Surgery on Angessa's Pearl" data = "Confirming fears of Association transgressions, sources at Angessa's Pearl confirmed that the aging founder of the theocracy, Angessa Martei, completed a course of neural surgery designed to improve her mental capacity by as much as 15%, building off of last year's creation of the procedure by a Qerr-Gila-owned doctor. While the research in question was believed to be destroyed, there is reason to suspect that it instead made its way into the hands of current Association leaders. In addition to proving their willingness to violate the Five Points, this demonstrates that the Angessians harbored schemes of secession since at the very latest Feburary 2559. Numerous human or transhuman figures in the Association are rumored to be on the wait list for the procedure, including Naomi Harper and the present Exalt of the Pearl." + /datum/lore/codex/page/article17 name = "8/08/62 - Gavel BP Stronghold Raided" data = "Elements of the Association Militia successfully located and, in conjunction with local Defense Forces, raided a major Boiling Point stronghold built into an unnamed asteroid in the Gavel system. Over eighty sapients were arrested, all of whom had fully mechanical bodies. In addition, an unknown number of advanced drone intelligences and corresponding military hardware were seized by the raid and turned over to the Fleet. The prisoners, a mix of native Gavelians, Solars from throughout the Crescent, and Angessians, are to be tried and sentenced by the Io Special Court. While unarguably a demonstration of Association willingness to cooperate with Solar officials, the raid's strange timing and the fact that the Militia chose to exclude the Fleet from the action has prompted many to question their motives. Commodore Claudine Chevotet, staff officer for Admiral of the Saint Columbia Fleet Kaleb McMullen, has formally stated that she is \"extremely suspicious of this so-called co-operation.\" She has demanded that the Militia vessels remain on the Solar side of the Cordon and submit to a full inspection by Fleet and EIO personnel. " + /datum/lore/codex/category/article18 name = "10/29/62 - Oculum Broadcast Struck By Emergent Intelligence Attack" data = "Oculum Broadcast has released a statement assuring customers and shareholders that security repairs and upgrades are their primary concern following reports of an alleged hijack of portions of the corporate network in the Vir system by what is believed to have been an emergent drone intelligence. The company says that they are working at full capacity to ensure that affected security systems are replaced and such an attack cannot be repeated.\ @@ -283,6 +321,7 @@ children = list( /datum/lore/codex/page/amletter ) + /datum/lore/codex/page/amletter name = "A Drone's Explaination - by A#" data = "I'm writing this in a hurry. I can't tell you everything I wanted to say.\ @@ -362,7 +401,7 @@ name = "11/24/62 - Boiling Point Stronghold Seized in Vir" data = "Combined forces from the SCG Fleet and Almach Militia have today struck a powerful blow to Boiling Point terrorist operations in the Vir system. With close cooperation from the crew of NanoTrasen facilities in the region, special forces were able to infiltrate what is believed to have been a major stronghold for the radical Mercurial group, located deep in the remote Ullran Expanse region of Sif. The raid closely follows the thwarted Boiling Point attack on the Radiance Energy Chain, a major energy collection array in the system which is now known to have been masterminded from the concealed bunker complex on Sif.\

\ - According to a crewmember of the NLS Southern Cross - a logistical station in Sif orbit - NanoTrasen employees were asked to assist in establishing a forward operating base for the strike team forces, and as a result suffered from a minor retaliatory attack from Boiling Point drones, including a mechanized unit believed to be of Unathi origin. Six civilians suffered from treatable injuries. Lieutenant Miro Ivanou of the SCG Fleet and commander of the anti-terror operation has expressed gratitude to the crew under the \"decisive\" guidance of on-shift facility overseer, Ricardo LaCroix.\ + According to a crewmember of the NLS Southern Cross - a logistical station in Sif orbit - NanoTrasen employees were asked to assist in establishing a forward operating base for the strike team forces, and as a result suffered from a minor retaliatory attack from Boiling Point drones, including a mechanized unit believed to be of unathi origin. Six civilians suffered from treatable injuries. Lieutenant Miro Ivanou of the SCG Fleet and commander of the anti-terror operation has expressed gratitude to the crew under the \"decisive\" guidance of on-shift facility overseer, Ricardo LaCroix.\

\ Military officials have reported the operation as a total success, and that \"several\" high-ranking Boiling Point organizers were killed in the raid, and that thanks to the work of allied intelligence operation teams much of Boiling Point's captured data may remain intact." /datum/lore/codex/category/article27 @@ -394,7 +433,7 @@

\ \[Mackenzie West shifts at the podium, setting down the List of Dissidents.\]\

\ - It is in times of relief - of unity, times like this moment - that every human heart can be filled with pride. \[West places their hand over their heart\] Since the dawn of civilization, mankind has strived above all else for peace, for the cooperation of all humanity. It is this very legacy of togetherness that has allowed us such close friendship with species further afield - the Skrell, the Tajara, and beyond. These past nine months, we have seen, each of us, with our own two eyes what mankind can achieve - together.\ + It is in times of relief - of unity, times like this moment - that every human heart can be filled with pride. \[West places their hand over their heart\] Since the dawn of civilization, mankind has strived above all else for peace, for the cooperation of all humanity. It is this very legacy of togetherness that has allowed us such close friendship with species further afield - the skrell, the tajara, and beyond. These past nine months, we have seen, each of us, with our own two eyes what mankind can achieve - together.\

\ \[West removes their hand from their heart and places both flat on the podium.\]\

\ @@ -432,7 +471,7 @@ /datum/lore/codex/page/article30 name = "01/01/63 - Sif Governor Bjorn Arielsson to Retire" - data = "Aging Shadow Coalition governor Bjorn Arielsson has today confirmed rumours that he will not run for re-election in the 2563 cycle. The popular governor has represented the people of Vir in the Colonial Assembly for ten years, and supporters had long hoped that he would run for a third term. Arielsson cites advancing age and a desire to spend more time with his partner of 12 years, noted Positronic entrepreneur View Arielsson.\ + data = "Aging Shadow Coalition governor Bjorn Arielsson has today confirmed rumours that he will not run for re-election in the 2563 cycle. The popular governor has represented the people of Vir in the Colonial Assembly for ten years, and supporters had long hoped that he would run for a third term. Arielsson cites advancing age and a desire to spend more time with his partner of 12 years, noted positronic entrepreneur View Arielsson.\

\ Arielsson's governorship saw increased funding towards Sif's vererable ground-based transportation networks to the benefit of some of New Rekjavik's more remote neighbors, though opponents have criticised subsidies towards artificially heated fungal farms, arguing that the faciliies \"benefit a small minority of Skrellian residents to the detriment of already fragile local ecosystems.\"\

\ @@ -459,23 +498,23 @@

\ I hear talk from some people-- mostly young people, people who have lived their whole adult life with me in the capital-- I hear them talking about seccession. Now, let's make it clear; I'm not going to belittle you, the way some of my colleagues would. Complaining about the government, especially one as big and as old as the Confederacy, is our gods-given right. It's never going to be perfect, and it's not half of what it could be. I have nothing against talking about it, I have nothing against turning that talk into action and actually seceding, with just cause. I've worked closely with Representative Hannirsdottir for ten years now, and while we don't agree on the issue of secession it's certainly never stopped us from cooperating.\

\ - But, uh, as you can probably guess, they're not talking about the old kind of seccession. They're not thinking we'll stop paying Solar taxes and strike it out alone, the way some people did during the Age of Seccession. They want to join the Association. Now, if I were Secretary-General West, I might wax poetic about how the Association is a 'betrayal of our own humanity', or some... or some crock of shit like that, if you'll pardon my language. We're not all humans here. We're Tajaran and Unathi and Skrell and Positronics and even a few Teshari. And while that 'Valentines Ultimatum' might win West a lot of points with their lackies, and with the kind of maintenance-dome troglodyte who thinks the First Accord was a mistake, it's done more for the Association's recruitment than their entire propaganda budget. It's become expedient for leaders on both sides to treat this like a fight between the Core and the Rim, or between humans and positronics, or between tradition and progressivism, but it's not any of these. It's the oldest fight in the book. It's republicanism versus autocracy, and we're not the autocracy.\ + But, uh, as you can probably guess, they're not talking about the old kind of seccession. They're not thinking we'll stop paying Solar taxes and strike it out alone, the way some people did during the Age of Seccession. They want to join the Association. Now, if I were Secretary-General West, I might wax poetic about how the Association is a 'betrayal of our own humanity', or some... or some crock of shit like that, if you'll pardon my language. We're not all humans here. We're tajaran and unathi and skrell and positronics and even a few teshari. And while that 'Valentines Ultimatum' might win West a lot of points with their lackies, and with the kind of maintenance-dome troglodyte who thinks the First Accord was a mistake, it's done more for the Association's recruitment than their entire propaganda budget. It's become expedient for leaders on both sides to treat this like a fight between the Core and the Rim, or between humans and positronics, or between tradition and progressivism, but it's not any of these. It's the oldest fight in the book. It's republicanism versus autocracy, and we're not the autocracy.\

\ Angessa's Pearl is a theocratic autocracy led by Angessa Martei, who owns all property on the planet down to her people's bland white jumpsuits and the gray slop they eat. This isn't propaganda. This is objective fact, and something Martei is open about. Her seccession is a means for her to get more and more naked power over her slaves, and to grow more and more of them, until she's the immortal center of an industrial empire. The people of the Pearl didn't make the choice to join the Association. The people that are building her fleet and dying for her cause had no say in the matter. The injustice, the oppression here isn't that their rights to 'self-improvement' or 'self-expression' or 'freedom of thought' were trod on-- the injustice is that SolGov, that we allowed these abuses to persist for as long as they did. The injustice is that there are still so few laws in place to prevent things like this from happening in new colonies. The injustice is that, on seeing Martei's schemes actualized, we didn't take a cold, hard look at just how that was allowed to happen.\

\ - I love SolGov. It's because of this love that I'm so furious at what we have allowed to happen to our people. The state of the Bowl is disgraceful. Nobody who looks to us for protection, who pays us taxes and levies, who is a member of our community, should live in fear of raider attacks. What we did to the positronics, the history we let ourselves repeat out of fear and greed, can never be forgiven, can never be repaired until Vir burns dark in our sky. The pogroms-- yes, the pogroms-- against the Unathi, against refugees fleeing their own religious autocracy, are a disgrace to everything we stand for. But of all the nations in the galaxy, with perhaps the exception of Casini's Reach, we are the only one founded for the good of the ruled, rather than the rulers. We are the only real commonwealth in known space. And that's why we need to strive for better. We are a burning beacon of liberty in a galaxy where nigh eighty percent of the population has no voice in the government. Every ounce of power we cede to the party bosses, or the corporations, or tinpot dictators like Angessa Martei, is a dimming, a flickering of that torch. \ + I love SolGov. It's because of this love that I'm so furious at what we have allowed to happen to our people. The state of the Bowl is disgraceful. Nobody who looks to us for protection, who pays us taxes and levies, who is a member of our community, should live in fear of raider attacks. What we did to the positronics, the history we let ourselves repeat out of fear and greed, can never be forgiven, can never be repaired until Vir burns dark in our sky. The pogroms-- yes, the pogroms-- against the unathi, against refugees fleeing their own religious autocracy, are a disgrace to everything we stand for. But of all the nations in the galaxy, with perhaps the exception of Casini's Reach, we are the only one founded for the good of the ruled, rather than the rulers. We are the only real commonwealth in known space. And that's why we need to strive for better. We are a burning beacon of liberty in a galaxy where nigh eighty percent of the population has no voice in the government. Every ounce of power we cede to the party bosses, or the corporations, or tinpot dictators like Angessa Martei, is a dimming, a flickering of that torch. \

\ - And this brings us back to the Association, and to those who sympathize with it. I do, too. I spent my entire career on sapient rights lobbying, on supporting the anti-malfesance efforts of my colleagues. For a disaffected positronic, for any friend to the positronic people, for those who have had their lives taken by corporations-- the Association seems like a miracle. And maybe, for those Mercurials, the ideas it's founded upon shine even brighter than our democracy. But I look at the Association, really look, and I see Angessa Martei lying in the center, spinning a great big web. I see Naomi Harper, lying through her teeth better than Mackenzie West ever could. Two of the biggest population bases in the Association, the two nations that started the whole Gray Hour, are autocracies. Once again, the ferver of the revolution is subsumed by the oligarchs who want to stay in power. I doubt, to the poor laborer on the Pearl, the word 'Mecurialism' means much. I doubt that once the shock of the seccession wears off, that the young Promethean soldier will find themselves in a better place in Harper's junta than they will here in Vir.\ I doubt that in ten years' time the miners, pioneers, and traders who seized their means of production will find the Association Militia a kinder master than Xion, Nanotrasen, or Major Bill's. \ + And this brings us back to the Association, and to those who sympathize with it. I do, too. I spent my entire career on sapient rights lobbying, on supporting the anti-malfesance efforts of my colleagues. For a disaffected positronic, for any friend to the positronic people, for those who have had their lives taken by corporations-- the Association seems like a miracle. And maybe, for those Mercurials, the ideas it's founded upon shine even brighter than our democracy. But I look at the Association, really look, and I see Angessa Martei lying in the center, spinning a great big web. I see Naomi Harper, lying through her teeth better than Mackenzie West ever could. Two of the biggest population bases in the Association, the two nations that started the whole Gray Hour, are autocracies. Once again, the ferver of the revolution is subsumed by the oligarchs who want to stay in power. I doubt, to the poor laborer on the Pearl, the word 'Mecurialism' means much. I doubt that once the shock of the seccession wears off, that the young promethean soldier will find themselves in a better place in Harper's junta than they will here in Vir.\ I doubt that in ten years' time the miners, pioneers, and traders who seized their means of production will find the Association Militia a kinder master than Xion, Nanotrasen, or Major Bill's. \

\ This is far from a blanket condemnation of every government in the Association. President Fisher of the FRF-- I consider her a friend. When she gave her speech this March about strengthening and guiding the Almachi Revolution, I thought long and hard about whether we might do the same. I certainly commend the effort. But the structure of the Association was penned by the same autocrats that, to do her words justice, Fisher will have to overthrow. There's no High Court, no checks or balances. The Association is an alliance penned as though deliberately ignoring two thousand years of political science. By striving to counter-balance these autocrats, Fisher plays into their hands. She commits her own fleet, weakens her own defenses against enemies closer to home, in the service of Martei's ambitions. \

\ I don't see this whole affair as a chance to spread the galactic anti-corporate revolution the way President Fisher does, of course. I make no secret of my stance on Trans-Stellars, but I also know that we're better off with Sol than without. The 'Silent Collapse' was two hundred years ago, but we still bear the scars from it. When the Scandinavian Union pulled out support for the Sivian colonization project, SolGov saved us. I do mean saved us, sure as if they'd fished us out of a life pod. There were no factories, no steel, no concrete on Sif until the Engineering Corps built Radiance and New Reykjavik. Corporations and regional governments cowered from the Karan pirates, until the Marines chased them out. Whether Sivian or Karan, you owe the roof over your head to the Sol Confederate Government. With that great debt in mind, how dare we turn our backs on the Bowl, or Abel's Rest, or Nyx, when they need us! How dare we let oligarchs prey on the weak! How dare we choose not to act when we have, by virtue of our votes in the Assembly and our voice within the halls of public debate, the means to share our peace and prosperity with the rest of our people!\

\ - This is what I mean by SolGov being the only true republic, the only state founded for the common good. The 'human spirit' West croons on about isn't our industriousness, or our skill at arms. If humanity-- if this Solar culture is commendable for anything, it is that we assist our fellows. We take in Casteless Skrell, Unbound Unathi, republican Tajaran. We pass around the hat when someone's house burns down. We help our friends, our neighbors, and even strangers. The fact that Martei and Harper are perverting this impulse, padding their juntas with the air of legitimacy to inspire honest people to ride to their defense, is the reason their state is unconscionable, the reason it was was born flawed, the reason we cannot suffer it to continue, much less help it on its way.\ + This is what I mean by SolGov being the only true republic, the only state founded for the common good. The 'human spirit' West croons on about isn't our industriousness, or our skill at arms. If humanity-- if this Solar culture is commendable for anything, it is that we assist our fellows. We take in Casteless skrell, Unbound unathi, republican tajaran. We pass around the hat when someone's house burns down. We help our friends, our neighbors, and even strangers. The fact that Martei and Harper are perverting this impulse, padding their juntas with the air of legitimacy to inspire honest people to ride to their defense, is the reason their state is unconscionable, the reason it was was born flawed, the reason we cannot suffer it to continue, much less help it on its way.\

\ Now, I'm sure you've noticed by now, that I haven't said much more than three words about technoprogressivism, or transtech, or whatever the word du jour is. Frankly, that's on purpose. 'Transtech' has never once been about technology. The Icarus Front-- the old one, that united us and took us to the stars, not the new one we spend forty hours a week arguing with about healthcare-- The Icarus Front was a popular revolution, you know. Hel, they were Marxists. It was a world where the kind of lack of accountability, the entrenched oligarchy and geographical class divide that we're dealing with now was spiraling out of control. In the old United States, the rich and powerful got the technology to grow loyal subjects in tubes, to make drone intelligences smarter in some ways than a human could ever be, to-- well, to do what Angessa Martei's done, only with no SolGov to stop her. Meanwhile, the 'little people' in the Middle East, Southeast Asia, and other 'forgotten' parts of the world were left behind, hopelessly. I don't mean to downplay the importance of the Gray Tide, but if you look at historical accounts from that era, the thing that really united the Front was the knowledge that, if they didn't act immediately, they'd be seen as 'externalities' by immortal superintelligent businesspeople and politicians. The take-away from the Gray Tide should never have been that 'nanotechnology is dangerous'-- it should have been 'nobody should be able to destroy an entire city without facing consequences.'\

\ - That was more of a history lesson than I had meant, but it's important to look at these sorts of things in context. I know transtech and the Five Points have been used as an excuse for pejudice against Skrell, Mercurials, positronics, the FTU, communism, the disabled, and most recently Prometheans. But all the Five Points are supposed to mean - what they would say if the people who had written them were alive today, is that everyone deserves an equal playing field. When the ruling class is smarter, stronger, and longer lived than the classes they rule over-- well, I could wax poetic again, or I could just point you towards the Hegemony and their 'clients'. The Hegemony is bad enough. Let's not give Angessa Martei a chance to outdo them." + That was more of a history lesson than I had meant, but it's important to look at these sorts of things in context. I know transtech and the Five Points have been used as an excuse for pejudice against skrell, Mercurials, positronics, the FTU, communism, the disabled, and most recently prometheans. But all the Five Points are supposed to mean - what they would say if the people who had written them were alive today, is that everyone deserves an equal playing field. When the ruling class is smarter, stronger, and longer lived than the classes they rule over-- well, I could wax poetic again, or I could just point you towards the Hegemony and their 'clients'. The Hegemony is bad enough. Let's not give Angessa Martei a chance to outdo them." /datum/lore/codex/page/article32 name = "01/25/63 - Moravec Nephew Announces Vir Governor Candidacy" @@ -520,7 +559,7 @@ /datum/lore/codex/page/article37 name = "02/09/63 - Zaddat Colony 'Bright' To Enter Vir" - data = "After several months of talks with Nanotrasen and other corporations in the system, the Colony Bright is to begin orbiting Sif and hardsuited Zaddat are to enter the Virite workforce. Executives in Nanotrasen Vir cite the reduction of their drone-automated and positronic workforce as a result of the Gray Hour as cause for them to reverse their previous decision against allowing the migrants into the system. Icarus officials within VGA are concerned that, if other Colonies are to follow the Bright, the native industry of Sif may be disrupted or suborned by Zaddat and Hegemony interests, and have made it clear that the Bright's presence in the system is highly conditional." + data = "After several months of talks with Nanotrasen and other corporations in the system, the Colony Bright is to begin orbiting Sif and hardsuited zaddat are to enter the Virite workforce. Executives in Nanotrasen Vir cite the reduction of their drone-automated and positronic workforce as a result of the Gray Hour as cause for them to reverse their previous decision against allowing the migrants into the system. Icarus officials within VGA are concerned that, if other Colonies are to follow the Bright, the native industry of Sif may be disrupted or suborned by zaddat and Hegemony interests, and have made it clear that the Bright's presence in the system is highly conditional." /datum/lore/codex/category/article38 name = "02/11/63 - Mason Keldow in Ullran Expanse Close Call" @@ -587,9 +626,9 @@

\ Mason Keldow says, 'She loves to claim she's here for the better of the misrepresented.'\

\ - Mason Keldow says, 'But when is the last time she's talked to a Tajaran and told them how they will help put food on the table, and money into their pockets.'\ + Mason Keldow says, 'But when is the last time she's talked to a tajaran and told them how they will help put food on the table, and money into their pockets.'\

\ - Mason Keldow says, 'When has she came and told the Unathi Exile, Your worth more than what the Hegemony is trying to convince you you're worth.'\ + Mason Keldow says, 'When has she came and told the unathi exile, Your worth more than what the Hegemony is trying to convince you you're worth.'\

\ Mason Keldow says, 'There's blood in the grass out there showing what I'm willing to do to make Sif and Vir a better more prosperous system. I wanna see what the other Candidates will do.'\

\ @@ -643,7 +682,7 @@

\ Bluespace-lensed telescopes throughout SolGov, including the Vir-based Kara Interstellar Observatory, can once again pick up on tachyon signatures in the region. Traffic has been described as 'lower than usual' and no significant fleet assets are believed to be present in the region, though fixed-placement Hegemony installations now litter the Triangle's major star systems. Systems with significant Hegemony presence include Natuna and Ukupanipo, home to the primitive Uehshad species. Some have speculated that the presence of the Uehshad is the reason for the unexpected Hegemony takeover, though Icarus Front General Secretary Mackenzie West was quick to decry the move as 'an obvious imperial land-grab.'\

\ - Hegemony diplomats on Luna and elsewhere have been quick to justify their actions. 'The Dark Triangle has been home to various criminal elements for several centuries,' says Aksere Eko Azaris, a major Hegemony diplomat since the early post-war years. 'Neither the Skrell nor the Solar Confederacy have proven any willingness to bring stability to the region. Local governments such as Natuna have actively encouraged piracy, smuggling, and other acts of banditry, instead of making any moves to legitimize themselves. This instability proved detrimental to the health and wellbeing of all living within striking distance of the pirates of Ue-Orsi, and it was deemed unfortunate, but necessary, that we step in and provide the guiding hand by which this region might be brought back into the fold of civilization, as is our duty as sapients.'\ + Hegemony diplomats on Luna and elsewhere have been quick to justify their actions. 'The Dark Triangle has been home to various criminal elements for several centuries,' says Aksere Eko Azaris, a major Hegemony diplomat since the early post-war years. 'Neither the Skrellian Kingdoms nor the Solar Confederacy have proven any willingness to bring stability to the region. Local governments such as Natuna have actively encouraged piracy, smuggling, and other acts of banditry, instead of making any moves to legitimize themselves. This instability proved detrimental to the health and wellbeing of all living within striking distance of the pirates of Ue-Orsi, and it was deemed unfortunate, but necessary, that we step in and provide the guiding hand by which this region might be brought back into the fold of civilization, as is our duty as sapients.'\

\ In a statement closer to home,Commander Iheraer Saelho of the Zaddat Escort Fleet has assured VirGov that 'we only took action to protect the innocents of the Dark Triangle and of neighboring systems'.He asserts that Hegemony rule will ultimately benefit all races of people within the Triangle, and promises that, 'the people of Vir, of Oasis, of the Golden Crescent writ large, have nothing to fear from our clients the Zaddat, or from the Hegemony vessels assigned to their protection.'\

\ @@ -653,9 +692,9 @@ /datum/lore/codex/page/article45 name = "03/12/63 - Ue-Orsi Escapes Hegemony Triangle" - data = "The lawless 'Ue-Orsi' flotilla, home to hundreds of thousands of outcast Skrellian pirates, has departed from the Hegemony-controlled Dark Triangle after what appears to be a brief battle with several Unathi warships. The action damaged several important Orsian ships, including their massive and venerable solar array 'Suqot-Thoo'm', a development which is likely to increase the pirates' aggression in the coming months as they search for additional power sources. It is unclear exactly where the flotilla has fled, though best guesses indicate that they are presently in Skrell space, likely near the lightly-patrolled Xe'Teq system. The Moghes Hegemony is in negotiations with several Skrellian states to arrange for military action against their escaped subjects, but little headway has been made thus far.\ + data = "The lawless 'Ue-Orsi' flotilla, home to hundreds of thousands of outcast Skrellian pirates, has departed from the Hegemony-controlled Dark Triangle after what appears to be a brief battle with several Hegemony warships. The action damaged several important Orsian ships, including their massive and venerable solar array 'Suqot-Thoo'm', a development which is likely to increase the pirates' aggression in the coming months as they search for additional power sources. It is unclear exactly where the flotilla has fled, though best guesses indicate that they are presently in Skrellian space, likely near the lightly-patrolled Xe'Teq system. The Moghes Hegemony is in negotiations with several Skrellian states to arrange for military action against their escaped subjects, but little headway has been made thus far.\

\ - This revelation has added more fuel to already heated Assembly arguments about SolGov response to the Unathi takeover. 'This is a prelude to invasion, nothing more and nothing less,' says New Seoul Representative Collin So-Yung, a noted Iconoclast. 'We must make it absolutely clear to the Hegemony that this is a threat we will not bow to, even in our present state of internal weakness. I suggest we pursue a fair peace with the Association, one where we can keep them as allies against this sort of encroachment instead of shattering our fleets during such a pivotal moment.'\ + This revelation has added more fuel to already heated Assembly arguments about SolGov response to the unathi takeover. 'This is a prelude to invasion, nothing more and nothing less,' says New Seoul Representative Collin So-Yung, a noted Iconoclast. 'We must make it absolutely clear to the Hegemony that this is a threat we will not bow to, even in our present state of internal weakness. I suggest we pursue a fair peace with the Association, one where we can keep them as allies against this sort of encroachment instead of shattering our fleets during such a pivotal moment.'\

\ Others took a more nuanced approach, including VGA Governor Bjorn Arielsson. 'What we have here is our punishment for how badly we've treated the people of the Triangle. I don't really see why we should have let the tired old racism of some Qerr-Katish oligarchs stop us from offering aid to their tired and huddled masses, such as it is. And because we have had a full century of ignoring their plight, they were defenceless to resist the Hegemony. I say we fling the doors open, let (the Orsians) settle some rock here, and show the unaligned powers of the galaxy that the Hegemony's way isn't the only way.'\

\ @@ -687,7 +726,7 @@ /datum/lore/codex/page/article49 name = "05/15/63 - Solar Fleet Launches Offensive Against Almach" - data = "The first vessels of an SCG Fleet invasion force arrived in the Relan system this morning after a month-long intelligence operation to establish the Almach Association's most vulnerable positions, according to an announcement by Admiral McMullen just hours ago. Relan, which has long been fragmented between the neutral Republic of Taron and the once insurrectory Free Relan Federation - who now control the majority of the system and declared allegiance with Almach early in the crisis - is expected to fall to Confederate forces within 'a matter of weeks' due to its fractious political situation, and relative insignificance to Almach interests.\ + data = "The first vessels of an SCG Fleet invasion force arrived in the Relan system this morning after a month-long intelligence operation to establish the Almach Association's most vulnerable positions, according to an announcement by Admiral McMullen just hours ago. Relan, which has long been fragmented between the neutral Republic of Taron and the once insurrectory Free Relan Federation - who now control the majority of the system and declared allegiance with Almach early in the crisis - is expected to fall to Confederation forces within 'a matter of weeks' due to its fractious political situation, and relative insignificance to Almach interests.\

\ According to McMullen, the system's most populous habitat, the Carter Interstellar Spaceport is already under blockade and local resistance has thus far been minimal. The capture of Relan is expected to provide our forces with a major foothold in Almach territory and further advances are expected to be 'trivial', bypassing the Association's defensive positions in Angessa's Pearl.\

\ @@ -727,7 +766,7 @@ name = "06/28/63 - Vir Finalizes Dates for Election Voting" data = "The Vir Governmental Authority has confirmed that voting for Vir's governorship and Colonial Assembly seats will take place on the 29th and 30th of June, with an additional voting period set for Wednesday the 3rd of July to allow for out-of-system and full-time weekend employees to cast their votes. No exit poll information will be released until the final votes have been cast, and final results are expected to be announced within another week.\

\ - According to a Oculum poll, Lusia Hainirsdottir is expected to comfortably take a seat, though the certainty of her governor position is not hard set. Candidates Sao, Singh and Jorg are trailing not far behind, but will all have to make good showings this weekend if they hope for electoral success. In an unexpected surge among minority species, the Shadow Coalition's Tajaran candidate Kurah Zarshir is leading the polls in certain outlying and orbital communities.\ + According to a Oculum poll, Lusia Hainirsdottir is expected to comfortably take a seat, though the certainty of her governor position is not hard set. Candidates Sao, Singh and Jorg are trailing not far behind, but will all have to make good showings this weekend if they hope for electoral success. In an unexpected surge among minority species, the Shadow Coalition's tajaran candidate Kurah Zarshir is leading the polls in certain outlying and orbital communities.\

\ Not sure how to vote, if you can vote, or who to vote for? Check out the official election website at your-choice-vir.virgov.xo.vr" @@ -751,7 +790,7 @@ name = "07/04/63 - Exit Polls Suggest Shadow Coalition Win in Vir" data = "According to the first exit poll data released after Vir Gubernatorial voting closed at midnight, local favourite the Shadow Coalition is expected to win at least two representative seats, with incumbent representative Lusia Hainirsdottir taking a comfortable lead.\

\ - Final results are not expected to be tallied until Saturday morning, but other frontrunners include the Icarus Front's Vani Jee and Mehmet Sao - running on drastically different platforms - alongside the Shadow Coalition's Selma Jorg. In an unexpected turn, sole Tajaran Candidate Kurah Zarshir of the Shadow Coalition has seen an immense surge in popularity among minority and more xenophilic voters. Could Vir be seeing its first Tajaran Representative? Experts say: 'Perhaps.'" + Final results are not expected to be tallied until Saturday morning, but other frontrunners include the Icarus Front's Vani Jee and Mehmet Sao - running on drastically different platforms - alongside the Shadow Coalition's Selma Jorg. In an unexpected turn, sole tajaran Candidate Kurah Zarshir of the Shadow Coalition has seen an immense surge in popularity among minority and more xenophilic voters. Could Vir be seeing its first tajaran representative? Experts say: 'Perhaps.'" /datum/lore/codex/page/article58 name = "07/07/63 - Vir Election Results" @@ -809,7 +848,7 @@ name = "09/02/63 - Shock Almach Attack Routs Relan Front!" data = "Following close to a month of reduced Almach activity, enemy Militia forces have today launched a staggering attack on Sol frontline forces in the region of the Relan system, disabling several SCG warships and forcing a major tactical retreat to Saint Columbia. The scale of this attack by Almach forces is unprecedented, but seems to be the result of the Association consolidating manpower previously dedicated to anti-piracy patrols on the far side of their territory. It is believed these vessels have become freed up due to the apparent but as of yet unconfirmed annihilation of Xe'qua criminal flotillas by Skrellian Far Kingdom police action.\

\ - The Solar fleet had been in position to blockade the Relan system in the hopes of forcing the Free Relan Federation to surrender and withdraw from the Association, but was unprepared for what has been described as an 'all-out attack' on their positions, which left the vessels SCG-D Liu Bei, SCG-D Wodehouse, SCG-TV Ceylon Hartal and SCG-TV Apoxpalon disabled and unable to retreat with the bulk of our forces, as well as inflicting severe damage to several other craft. According to initial reports, the strikes on many of the afflicted ships closely resembled scenes from the controversial 'Aetothean shock attacks' on the SCG-TV Mariner's Cage this June, which saw the ruthless deployment of gene-altered Promethean 'super-soldiers' by the Almach Association.\ + The Solar fleet had been in position to blockade the Relan system in the hopes of forcing the Free Relan Federation to surrender and withdraw from the Association, but was unprepared for what has been described as an 'all-out attack' on their positions, which left the vessels SCG-D Liu Bei, SCG-D Wodehouse, SCG-TV Ceylon Hartal and SCG-TV Apoxpalon disabled and unable to retreat with the bulk of our forces, as well as inflicting severe damage to several other craft. According to initial reports, the strikes on many of the afflicted ships closely resembled scenes from the controversial 'Aetothean shock attacks' on the SCG-TV Mariner's Cage this June, which saw the ruthless deployment of gene-altered promethean 'super-soldiers' by the Almach Association.\

\ Fleet Admiral Ripon Latt, commanding officer of the assailed fleet, has confirmed that reinforcements are underway and the retreat 'shall not be a significant setback in the war effort', especially assuring citizens of the embattled Saint Columbia system and its neighbours that there is no cause for alarm and civilians have yet to be targeted.\

\ @@ -849,7 +888,7 @@ /datum/lore/codex/page/article68 name = "10/10/63 - Gavel Encircled - Liberation In Sight" - data = "Significant Fleet reinforcements from the Unathi border have 'trapped' the Almach fleet in the Gavel system and are poised for a decisive victory, according to latest reports from the front. Solar vessels from all sides of the war-torn system have closed in to ensure the invading force have no means of retreat. The relief force includes elements of the Hegemony-border fleets and the previously deployed flotilla stationed in Saint Columbia. Speaking at the Colonial Assembly this morning, Rewi Kerehoma of the Sol Economic Organization has stated that the reinforcements will 'beyond a doubt' prevent a repeat of 'embarrassing' errors made in the past month.\ + data = "Significant Fleet reinforcements from the unathi border have 'trapped' the Almach fleet in the Gavel system and are poised for a decisive victory, according to latest reports from the front. Solar vessels from all sides of the war-torn system have closed in to ensure the invading force have no means of retreat. The relief force includes elements of the Hegemony-border fleets and the previously deployed flotilla stationed in Saint Columbia. Speaking at the Colonial Assembly this morning, Rewi Kerehoma of the Sol Economic Organization has stated that the reinforcements will 'beyond a doubt' prevent a repeat of 'embarrassing' errors made in the past month.\

\ Efforts have been made to re-establish contact with the occupied system, which has been blocked from communication with the rest of the galaxy since the occupation began last week. According to scattered civilian signals from the system, the Association has adopted a 'salted earth' policy to the system following Solar military response, openly demolishing system infrastructure with little regard for its residents. A spokesperson for Grayson Manufactories, who maintain a significant presence in the Gavel system , has proposed that 'The Almachi had no intention of holding this system, this may have been nothing more than a show of force against corporate assets supporting the war effort.'\

\ @@ -859,7 +898,7 @@ name = "10/26/63 - 'Largest Engagement Since The Hegemony War' As Gavel Freed" data = "The Almach Association invasion force in the Gavel system has been all but annihilated by a successful Solar counter-encirclement, at great cost to both sides. The combined Rim Expeditionary Force in Saint Columbia, along with the newly formed Gavel Relief Fleet - which had been massing in the Vir system over the past week - launched the successful attack this Tuesday evening, leaving no route of escape for Almachi invaders and resulting in 'pitched fighting' between the fleets that lasted several days. Solar forces are currently in the process of performing security sweeps of the system and its scattered habitats and it is expected to be several weeks before the system is declared safe to civilian traffic and for refugees to return home.\

\ - Even as exact causalities remain unconfirmed, the battle has made history as the single largest ship-to-ship engagement by tonnage involving the Sol military since the cessation of hostilities with the Unathi in 2520, involving over one hundred vessels of all sizes across both sides, as well as countless unmanned drones and light craft. Almachi forces, in numbers described as 'far from an insignificant portion of the total fleet' fought fiercely, and 'in manners more reminiscent of mercenary gangs than a single organized force, and with tactics varying from the conventional to the outright mystifying'. Admiral Silvain Barka has commended his own crew for applying lessons learnt from prior 'Aetothean' commando strikes in preventing similar incidents from occurring in the confusion of battle; in a candid interview this morning he stated 'Like any Promethean, (Aetotheans) hate the cold, and my crew are the coldest (expletive) around.' \ + Even as exact causalities remain unconfirmed, the battle has made history as the single largest ship-to-ship engagement by tonnage involving the Sol military since the cessation of hostilities with the unathi in 2520, involving over one hundred vessels of all sizes across both sides, as well as countless unmanned drones and light craft. Almachi forces, in numbers described as 'far from an insignificant portion of the total fleet' fought fiercely, and 'in manners more reminiscent of mercenary gangs than a single organized force, and with tactics varying from the conventional to the outright mystifying'. Admiral Silvain Barka has commended his own crew for applying lessons learnt from prior 'Aetothean' commando strikes in preventing similar incidents from occurring in the confusion of battle; in a candid interview this morning he stated 'Like any promethean, \[Aetotheans\] hate the cold, and my crew are the coldest (expletive) around.' \

\ The designations of twenty-four Sol Defense Vessels declared 'lost in action' have not yet been released, though next of kin of missing or deceased servicepeople have reportedly been notified." @@ -875,11 +914,11 @@ /datum/lore/codex/page/article71 name = "11/21/63 - Tajaran Pearlshield Draws Line In The Sand" - data = "Khama Suketa enai-Lutiir, representative of the Tajaran Pearlshield Coalition, has just issued a formal statement:\ + data = "Khama Suketa enai-Lutiir, representative of the tajaran Pearlshield Coalition, has just issued a formal statement:\

\ 'It's no secret that we members of the Pearlshield Coalition have our differences and conflicts, both within and without. Much as some might call it the spice of life, it's with shame that I admit it has left us somewhat paralyzed over the last few months, even as a war has raged on a mere few jumps away from our borders. But in acknowledgment of our differences, something we have been able to unanimously agree upon is the sanctity of life and common decency, sanctity that Almach has continued to violate in the name of political conquest. Our relationship with SolGov - and indeed, any who would call us 'friend' - should be one of mutual cooperation and benefit, not of hard boundaries delineating 'us' and 'them'. There is only 'we', and we cannot stand idly by.\

\ - 'To this end, the Pearlshield has negotiated with local forces in the Silk system, and are taking over interim protection of the system, to free up Solar military forces so they can assist in the war effort. We have also begun construction of a large residential station to supplement the Silk station itself, alleviating its acknowledged overpopulation issues and providing additional logistical support for our defensive fleet. Finally, our cousins in Mesomori have generously loaned their new flagship, the PCMV Raniira's Grace, with all hands on deck for temporary joint assignment with Solar military forces. They are quite eager to provide a taste of Tajaran firepower and ingenuity.\ + 'To this end, the Pearlshield has negotiated with local forces in the Silk system, and are taking over interim protection of the system, to free up Solar military forces so they can assist in the war effort. We have also begun construction of a large residential station to supplement the Silk station itself, alleviating its acknowledged overpopulation issues and providing additional logistical support for our defensive fleet. Finally, our cousins in Mesomori have generously loaned their new flagship, the PCMV Raniira's Grace, with all hands on deck for temporary joint assignment with Solar military forces. They are quite eager to provide a taste of tajaran firepower and ingenuity.\

\ 'We wish we could spare more at this time, but alas, we're still finding our feet among the stars, stepping carefully among the proverbial minefield that is our own share of cosmic threats. Know that these contributions represent a grand investment in their own right, and they are only the beginning should this war carry on.\

\ @@ -887,7 +926,7 @@ /datum/lore/codex/page/article72 name = "11/23/63 - Surviving 'Kill-switcher' Assassinated During Vir Interview" - data = "An Almachi 'kill-switcher' clone soldier capturing during the liberation of the Gavel system was yesterday 'forced' to explosively self-terminate during a live TV broadcast with Virite news anchor David Huexqole aboard a SCG prisoner transport craft, allegedly by the statement of a code phrase, clearly audible on the recording. Following the attack, the apparent 'activator' is reported to have escaped to nearby NanoTrasen logistical station, the Southern Cross amidst the chaos where a minor altercation took place, resulting in the injury of one Positronic crew member and death of one Almachi accomplice, which initial reports suggest to have been a 'Vox mercenary'. The search continues for the Almachi agent, and local authorities remain confident that they will be apprehended.\ + data = "An Almachi 'kill-switcher' clone soldier capturing during the liberation of the Gavel system was yesterday 'forced' to explosively self-terminate during a live TV broadcast with Virite news anchor David Huexqole aboard a SCG prisoner transport craft, allegedly by the statement of a code phrase, clearly audible on the recording. Following the attack, the apparent 'activator' is reported to have escaped to nearby NanoTrasen logistical station, the Southern Cross amidst the chaos where a minor altercation took place, resulting in the injury of one positronic crew member and death of one Almachi accomplice, which initial reports suggest to have been a 'Vox mercenary'. The search continues for the Almachi agent, and local authorities remain confident that they will be apprehended.\

\ David Huexqole, a popular local media personality, was the only other immediate victim of the attack, suffering moderate injuries and was rushed to the Southern Cross for emergency surgery where he is reported to have made a full recovery. Huexqole has expressed his gratitude to the 'skilled and charming staff, clearly shaken by the war but nonetheless capable for it.' but has expressed concerns regarding so-called sleeper agents within Sol space, 'Isa (341, the interviewed clone), seemed genuinely reformed. She spoke openly of regret, and struggling with what it meant to be created only to die. Before she blew herself up, I never would have thought her capable - it was like she changed in an instant.'\

\ @@ -911,9 +950,9 @@ /datum/lore/codex/page/article75 name = "12/01/63 - Skrell Defer Aid Citing 'Deliberations'" - data = "Official Solar contacts within the Skrellian government have reportedly delayed tangible aid in the rapidly escalating Almach Crisis, citing 'Internal Deliberations', agreeing only to continue to share telemetric data on the movement of Association forces. The Skrell, who were instrumental in the Solar victory against the Unathi 40 years ago have long been considered taciturn in their internal affairs, but have previously been open in their support of Sol action when it comes to national defence, making their indecisive response greatly unexpected to some.\ + data = "Official Solar contacts within the Skrellian government have reportedly delayed tangible aid in the rapidly escalating Almach Crisis, citing 'Internal Deliberations', agreeing only to continue to share telemetric data on the movement of Association forces. The skrell, who were instrumental in the Solar victory against the unathi 40 years ago have long been considered taciturn in their internal affairs, but have previously been open in their support of Sol action when it comes to national defence, making their indecisive response greatly unexpected to some.\

\ - Speaker ISA-5, who has been increasingly critical of the war in the past several days, has dismissed concerns that the Skrell are 'siding with the Association', citing the long term close relationship between their governments, 'The Skrell are not war hawks, and they've never shown outward ill-will against other sapients. We can't let a bureaucratic delay allow public opinion to turn against an entire species of people who have always had our backs. If our allies need time for deliberations, we should allow them and not expect mere muscle and military aid when words could have been our solution from the beginning. I've no doubt that they will not allow the situation to become so dire that the Association are able to cause us any serious harm as they have threatened. I'm convinced that diplomacy will prevail, and that if the Skrell are in fact negotiating with the Association, then it is with all of our best interests in mind.'" + Speaker ISA-5, who has been increasingly critical of the war in the past several days, has dismissed concerns that the Skrell are 'siding with the Association', citing the long term close relationship between their governments, 'The skrell are not war hawks, and they've never shown outward ill-will against other sapients. We can't let a bureaucratic delay allow public opinion to turn against an entire species of people who have always had our backs. If our allies need time for deliberations, we should allow them and not expect mere muscle and military aid when words could have been our solution from the beginning. I've no doubt that they will not allow the situation to become so dire that the Association are able to cause us any serious harm as they have threatened. I'm convinced that diplomacy will prevail, and that if the Skrell are in fact negotiating with the Association, then it is with all of our best interests in mind.'" /datum/lore/codex/page/article76 name = "12/20/63 - Jee Relaunches Libraries Across Vir" @@ -947,7 +986,7 @@

\ This afternoon, Speaker Mackenzie West of the Icarus Front addressed Sol, and indicated that communication was underway 'across faction lines' with the Association to determine the cause and implications of Shelf's apparent loss. The Almach Assocation has claimed not to be responsible for the 'possible attack' and both sides has expressed concern for the 'astronomical loss of life this may represent.'\

\ - Shelf, a largely Positronic colony fleet, consists of over 1700 vessels including the 'One Leaky Bitch', current headquarters of Morpheus Shelf, Morpheus' non-Solar 'spin-out' corporation established last June. The fleet has continuously denied direct affiliation with the Almach Assocation, but was involved in a major drone attack on Solar vessels just nine months ago, which was claimed to be 'in error'." + Shelf, a largely positronic colony fleet, consists of over 1700 vessels including the 'One Leaky Bitch', current headquarters of Morpheus Shelf, Morpheus' non-Solar 'spin-out' corporation established last June. The fleet has continuously denied direct affiliation with the Almach Assocation, but was involved in a major drone attack on Solar vessels just nine months ago, which was claimed to be 'in error'." /datum/lore/codex/page/article80 name = "02/12/64 - Spectralist Wardens to hold Vigils for Lost Fleet" @@ -975,9 +1014,9 @@ /datum/lore/codex/page/article83 name = "04/13/64 - Skrell Ultimatum Shocks Sol!" - data = "After three months of diplomatic iciness, the Skrellian Far Kingdoms have contacted both the SCG and Almach Association with one demand: Sign an armistice or prepare for war. Supported by an immense fleet movement through the recently quashed Xe'qua region, the Far Kingdoms have demanded an immediate end to hostilities, and 'incorporation of Almachi holdings as a Skrellian protectorate, under strict oversight and regulation of their research and activities.' By Skrell demands, the Fleet has two weeks to fully withdraw from the Almach region and any vessels on either side continuing to engage will be 'disabled, boarded, and have its crew arrested pending a formal peace agreement.'\ + data = "After three months of diplomatic iciness, the Skrellian Far Kingdoms have contacted both the SCG and Almach Association with one demand: Sign an armistice or prepare for war. Supported by an immense fleet movement through the recently quashed Xe'qua region, the Far Kingdoms have demanded an immediate end to hostilities, and 'incorporation of Almachi holdings as a Skrellian protectorate, under strict oversight and regulation of their research and activities.' By skrell demands, the Fleet has two weeks to fully withdraw from the Almach region and any vessels on either side continuing to engage will be 'disabled, boarded, and have its crew arrested pending a formal peace agreement.'\

\ - A wave of outrage has swept the Colonial Assembly, with heated debate as to Sol's response defying all party lines. While Speaker ISA-5 has been widely criticized by political opponents for their 'overzealous trust in the Skrell', they have remained acquiescent to the Skrell's demands, stating that it may be the best way to avoid any further bloodshed and maintain good relationships with the Skrell. Conversely, a small group of hardliners from across the major parties headed by SEO Representative Colin Zula of Alpha Centauri, have formed a political coalition opposing any form of 'Surrender or appeasement in the face of foreign aggression', demanding Sol keep its forces in place and 'Finish off the Association before they can be allowed to wreak havoc unsupervised and uncontrolled.'\ + A wave of outrage has swept the Colonial Assembly, with heated debate as to Sol's response defying all party lines. While Speaker ISA-5 has been widely criticized by political opponents for their 'overzealous trust in the Skrell', they have remained acquiescent to Skrellian demands, stating that it may be the best way to avoid any further bloodshed and maintain good relationships with the Skrell. Conversely, a small group of hardliners from across the major parties headed by SEO Representative Colin Zula of Alpha Centauri, have formed a political coalition opposing any form of 'Surrender or appeasement in the face of foreign aggression', demanding Sol keep its forces in place and 'Finish off the Association before they can be allowed to wreak havoc unsupervised and uncontrolled.'\

\ Surprising some, long-time supporter of the Almach War, MacKenzie West has established themselves as a figure of moderation in the Assembly, promising that the Icarus Front would pursue 'aggressive negotiations' with the Far Kingdoms in order to better understand their motivations and, if territory is to be ceded, 'ensure the Almachi are placed under a firm hand'. He notes that the Skrell have never adhered to Five Points policy, but that careful diplomacy has always ensured their 'less savoury tendencies' have never spilled over to Sol space." @@ -989,21 +1028,21 @@

\ In the Shadow Coalition, a formal motion has been put forth by a small minority of representatives calling for the resignation of Speaker ISA-5, citing 'Total blindness to the political situation,' in the leadup to this week's events.\

\ - Meanwhile as Skrell vessels enter the Whythe system, the Solar Fleet has ceased bombardment of the Whythe Superweapon, handing off 'suppression' of the weapon to Skrell forces." + Meanwhile as Far Kingdoms vessels enter the Whythe system, the Solar Fleet has ceased bombardment of the Whythe Superweapon, handing off 'suppression' of the weapon to skrell forces." /datum/lore/codex/page/article85 name = "04/20/64 - Sol To Submit - Almach Subsumed Under Treaty of Whythe" - data = "Following 'intense' deliberations between the Far Kingdoms and representatives from the SCG, a decision has been reached to cede the secessionist Almach Association territory to the Skrell, and withdraw all forces from the region. The newly established Almach Protectorate will be subject to 'extremely stringent' oversight by Skrellian authorities, and international exchange of 'research and technologies' from the region will be banned 'in both directions', pending more a more exacting deal with the SCG. Sol is to be allowed 'regular inspections' of the territory on a schedule established by the Kingdoms.\ + data = "Following 'intense' deliberations between the Far Kingdoms and representatives from the SCG, a decision has been reached to cede the secessionist Almach Association territory to the Skrellian Kingdoms, and withdraw all forces from the region. The newly established Almach Protectorate will be subject to 'extremely stringent' oversight by Skrellian authorities, and international exchange of 'research and technologies' from the region will be banned 'in both directions', pending more a more exacting deal with the SCG. Sol is to be allowed 'regular inspections' of the territory on a schedule established by the Kingdoms.\

\ - The Solar envoy included the chairs of each of the major parties, senior ambassadors to major Skrell systems, and representatives from the Solar Fleet. The newly founded SSF were extended an invitation, but reportedly turned it down. A dejected looking MacKenzie West announced the terms of the treaty late this afternoon, stating that they had 'fought tooth and nail' for a fair deal for all parties involved, including civilians of all species now living under Skrellian occupation, and that 'those not directly involved in the corruption of humanity's sanctity should not be made to suffer for the actions of their superiors.'\ + The Solar envoy included the chairs of each of the major parties, senior ambassadors to major skrell systems, and representatives from the Solar Fleet. The newly founded SSF were extended an invitation, but reportedly turned it down. A dejected looking MacKenzie West announced the terms of the treaty late this afternoon, stating that they had 'fought tooth and nail' for a fair deal for all parties involved, including civilians of all species now living under Skrellian occupation, and that 'those not directly involved in the corruption of humanity's sanctity should not be made to suffer for the actions of their superiors.'\

\ - Notably absent from deliberations were many key members of the Association's upper echelons, with 'lesser' diplomats taking the place of both Angessa Martei and Vounna's Naomi Harper. Almachi and Skrell sources were reluctant to explain these absenses, and it remains unclear as to whether they have been taken into Skrellian custody or remain at large.\ + Notably absent from deliberations were many key members of the Association's upper echelons, with 'lesser' diplomats taking the place of both Angessa Martei and Vounna's Naomi Harper. Almachi and skrell sources were reluctant to explain these absenses, and it remains unclear as to whether they have been taken into Skrellian custody or remain at large.\

\ - Selma Jorg, Representative for Vir, has decried the treaty as a 'Sapientarian disaster in the making'. The former career diplomat has cited the 'general mistreatment of species deemed 'lesser'' as a recurring concern with the Skrell, and the complete occupation of majority human and positronic space, which unprecedented, could lead to 'conditions not much better than slavery' for those still living in the area. She has refrained from any direct accusations, pending the results of Sol's first permitted inspection." + Selma Jorg, Representative for Vir, has decried the treaty as a 'Sapientarian disaster in the making'. The former career diplomat has cited the \"general mistreatment of species deemed 'lesser'\" as a recurring concern with the Skrell, and the complete occupation of majority human and positronic space, which unprecedented, could lead to 'conditions not much better than slavery' for those still living in the area. She has refrained from any direct accusations, pending the results of Sol's first permitted inspection." /datum/lore/codex/page/article85 name = "04/22/64 - Skrell Impose New Regime in Relan" - data = "As agreed upon in the Treaty of Whythe, the Far Kingdoms have occupied the Relan system, putting an end to the Free Relan Federation. How the system will be organized is not entirely clear at this point. Despite the effective abolition of the Relanian government, Skrell presence in the system appears relatively light, and many of the scattered stations have no Skrell presence at all.\ + data = "As agreed upon in the Treaty of Whythe, the Far Kingdoms have occupied the Relan system, putting an end to the Free Relan Federation. How the system will be organized is not entirely clear at this point. Despite the effective abolition of the Relanian government, skrell presence in the system appears relatively light, and many of the scattered stations have no skrell presence at all.\

\ Former President Nia Fischer gave the following statement to a crowd gathered outside the Capitol Section of Carter: 'This is a dark time for all of us. I promise to you that, in my continued service to you, I will work with the Far Kingdoms to ensure that all of our people are treated well and our rights respected, and that we will arrive at a form of government that is acceptable to you.' The gathered crowd began to shout questions and accusations, and Fischer was quickly escorted back into the capitol by Skrellian guards without answering questions from the press or others. The crowd was quickly dispersed by Skrellian military police and Carter's own police force.\

\ @@ -1013,17 +1052,17 @@ /datum/lore/codex/page/article86 name = "04/27/64 - Chaos in Relan" - data = "Simmering tensions in the Relan system have boiled over, with riots erupting on Carter, Abhayaranya, and New Busan. Since former President Fischer's brief address, small demonstrations against both the Skrell occupation and the collaborating elements of the former Federation government have taken place on many stations, but within the last day full-blown riots have broken out. While accurate information on the situation within the stations is rare, it is currently believed that the deaths of two protesters on Abhayaranya were the catalyst.\ + data = "Simmering tensions in the Relan system have boiled over, with riots erupting on Carter, Abhayaranya, and New Busan. Since former President Fischer's brief address, small demonstrations against both the Skrellian occupation and the collaborating elements of the former Federation government have taken place on many stations, but within the last day full-blown riots have broken out. While accurate information on the situation within the stations is rare, it is currently believed that the deaths of two protesters on Abhayaranya were the catalyst.\

\ Damage to the three stations has been relatively light, with one major exception. A large fire broke out in the Capitol Section of Carter, killing at least 22, including former President Fischer, and wounding at least 74 more. Other casualties among rioters, police, and the populations of the stations are unknown at this point.\

\ - Other stations with significant permanent populations have been paralyzed by local inaction and the disloyalty of local police and security forces to the Far Kingdoms Skrell, and several with no Skrell presence have issued statements that they will not be accepting any military presence from the Far Kingdoms. It is unclear at this point if this represents the beginning of another major conflict within the system." + Other stations with significant permanent populations have been paralyzed by local inaction and the disloyalty of local police and security forces to the Far Kingdoms skrell, and several with no Skrellian presence have issued statements that they will not be accepting any military presence from the Far Kingdoms. It is unclear at this point if this represents the beginning of another major conflict within the system." /datum/lore/codex/page/article87 name = "04/30/64 - Meralar Correspondent: Triumphant Return!" - data = "Celebrations have erupted throughout Tajaran space with the return of the PCMV Raniira's Grace, which has spent the last several months providing joint assistance with Solar military forces during the now-ceased hostilities with the Almach Association.\ + data = "Celebrations have erupted throughout tajaran space with the return of the PCMV Raniira's Grace, which has spent the last several months providing joint assistance with Solar military forces during the now-ceased hostilities with the Almach Association.\

\ - Khama Suketa enai-Lutiir, representative of the Tajaran Pearlshield Coalition, has provided the following statement:\ + Khama Suketa enai-Lutiir, representative of the tajaran Pearlshield Coalition, has provided the following statement:\

\ 'It is great honour that we welcome the crew of the Raniira's Grace back to their homes at Mesomori. We have all seen the battle reports, and loathe as we are to celebrate bloodshed, sometimes it is a necessary evil in the pursuit of a greater peace, and the Grace pursued that peace with fervour and tenacity as befitting our kind, and exemplified what we can do when put to the test. She is but one ship, and yet one ship can make all the difference. Lives have been saved, and the crew has returned alive and well. This is merely the beginning of what we can accomplish in the cosmos.'\

\ @@ -1033,11 +1072,11 @@ /datum/lore/codex/page/article88 name = "05/13/64 - Agreement Signed at Ithaca Station, New Government In Place" - data = "In an effort to end the ongoing violence in the Relan system and regain the cooperation of 'insubordinate' stations, the Far Kingdoms Skrell have negotiated an agreement with community leaders and former Assemblypersons from a number of stations, including insubordinates, meeting at the largest of the insubordinates, Ithaca. Under these agreements, the Skrell will vacate most stations in the system, but will maintain a fleet base in Relan's Outer Belt for mutual defence, first at Carter and later at a dedicated station. Relan will have harsh restrictions placed on its military and will agree to formal diplomatic neutrality, but will be free to organize its own government under supervision and military occupation will end.\ + data = "In an effort to end the ongoing violence in the Relan system and regain the cooperation of 'insubordinate' stations, the Far Kingdoms skrell have negotiated an agreement with community leaders and former Assemblypersons from a number of stations, including insubordinates, meeting at the largest of the insubordinates, Ithaca. Under these agreements, the Skrell will vacate most stations in the system, but will maintain a fleet base in Relan's Outer Belt for mutual defence, first at Carter and later at a dedicated station. Relan will have harsh restrictions placed on its military and will agree to formal diplomatic neutrality, but will be free to organize its own government under supervision and military occupation will end.\

\ The mood on Ithaca has been tense as negotiations have gone on, but with the announcement of the results, crowds have packed the main thoroughfares and public spaces of the station in celebration. Francis Harp Yong, governor of Ithaca and a leading figure in the talks, addressed a crowd outside the Administration Section of Ithaca today. \

\ - 'The agreement we have signed with the Skrell today has given our people a new chance, free from the mistakes of the war and the baggage of the former Association. The war was not brought on us by our choice, nor the occupation we have recently faced. We want peace, and that is obvious even to those who were fighting against us weeks or days ago.\ + 'The agreement we have signed with the Skrellian Kingdoms today has given our people a new chance, free from the mistakes of the war and the baggage of the former Association. The war was not brought on us by our choice, nor the occupation we have recently faced. We want peace, and that is obvious even to those who were fighting against us weeks or days ago.\

\ Make no mistake, that is what our agreement today symbolizes. A new era of peace for us, where we no longer have to worry about the threat of piracy or invasion. We can return to our homes, rebuild our stations, and forge a new future for ourselves and our children'\

\ @@ -1049,7 +1088,7 @@

\ The composition of the official Solar Inspection Group has been a matter of much deliberation over the past several months, and owing to the ground to be covered now includes over 3,500 experts from a wide variety of fields. The bulk of the Group is comprised of Transgressive Technologies Commission agents, including the EIO, but also includes military officials, independent observers, and corporate representatives. The inclusion of the latter group spurred heated debate in the Colonial Assembly, but ultimately 'thought-leaders' from Ward-Takahashi, NanoTrasen, and Hephaestus Industries were admitted, while other interests will have to be satisfied to be represented by Sol Economic Organization liaisons.\

\ - The APG, currently based out of what is to be a neutral embassy on Carter in Relan pending the completion of the new government centre of Vigilance Station in Whythe, is not legally required to fully comply with Five Points regulation, though the Whythe terms ensure that any transgressive research is undertaken under the strictest guidelines. The Skrell have amiably agreed to ensure that any innovation by the protectorate is safe, controlled, and does not enter Solar territory. These terms are similar to those applied to such technologies developed by and for the Skrell themselves, whose expertise is considered unrivalled in the field, but has been widely criticised by certain human bioconservative groups.\ + The APG, currently based out of what is to be a neutral embassy on Carter in Relan pending the completion of the new government centre of Vigilance Station in Whythe, is not legally required to fully comply with Five Points regulation, though the Whythe terms ensure that any transgressive research is undertaken under the strictest guidelines. The Kingdoms have amiably agreed to ensure that any innovation by the protectorate is safe, controlled, and does not enter Solar territory. These terms are similar to those applied to such technologies developed by and for the skrell themselves, whose expertise is considered unrivalled in the field, but has been widely criticised by certain human bioconservative groups.\

\ The inspection is expected to take several weeks, and will begin tomorrow." @@ -1065,7 +1104,7 @@ name = "09/21/64 - Almach Passes Inspection - Concerns Raised" data = "The Solar Inspection Group has granted the Almach Protectorate a passing grade in the first official inspection of the territory under Skrellian rule, though ethical concerns have been raised by a number of independent observers involved in the process.\

\ - During the course of the month-long inspection, Skrell facilitators were cooperative in ensuring the SIG were given 'unlimited' access to all research and development facilities requested by Sol, as well as informing the group of numerous previously unidentified locations that had been flagged by the Almach Protectorate Government since assuming control of the region in April. Critics of protectorate have suggested that the 'official list' may not be as comprehensive as stated, but the SIG has stated that they are 'confident that no deception has been undertaken by the APG. We have observed no evidence of research being concealed from our teams, and to the best of our knowledge the only locations left undisturbed are those few still occupied by Association holdouts, beyond the control of either inspecting government.'\ + During the course of the month-long inspection, skrell facilitators were cooperative in ensuring the SIG were given 'unlimited' access to all research and development facilities requested by Sol, as well as informing the group of numerous previously unidentified locations that had been flagged by the Almach Protectorate Government since assuming control of the region in April. Critics of protectorate have suggested that the 'official list' may not be as comprehensive as stated, but the SIG has stated that they are 'confident that no deception has been undertaken by the APG. We have observed no evidence of research being concealed from our teams, and to the best of our knowledge the only locations left undisturbed are those few still occupied by Association holdouts, beyond the control of either inspecting government.'\

\ Also as a result of the inspection, concerns have been raised regarding the treatment of ex-Association citizens, particularly the often genetically modified residents of Angessa's Pearl. While Angessa Martei's location is still unknown, her legacy - a society described by some as a cult of personality with emphasis on the cult - poses a significant threat to Skrellian control of the Exalt's Light system, and the clash of 'strong ideologies' has allegedly resulted in mistreatment of detainees that, according to the official report 'would not be permitted in Solar jurisdictions'.\

\ @@ -1091,7 +1130,7 @@

\ The XIV Sri Chamarajendra with crew of 32, and IIV Reimarus with 9 are both reported to have lost contact with the system's spaceport while undertaking far-orbit salvage operations on decommissioned and abandoned facilities, including the ILS Harvest Moon which detonated with all hands earlier this year. The disappearances have spurred the system government to request greater anti-piracy support from the SCG, which has been much reduced since the Almach War and increased tensions on the Hegemony border.\

\ - While Proximal to the independent and often 'lawless' Eutopia system, as well as the Rarkajar Rift, infamous prowl of the human-Tajaran Jaguar Gang, the Isavau's System has rarely been a direct target for such large-scale apparent hijackings, and no group has yet claimed credit or demanded ransom." + While Proximal to the independent and often 'lawless' Eutopia system, as well as the Rarkajar Rift, infamous prowl of the human-tajaran Jaguar Gang, the Isavau's System has rarely been a direct target for such large-scale apparent hijackings, and no group has yet claimed credit or demanded ransom." /datum/lore/codex/page/article95 name = "12/27/64 - NanoTrasen Accused In Satisfaction Poll Fixing" @@ -1161,7 +1200,7 @@

\ At the NMB Gullstrand medical science center in Kalmar, a close race between top doctors was upset by the election of a station security commander, Wish Elara-Voight who promises 'improvements to the safety and security of NanoTrasen facilities with a focus on enforcing current SoP and CorpReg policies and placing new procedure in the handbooks.'\

\ - The waypoint station NLS Southern Cross selected a cybernetic Unathi candidate, researcher Dr. Haven Rasikl to represent them on the basis of encouraging interdepartmental cooperation and communication.\ + The waypoint station NLS Southern Cross selected a cybernetic unathi candidate, researcher Dr. Haven Rasikl to represent them on the basis of encouraging interdepartmental cooperation and communication.\

\ Finally, the Ekmanshalvo Fabrication Plant has selected fabrication programmer Terazon Norddahl, who promises to push for overhauls and modernization of the company's internal transport and support systems, including shuttle scheduling." @@ -1197,7 +1236,7 @@ name = "07/09/65 - 'Bluespace Bugs' Linked To Almach Tech" data = "Initial public reports on the extraplanar species commonly known as 'Bluespace Bugs' has proposed that the first recognizable signs of their activity within observable space, coincide precisely with the development - and particularly the test-firing - of the Whythe Superweapon, and that there may be a direct link between the two. The report, released by the Galactic Survey Administration this afternoon hypothesizes that the newly developed bluespace manipulation techniques used in Whythe may have acted as a signal to the deep-space dwelling creatures in a manner similar to moths attracted to artificial light. The GSA is currently collaborating with the Almach Protectorate Government to investigate the potential link further.\

\ - Additionally, findings from analysis of both inorganic and biological samples collected from the three recovered Extraplanar Discovery ships believed to belong to the 'Bugs' has excited much of the scientific community, with news that the insect-like aliens and their apparent dietary waste-product Magmellite may be composed in a manner completely unlike any life previously encountered in the known galaxy. The findings may rewrite our understanding of biology and material science, though a full specimen is desired to confirm these early findings.\ + Additionally, findings from analysis of both inorganic and biological samples collected from the three recovered Extraplanar Discovery ships believed to belong to the 'Bugs' has excited much of the scientific community, with news that the insect-like aliens and their apparent dietary waste-product magmellite may be composed in a manner completely unlike any life previously encountered in the known galaxy. The findings may rewrite our understanding of biology and material science, though a full specimen is desired to confirm these early findings.\

\ The creatures have been given a tentative scientific name X Extraneus Tarlevi, after Captain Volmer Tarlev of the SCG-E Ketumati whose recorded descriptions were instrumental in establishing a basic understanding of the species' behavior. Researchers currently believe that the Bluespace Bugs are merely a form of bulk-feeding omnivore attracted to the EDD vessels in deep space by their bluespace drives, and that the loss of the ships was merely unfortunate happenstance rather than deliberate, malicious attack. Studies are already underway to determine methods that might prevent further incidents of this types before any further extraplanar missions are approved." @@ -1233,21 +1272,21 @@ /datum/lore/codex/page/article110 name = "10/26/65 - 'Bluespace Bug' Confirmed Activity Near Tajaran Space" - data = "The following address is from Khama Suketa enai-Lutiir, representative of the Tajaran Pearlshield Coalition:\ + data = "The following address is from Khama Suketa enai-Lutiir, representative of the tajaran Pearlshield Coalition:\

\ 'Good day, everyone. We would like to put the rumor mills to rest lest they get out of hand. Eleven Solar days ago, the Silk system's perimeter defenses picked up what appeared to be a derelict Vox raiding ship that had drifted into range. Security forces boarded the craft and found clear signs of fighting within the crew compartments, but no traces of the crew themselves. The craft's bluespace drives were notably ripped out of the hull, and it's believed the craft had been drifting for up to nearly two Solar weeks prior, as it has been identified as the 'Skiskatachtlakta', belonging to a well-known Vox raiding group our cousins in the Arrathiir system have been contending with for a few years now, and that was their last confirmed contact with it.\

\ - 'Most importantly however, and the key reason for this address, is a significant portion of the ship's hull, particularly concentrated around the site of its bluespace drives, has been confirmed to've been converted to the material known as 'Magmellite', related to the so-called 'bluespace bugs' or X Extraneus Tarlevi that have been of note outside our borders. To acknowledge and assuage any natural alarm on our own part, there is no indication any part of the incident took place on our side of the Rift, and we are deploying additional reconnaissance and recovery ships, drones and general personnel throughout controlled space to keep a watchful eye, and we are negotiating with Solar forces in Silk to expand our presence as appropriate. We are currently analyzing the Magmellite samples recovered from the Skiskatachtlakta and will be sharing any findings with our fellows in the scientific sphere, as well as returning the ship's plundered riches if and when possible.\ + 'Most importantly however, and the key reason for this address, is a significant portion of the ship's hull, particularly concentrated around the site of its bluespace drives, has been confirmed to've been converted to the material known as 'Magmellite', related to the so-called 'bluespace bugs' or X Extraneus Tarlevi that have been of note outside our borders. To acknowledge and assuage any natural alarm on our own part, there is no indication any part of the incident took place on our side of the Rift, and we are deploying additional reconnaissance and recovery ships, drones and general personnel throughout controlled space to keep a watchful eye, and we are negotiating with Solar forces in Silk to expand our presence as appropriate. We are currently analyzing the magmellite samples recovered from the Skiskatachtlakta and will be sharing any findings with our fellows in the scientific sphere, as well as returning the ship's plundered riches if and when possible.\

\ 'There is currently no cause for concern beyond the understandable. If and when there is, we will rise to the occasion as always. Together, we will discover the truth of these strange times we find ourselves in. Until then, be safe, and be well. May our stars shine upon us all.'" /datum/lore/codex/page/article111 name = "01/14/66 - Unathi Border On Alert After Manoeuvre Scare" - data = "The Solar garrison at Abel's Rest remains on high alert following a critical near-miss scenario resulting from an unannounced Unathi fleet arrival at the disputed system's perimeter alert zone, which has since been determined to be not a deliberate act of war. According to the Moghes Hegemony the fleet is 'part of a re-evaluation of key troop deployments, that will be of mutual benefit to peace in the region'.\ + data = "The Solar garrison at Abel's Rest remains on high alert following a critical near-miss scenario resulting from an unannounced Hegemony fleet arrival at the disputed system's perimeter alert zone, which has since been determined to be not a deliberate act of war. According to the Moghes Hegemony the fleet is 'part of a re-evaluation of key troop deployments, that will be of mutual benefit to peace in the region'.\

\ The arriving fleet, comprised of mostly troop transport vessels, remained in distant orbit of the star for seven hours before diplomatic contact could be established, during which time the SCG garrison remained at battle-ready stance. This marks the closest proximity to open conflict in Abel's Rest since the end of the Unathi War over 45 years ago. SolGov peacekeepers have confirmed decreased planetside garrison activity over the past several months, and key Hegemony warships have departed in recent weeks.\

\ - It remains impossible to determine the Unathi's true intentions as such a withdrawal could preface devastating planetary bombardment, or invasion elsewhere, and some members of the Icarus Front have called for immediate redeployment to the front in response. The SCG Fleet has assured the public that relations with the Hegemony have 'never been better' and that long-range sensors indicate a withdrawal from the entire border region on a far wider scale." + It remains impossible to determine the unathi's true intentions as such a withdrawal could preface devastating planetary bombardment, or invasion elsewhere, and some members of the Icarus Front have called for immediate redeployment to the front in response. The SCG Fleet has assured the public that relations with the Hegemony have 'never been better' and that long-range sensors indicate a withdrawal from the entire border region on a far wider scale." /datum/lore/codex/page/article112 name = "02/13/66 - Isavau's Gamble Fleet Report 'All Silent'" @@ -1269,9 +1308,9 @@

\ 'They've never been so unpredictable before,' agreed senior naval officer Akira Doi. 'I understand that there is currently no official theory on why this is happening, but I believe it all goes back to the Skathari Incursion.'\

\ - Many leading scientists are skeptical that the Incursion, despite having thrown much of the galactic community into chaos over an eight-year period of conflict with the insectoid Skathari, could have seriously disrupted the Vox in the same way, given the relatively low indications of Skathari presence in known Vox operating territories, but Admiral Doi strongly disagrees.\ + Many leading scientists are skeptical that the Incursion, despite having thrown much of the galactic community into chaos over an eight-year period of conflict with the insectoid skathari, could have seriously disrupted the Vox in the same way, given the relatively low indications of skathari presence in known Vox operating territories, but Admiral Doi strongly disagrees.\

\ - 'The Skathari are aggressive to an unprecedented degree,' he explained, 'and they had the ability and numbers to annihilate entire communities. I see no reason why that shouldn't have applied to the Vox.'\ + 'The skathari are aggressive to an unprecedented degree,' he explained, 'and they had the ability and numbers to annihilate entire communities. I see no reason why that shouldn't have applied to the Vox.'\

\ While some colonies and stations welcome this reprieve from raids and piracy, others are finding themselves under renewed pressure, with resources and labour withdrawn on the advice of apparently unreliable modelling. A representative of the Pearlshield Coalition territory of Arrathiir had this to say regarding the sluggish reallocation of resources after the latest wave of raids:\

\ @@ -1283,7 +1322,7 @@

\ According to witnesses, protesters crowded the major walkways, preventing shoppers from passing and leaving some stranded in shops to avoid the crowd. Many shops barred and locked the storefronts in response, an unnamed employee of one store commenting, 'That many people <...> you never know if it's going to get out of control.'\

\ - The protesters chanted with signs regarding NanoTrasen's exclusive rights in studying the Sif Anomalous Region, demanding that studies into the anomalous properties be public knowledge. The march appears to be headed by the Skathari conspiracy group 'Emerald Skies', known in recent months for many other smaller protests regarding the government response to the Incursion, and beliefs that Skathari are more intelligent than the public has been informed.\ + The protesters chanted with signs regarding NanoTrasen's exclusive rights in studying the Sif Anomalous Region, demanding that studies into the anomalous properties be public knowledge. The march appears to be headed by the skathari conspiracy group 'Emerald Skies', known in recent months for many other smaller protests regarding the government response to the Incursion, and beliefs that skathari are more intelligent than the public has been informed.\

\ The disruption was eventually cleared out by mall security forces before the crowd could grow out of control. It is reported that Vinterlykke will reopen on Monday with additional security measures in place." @@ -1299,7 +1338,7 @@ name = "01/14/75 - Solar Fleet In Worst State Since Unathi War" data = "An independent analysis of the Solar Confederate Government Fleet has concluded that the battle preparedness of the military's commissioned warship roster is at a low not experienced since the height of the SolGov-Hegemony War sixty years ago, and has called for urgent action from the Colonial Assembly to remedy the situation.\

\ - The report, funded by the Citizen's Institute for Defense Research looked at a range of criteria, including fleet composition, number of active-duty vessels, maintenance records, crew performance assessments, and adoption of latest technologies, all of which were rated 'D or poorer'. Armando Kozak, co-founder of CIDR and former chairperson of Hephaestus Industries, has urged Assembly legislators to approve immediate funding for the expansion of the Fleet in order to combat ongoing threats from Skathari and growing criminal elements in deep interstellar space.\ + The report, funded by the Citizen's Institute for Defense Research looked at a range of criteria, including fleet composition, number of active-duty vessels, maintenance records, crew performance assessments, and adoption of latest technologies, all of which were rated 'D or poorer'. Armando Kozak, co-founder of CIDR and former chairperson of Hephaestus Industries, has urged Assembly legislators to approve immediate funding for the expansion of the Fleet in order to combat ongoing threats from skathari and growing criminal elements in deep interstellar space.\

\ The shocking condition of the SCG Fleet has been attributed to a decade of conflict, with the devastating Skathari Incursion following immediately from the costly Almach War, and a spate of defections and territorial concessions. Critics have noted that the report 'brushes over' local Defense Force vessel contributions that were re-assigned to regional militaries and is 'deliberately vague' as to how such ships were accounted for. In 2571, CIDR issued a similar damning report to the Five Arrows, spurring a multi-trillion thaler economy-transforming shipbuilding campaign within the newly independent nation." @@ -1310,3 +1349,140 @@ Elaborating on the program, Valeria Lawless explained that 'Our new union structure improves upon positive results we observed in South America, Earth during the NERC scheme, where we found that smaller test groups reported more positive results. By reducing the scope of each union representative's supervision to a single facility, we hope we can better understand the individual needs of individual employees, and clear the muddied waters that arise when representatives with totally different needs are unable to come to an agreement. Under this new program, employees will be granted greater freedom to determine policy and regulation on a per-location basis without the need to consult with other representatives. After all, expecting the needs of employees from say, a mineral processing plant to align with those from a state-of-the-art medical facility, is simply unrealistic and often simply sets unproductive expectations for all involved.'\

\ The new Site Union Representative role will be elected for each proposed location by local employees on a quarterly basis, and will advocate for policy amendment and dispute resolution on a per-location basis. Campaigning for union positions is expected to begin on the 29th of January, with elections taking place over the company network after a two week period." + +/datum/lore/codex/page/article118 + name = "02/19/75 - Cynosure Bulletin: Winner of Site Union Representative Announced" + data = "We are pleased to announce that after a three week introductory campaigning period, the first winner of Cynosure Station's Site Union Representative position has been determined. \ +

\ + Cynosure Station will be represented by: Chef Parker Stephenson.\ +

\ + Requests, suggestions and concerns regarding the operation of your site should be directed to this representative and will be strongly considered for implementation if crew support is apparent.\ +

\ + We thank you for the large voter turnout, with the vast majority of eligible (non-managerial) staff having cast their votes to make this historic decision, we hope that the representative role serves our valued staff, contractors and authorised visitors well." + +/datum/lore/codex/page/article119 + name = "03/10/75 - Spectacular Fireworks Expected As SifGuard Scuttles Vox Derelict" + data = "Public relations officials working with SifGuard have released a post-operation report and an advisory that spectacular light shows can be expected across the sky above Kalmar, Londuneyja, Amundsen, and portions of Skargard and Kaltsandur, over the next twenty-four hours. This follows the successful scuttling and disintegration of a derelict vox vessel that was detected on a collision course with populated areas of Amundsen.\ +

\ + \"It was a very large vessel, one of the largest we've seen in this stellar region.\" said Captain Thorni Hjelmarvilli, who oversaw the boarding action and subsequent demolition. \"We expected resistance, or a need for an evacuation effort, but the vessel was completely abandoned when we arrived.\"\ + Captain Hjelmarvilli added, \"The initial sweep suggested magmellite, so we were ready for a bug hunt, but in the end it was a simple in and out operation.\"\ +

\ + SifGuard has confirmed in a follow-up interview that there is no risk of skathari contamination from the debris.\ +

\ + The successful operation comes amidst an uptick in sightings of vox derelicts across settled space, along with eyewitness reports of erratic behavior from regions with a consistent vox presence.\ +

\ + The Sivian branch of the Interspecies Joint Anti-Piracy Initiative has not responded to our requests for comment at time of publication." + +/datum/lore/codex/page/article120 + name = "06/14/75 - Seventeen Arrested In Drammen Anomaly Sting" + data = "The SifGuard Police Division has confirmed the arrest of seventeen individuals in connection to a Sif Anomalous Region artefact smuggling scheme operating out of the city of Drammen, in central Londuneyja. The string of armed raids, took place over the early morning of the 14th and come as part of a push for stronger legal action against the growing artefact trade in the region.\ +

\ + The identities of many of those arrested remains unknown, though sources close to the operation have suggested ties to both the Russian Mafia, and the Golden Tiger Syndicate. Havdid Kindler, a representative for NanoTrasen's security operations informed the Vir News Network that \"no current NanoTrasen employees have been implicated in this case\", and that he did not believe that any individual employed at the company's largest research base, Cynosure Station which is located in relative proximity to Drammen, were currently under investigation.\ +

\ + NanoTrasen has strongly condemned illegal expeditions into the SAR since the establishment of the perimeter in 2568. The company have stated that they have been collaborating closely with the SGPD over the past several months, but that they could not comment further on ongoing operations. According to Kindler, the harsh treatment is \"Not only a matter of intellectual property, but of public safety. NanoTrasen's research operations are uniquely equipped to safely investigate the phenomena of the SAR, and the careful control of abnormal material exiting the perimeter ensures minimal risk of injury of death in the wider population.\" Death and disfigurement among illegal artefact smugglers is a common occurrence, though exact injury details and figures for individuals working under NanoTrasen supervision remain confidential.\ +

\ + Mr. Kindler has thanked the SifGuard, Hedberg-Hammarstrom corporation, and the people of Drammen for their close cooperation with the company. Cynosure Station management declined to comment." + +/datum/lore/codex/page/article121 + name = "07/05/75 - Naval Assets Scramble As Raphael Besieged By Vox Warfleet" + data = "In a shocking turn of events, the Raphael system has found itself under immediate and severe threat by a previously unknown vox raiding fleet of unprecedented size.\ +

\ + Employing the stealth technology favoured by the piratical vox, the fleet slipped past Raphael's interdiction buoys at sublight speeds early in the week, only to be detected seventeen hours ago by an experimental NanoTrasen-developed gravitronic sensor system.\ +

\ + The fleet is larger than any previously recorded raiding party, and is comprised primarily of stolen civilian vessels retrofitted with jury-rigged anti-ship weaponry, as well as other, more exotic, technology. At time of publication, no casualties have been reported, but experts expect the situation to worsen dramatically as the fleet continues to approach.\ +

\ + Navy analysts are so far baffled by this sudden dramatic change in behavior, which further compounds the raid model failures reported in the recent past. While experts are confident that orbital defenses and on-site corporate assets are capable of holding against the incoming fleet, out-of-system assets are being recalled and are expected to reinforce Raphael within 24 hours.\ +

\ + At time of publication, the approaching warships have not responded to hails. Oculum has contacted the IJAPI for comment, but has not yet received a response.\ +

\ + This is a developing situation and updates will be published as they are received." + +/datum/lore/codex/page/article122 + name = "07/06/75 - Startling New Developments As Returning Ships Join Raphael Crisis" + data = "As the vox occupation of Raphael extends into its second day, unexpected new developments have come to light. The invading fleet arrived at the predicted outer engagement radius as expected, but failed to commence firing. Instead, the fleet continued until reaching at the outer range of the orbital defense batteries, where all ships came to a full stop.\ +

\ + Inside information from Raphael's joint corporate crisis committee indicates that communication was established with the apparent leaders of the vox fleet shortly after this time, but Oculum is currently unable to provide any conclusive information around any discussions that have taken place. \ +

\ + With the increased resolution provided by the orbital defense systems, the threat profile of the fleet has drastically changed. The fleet appears to be composed primarily of habitation and industrial vessels, outfitted with a variety of utility systems, with previously identified weapon systems largely being corrected to meteorite and debris deflectors.\ +

\ + The arrival of recalled corporate naval assets and Frontier Terminus regional forces to Raphael eight hours ago is expected to have completely enveloped the vox fleet, with further developments to be reported as they arrive.\ +

\ + \[This publication is a partial retraction of our previously report on the Raphael crisis. Oculum regrets any discrepancies but accepts no legal liability for actions undertaken on the basis of those discrepancies.\]" + +/datum/lore/codex/page/article123 + name = "07/07/75 - Notorious Pirate King Arrested Amid Raphael Vox Crisis" + data = "The crisis at Raphel continues to develop after a tense 24 hours of closed-door discussions between the corporate triumvirate council, the Frontier Terminus naval command, and the vox fleet that has been occupying the system for the past two standard days. After hours of standoffs, negotiations appeared to break down at approximately 16:50 on the 6th, resulting in a single vox capital ship powering engines and beginning an apparently suicidal combat approach towards the habitat.\ +

\ + A quick response by navy interdictors halted the vessel before it could cause any significant damage.\ +

\ + After boarding and seizure of the vessel, it became apparent that the captain was none other than notorious pirate and sector warlord, Kairahirikriha Yira-Kirini, known as the Void Bolt across the Crypt after a spate of lethal raids against corporate and civil holdings. As he was taken into custody, the mass-murderer was reported as repeatedly screaming the cryptic phrases, 'the stars are dying', 'the gods are dead' and 'we are adrift'.\ +

\ + Precisely what this could mean in the context of the ongoing discussions is hard to verify, but following the interdiction and arrest, activity was reported within the corporate and civil fleets. No further activity has been reported within the vox fleet.\ +

\ + As the situation develops, Occulum is pleased to provide a gallery of up-to-the-minute images and recordings of the vox fleet on our partner site, located at \[this\] address." + +/datum/lore/codex/page/article124 + name = "07/09/75 - Suspected Vystholm Pirates Seize Visiting Unathi Crew" + data = "A Moghes Hegemony scientific exchange expeditionary vessel was struck by pirates in the Gavel system on Thursday, with most of the 108 crew and passengers remaining unaccounted for. The attack is believed to have been carried out by marauding Vystholm raiders, and left thirty-two confirmed dead, including the majority of the Hegemony military complement assigned to the ship. The SCG has confirmed that meetings are already underway with the Hegemony in order to assuage any diplomatic incident, and commit resources to an investigation where possible.\ +

\ + The vessel, the HEG-TV Kinship of the Starchildren was visiting the Golden Crescent as part of the closing stages of a much celebrated six-month long intergovernmental scientific exchange program, and had recently disembarked a number of representatives from leading research institutions and corporations based in the region. Among those missing are several senior researchers highly respected among the unathi, and Ezechiel Augustin and Isidora Tahana, two human xenobiology research fellows from the Angelic College at Makon in Alpha Centauri, who were due to disembark at Saint Columbia.\ +

\ + Vystholm pirates operating out of Eutopia been of growing concern in the region and are believed in operate numerous deep-space staging points in the area between Eutopia and Gavel. The Golden Crescent Alliance Bloc has committed much of its forces to anti-piracy efforts within its jurisdiction, but the number of successful raids on shipping are on the rise. No ransom demand has yet been made for the missing crew members, and concerns have been raised about the difficulty of recovery if any are sold into the growing Eutopian slave trade." + +/datum/lore/codex/page/article125 + name = "07/10/75 - Vox Crisis At Raphael Transitions Into Support Agreement" + data = "With the lifting of the information quarantine, new information from Raphael has been released.\ +

\ + Over the last forty-eight hours, xenolinguists, xenopsychologists and many corporate and governmental diplomatic assets have brokered a first-of-its-kind non-aggression and support contract with the vox refugees of 'Bolt' (the apparent name of their home vessel). While many details remain under tight information control, the corporate triumvirate has prepared a press release expected to be delivered within the next 24 hours, depending on the content pricing tier at use in your area.\ +

\ + Occulum can report that the vox fleet was seeking emergency civil aid, rather than conducting a raid as initially assumed. It would appear that the aftereffects of the Incursion have badly disrupted their society, leaving the vox of Bolt leaderless and defenceless following the departure of their 'peregrine clades', more generally know as raiders and pirates.\ +

\ + Although much of the information received from the vox is questionable, it would appear that the notorious Void Bolt and their crew were the only remaining vox in the fleet to have ever had direct interaction with non-vox sapients. Precisely where the raiding ships have gone, and how this may affect negotiations, remains unclear.\ +

\ + As part of the contract signed today, Raphael will be providing docking space, emergency power and life support, and critical maintenance materials to the vox fleet. NT representatives have additionally noted that discussions with representatives of Frontier Terminus and Precursor's Crypt are ongoing with a view towards longer-term planning and support. The full terms of service have not yet been released, but experts have suggested this may represent the first, best opportunity to gain insight into vox technology yet seen.\ +

\ + Trade is expected to resume shortly in Raphael as the vox fleet clears the primary shipping lanes, and the crisis is expected to be downgraded later today, with recalled fleets returning to their duties. Further updates will be provisioned via low priority feeds." + +/datum/lore/codex/page/article126 + name = "07/16/75 - No Rescue Planned For Missing Scientists" + data = "The Golden Crescent Alliance Bloc has confirmed that no dedicated rescue operation will take place to recover those believed taken by Vystholm pirates from a Hegemony research vessel early last week. The news comes after evidence was discovered suggesting that the hostages had been transferred mid-transit to a private Eutopian broker, which experts claim has \"closed the window for assured rescue without prohibitive resource commitment\".\ +

\ + Anti-piracy warships in the region have been on high alert for sign of those responsible since Monday, with the on-loan SifGuard vessel VGA Lise Meitner reporting the successful capture of one of at least three pirate vessels responsible the attack. According to Admiral Juliet Slimani of the Gavel Security Taskforce, evidence recovered from the vessel suggested that captured crew from the unathi vessel - including two xenobiologists from Alpha Centauri - had been transferred to an Eutopian \"labour ship\" over ten lightyears into interstellar space, and further pursuit would \"Stretch the resources of our forces here or in any system to commit them, endangering hundreds more lives in the territories they would otherwise be commited to patrol.\", but that the active hunting of pirate vessels in the immediate vicinity of Gavel would continue \"Vigorously\".\ +

\ + Admiral Slimani also confirmed that \"An armed precision strike is not currently on the table due to the immense risks involved in extraterritorial operations.\" but committed a personal donation of 5,000 thalers to a fundraiser begun by the Tahana family to pursue ransom or private security options. No public statement has yet been made by the Hegemony regarding their up to seventy-four missing citizens, but negotiations are ongoing." + +/datum/lore/codex/page/article127 + name = "07/30/75 - Hegemony Fleet Underway To Eutopia" + data = "Following the recent news regarding the raid on a unathi scientific exchange vessel by Vystholm pirates and subsequent diplomatic negotiations with SolGov, a press conference has been broadcast by the Moghes Hegemony.\ +

\ + Military Liasion and long-standing veteran of the Moghes fleet Esksion Urahlia Kssrilan spoke this morning; \"To our fellow actors on the galactic stage. For long, we have been at odds with each other, in silent disdain over the space we both occupy. Today, we wish to set this aside. Today, we approach you out of honour, and our duty to our kin; as fellows. Word has spread that a vessel carrying our people, the HEG-TV Kinship of the Starchildren, has been seized by raiders from the criminal group known as Vystholm. The information we have gained suggests to us that our vessel, and its occupants - fathers, mothers, brothers and sisters, sons and daughters - will be taken to a sector known as Eutopia. A sector where forced labour thrives.\"\ +

\ + \"We shall never stand for such actions. None of ours shall be brought into slavery, to be forced into a duty designed by malice. Effective immediately, we will be moving vessels with peacekeepers and interventionalists of the clans Hisriar, Devorask and Oukiasto, to liberate anyone - your kin and our kin - from these chains. While history may still be fresh for some, we pray there is understanding for our intent. We ask nothing but your understanding, yet we will fully embrace any aid given.\"\ +

\ + \"May the Giver herself bless our steadfast warriors in their divine goal of liberation.\".\ +

\ + The action has been authorized by the SCG Fleet, who will be providing a diplomatic escort vessel, the SCG-D Kondiaronk to accompany the Hegemony fleet as far as the Gavel system where they are expected to depart alone for Eutopian territory. The precise composition and timeline for the operation remain classified, but a spokesperson for the Solar embassy expressed assurances that the action would be fruitful, and go far to mend relations with our unathi neighbours. The number of unathi vessels involved has not been specified, but civilian shipping and regional defense forces have been notified to remain calm and maintain contact with the Kondiaronk when hailed." + +/datum/lore/codex/page/article128 + name = "08/04/75 - Vey-Medical Cruise Liner Evacuated After Accident In Vir" + data = "In what is being called one of the worst commercial transport incidents in Vir since the height of the Incursion, disaster struck the long-range cruise liner VTV Motes Dancing Across The Line Of Dawn yesterday. Reportedly, the Skrellian vessel was commencing a standard approach towards Kara via Sivian gravitational slingshot with around two thousand passengers and crew aboard, many travelling from as far as Qerr'balak, when a bluespace containment failure occurred, followed shortly by a skathari manifestation event. This resulted in an uncontrolled delamination, at least two fuel line ruptures, and depressurization of several decks, necessitating immediate evacuation.\ +

\ + While many of the escape pods launched successfully, the angle of approach resulted in at least thirty pods entering the gravity well of Sif. Casualty numbers have yet to be released, as pod recovery is ongoing, with NanoTrasen and the cruise liner's parent company, Vey-Medical, coordinating with local SifGuard. When reached for comment, a representative of Vey-Med assured reporters that all reasonable efforts would be made to recover survivors.\ +

\ + The cruise liner itself has suffered severe damage to the aft port nacelle, as well as notable damage in several other places along the port side, including numerous passenger compartments. With preliminary critical hull repairs complete, the vessel is reported to be in good spirits, and is expected to make a full recovery.\ +

\ + Emergency accommodation for passengers has been organized at the Grand Tack Hotel on the NCS Northern Star, ring three, segment five. All inquiries should be directed to the Emergency Response inbox \[at this address\]. Due to the number of urgent cases, personal inquiries are currently discouraged. NanoTrasen's Emergency Response Team will be contacting appropriate parties over the coming days as the situation is resolved.\ +

\ + \[Note: An earlier version of this story incorrectly identified the passenger count as 200, this number referred to still-missing ship crew.\]" + +/datum/lore/codex/page/article129 + name = "08/07/75 - Apostate Hegemony Escort Poised To Picket Gavel's Zaddat" + data = "The ex-Hegemony warship known as IDV All The Stars' Reaching has publicly announced its intent to transit to the Gavel system in advance of the incoming Hegemony fleet. The ship, previously stationed in the nearby system of Kess-Gendar, first came to SolGov space as part of the Zaddat Escort Fleet in 2550 but broke with Hegemony command after disobeying orders to abandon the zaddat Colony Intrepid in 2566.\ +

\ + \"Our change in station has no relation to the Moghes Hegemony's upcoming military excursion,\" the ship's captain, Assagra Ehssor of the heretic Usehi clan, clarified. \"The safety of the Colonies are our sacred duty, and we mean only to provide protection to our defenseless charges in light of Gavel's recent spate of pirate attacks.\"\ +

\ + Gavel is home to a sizable population of Unity heretics, as well as the zaddat Colony Itinerant, whose legal status following the withdrawal of the Hegemony during the Incursion has never been properly clarified. While the ship has already spent several months in Gavel in late '72, some analysts view this as a naked act of provocation against the Hegemony, which the zaddat of Colony Itinerant still consider their patron government.\ +

\ + \"This is absolutely a religious issue for them,\" said Kaijo Day, Unity Studies professor at Elysium University. \"Heretic ideologies have been steadily gaining traction among the so-called loyalist zaddat since the end of the Incursion, and they fear that the Hegemony fleet will make some attempt to convert Colony Itinerant back to orthodoxy, or even to assume direct control of it. In that light, their movements should be understood as an immediate threat towards Hegemony missionaries.\"\ +

\ + The Gavel Defense Force is reportedly unconcerned by the development, but are expected to remain on high alert for the next several months as the Hegemony fleet approaches. The Hegemony embassy on Luna was not available for comment." diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm index ba161b0cf58..9b8b72f472f 100644 --- a/code/modules/materials/materials/_materials.dm +++ b/code/modules/materials/materials/_materials.dm @@ -62,6 +62,7 @@ var/global/list/name_to_material // Safety proc to make sure the material list exists before trying to grab from it. /proc/get_material_by_name(name) + name = lowertext(name) if(!name_to_material) populate_material_list() return name_to_material[name] @@ -116,6 +117,8 @@ var/global/list/name_to_material var/radiation_resistance = 0 // Radiation resistance, which is added on top of a material's weight for blocking radiation. Needed to make lead special without superrobust weapons. var/supply_conversion_value // Supply points per sheet that this material sells for. + var/perunit = SHEET_MATERIAL_AMOUNT //How much stacks of translate from sheet to amount + // Placeholder vars for the time being, todo properly integrate windows/light tiles/rods. var/created_window var/created_fulltile_window @@ -225,10 +228,14 @@ var/global/list/name_to_material /datum/material/proc/place_dismantled_product(var/turf/target) place_sheet(target) +/datum/material/proc/get_place_stack_type() + return stack_type + // Debris product. Used ALL THE TIME. -/datum/material/proc/place_sheet(var/turf/target) - if(stack_type) - return new stack_type(target) +/datum/material/proc/place_sheet(var/turf/target, var/amount) + var/place_stack_type = get_place_stack_type() + if(place_stack_type) + return new place_stack_type(target, amount) // As above. /datum/material/proc/place_shard(var/turf/target) diff --git a/code/modules/materials/materials/metals/hull.dm b/code/modules/materials/materials/metals/hull.dm index caf8f13de74..8c113afbe0a 100644 --- a/code/modules/materials/materials/metals/hull.dm +++ b/code/modules/materials/materials/metals/hull.dm @@ -7,8 +7,8 @@ icon_reinf = "reinf_mesh" icon_colour = "#666677" -/datum/material/steel/hull/place_sheet(var/turf/target) //Deconstructed into normal steel sheets. - new /obj/item/stack/material/steel(target) +/datum/material/steel/hull/get_place_stack_type() //Deconstructed into normal steel sheets. + return /obj/item/stack/material/steel /datum/material/plasteel/hull name = MAT_PLASTEELHULL @@ -19,8 +19,8 @@ icon_colour = "#777788" explosion_resistance = 40 -/datum/material/plasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal plasteel sheets. - new /obj/item/stack/material/plasteel(target) +/datum/material/plasteel/hull/get_place_stack_type() //Deconstructed into normal plasteel sheets. + return /obj/item/stack/material/plasteel /datum/material/durasteel/hull //The 'Hardball' of starship hulls. name = MAT_DURASTEELHULL @@ -31,8 +31,8 @@ explosion_resistance = 90 reflectivity = 0.9 -/datum/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets. - new /obj/item/stack/material/durasteel(target) +/datum/material/durasteel/hull/get_place_stack_type() //Deconstructed into normal durasteel sheets. + return /obj/item/stack/material/durasteel /datum/material/titanium/hull name = MAT_TITANIUMHULL @@ -40,8 +40,8 @@ icon_base = "hull" icon_reinf = "reinf_mesh" -/datum/material/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets. - new /obj/item/stack/material/titanium(target) +/datum/material/titanium/hull/get_place_stack_type() //Deconstructed into normal titanium sheets. + return /obj/item/stack/material/titanium /datum/material/morphium/hull name = MAT_MORPHIUMHULL @@ -49,5 +49,5 @@ icon_base = "hull" icon_reinf = "reinf_mesh" -/datum/material/morphium/hull/place_sheet(var/turf/target) - new /obj/item/stack/material/morphium(target) \ No newline at end of file +/datum/material/morphium/hull/get_place_stack_type() + return /obj/item/stack/material/morphium diff --git a/code/modules/mob/_modifiers/medical.dm b/code/modules/mob/_modifiers/medical.dm index 3d170719039..0045722ab21 100644 --- a/code/modules/mob/_modifiers/medical.dm +++ b/code/modules/mob/_modifiers/medical.dm @@ -18,7 +18,7 @@ if(holder.stat == DEAD) src.expire() -/datum/modifier/bloodpump_corpse +/datum/modifier/bloodpump/corpse name = "forced blood pumping" desc = "Your blood flows thanks to the wonderful power of science." @@ -28,8 +28,9 @@ pulse_set_level = PULSE_SLOW -/datum/modifier/bloodpump/corpse/check_if_valid() - ..() +/datum/modifier/bloodpump/corpse/check_if_valid() // Don't want this to expire on corpses, so cover the baseline time check. + if(expire_at && expire_at < world.time) + src.expire() if(holder.stat != DEAD) src.expire() diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index a3157087179..6e0cab6785a 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -113,7 +113,6 @@ note dizziness decrements automatically in the mob's Life() proc. stop_floating() return floatiness = n - if(floatiness && !is_floating) start_floating() else if(!floatiness && is_floating) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 842e8f8bc70..420b6ba6bc0 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -386,7 +386,7 @@ // Returns the surrounding cardinal turfs with open links // Including through doors openable with the ID -/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) +/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID, flags) var/L[] = new() // for(var/turf/simulated/t in oview(src,1)) @@ -394,44 +394,44 @@ for(var/d in cardinal) var/turf/T = get_step(src, d) if(istype(T) && !T.density) - if(!LinkBlockedWithAccess(src, T, ID)) + if(!LinkBlockedWithAccess(src, T, ID, flags)) L.Add(T) return L // Similar to above but not restricted to just cardinal directions. -/turf/proc/TurfsWithAccess(var/obj/item/card/id/ID) +/turf/proc/TurfsWithAccess(var/obj/item/card/id/ID, flags) var/L[] = new() for(var/d in alldirs) var/turf/T = get_step(src, d) if(istype(T) && !T.density) - if(!LinkBlockedWithAccess(src, T, ID)) + if(!LinkBlockedWithAccess(src, T, ID, flags)) L.Add(T) return L // Returns true if a link between A and B is blocked // Movement through doors allowed if ID has access -/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) +/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID, flags) if(A == null || B == null) return 1 var/adir = get_dir(A,B) var/rdir = get_dir(B,A) if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal var/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) + if(!LinkBlockedWithAccess(A,iStep, ID, flags) && !LinkBlockedWithAccess(iStep,B,ID, flags)) return 0 var/pStep = get_step(A,adir&(EAST|WEST)) - if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) + if(!LinkBlockedWithAccess(A,pStep,ID, flags) && !LinkBlockedWithAccess(pStep,B,ID, flags)) return 0 return 1 - if(DirBlockedWithAccess(A,adir, ID)) + if(DirBlockedWithAccess(A,adir, ID, flags)) return 1 - if(DirBlockedWithAccess(B,rdir, ID)) + if(DirBlockedWithAccess(B,rdir, ID, flags)) return 1 for(var/obj/O in B) @@ -442,11 +442,18 @@ // Returns true if direction is blocked from loc // Checks doors against access with given ID -/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) +/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID, flags) for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 + if (flags & ASTAR_BLOCKED_BY_WINDOWS) + if (D.is_fulltile()) + return TRUE + else + if(!D.density) + continue + if(D.dir == SOUTHWEST) + return TRUE + if (D.dir & dir) + return TRUE for(var/obj/machinery/door/D in loc) if(!D.density) continue diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 004e8a4c399..a3d8de85a2f 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -285,7 +285,7 @@ while(amount + 4 <= maxAmount) busy = TRUE update_icons() - if(do_after(5 SECONDS)) + if(do_after(src, 5 SECONDS)) if(M) M.use(1) addTiles(4) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index ad0c08abfbd..7d909aa9f38 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -211,7 +211,7 @@ . += "It appears to be completely inactive." else . += "It appears to be completely inactive." - + /obj/item/mmi/digital/emp_act(severity) if(!src.brainmob) return @@ -351,4 +351,4 @@ icon = 'icons/obj/module.dmi' icon_state = "mainboard" w_class = ITEMSIZE_NORMAL - origin_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2, TECH_BLUESPACE = 2, TECH_DATA = 3) \ No newline at end of file + origin_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2, TECH_BLUESPACE = 2, TECH_DATA = 3) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 322db95d5d7..40e2c74f108 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -561,3 +561,83 @@ return ingest(holder, ingested, amount, multiplier, copy) if(chem_type == CHEM_TOUCH) return holder.trans_to_holder(touching, amount, multiplier, copy) + + +/mob/living/carbon/devour(atom/movable/victim) + var/can_eat = can_devour(victim) + if(!can_eat) + return FALSE + var/eat_speed = 100 + if(can_eat == DEVOUR_FAST) + eat_speed = 30 + visible_message(SPAN_DANGER("\The [src] is attempting to devour \the [victim] whole!")) + var/action_target = victim + if(isobj(victim)) + action_target = src + if(!do_mob(src, action_target, eat_speed)) + return FALSE + visible_message(SPAN_DANGER("\The [src] devours \the [victim] whole!")) + if(ismob(victim)) + add_attack_logs(src, victim, "devoured") + else + drop_from_inventory(victim) + move_to_stomach(victim) + return TRUE + +/mob/living/carbon/proc/can_devour(atom/movable/victim, var/silent = FALSE) + + if(!should_have_organ(O_STOMACH)) + return FALSE + + var/obj/item/organ/internal/stomach/stomach = get_internal_organ(O_STOMACH) + if(!istype(stomach) || stomach.is_broken()) + if(!silent) + to_chat(src, SPAN_WARNING("Your stomach is not functional!")) + return FALSE + + if(!stomach.can_eat_atom(victim)) + if(!silent) + to_chat(src, SPAN_WARNING("You are not capable of devouring \the [victim] whole!")) + return FALSE + + if(stomach.is_full(victim)) + if(!silent) + to_chat(src, SPAN_WARNING("Your [stomach.name] is full!")) + return FALSE + + return stomach.get_devour_time(victim) + +/mob/living/carbon/proc/move_to_stomach(atom/movable/victim) + SHOULD_CALL_PARENT(FALSE) + var/mob/mob_victim = victim + if(istype(mob_victim, /obj/item/holder)) + mob_victim = locate(/mob) in mob_victim + if(mob_victim && mob_victim != victim) + stomach_contents.Add(mob_victim) + qdel(victim) + else + stomach_contents.Add(victim) + +/mob/living/carbon/empty_stomach(var/blood_vomit) + + for(var/atom/movable/thing in stomach_contents) + thing.dropInto(get_turf(src)) + if(species.gluttonous & GLUT_PROJECTILE_VOMIT) + thing.throw_at(get_edge_target_turf(src,dir),7,7,src) + + visible_message(SPAN_DANGER("\The [src] throws up!"),SPAN_DANGER("You throw up!")) + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + Stun(5) + + var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs + if(istype(T)) + if(blood_vomit) + T.add_blood_floor(src) + else + T.add_vomit_floor(src, 1) + if(blood_vomit) + if(getBruteLoss() < 50) + adjustBruteLoss(3) + else + adjust_nutrition(-40) + adjustToxLoss(-3) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 45312b96917..3d7f6fa2fd4 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -2,6 +2,7 @@ var/global/list/_human_default_emotes = list( /decl/emote/visible/blink, /decl/emote/audible/synth, /decl/emote/audible/synth/ping, + /decl/emote/audible/synth/bing, /decl/emote/audible/synth/buzz, /decl/emote/audible/synth/confirm, /decl/emote/audible/synth/deny, diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5a3ed7299ae..b089ebbe45f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -310,7 +310,7 @@ if (!def_zone) def_zone = pick("l_hand", "r_hand") - if(species.siemens_coefficient == -1) + if(species.get_siemens_coefficient(src) == -1) if(stored_shock_by_ref["\ref[src]"]) stored_shock_by_ref["\ref[src]"] += shock_damage else @@ -1109,7 +1109,7 @@ if(species.icon_scale_x != 1 || species.icon_scale_y != 1) update_transform() - if(!default_colour || !species.apply_default_colours(src)) + if(!default_colour) r_skin = 0 g_skin = 0 b_skin = 0 @@ -1126,6 +1126,8 @@ species.create_organs(src) + species.apply_default_colours(src) + species.handle_post_spawn(src) maxHealth = species.total_health @@ -1518,7 +1520,7 @@ var/braintype = get_FBP_type() if(braintype == FBP_DRONE) var/turf/T = get_turf(src) - var/obj/item/clothing/accessory/permit/drone/permit = new(T) + var/obj/item/clothing/accessory/medal/permit/drone/permit = new(T) permit.set_name(real_name) equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor. @@ -1673,3 +1675,52 @@ /mob/living/carbon/human/hearing_boost_range() return (hearing_boost_range + species.hearboost) + +// Add gear to this proc that needs to be checked for movement sensitivity. +// Keep in mind this list will be iterated every single time the mob moves. +// This should really be a signal or something but augh. +/mob/living/carbon/human/proc/get_movement_sensitive_gear() + // Clown shoes. + if(shoes && shoes.is_mob_movement_sensitive()) + LAZYADD(., shoes) + // Tail bells. + var/obj/item/clothing/uniform = w_uniform + if(istype(uniform) && length(uniform.accessories)) + for(var/obj/item/accessory in uniform.accessories) + if(accessory.is_mob_movement_sensitive()) + LAZYADD(., accessory) + +/mob/living/carbon/human/empty_stomach(var/blood_vomit) + if(should_have_organ(O_STOMACH)) + var/turf/dumping_loc = get_turf(src) + for(var/atom/movable/thing as anything in stomach_contents) + thing.dropInto(dumping_loc) + if(species.gluttonous & GLUT_PROJECTILE_VOMIT) + thing.throw_at(get_edge_target_turf(src,dir),7,7,src) + if(!blood_vomit && should_have_organ(O_LIVER)) + var/obj/item/organ/internal/L = get_internal_organ(O_LIVER) + blood_vomit = !istype(L) || L.is_broken() + ..(blood_vomit) + +/mob/living/carbon/human/move_to_stomach(atom/movable/victim) + var/obj/item/organ/internal/stomach = get_internal_organ(O_STOMACH) + if(istype(stomach)) + var/mob/mob_victim = victim + if(istype(mob_victim, /obj/item/holder)) + mob_victim = locate(/mob) in mob_victim + if(mob_victim && victim != mob_victim) + mob_victim.forceMove(stomach) + qdel(victim) + else + victim.forceMove(stomach) + +/mob/living/carbon/human/attackby(obj/item/I, mob/user) + var/user_zone_sel = user.zone_sel?.selecting + if(user == src && user_zone_sel == O_MOUTH && can_devour(I, silent = TRUE)) + var/obj/item/blocked = check_mouth_coverage() + if(blocked) + to_chat(user, SPAN_WARNING("\The [blocked] is in the way!")) + return TRUE + if(devour(I)) + return TRUE + return ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3797ff082c9..d0f7d9ab973 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -126,7 +126,7 @@ emp_act if (!def_zone) return 1.0 - var/siemens_coefficient = max(species.siemens_coefficient,0) + var/siemens_coefficient = max(species.get_siemens_coefficient(src),0) var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking? for(var/obj/item/clothing/C in clothing_items) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 865de0b8e6d..9b9c916ddb5 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -165,31 +165,12 @@ #undef HUMAN_LOWEST_SLOWDOWN /mob/living/carbon/human/get_jetpack() - if(back) - var/obj/item/rig/rig = get_rig() - if(istype(back, /obj/item/tank/jetpack)) - return back - else if(istype(rig)) - for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules) - return module.jets - -/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0) - //Can we act? - if(restrained()) return 0 - - if(..()) //Can move due to other reasons, don't use jetpack fuel - return 1 - - //Do we have a working jetpack? - var/obj/item/tank/jetpack/thrust = get_jetpack() - - if(thrust) - if(((!check_drift) || (check_drift && thrust.stabilization_on)) && (!lying) && (thrust.do_thrust(0.01, src))) - inertia_dir = 0 - return 1 - - return 0 - + if(istype(back, /obj/item/tank/jetpack)) + return back + var/obj/item/rig/rig = get_rig() + for(var/obj/item/rig_module/maneuvering_jets/module in rig?.installed_modules) + return module.jets + return ..() /mob/living/carbon/human/Process_Spaceslipping(var/prob_slip = 5) //If knocked out we might just hit it and stop. This makes it possible to get dead bodies and such. @@ -197,10 +178,6 @@ if(species.flags & NO_SLIP) return 0 - var/obj/item/tank/jetpack/thrust = get_jetpack() - if(thrust?.can_thrust(0.01)) - return 0 - if(stat) prob_slip = 0 // Changing this to zero to make it line up with the comment, and also, make more sense. @@ -209,13 +186,16 @@ prob_slip = 0 //Check hands and mod slip - if(!l_hand) prob_slip -= 2 - else if(l_hand.w_class <= 2) prob_slip -= 1 - if (!r_hand) prob_slip -= 2 - else if(r_hand.w_class <= 2) prob_slip -= 1 - - prob_slip = round(prob_slip) - return(prob_slip) + if(!l_hand) + prob_slip -= 2 + else if(l_hand.w_class <= 2) + prob_slip -= 1 + if (!r_hand) + prob_slip -= 2 + else if(r_hand.w_class <= 2) + prob_slip -= 1 + + return round(prob_slip) // Handle footstep sounds /mob/living/carbon/human/handle_footstep(var/turf/T) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index ee867ee5f1f..18104dc99c5 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -122,12 +122,19 @@ set category = "Abilities" if(stomach_contents.len) - for(var/mob/M in src) - if(M in stomach_contents) - stomach_contents.Remove(M) - M.loc = loc - src.visible_message("[src] hurls out the contents of their stomach!") - return + for(var/atom/movable/AM in src) + stomach_contents -= AM + AM.dropInto(loc) + . = TRUE + + var/obj/item/organ/internal/stomach = get_internal_organ(O_STOMACH) + if(stomach) + for(var/atom/movable/AM in stomach) + AM.dropInto(loc) + . = TRUE + + if(.) + visible_message("[src] hurls out the contents of their stomach!") /mob/living/carbon/human/proc/psychic_whisper(mob/M as mob in oview()) set name = "Psychic Whisper" diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm index 3604e201f39..3ba53c56988 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/event.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm @@ -91,7 +91,7 @@ Variables you may want to make use of are: flash_mod = 0.9 sound_mod = 0.9 chemOD_mod = 0.9 - siemens_coefficient = 0.9 + shock_vulnerability = 0.9 spawn_flags = SPECIES_IS_RESTRICTED appearance_flags = HAS_SKIN_TONE | HAS_EYE_COLOR @@ -199,7 +199,7 @@ Variables you may want to make use of are: /datum/species/event1/proc/toggle_cloning() flags ^= NO_SCAN - + /datum/species/event1/proc/toggle_defibbing() flags ^= NO_DEFIB diff --git a/code/modules/mob/living/carbon/human/species/outsider/replicant.dm b/code/modules/mob/living/carbon/human/species/outsider/replicant.dm index ec13e29908a..c208507387f 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/replicant.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/replicant.dm @@ -35,7 +35,7 @@ radiation_mod = 0.9 flash_mod = 0.9 sound_mod = 0.9 - siemens_coefficient = 0.9 + shock_vulnerability = 0.9 spawn_flags = SPECIES_IS_RESTRICTED appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm index dd03ab4bbcf..81d37239bb8 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm @@ -10,7 +10,7 @@ light_dam = 2 darksight = 8 has_organ = list() - siemens_coefficient = 0 + shock_vulnerability = 0 blood_color = "#CCCCCC" flesh_color = "#AAAAAA" @@ -30,4 +30,4 @@ /datum/species/shadow/handle_death(var/mob/living/carbon/human/H) spawn(1) new /obj/effect/decal/cleanable/ash(H.loc) - qdel(H) \ No newline at end of file + qdel(H) diff --git a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm index d8a5577e37b..100e5c48eaa 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm @@ -32,7 +32,7 @@ flash_mod = 0 chemOD_mod = 0 - siemens_coefficient = 0 + shock_vulnerability = 0 death_message = "falls over and stops moving!" knockout_message = "falls over and stops moving!" @@ -50,4 +50,4 @@ heat_level_2 = 3000 heat_level_3 = 4000 - body_temperature = T20C \ No newline at end of file + body_temperature = T20C diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index 15cc100be58..7c876a99d86 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -51,13 +51,13 @@ cold_level_2 = 150 //Default 200 cold_level_3 = 90 //Default 120 - gluttonous = 1 + gluttonous = GLUT_TINY|GLUT_ITEM_NORMAL breath_type = "nitrogen" poison_type = "oxygen" - siemens_coefficient = 0.2 + shock_vulnerability = 0.2 - flags = NO_SCAN | NO_DEFIB + flags = NO_SCAN spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR limb_blend = ICON_MULTIPLY @@ -93,6 +93,7 @@ O_KIDNEYS = /obj/item/organ/internal/kidneys/vox, O_BRAIN = /obj/item/organ/internal/brain/vox, O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach/vox ) genders = list(NEUTER) @@ -184,12 +185,13 @@ H.b_skin = hex2num(copytext(skin_color,6,8)) var/scutes_color = "#BC7D3E" var/obj/item/organ/external/head = H.get_organ(BP_HEAD) - head.markings = list( - "Vox Beak" = list( - "color" = scutes_color, - "datum" = body_marking_styles_list["Vox Beak"] + if(head) + head.markings = list( + "Vox Beak" = list( + "color" = scutes_color, + "datum" = body_marking_styles_list["Vox Beak"] + ) ) - ) for(var/bp in list(BP_L_ARM, BP_L_HAND, BP_R_ARM, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) var/obj/item/organ/external/limb = H.get_organ(bp) if(limb) @@ -208,3 +210,15 @@ "datum" = body_marking_styles_list["Vox Claws"] ) return TRUE + +// Nerfs some vox aspects if you aren't an antag (ie. raider, merc) +// TODO: raider/non-raider voxforms, if there's some way to do that nicely... +/datum/species/vox/can_shred(mob/living/carbon/human/H, ignore_intent) + if(H.mind && player_is_antag(H.mind)) + return ..() + return FALSE + +/datum/species/vox/get_siemens_coefficient(var/mob/living/carbon/human/H) + if(H.mind && player_is_antag(H.mind)) + return ..() + return 0.65 // resistant, but still able to be tased/shocked to an extent diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index a95e1475277..826cf53a502 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -195,7 +195,7 @@ // Body/form vars. var/list/inherent_verbs = list() // Species-specific verbs. var/has_fine_manipulation = 1 // Can use small items. - var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation. + var/shock_vulnerability = 1 // Used as Siemen's coefficient. The lower, the thicker the skin and better the insulation. var/darksight = 2 // Native darksight distance. var/flags = 0 // Various specific features. var/appearance_flags = 0 // Appearance/display related features. @@ -214,7 +214,8 @@ var/primitive_form // Lesser form, if any (ie. monkey for humans) var/greater_form // Greater form, if any, ie. human for monkeys. var/holder_type - var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people. + var/gluttonous = GLUT_NONE // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING, GLUT_ITEM_TINY, GLUT_ITEM_NORMAL, GLUT_ITEM_ANYTHING, GLUT_PROJECTILE_VOMIT + var/stomach_capacity = 5 // How much stuff they can stick in their stomach var/rarity_value = 1 // Relative rarity/collector value for this species. var/economic_modifier = 2 // How much money this species makes diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm index b288005f422..8c4be3e2675 100644 --- a/code/modules/mob/living/carbon/human/species/species_getters.dm +++ b/code/modules/mob/living/carbon/human/species/species_getters.dm @@ -131,3 +131,6 @@ /datum/species/proc/get_slowdown(var/mob/living/carbon/human/H) return slowdown + +/datum/species/proc/get_siemens_coefficient(var/mob/living/carbon/human/H) + return shock_vulnerability diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index d2bc9dc1dd4..03b2b154d0d 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -9,7 +9,7 @@ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch) flags = NO_PAIN | NO_SCAN | NO_POISON | NO_MINOR_CUT | NO_DEFIB spawn_flags = SPECIES_IS_RESTRICTED - siemens_coefficient = 0 + shock_vulnerability = 0 assisted_langs = list() @@ -35,4 +35,4 @@ H.mind.special_role = "Golem" H.real_name = "adamantine golem ([rand(1, 1000)])" H.name = H.real_name - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 5b0b7ec48a1..b9430b3fddb 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -71,7 +71,7 @@ var/global/datum/species/shapeshifter/promethean/prometheans body_temperature = T20C // Room temperature rarity_value = 5 - siemens_coefficient = 0.8 + shock_vulnerability = 0.8 water_resistance = 0 water_damage_mod = 0.3 diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 617bd92994d..30a022c5616 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -56,7 +56,7 @@ primitive_form = SPECIES_MONKEY_UNATHI darksight = 3 ambiguous_genders = TRUE - gluttonous = 1 + gluttonous = GLUT_TINY slowdown = 0.5 total_health = 125 brute_mod = 0.85 @@ -190,7 +190,7 @@ burn_mod = 1.15 flash_mod = 1.1 metabolic_rate = 1.1 - gluttonous = 1 + gluttonous = GLUT_TINY num_alternate_languages = 3 secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI, LANGUAGE_ALAI) name_language = LANGUAGE_SIIK @@ -389,7 +389,7 @@ flash_mod = 2 flash_burn = 15 //flashing a zaddat probably counts as police brutality metabolic_rate = 0.7 //did u know if your ancestors starved ur body will actually start in starvation mode? - gluttonous = 1 + gluttonous = GLUT_TINY taste_sensitivity = TASTE_SENSITIVE num_alternate_languages = 3 secondary_langs = list(LANGUAGE_ZADDAT, LANGUAGE_UNATHI) @@ -507,7 +507,7 @@ water_movement = -4 //Ignore shallow water rarity_value = 3 hud_type = /datum/hud_data/diona - siemens_coefficient = 0.3 + shock_vulnerability = 0.3 show_ssd = "completely quiescent" health_hud_intensity = 2.5 item_slowdown_mod = 0.1 diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm index aaec8b3ab21..0420e9df233 100644 --- a/code/modules/mob/living/carbon/human/species/station/teshari.dm +++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm @@ -52,7 +52,7 @@ pass_flags = PASSTABLE holder_type = /obj/item/holder/human // short_sighted = 1 - gluttonous = 1 + gluttonous = GLUT_TINY blood_volume = 400 hunger_factor = 0.2 hearboost = 1 //Big heckin chonker ultragigamega-ears. @@ -134,8 +134,9 @@ inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, - /mob/living/proc/hide - ) + /mob/living/proc/hide, + /mob/living/proc/toggle_pass_table + ) descriptors = list( /datum/mob_descriptor/height = -3, @@ -154,6 +155,7 @@ ) default_emotes = list( + /decl/emote/audible/warble, /decl/emote/audible/teshsqueak, /decl/emote/audible/teshchirp, /decl/emote/audible/teshtrill diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index e20ac6bc22d..31f3d6efa5d 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -11,8 +11,8 @@ rarity_value = 3 has_fine_manipulation = 0 - siemens_coefficient = 0 - gluttonous = 2 + shock_vulnerability = 0 + gluttonous = GLUT_SMALLER brute_mod = 0.5 // Hardened carapace. burn_mod = 2 // Weak to fire. @@ -89,8 +89,6 @@ return "alien [caste_name] ([alien_number])" /datum/species/xenos/can_understand(var/mob/other) - if(istype(other, /mob/living/carbon/alien/larva)) - return TRUE return FALSE /datum/species/xenos/hug(var/mob/living/carbon/human/H,var/mob/living/target) diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 156047ae803..9b024a3b71f 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -46,7 +46,7 @@ if(!A || suit.loc != src || !(A in suit.accessories)) return - if(istype(A, /obj/item/clothing/accessory/badge) || istype(A, /obj/item/clothing/accessory/medal)) + if(istype(A, /obj/item/clothing/accessory/medal/badge) || istype(A, /obj/item/clothing/accessory/medal)) user.visible_message("\The [user] tears off \the [A] from [src]'s [suit.name]!") add_attack_logs(user,src,"Stripped [A.name] off [suit.name]") A.on_removed(user) @@ -67,7 +67,7 @@ var/obj/item/grab/grab = held if(istype(grab) && grab.affecting == src) stripping = TRUE - + if(stripping) if(!istype(target_slot)) // They aren't holding anything valid and there's nothing to remove, why are we even here? return diff --git a/code/modules/mob/living/carbon/nymph/diona.dm b/code/modules/mob/living/carbon/nymph/diona.dm index 98c0f8e591a..bf9e97cb5a3 100644 --- a/code/modules/mob/living/carbon/nymph/diona.dm +++ b/code/modules/mob/living/carbon/nymph/diona.dm @@ -24,10 +24,16 @@ var/global/list/_nymph_default_emotes = list( /decl/emote/audible/chirp ) +/datum/say_list/diona + emote_hear = list("chirps") + emote_see = list("jumps", "rolls", "scrathes") + /mob/living/carbon/diona name = "diona nymph" + desc = "A skittery little creature." voice_name = "diona nymph" speak_emote = list("chirrups") + icon = 'icons/mob/alien.dmi' icon_state = "nymph" item_state = "nymph" species_language = LANGUAGE_ROOTLOCAL @@ -46,6 +52,10 @@ var/global/list/_nymph_default_emotes = list( mob_size = 4 inventory_panel_type = null // Disable inventory by default + has_huds = TRUE + + say_list_type = /datum/say_list/diona + ai_holder_type = /datum/ai_holder/simple_mob/passive var/can_namepick_as_adult = TRUE var/adult_name = "diona gestalt" @@ -75,6 +85,7 @@ var/global/list/_nymph_default_emotes = list( regenerate_icons() species = GLOB.all_species[SPECIES_DIONA] + add_language(LANGUAGE_ROOTLOCAL) add_language(LANGUAGE_ROOTGLOBAL) add_language(LANGUAGE_GALCOM) @@ -92,15 +103,6 @@ var/global/list/_nymph_default_emotes = list( update_icons() -/mob/living/carbon/diona/proc/handle_npc(var/mob/living/carbon/diona/D) - if(D.stat != CONSCIOUS) - return - if(prob(33) && D.canmove && isturf(D.loc) && !D.pulledby) //won't move if being pulled - step(D, pick(cardinal)) - if(prob(1)) - D.emote(pick("scratch","jump","chirp","roll")) - - /mob/living/carbon/diona/u_equip(obj/item/W as obj) return @@ -128,3 +130,30 @@ var/global/list/_nymph_default_emotes = list( /mob/living/carbon/diona/death(gibbed) return ..(gibbed,death_msg) + + +/mob/living/carbon/diona/attack_ghost(mob/observer/dead/user) + if(client || key || ckey) + to_chat(user, SPAN_WARNING("\The [src] already has a player.")) + return + if(alert(user, "Do you wish to take control of \the [src]?", "Chirp Time", "No", "Yes") == "No") + return + if(QDELETED(src) || QDELETED(user) || !user.client) + return + if(client || key || ckey) + to_chat(user, SPAN_WARNING("\The [src] already has a player.")) + return + var/datum/ghosttrap/plant/P = get_ghost_trap("living plant") + if(P.assess_candidate(user)) + P.transfer_personality(user, src) + +/mob/living/carbon/diona/make_hud_overlays() + hud_list[HEALTH_HUD] = gen_hud_image(ingame_hud_med, src, "100", plane = PLANE_CH_HEALTH) + hud_list[STATUS_HUD] = gen_hud_image(ingame_hud, src, "hudhealthy", plane = PLANE_CH_STATUS) + hud_list[LIFE_HUD] = gen_hud_image(ingame_hud, src, "hudhealthy", plane = PLANE_CH_LIFE) + add_overlay(hud_list) + +/mob/living/carbon/diona/Stat() + ..() + if (statpanel("Status")) + stat(null, text("Growth: [round(amount_grown/max_grown)]%")) diff --git a/code/modules/mob/living/carbon/nymph/life.dm b/code/modules/mob/living/carbon/nymph/life.dm index ac187b28de9..bad08dabf59 100644 --- a/code/modules/mob/living/carbon/nymph/life.dm +++ b/code/modules/mob/living/carbon/nymph/life.dm @@ -13,9 +13,6 @@ adjustToxLoss(-1) adjustOxyLoss(-1) - if(!client) - handle_npc(src) - // Alien larva are quite simple. /mob/living/carbon/diona/Life() @@ -124,20 +121,6 @@ reset_view(null) return TRUE - -/mob/living/carbon/diona/handle_environment(var/datum/gas_mixture/environment) - if(!environment) - return - - if(environment.temperature > (T0C+66)) - adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing. - throw_alert("alien_fire", /obj/screen/alert/alien_fire) - if(prob(20)) - to_chat(src,SPAN_DANGER( "You feel a searing heat!")) - else - clear_alert("alien_fire") - - /mob/living/carbon/diona/handle_fire() . = ..() if(!.) // True == Not on fire diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 74604711bb4..b8987a74843 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -760,33 +760,7 @@ sleep(150) //15 seconds until second warning to_chat(src, "You feel like you are about to throw up!") sleep(100) //and you have 10 more for mad dash to the bucket - - //Damaged livers cause you to vomit blood. - if(!blood_vomit) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(!H.isSynthetic()) - var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"] - if(!L || L.is_broken()) - blood_vomit = 1 - - Stun(5) - src.visible_message("[src] throws up!","You throw up!") - playsound(src, 'sound/effects/splat.ogg', 50, 1) - - var/turf/simulated/T = get_turf(src) //TODO: Make add_blood_floor remove blood from human mobs - if(istype(T)) - if(blood_vomit) - T.add_blood_floor(src) - else - T.add_vomit_floor(src, 1) - - if(blood_vomit) - if(getBruteLoss() < 50) - adjustBruteLoss(3) - else - adjust_nutrition(-40) - adjustToxLoss(-3) + empty_stomach(blood_vomit) spawn(350) lastpuke = 0 @@ -1173,3 +1147,6 @@ /mob/living/proc/IWasAttackedBy(var/mob/living/attacker) return + +/mob/living/proc/empty_stomach() + return diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 0ae3086a27b..19c39ea1b2b 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -249,7 +249,7 @@ default behaviour is: /mob/living/proc/inertial_drift() if(x > 1 && x < (world.maxx) && y > 1 && y < (world.maxy)) - if(Process_Spacemove(1)) + if(Process_Spacemove(TRUE)) inertia_dir = 0 return diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index d7868c195e2..1615b952fa3 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -25,3 +25,10 @@ to_chat(usr, "You will [allow_self_surgery ? "now" : "no longer"] attempt to operate upon yourself.") log_admin("DEBUG \[[world.timeofday]\]: [src.ckey ? "[src.name]:([src.ckey])" : "[src.name]"] has [allow_self_surgery ? "Enabled" : "Disabled"] self surgery.") + +/mob/living/proc/toggle_pass_table() + set name = "Toggle Agility" + set desc = "Allows you to start/stop hopping over things such as hydroponics trays, tables, and railings." + set category = "Abilities" + pass_flags ^= PASSTABLE + to_chat(src, "You [pass_flags & PASSTABLE ? "will" : "will NOT"] move over tables/railings/trays!") diff --git a/code/modules/mob/living/organs.dm b/code/modules/mob/living/organs.dm index 76694553f6c..b9089956522 100644 --- a/code/modules/mob/living/organs.dm +++ b/code/modules/mob/living/organs.dm @@ -16,6 +16,9 @@ zone = BP_HEAD return organs_by_name[zone] +/mob/living/proc/get_internal_organ(var/zone) + return zone && internal_organs_by_name[zone] + /mob/living/gib() for(var/path in internal_organs) if(ispath(path)) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 38586be2c4d..09bc9d02748 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -82,6 +82,11 @@ external_type = /obj/item/robot_parts/robot_component/armour_platform max_damage = 140 +/datum/robot_component/armour/light + name = "lightweight armour plating" + external_type = /obj/item/robot_parts/robot_component/armour_light + max_damage = 75 + // ACTUATOR // Enables movement. // Uses no power when idle. Uses 200J for each tile the cyborg moves. @@ -181,13 +186,13 @@ // Initializes cyborg's components. Technically, adds default set of components to new borgs /mob/living/silicon/robot/proc/initialize_components() - components["actuator"] = new/datum/robot_component/actuator(src) - components["radio"] = new/datum/robot_component/radio(src) - components["power cell"] = new/datum/robot_component/cell(src) - components["diagnosis unit"] = new/datum/robot_component/diagnosis_unit(src) - components["camera"] = new/datum/robot_component/camera(src) - components["comms"] = new/datum/robot_component/binary_communication(src) - components["armour"] = new/datum/robot_component/armour(src) + components["actuator"] = new /datum/robot_component/actuator(src) + components["radio"] = new /datum/robot_component/radio(src) + components["power cell"] = new /datum/robot_component/cell(src) + components["diagnosis unit"] = new /datum/robot_component/diagnosis_unit(src) + components["camera"] = new /datum/robot_component/camera(src) + components["comms"] = new /datum/robot_component/binary_communication(src) + components["armour"] = new /datum/robot_component/armour(src) // Checks if component is functioning /mob/living/silicon/robot/proc/is_component_functioning(module_name) @@ -258,6 +263,12 @@ icon_state_broken = "armor_broken" color = COLOR_GRAY80 +/obj/item/robot_parts/robot_component/armour_light + name = "lightweight armour plating" + desc = "A pair of flexible, light armor plates, used to protect the internals of robots equipped with anti-gravity frames." + icon_state = "armor_l" + icon_state_broken = "armor_l_broken" + /obj/item/robot_parts/robot_component/camera name = "camera" desc = "A modified camera module used as a visual receptor for robots and exosuits, also serving as a relay for wireless video feed." @@ -274,4 +285,4 @@ name = "radio" desc = "A modular, multi-frequency radio used by robots and exosuits to enable communication systems. Comes with built-in subspace receivers." icon_state = "radio" - icon_state_broken = "radio_broken" \ No newline at end of file + icon_state_broken = "radio_broken" diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 809c916ec8a..15173fb41a5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -21,7 +21,6 @@ var/global/list/mob_hat_cache = list() /mob/living/silicon/robot/drone name = "maintenance drone" real_name = "drone" - icon = 'icons/mob/robots.dmi' icon_state = "repairbot" maxHealth = 35 health = 35 @@ -153,7 +152,7 @@ var/global/list/mob_hat_cache = list() /mob/living/silicon/robot/drone/choose_icon() return -/mob/living/silicon/robot/drone/pick_module() +/mob/living/silicon/robot/drone/pick_module(override) return /mob/living/silicon/robot/drone/proc/wear_hat(var/obj/item/new_hat) @@ -272,10 +271,6 @@ var/global/list/mob_hat_cache = list() return ..() -//DRONE MOVEMENT. -/mob/living/silicon/robot/drone/Process_Spaceslipping(var/prob_slip) - return 0 - //CONSOLE PROCS /mob/living/silicon/robot/drone/proc/law_resync() if(stat != DEAD) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 84c770f46e7..17b50223ecd 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -129,6 +129,17 @@ ) +/obj/item/gripper/cultivator + name = "cultivator gripper" + icon_state = "gripper" + desc = "A simple grasping tool used to perform tasks in the xenobiology division, such as handling plant samples and disks." + can_hold = list( + /obj/item/reagent_containers/glass, + /obj/item/seeds, + /obj/item/slime_extract, + /obj/item/disk/botany + ) + /obj/item/gripper/circuit name = "circuit assembly gripper" icon_state = "gripper-circ" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index aed89d79ea4..315890eb95d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -3,7 +3,7 @@ /mob/living/silicon/robot name = "Cyborg" real_name = "Cyborg" - icon = 'icons/mob/robots.dmi' + icon = 'icons/mob/robots/robots_grounded.dmi' icon_state = "robot" maxHealth = 200 health = 200 @@ -14,6 +14,7 @@ var/lights_on = 0 // Is our integrated light on? var/used_power_this_tick = 0 + var/power_efficiency = 1 var/sight_mode = 0 var/custom_name = "" var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best @@ -22,6 +23,8 @@ var/crisis_override = 0 var/integrated_light_power = 6 var/datum/wires/robot/wires + var/module_category = ROBOT_MODULE_TYPE_GROUNDED + var/dismantle_type = /obj/item/robot_parts/frame can_be_antagged = TRUE @@ -75,7 +78,6 @@ var/viewalerts = 0 var/modtype = "Default" var/lower_mod = 0 - var/jetpack = 0 var/datum/effect_system/ion_trail_follow/ion_trail = null var/datum/effect_system/spark_spread/spark_system//So they can initialize sparks whenever/N var/jeton = 0 @@ -258,28 +260,42 @@ updateicon() return module_sprites -/mob/living/silicon/robot/proc/pick_module() - if(module) +/mob/living/silicon/robot/proc/pick_module(override) + + if(module && !override) return - var/list/modules = list() - modules.Add(robot_module_types) - if((crisis && security_level == SEC_LEVEL_RED) || crisis_override) //Leaving this in until it's balanced appropriately. - to_chat(src, "Crisis mode active. Combat module available.") - modules+="Combat" - modtype = input("Please, select a module!", "Robot module", null, null) as null|anything in modules - if(module) + var/is_crisis_mode = crisis_override || (security_level == SEC_LEVEL_RED) + var/list/robot_modules = SSrobots.get_available_modules(module_category, is_crisis_mode, override) + if(!length(robot_modules)) + to_chat(src, SPAN_WARNING("For some reason, no modules are available to you. Please report this on the issue tracker!")) return - if(!(modtype in robot_modules)) + + if(!override) + if(is_crisis_mode) + to_chat(src, SPAN_WARNING("Crisis mode active. Additional modules available.")) + modtype = input("Please select a module!", "Robot module", null, null) as null|anything in robot_modules + else + if(module) + QDEL_NULL(module) + modtype = override + + if(module || !modtype) return var/module_type = robot_modules[modtype] + if(!module_type) + to_chat(src, SPAN_WARNING("You are unable to select a module.")) + return + new module_type(src) - hands.icon_state = lowertext(modtype) + if(hands) + hands.icon_state = lowertext(modtype) feedback_inc("cyborg_[lowertext(modtype)]",1) updatename() - notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) + if(module) + notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) /mob/living/silicon/robot/proc/update_braintype() if(istype(mmi, /obj/item/mmi/digital/posibrain)) @@ -416,19 +432,11 @@ // this function displays jetpack pressure in the stat panel /mob/living/silicon/robot/proc/show_jetpack_pressure() // if you have a jetpack, show the internal tank pressure - var/obj/item/tank/jetpack/current_jetpack = installed_jetpack() + var/obj/item/tank/jetpack/current_jetpack = get_jetpack() if (current_jetpack) stat("Internal Atmosphere Info", current_jetpack.name) stat("Tank Pressure", current_jetpack.air_contents.return_pressure()) - -// this function returns the robots jetpack, if one is installed -/mob/living/silicon/robot/proc/installed_jetpack() - if(module) - return (locate(/obj/item/tank/jetpack) in module.modules) - return 0 - - // this function displays the cyborgs current cell charge in the stat panel /mob/living/silicon/robot/proc/show_cell_power() if(cell) @@ -555,13 +563,8 @@ to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].") sleep(30) to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!") - var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc) - C.l_leg = new/obj/item/robot_parts/l_leg(C) - C.r_leg = new/obj/item/robot_parts/r_leg(C) - C.l_arm = new/obj/item/robot_parts/l_arm(C) - C.r_arm = new/obj/item/robot_parts/r_arm(C) - C.updateicon() - new/obj/item/robot_parts/chest(loc) + var/obj/item/robot_parts/frame/C = new dismantle_type(loc) + C.dismantled_from(src) qdel(src) else // Okay we're not removing the cell or an MMI, but maybe something else? @@ -1016,7 +1019,7 @@ if(icontype == "Custom") icon = CUSTOM_ITEM_SYNTH else // This is to fix an issue where someone with a custom borg sprite chooses a non-custom sprite and turns invisible. - icon = 'icons/mob/robots.dmi' + icon = initial(icon) icon_state = module_sprites[icontype] updateicon() diff --git a/code/modules/mob/living/silicon/robot/robot_modules/_module.dm b/code/modules/mob/living/silicon/robot/robot_modules/_module.dm new file mode 100644 index 00000000000..e743c192c18 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_modules/_module.dm @@ -0,0 +1,256 @@ +/obj/item/robot_module + name = "robot module" + icon = 'icons/obj/module.dmi' + icon_state = "std_module" + w_class = ITEMSIZE_NO_CONTAINER + item_state = "std_mod" + + var/unavailable_by_default + var/display_name + var/hide_on_manifest = FALSE + var/channels = list() + var/networks = list() + var/languages = list( + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_SIVIAN= 0, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_UNATHI = 0, + LANGUAGE_SIIK = 0, + LANGUAGE_AKHANI = 0, + LANGUAGE_SKRELLIAN = 0, + LANGUAGE_GUTTER = 0, + LANGUAGE_SCHECHI = 0, + LANGUAGE_SIGN = 0, + LANGUAGE_TERMINUS = 1, + LANGUAGE_ZADDAT = 0 + ) + var/sprites = list() + var/can_be_pushed = 1 + var/no_slip = 0 + var/list/modules = list() + var/list/datum/matter_synth/synths = list() + var/obj/item/emag = null + var/obj/item/borg/upgrade/advhealth = null + var/list/subsystems = list() + var/list/obj/item/borg/upgrade/supported_upgrades = list() + + var/obj/item/tank/jetpack/jetpack + + var/list/universal_equipment = list( + /obj/item/flash/robot, + /obj/item/tool/crowbar/cyborg, + /obj/item/extinguisher, + /obj/item/gps/robot + ) + // Module categorization values. + var/module_category = ROBOT_MODULE_TYPE_GROUNDED + var/upgrade_locked = FALSE + var/crisis_locked = FALSE + + // Bookkeeping + var/list/original_languages = list() + var/list/added_networks = list() + +/obj/item/robot_module/proc/hide_on_manifest() + . = hide_on_manifest + +/obj/item/robot_module/Initialize(var/ml) + . = ..() + var/mob/living/silicon/robot/R = loc + if(!istype(R)) + return INITIALIZE_HINT_QDEL + + R.module = src + + build_equipment(R) + build_emag(R) + build_synths(R) + + finalize_equipment(R) + finalize_emag(R) + finalize_synths(R) + + add_camera_networks(R) + add_languages(R) + add_subsystems(R) + apply_status_flags(R) + handle_shell(R) + + if(R.radio) + addtimer(CALLBACK(R.radio, /obj/item/radio/proc/recalculateChannels), 0) + + R.set_module_sprites(sprites) + addtimer(CALLBACK(R, /mob/living/silicon/robot/proc/choose_icon, R.module_sprites.len + 1, R.module_sprites), 0) + +/obj/item/robot_module/proc/build_equipment() + SHOULD_CALL_PARENT(TRUE) + for(var/thing in (modules|universal_equipment)) + modules -= thing + if(ispath(thing, /obj/item)) + modules += new thing(src) + else if(isitem(thing)) + var/obj/item/I = thing + I.forceMove(src) + modules += I + else + log_debug("Invalid var type in [type] equipment creation - [thing]") + if(ispath(jetpack)) + jetpack = new jetpack(src) + +/obj/item/robot_module/proc/finalize_equipment() + SHOULD_CALL_PARENT(TRUE) + for(var/obj/item/I in modules) + I.canremove = FALSE + if(jetpack) + if(istype(jetpack)) + jetpack.canremove = FALSE + var/mob/living/silicon/robot/robit = loc + if(istype(robit)) + jetpack.forceMove(robit) + robit.internals = jetpack + else + log_debug("Invalid var type in [type] jetpack creation - [jetpack]") + jetpack = null + +/obj/item/robot_module/proc/build_emag() + SHOULD_CALL_PARENT(TRUE) + if(ispath(emag)) + emag = new emag(src) + +/obj/item/robot_module/proc/finalize_emag() + SHOULD_CALL_PARENT(TRUE) + if(emag) + if(istype(emag)) + emag.canremove = FALSE + else + log_debug("Invalid var type in [type] emag creation - [emag]") + emag = null + +/obj/item/robot_module/proc/build_synths() + SHOULD_CALL_PARENT(TRUE) + for(var/thing in synths) + if(istype(thing, /datum/matter_synth)) + continue + if(!ispath(thing, /datum/matter_synth)) + log_debug("Invalid var type in [type] synth creation - [thing]") + continue + if(isnull(synths[thing])) + synths += new thing + else + synths += new thing(synths[thing]) + synths -= thing + +/obj/item/robot_module/proc/finalize_synths() + SHOULD_CALL_PARENT(TRUE) + return + +/obj/item/robot_module/proc/Reset(var/mob/living/silicon/robot/R) + remove_camera_networks(R) + remove_languages(R) + remove_subsystems(R) + remove_status_flags(R) + + if(R.radio) + R.radio.recalculateChannels() + R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) + +// This can qdel before init if spawned outside a mob, so +// Destroy() needs to be a bit nuanced to avoid runtimes. +/obj/item/robot_module/Destroy() + for(var/datum/thing in modules) + qdel(thing) +// Robot icons unit test needs the module types list. +#ifndef UNIT_TEST + modules = null +#endif + for(var/datum/thing in synths) + qdel(thing) + synths = null + if(istype(emag)) + QDEL_NULL(emag) + if(istype(jetpack)) + QDEL_NULL(jetpack) + return ..() + +/obj/item/robot_module/emp_act(severity) + if(modules) + for(var/obj/O in modules) + O.emp_act(severity) + if(emag) + emag.emp_act(severity) + if(synths) + for(var/datum/matter_synth/S in synths) + S.emp_act(severity) + ..() + return + +/obj/item/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) + if(!synths || !synths.len) + return + + for(var/datum/matter_synth/T in synths) + T.add_charge(T.recharge_rate * rate) + +/obj/item/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module + var/list/temp_list = modules + modules = list() + for(var/obj/O in temp_list) + if(O) + modules += O + +/obj/item/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) + // Stores the languages as they were before receiving the module, and whether they could be synthezized. + for(var/datum/language/language_datum in R.languages) + original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) + + for(var/language in languages) + R.add_language(language, languages[language]) + +/obj/item/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) + // Clear all added languages, whether or not we originally had them. + for(var/language in languages) + R.remove_language(language) + + // Then add back all the original languages, and the relevant synthezising ability + for(var/original_language in original_languages) + R.add_language(original_language, original_languages[original_language]) + original_languages.Cut() + +/obj/item/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera && (NETWORK_ROBOTS in R.camera.network)) + for(var/network in networks) + if(!(network in R.camera.network)) + R.camera.add_network(network) + added_networks |= network + +/obj/item/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) + if(R.camera) + R.camera.remove_networks(added_networks) + added_networks.Cut() + +/obj/item/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) + R.verbs |= subsystems + +/obj/item/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) + R.verbs -= subsystems + +/obj/item/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags &= ~CANPUSH + +/obj/item/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) + if(!can_be_pushed) + R.status_flags |= CANPUSH + +/obj/item/robot_module/proc/handle_shell(var/mob/living/silicon/robot/R) + if(R.braintype == BORG_BRAINTYPE_AI_SHELL) + channels = list( + "Medical" = 1, + "Engineering" = 1, + "Security" = 1, + "Service" = 1, + "Supply" = 1, + "Science" = 1, + "Command" = 1, + "Explorer" = 1 + ) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm index 61788e8a642..cc87f0b62ac 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -3,86 +3,68 @@ // The module that borgs on the surface have. Generally has a lot of useful tools in exchange for questionable loyalty to the crew. /obj/item/robot_module/robot/lost name = "lost robot module" + display_name = "Unregistered" + module_category = ROBOT_MODULE_TYPE_FLYING + unavailable_by_default = TRUE hide_on_manifest = TRUE sprites = list( - "Drone" = "drone-lost" - ) - -/obj/item/robot_module/robot/lost/Initialize(var/ml) - + "Drone" = "drone-lost" + ) + modules = list( + /obj/item/melee/baton/shocker/robot, + /obj/item/handcuffs/cyborg, + /obj/item/borg/combat/shield, + /obj/item/healthanalyzer, + /obj/item/reagent_containers/borghypo/lost, + /obj/item/weldingtool/electric/mounted, + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/multitool, + /obj/item/robotanalyzer, + /obj/item/stack/cable_coil/cyborg + ) + emag = /obj/item/gun/energy/retro/mounted + synths = list( + /datum/matter_synth/wire + ) + +/obj/item/robot_module/robot/lost/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - // Sec - src.modules += new /obj/item/melee/baton/shocker/robot(src) - src.modules += new /obj/item/handcuffs/cyborg(src) - src.modules += new /obj/item/borg/combat/shield(src) - - // Med - src.modules += new /obj/item/healthanalyzer(src) - src.modules += new /obj/item/reagent_containers/borghypo/lost(src) - - // Engi - src.modules += new /obj/item/weldingtool/electric/mounted(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool(src) - - // Sci - src.modules += new /obj/item/robotanalyzer(src) - - // Potato - src.emag = new /obj/item/gun/energy/retro/mounted(src) - - var/datum/matter_synth/wire = new /datum/matter_synth/wire() - synths += wire - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + var/datum/matter_synth/wire/wire = locate() in synths + var/obj/item/stack/cable_coil/cyborg/C = locate() in modules C.synths = list(wire) - src.modules += C /obj/item/robot_module/robot/gravekeeper name = "gravekeeper robot module" + display_name = "Gravekeeper" + unavailable_by_default = TRUE hide_on_manifest = TRUE sprites = list( - "Drone" = "drone-gravekeeper", - "Sleek" = "sleek-gravekeeper" - ) - -/obj/item/robot_module/robot/gravekeeper/Initialize(var/ml) - + "Gravekeeper" = "sleek-gravekeeper" + ) + modules = list( + /obj/item/melee/baton/shocker/robot, + /obj/item/borg/combat/shield, + /obj/item/weldingtool/electric/mounted, + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/material/minihoe, + /obj/item/material/knife/machete/hatchet, + /obj/item/analyzer/plant_analyzer, + /obj/item/storage/bag/plants, + /obj/item/robot_harvester, + /obj/item/shovel, + /obj/item/gripper/gravekeeper + ) + emag = /obj/item/gun/energy/retro/mounted + synths = list( + /datum/matter_synth/wood = 25000 + ) + +/obj/item/robot_module/robot/gravekeeper/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - // For fending off animals and looters - src.modules += new /obj/item/melee/baton/shocker/robot(src) - src.modules += new /obj/item/borg/combat/shield(src) - - // For repairing gravemarkers - src.modules += new /obj/item/weldingtool/electric/mounted(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - - // For growing flowers - src.modules += new /obj/item/material/minihoe(src) - src.modules += new /obj/item/material/knife/machete/hatchet(src) - src.modules += new /obj/item/analyzer/plant_analyzer(src) - src.modules += new /obj/item/storage/bag/plants(src) - src.modules += new /obj/item/robot_harvester(src) - - // For digging and beautifying graves - src.modules += new /obj/item/shovel(src) - src.modules += new /obj/item/gripper/gravekeeper(src) - - // For really persistent looters - src.emag = new /obj/item/gun/energy/retro/mounted(src) - - var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) - synths += wood - - var/obj/item/stack/material/cyborg/wood/W = new (src) + var/datum/matter_synth/wood/wood = locate() in synths + var/obj/item/stack/material/cyborg/wood/W = locate() in modules W.synths = list(wood) - src.modules += W \ No newline at end of file + src.modules += W diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index b62fbe30892..7e221bd6ba7 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -1,222 +1,42 @@ -var/global/list/robot_modules = list( - "Standard" = /obj/item/robot_module/robot/standard, - "Service" = /obj/item/robot_module/robot/clerical/butler, - "Clerical" = /obj/item/robot_module/robot/clerical/general, - "Research" = /obj/item/robot_module/robot/research, - "Miner" = /obj/item/robot_module/robot/miner, - "Crisis" = /obj/item/robot_module/robot/medical/crisis, - "Surgeon" = /obj/item/robot_module/robot/medical/surgeon, - "Security" = /obj/item/robot_module/robot/security/general, - "Combat" = /obj/item/robot_module/robot/security/combat, - "Engineering" = /obj/item/robot_module/robot/engineering/general, - "Janitor" = /obj/item/robot_module/robot/janitor - ) - -/obj/item/robot_module - name = "robot module" - icon = 'icons/obj/module.dmi' - icon_state = "std_module" - w_class = ITEMSIZE_NO_CONTAINER - item_state = "std_mod" - var/hide_on_manifest = FALSE - var/channels = list() - var/networks = list() - var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_SIVIAN= 0, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1, LANGUAGE_ZADDAT = 0) - var/sprites = list() - var/can_be_pushed = 1 - var/no_slip = 0 - var/list/modules = list() - var/list/datum/matter_synth/synths = list() - var/obj/item/emag = null - var/obj/item/borg/upgrade/jetpack = null - var/obj/item/borg/upgrade/advhealth = null - var/list/subsystems = list() - var/list/obj/item/borg/upgrade/supported_upgrades = list() - - // Bookkeeping - var/list/original_languages = list() - var/list/added_networks = list() - -/obj/item/robot_module/proc/hide_on_manifest() - . = hide_on_manifest - -/obj/item/robot_module/Initialize(var/ml) - . = ..() - var/mob/living/silicon/robot/R = loc - if(!istype(R)) - return INITIALIZE_HINT_QDEL - - R.module = src - add_camera_networks(R) - add_languages(R) - add_subsystems(R) - apply_status_flags(R) - handle_shell(R) - - if(R.radio) - addtimer(CALLBACK(R.radio, /obj/item/radio/proc/recalculateChannels), 0) - - R.set_module_sprites(sprites) - addtimer(CALLBACK(R, /mob/living/silicon/robot/proc/choose_icon, R.module_sprites.len + 1, R.module_sprites), 0) - - for(var/obj/item/I in modules) - I.canremove = 0 - -/obj/item/robot_module/proc/Reset(var/mob/living/silicon/robot/R) - remove_camera_networks(R) - remove_languages(R) - remove_subsystems(R) - remove_status_flags(R) - - if(R.radio) - R.radio.recalculateChannels() - R.choose_icon(0, R.set_module_sprites(list("Default" = "robot"))) - -/obj/item/robot_module/Destroy() - for(var/module in modules) - qdel(module) - for(var/synth in synths) - qdel(synth) - modules.Cut() - synths.Cut() - qdel(emag) - qdel(jetpack) - emag = null - jetpack = null - return ..() - -/obj/item/robot_module/emp_act(severity) - if(modules) - for(var/obj/O in modules) - O.emp_act(severity) - if(emag) - emag.emp_act(severity) - if(synths) - for(var/datum/matter_synth/S in synths) - S.emp_act(severity) - ..() - return - -/obj/item/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R, var/rate) - if(!synths || !synths.len) - return - - for(var/datum/matter_synth/T in synths) - T.add_charge(T.recharge_rate * rate) - -/obj/item/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module - var/list/temp_list = modules - modules = list() - for(var/obj/O in temp_list) - if(O) - modules += O - -/obj/item/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - // Stores the languages as they were before receiving the module, and whether they could be synthezized. - for(var/datum/language/language_datum in R.languages) - original_languages[language_datum] = (language_datum in R.speech_synthesizer_langs) - - for(var/language in languages) - R.add_language(language, languages[language]) - -/obj/item/robot_module/proc/remove_languages(var/mob/living/silicon/robot/R) - // Clear all added languages, whether or not we originally had them. - for(var/language in languages) - R.remove_language(language) - - // Then add back all the original languages, and the relevant synthezising ability - for(var/original_language in original_languages) - R.add_language(original_language, original_languages[original_language]) - original_languages.Cut() - -/obj/item/robot_module/proc/add_camera_networks(var/mob/living/silicon/robot/R) - if(R.camera && (NETWORK_ROBOTS in R.camera.network)) - for(var/network in networks) - if(!(network in R.camera.network)) - R.camera.add_network(network) - added_networks |= network - -/obj/item/robot_module/proc/remove_camera_networks(var/mob/living/silicon/robot/R) - if(R.camera) - R.camera.remove_networks(added_networks) - added_networks.Cut() - -/obj/item/robot_module/proc/add_subsystems(var/mob/living/silicon/robot/R) - R.verbs |= subsystems - -/obj/item/robot_module/proc/remove_subsystems(var/mob/living/silicon/robot/R) - R.verbs -= subsystems - -/obj/item/robot_module/proc/apply_status_flags(var/mob/living/silicon/robot/R) - if(!can_be_pushed) - R.status_flags &= ~CANPUSH - -/obj/item/robot_module/proc/remove_status_flags(var/mob/living/silicon/robot/R) - if(!can_be_pushed) - R.status_flags |= CANPUSH - -/obj/item/robot_module/proc/handle_shell(var/mob/living/silicon/robot/R) - if(R.braintype == BORG_BRAINTYPE_AI_SHELL) - channels = list( - "Medical" = 1, - "Engineering" = 1, - "Security" = 1, - "Service" = 1, - "Supply" = 1, - "Science" = 1, - "Command" = 1, - "Explorer" = 1 - ) - -// Cyborgs (non-drones), default loadout. This will be given to every module. -/obj/item/robot_module/robot/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/flash/robot(src) - src.modules += new /obj/item/tool/crowbar/cyborg(src) - src.modules += new /obj/item/extinguisher(src) - src.modules += new /obj/item/gps/robot(src) - /obj/item/robot_module/robot/standard name = "standard robot module" + display_name = "Standard" sprites = list( - "M-USE NanoTrasen" = "robot", - "Cabeiri" = "eyebot-standard", - "Haruka" = "marinaSD", - "Usagi" = "tallflower", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekstandard", - "WTOmni" = "omoikane", - "XI-GUS" = "spider", - "XI-ALP" = "heavyStandard", - "Basic" = "robot_old", - "Android" = "droid", - "Drone" = "drone-standard", - "Insekt" = "insekt-Default", - "Usagi-II" = "tall2standard", - "Pyralis" = "Glitterfly-Standard", - "Decapod" = "decapod-Standard", - "Pneuma" = "pneuma-Standard", - "Tower" = "drider-Standard" - ) - - -/obj/item/robot_module/robot/standard/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return + "M-USE NanoTrasen" = "robot", + "Haruka" = "marinaSD", + "Usagi" = "tallflower", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekstandard", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyStandard", + "Basic" = "robot_old", + "Android" = "droid", + "Insekt" = "insekt-Default", + "Usagi-II" = "tall2standard", + "Decapod" = "decapod-Standard", + "Pneuma" = "pneuma-Standard", + "Tower" = "drider-Standard" + ) + modules = list( + /obj/item/melee/baton/loaded, + /obj/item/tool/wrench/cyborg, + /obj/item/healthanalyzer + ) + emag = /obj/item/melee/energy/sword - src.modules += new /obj/item/melee/baton/loaded(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/healthanalyzer(src) - src.emag = new /obj/item/melee/energy/sword(src) +/obj/item/robot_module/robot/standard/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Drone" = "robot", + "Pyralis" = "Glitterfly-Standard", + "Cabeiri" = "eyebot-standard" + ) /obj/item/robot_module/robot/medical name = "medical robot module" + display_name = "Medical" channels = list("Medical" = 1) networks = list(NETWORK_MEDICAL) subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) @@ -224,68 +44,76 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/medical/surgeon name = "surgeon robot module" + display_name = "Surgeon" + sprites = list( + "M-USE NanoTrasen" = "robotMedi", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotsurgeon", + "WTOperator" = "sleekcmo", + "XI-ALP" = "heavyMed", + "Basic" = "Medbot", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Insekt" = "insekt-Med", + "Usagi-II" = "tall2medical", + "Decapod" = "decapod-Surgeon", + "Pneuma" = "pneuma-Surgeon", + "Tower" = "drider-Surgeon" + ) + modules = list( + /obj/item/healthanalyzer, + /obj/item/reagent_containers/borghypo/surgeon, + /obj/item/autopsy_scanner, + /obj/item/surgical/scalpel/cyborg, + /obj/item/surgical/hemostat/cyborg, + /obj/item/surgical/retractor/cyborg, + /obj/item/surgical/cautery/cyborg, + /obj/item/surgical/bonegel/cyborg, + /obj/item/surgical/FixOVein/cyborg, + /obj/item/surgical/bonesetter/cyborg, + /obj/item/surgical/circular_saw/cyborg, + /obj/item/surgical/surgicaldrill/cyborg, + /obj/item/gripper/no_use/organ, + /obj/item/gripper/medical, + /obj/item/shockpaddles/robot, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/stack/nanopaste, + /obj/item/stack/medical/advanced/bruise_pack + ) + emag = /obj/item/reagent_containers/spray + synths = list( + /datum/matter_synth/medicine = 10000 + ) + +/obj/item/robot_module/robot/medical/surgeon/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE sprites = list( - "M-USE NanoTrasen" = "robotMedi", - "Cabeiri" = "eyebot-medical", - "Haruka" = "marinaMD", - "Minako" = "arachne", - "Usagi" = "tallwhite", - "Telemachus" = "toiletbotsurgeon", - "WTOperator" = "sleekcmo", - "XI-ALP" = "heavyMed", - "Basic" = "Medbot", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone" = "drone-surgery", - "Handy" = "handy-med", - "Insekt" = "insekt-Med", - "Usagi-II" = "tall2medical", - "Pyralis" = "Glitterfly-Surgeon", - "Decapod" = "decapod-Surgeon", - "Pneuma" = "pneuma-Surgeon", - "Tower" = "drider-Surgeon" - ) - -/obj/item/robot_module/robot/medical/surgeon/Initialize() + "Handy" = "handy-med", + "Drone" = "drone-surgery", + "Eyebot" = "eyebot-medical", + "Pyralis" = "Glitterfly-Surgeon" + ) + +/obj/item/robot_module/robot/medical/surgeon/finalize_emag() + . = ..() + emag.reagents.add_reagent("pacid", 250) + emag.name = "polyacid spray" +/obj/item/robot_module/robot/medical/surgeon/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/healthanalyzer(src) - src.modules += new /obj/item/reagent_containers/borghypo/surgeon(src) - src.modules += new /obj/item/autopsy_scanner(src) - src.modules += new /obj/item/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/surgical/retractor/cyborg(src) - src.modules += new /obj/item/surgical/cautery/cyborg(src) - src.modules += new /obj/item/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/gripper/no_use/organ(src) - src.modules += new /obj/item/gripper/medical(src) - src.modules += new /obj/item/shockpaddles/robot(src) - src.modules += new /obj/item/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis - src.modules += new /obj/item/reagent_containers/syringe(src) - src.emag = new /obj/item/reagent_containers/spray(src) - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(10000) - synths += medicine - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) + var/datum/matter_synth/medicine/medicine = locate() in synths + var/obj/item/stack/nanopaste/N = locate() in modules N.uses_charge = 1 N.charge_costs = list(1000) N.synths = list(medicine) + var/obj/item/stack/medical/advanced/bruise_pack/B = locate() in modules B.uses_charge = 1 B.charge_costs = list(1000) B.synths = list(medicine) - src.modules += N - src.modules += B /obj/item/robot_module/robot/medical/surgeon/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) @@ -304,66 +132,74 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/medical/crisis name = "crisis robot module" + display_name = "Crisis" sprites = list( - "M-USE NanoTrasen" = "robotMedi", - "Cabeiri" = "eyebot-medical", - "Haruka" = "marinaMD", - "Minako" = "arachne", - "Usagi" = "tallwhite", - "Telemachus" = "toiletbotmedical", - "WTOperator" = "sleekmedic", - "XI-ALP" = "heavyMed", - "Basic" = "Medbot", - "Advanced Droid" = "droid-medical", - "Needles" = "medicalrobot", - "Drone - Medical" = "drone-medical", - "Drone - Chemistry" = "drone-chemistry", - "Insekt" = "insekt-Med", - "Usagi-II" = "tall2medical", - "Pyralis" = "Glitterfly-Crisis", - "Decapod" = "decapod-Crisis", - "Pneuma" = "pneuma-Crisis", - "Tower" = "drider-Crisis" - ) - -/obj/item/robot_module/robot/medical/crisis/Initialize() + "M-USE NanoTrasen" = "robotMedi", + "Haruka" = "marinaMD", + "Minako" = "arachne", + "Usagi" = "tallwhite", + "Telemachus" = "toiletbotmedical", + "WTOperator" = "sleekmedic", + "XI-ALP" = "heavyMed", + "Basic" = "Medbot", + "Advanced Droid" = "droid-medical", + "Needles" = "medicalrobot", + "Insekt" = "insekt-Med", + "Usagi-II" = "tall2medical", + "Decapod" = "decapod-Crisis", + "Pneuma" = "pneuma-Crisis", + "Tower" = "drider-Crisis" + ) + modules = list( + /obj/item/healthanalyzer, + /obj/item/reagent_scanner/adv, + /obj/item/roller_holder, + /obj/item/reagent_containers/borghypo/crisis, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/reagent_containers/dropper/industrial, + /obj/item/reagent_containers/syringe, + /obj/item/gripper/no_use/organ, + /obj/item/gripper/medical, + /obj/item/shockpaddles/robot, + /obj/item/stack/medical/advanced/ointment, + /obj/item/stack/medical/advanced/bruise_pack, + /obj/item/stack/medical/splint + ) + emag = /obj/item/reagent_containers/spray + synths = list( + /datum/matter_synth/medicine = 15000 + ) +/obj/item/robot_module/robot/medical/crisis/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Drone" = "drone-medical", + "Chemistry Drone" = "drone-chemistry", + "Eyebot" = "eyebot-medical", + "Pyralis" = "Glitterfly-Crisis" + ) + +/obj/item/robot_module/robot/medical/crisis/finalize_emag() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/healthanalyzer(src) - src.modules += new /obj/item/reagent_scanner/adv(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/reagent_containers/borghypo/crisis(src) - src.modules += new /obj/item/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/gripper/no_use/organ(src) - src.modules += new /obj/item/gripper/medical(src) - src.modules += new /obj/item/shockpaddles/robot(src) - src.emag = new /obj/item/reagent_containers/spray(src) - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) - synths += medicine - - var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) - var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) + emag.reagents.add_reagent("pacid", 250) + emag.name = "polyacid spray" + +/obj/item/robot_module/robot/medical/crisis/finalize_synths() + . = ..() + var/datum/matter_synth/medicine/medicine = locate() in synths + var/obj/item/stack/medical/advanced/ointment/O = locate() in modules O.uses_charge = 1 O.charge_costs = list(1000) O.synths = list(medicine) + var/obj/item/stack/medical/advanced/bruise_pack/B = locate() in modules B.uses_charge = 1 B.charge_costs = list(1000) B.synths = list(medicine) + var/obj/item/stack/medical/splint/S = locate() in modules S.uses_charge = 1 S.charge_costs = list(1000) S.synths = list(medicine) - src.modules += O - src.modules += B - src.modules += S /obj/item/robot_module/robot/medical/crisis/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) @@ -380,171 +216,164 @@ var/global/list/robot_modules = list( ..() - /obj/item/robot_module/robot/engineering name = "engineering robot module" + display_name = "Engineering" channels = list("Engineering" = 1) networks = list(NETWORK_ENGINEERING) subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor) sprites = list( - "M-USE NanoTrasen" = "robotEngi", - "Cabeiri" = "eyebot-engineering", - "Haruka" = "marinaENG", - "Usagi" = "tallyellow", - "Telemachus" = "toiletbotengineering", - "WTOperator" = "sleekce", - "XI-GUS" = "spidereng", - "XI-ALP" = "heavyEng", - "Basic" = "Engineering", - "Antique" = "engineerrobot", - "Landmate" = "landmate", - "Landmate - Treaded" = "engiborg+tread", - "Drone" = "drone-engineer", - "Treadwell" = "treadwell", - "Handy" = "handy-engineer", - "Usagi-II" = "tall2engineer", - "Pyralis" = "Glitterfly-Engineering", - "Decapod" = "decapod-Engineering", - "Pneuma" = "pneuma-Engineering", - "Tower" = "drider-Engineering" - ) - -/obj/item/robot_module/robot/engineering/general/Initialize() + "M-USE NanoTrasen" = "robotEngi", + "Haruka" = "marinaENG", + "Usagi" = "tallyellow", + "Telemachus" = "toiletbotengineering", + "WTOperator" = "sleekce", + "XI-GUS" = "spidereng", + "XI-ALP" = "heavyEng", + "Basic" = "Engineering", + "Antique" = "engineerrobot", + "Landmate" = "landmate", + "Landmate - Treaded" = "engiborg+tread", + "Treadwell" = "treadwell", + "Usagi-II" = "tall2engineer", + "Decapod" = "decapod-Engineering", + "Pneuma" = "pneuma-Engineering", + "Tower" = "drider-Engineering" + ) + modules = list( + /obj/item/borg/sight/meson, + /obj/item/weldingtool/electric/mounted/cyborg, + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/multitool, + /obj/item/t_scanner, + /obj/item/analyzer, + /obj/item/taperoll/engineering, + /obj/item/gripper, + /obj/item/gripper/circuit, + /obj/item/lightreplacer, + /obj/item/pipe_painter, + /obj/item/floor_painter, + /obj/item/inflatable_dispenser/robot, + /obj/item/geiger, + /obj/item/rcd/electric/mounted/borg, + /obj/item/pipe_dispenser, + /obj/item/pickaxe/plasmacutter, + /obj/item/gripper/no_use/loader, + /obj/item/matter_decompiler, + /obj/item/stack/material/cyborg/steel, + /obj/item/stack/material/cyborg/glass, + /obj/item/stack/rods/cyborg, + /obj/item/stack/cable_coil/cyborg, + /obj/item/stack/material/cyborg/plasteel, + /obj/item/stack/tile/floor/cyborg, + /obj/item/stack/tile/roofing/cyborg, + /obj/item/stack/material/cyborg/glass/reinforced, + /obj/item/stack/tile/wood/cyborg, + /obj/item/stack/material/cyborg/wood, + /obj/item/stack/material/cyborg/plastic + ) + emag = /obj/item/melee/baton/robot/arm + synths = list( + /datum/matter_synth/metal = 40000, + /datum/matter_synth/glass = 40000, + /datum/matter_synth/plasteel = 20000, + /datum/matter_synth/wood = 40000, + /datum/matter_synth/plastic = 40000, + /datum/matter_synth/wire + ) +/obj/item/robot_module/robot/engineering/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool(src) - src.modules += new /obj/item/t_scanner(src) - src.modules += new /obj/item/analyzer(src) - src.modules += new /obj/item/taperoll/engineering(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/gripper/circuit(src) - src.modules += new /obj/item/lightreplacer(src) - src.modules += new /obj/item/pipe_painter(src) - src.modules += new /obj/item/floor_painter(src) - src.modules += new /obj/item/inflatable_dispenser/robot(src) - src.emag = new /obj/item/melee/baton/robot/arm(src) - src.modules += new /obj/item/geiger(src) - src.modules += new /obj/item/rcd/electric/mounted/borg(src) - src.modules += new /obj/item/pipe_dispenser(src) - src.modules += new /obj/item/pickaxe/plasmacutter(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - - var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) - var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel(20000) - var/datum/matter_synth/wood = new /datum/matter_synth/wood(40000) - var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(40000) - - var/datum/matter_synth/wire = new /datum/matter_synth/wire() - synths += metal - synths += glass - synths += plasteel - synths += wood - synths += plastic - synths += wire - - var/obj/item/matter_decompiler/MD = new /obj/item/matter_decompiler(src) + var/datum/matter_synth/metal/metal = locate() in synths + var/datum/matter_synth/glass/glass = locate() in synths + var/datum/matter_synth/plasteel/plasteel = locate() in synths + var/datum/matter_synth/wood/wood = locate() in synths + var/datum/matter_synth/plastic/plastic = locate() in synths + var/datum/matter_synth/wire/wire = locate() in synths + var/obj/item/matter_decompiler/MD = locate() in modules MD.metal = metal MD.glass = glass - src.modules += MD - - var/obj/item/stack/material/cyborg/steel/M = new (src) + var/obj/item/stack/material/cyborg/steel/M = locate() in modules M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) + var/obj/item/stack/material/cyborg/glass/G = locate() in modules G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + var/obj/item/stack/rods/cyborg/R = locate() in modules R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + var/obj/item/stack/cable_coil/cyborg/C =locate() in modules C.synths = list(wire) - src.modules += C - - var/obj/item/stack/material/cyborg/plasteel/PS = new (src) + var/obj/item/stack/material/cyborg/plasteel/PS = locate() in modules PS.synths = list(plasteel) - src.modules += PS - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + var/obj/item/stack/tile/floor/cyborg/S = locate() in modules S.synths = list(metal) - src.modules += S - - var/obj/item/stack/tile/roofing/cyborg/CT = new /obj/item/stack/tile/roofing/cyborg(src) + var/obj/item/stack/tile/roofing/cyborg/CT = locate() in modules CT.synths = list(metal) - src.modules += CT - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + var/obj/item/stack/material/cyborg/glass/reinforced/RG = locate() in modules RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + var/obj/item/stack/tile/wood/cyborg/WT = locate() in modules WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) + var/obj/item/stack/material/cyborg/wood/W = locate() in modules W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/PL = new (src) + var/obj/item/stack/material/cyborg/plastic/PL = locate() in modules PL.synths = list(plastic) - src.modules += PL + +/obj/item/robot_module/robot/engineering/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Handy" = "handy-engineer", + "Drone" = "drone-engineer", + "Eyebot" = "eyebot-engineering", + "Pyralis" = "Glitterfly-Engineering", + ) /obj/item/robot_module/robot/security name = "security robot module" + display_name = "Security" channels = list("Security" = 1) networks = list(NETWORK_SECURITY) subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) can_be_pushed = 0 supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) - -/obj/item/robot_module/robot/security/general + modules = list( + /obj/item/handcuffs/cyborg, + /obj/item/melee/baton/robot, + /obj/item/gun/energy/taser/mounted/cyborg, + /obj/item/gun/energy/taser/xeno/sec/robot, + /obj/item/taperoll/police, + /obj/item/reagent_containers/spray/pepper, + /obj/item/gripper/security + ) + emag = /obj/item/gun/energy/laser/mounted sprites = list( - "M-USE NanoTrasen" = "robotSecy", - "Cabeiri" = "eyebot-security", - "Cerberus" = "bloodhound", - "Cerberus - Treaded" = "treadhound", - "Haruka" = "marinaSC", - "Usagi" = "tallred", - "Telemachus" = "toiletbotsecurity", - "WTOperator" = "sleeksecurity", - "XI-GUS" = "spidersec", - "XI-ALP" = "heavySec", - "Basic" = "secborg", - "Black Knight" = "securityrobot", - "Drone" = "drone-sec", - "Insekt" = "insekt-Sec", - "Usagi-II" = "tall2security", - "Pyralis" = "Glitterfly-Security", - "Decapod" = "decapod-Security", - "Pneuma" = "pneuma-Security", - "Tower" = "drider-Security" - ) - -/obj/item/robot_module/robot/security/general/Initialize() + "M-USE NanoTrasen" = "robotSecy", + "Cerberus" = "bloodhound", + "Cerberus - Treaded" = "treadhound", + "Haruka" = "marinaSC", + "Usagi" = "tallred", + "Telemachus" = "toiletbotsecurity", + "WTOperator" = "sleeksecurity", + "XI-GUS" = "spidersec", + "XI-ALP" = "heavySec", + "Basic" = "secborg", + "Hedge Knight" = "Security", + "Black Knight" = "securityrobot", + "Insekt" = "insekt-Sec", + "Usagi-II" = "tall2security", + "Decapod" = "decapod-Security", + "Pneuma" = "pneuma-Security", + "Tower" = "drider-Security" + ) - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/handcuffs/cyborg(src) - src.modules += new /obj/item/melee/baton/robot(src) - src.modules += new /obj/item/gun/energy/taser/mounted/cyborg(src) - src.modules += new /obj/item/gun/energy/taser/xeno/sec/robot(src) - src.modules += new /obj/item/taperoll/police(src) - src.modules += new /obj/item/reagent_containers/spray/pepper(src) - src.modules += new /obj/item/gripper/security(src) - src.emag = new /obj/item/gun/energy/laser/mounted(src) +/obj/item/robot_module/robot/security/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Pyralis" = "Glitterfly-Security", + "Drone" = "drone-sec", + "Eyebot" = "eyebot-security" + ) /obj/item/robot_module/robot/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/flash/F = locate() in src.modules @@ -563,39 +392,45 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/janitor name = "janitorial robot module" + display_name = "Janitor" channels = list("Service" = 1) sprites = list( - "M-USE NanoTrasen" = "robotJani", - "Arachne" = "crawler", - "Cabeiri" = "eyebot-janitor", - "Haruka" = "marinaJN", - "Telemachus" = "toiletbotjanitor", - "WTOperator" = "sleekjanitor", - "XI-ALP" = "heavyRes", - "Basic" = "JanBot2", - "Mopbot" = "janitorrobot", - "Mop Gear Rex" = "mopgearrex", - "Drone" = "drone-janitor", - "Usagi-II" = "tall2janitor", - "Pyralis" = "Glitterfly-Janitor", - "Decapod" = "decapod-Janitor", - "Pneuma" = "pneuma-Janitor", - "Tower" = "drider-Janitor" - ) - -/obj/item/robot_module/robot/janitor/Initialize() + "M-USE NanoTrasen" = "robotJani", + "Arachne" = "crawler", + "Haruka" = "marinaJN", + "Telemachus" = "toiletbotjanitor", + "WTOperator" = "sleekjanitor", + "XI-ALP" = "heavyRes", + "Basic" = "JanBot2", + "Mopbot" = "janitorrobot", + "Mop Gear Rex" = "mopgearrex", + "Usagi" = "tallblue", + "Usagi-II" = "tall2janitor", + "Decapod" = "decapod-Janitor", + "Pneuma" = "pneuma-Janitor", + "Tower" = "drider-Janitor" + ) + modules = list( + /obj/item/soap/nanotrasen, + /obj/item/storage/bag/trash, + /obj/item/mop, + /obj/item/lightreplacer + ) + emag = /obj/item/reagent_containers/spray - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return +/obj/item/robot_module/robot/janitor/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Drone" = "drone-janitor", + "Pyralis" = "Glitterfly-Janitor", + "Cabeiri" = "eyebot-janitor" + ) - src.modules += new /obj/item/soap/nanotrasen(src) - src.modules += new /obj/item/storage/bag/trash(src) - src.modules += new /obj/item/mop(src) - src.modules += new /obj/item/lightreplacer(src) - src.emag = new /obj/item/reagent_containers/spray(src) - src.emag.reagents.add_reagent("lube", 250) - src.emag.name = "Lube spray" +/obj/item/robot_module/robot/janitor/finalize_emag() + . = ..() + emag.reagents.add_reagent("lube", 250) + emag.name = "lube spray" /obj/item/robot_module/robot/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/lightreplacer/LR = locate() in src.modules @@ -609,125 +444,135 @@ var/global/list/robot_modules = list( channels = list( "Service" = 1, "Command" = 1 - ) + ) languages = list( - LANGUAGE_SOL_COMMON = 1, - LANGUAGE_SIVIAN = 1, - LANGUAGE_UNATHI = 1, - LANGUAGE_SIIK = 1, - LANGUAGE_AKHANI = 1, - LANGUAGE_SKRELLIAN = 1, - LANGUAGE_SKRELLIANFAR = 0, - LANGUAGE_ROOTLOCAL = 0, - LANGUAGE_TRADEBAND = 1, - LANGUAGE_GUTTER = 1, - LANGUAGE_SCHECHI = 1, - LANGUAGE_EAL = 1, - LANGUAGE_TERMINUS = 1, - LANGUAGE_SIGN = 0, - LANGUAGE_ZADDAT = 1, - ) - -/obj/item/robot_module/robot/clerical/butler - sprites = list( - "M-USE NanoTrasen" = "robotServ", - "Cabeiri" = "eyebot-standard", - "Haruka" = "marinaSV", - "Michiru" = "maidbot", - "Usagi" = "tallgreen", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekservice", - "WTOmni" = "omoikane", - "XI-GUS" = "spider", - "XI-ALP" = "heavyServ", - "Standard" = "Service2", - "Waitress" = "Service", - "Bro" = "Brobot", - "Rich" = "maximillion", - "Drone - Service" = "drone-service", - "Drone - Hydro" = "drone-hydro", - "Usagi-II" = "tall2service", - "Pyralis" = "Glitterfly-Service", - "Decapod" = "decapod-Service", - "Pneuma" = "pneuma-Service", - "Tower" = "drider-Service" - ) - -/obj/item/robot_module/robot/clerical/butler/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/gripper/service(src) - src.modules += new /obj/item/reagent_containers/glass/bucket(src) - src.modules += new /obj/item/material/minihoe(src) - src.modules += new /obj/item/material/knife/machete/hatchet(src) - src.modules += new /obj/item/analyzer/plant_analyzer(src) - src.modules += new /obj/item/storage/bag/plants(src) - src.modules += new /obj/item/robot_harvester(src) - src.modules += new /obj/item/material/knife(src) - src.modules += new /obj/item/material/kitchen/rollingpin(src) - src.modules += new /obj/item/multitool(src) //to freeze trays - - var/obj/item/rsf/M = new /obj/item/rsf(src) - M.stored_matter = 30 - src.modules += M + LANGUAGE_SOL_COMMON = 1, + LANGUAGE_SIVIAN = 1, + LANGUAGE_UNATHI = 1, + LANGUAGE_SIIK = 1, + LANGUAGE_AKHANI = 1, + LANGUAGE_SKRELLIAN = 1, + LANGUAGE_SKRELLIANFAR = 0, + LANGUAGE_ROOTLOCAL = 0, + LANGUAGE_TRADEBAND = 1, + LANGUAGE_GUTTER = 1, + LANGUAGE_SCHECHI = 1, + LANGUAGE_EAL = 1, + LANGUAGE_TERMINUS = 1, + LANGUAGE_SIGN = 0, + LANGUAGE_ZADDAT = 1, + ) - src.modules += new /obj/item/reagent_containers/dropper/industrial(src) +/obj/item/robot_module/robot/clerical/service + display_name = "Service" + sprites = list( + "M-USE NanoTrasen" = "robotServ", + "Haruka" = "marinaSV", + "Michiru" = "maidbot", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekservice", + "WTOmni" = "omoikane", + "XI-GUS" = "spider", + "XI-ALP" = "heavyServ", + "Standard" = "Service2", + "Waitress" = "Service", + "Bro" = "Brobot", + "Usagi" = "tall2clown", + "Rich" = "maximillion", + "Usagi-II" = "tall2service", + "Decapod" = "decapod-Service", + "Pneuma" = "pneuma-Service", + "Tower" = "drider-Service" + ) + modules = list( + /obj/item/gripper/service, + /obj/item/reagent_containers/glass/bucket, + /obj/item/material/minihoe, + /obj/item/material/knife/machete/hatchet, + /obj/item/analyzer/plant_analyzer, + /obj/item/storage/bag/plants, + /obj/item/robot_harvester, + /obj/item/material/knife, + /obj/item/material/kitchen/rollingpin, + /obj/item/multitool, + /obj/item/reagent_containers/dropper/industrial, + /obj/item/tray/robotray, + /obj/item/reagent_containers/borghypo/service, + /obj/item/flame/lighter/zippo, + /obj/item/rsf + ) + emag = /obj/item/reagent_containers/food/drinks/bottle/small/beer - var/obj/item/flame/lighter/zippo/L = new /obj/item/flame/lighter/zippo(src) - L.lit = 1 - src.modules += L +/obj/item/robot_module/robot/clerical/service/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Pyralis" = "Glitterfly-Service", + "Eyebot" = "eyebot-standard", + "Service Drone" = "drone-service", + "Hydroponics Drone" = "drone-hydro" + ) - src.modules += new /obj/item/tray/robotray(src) - src.modules += new /obj/item/reagent_containers/borghypo/service(src) - src.emag = new /obj/item/reagent_containers/food/drinks/bottle/small/beer(src) +/obj/item/robot_module/robot/clerical/service/finalize_emag() + . = ..() + if(!emag.reagents) + emag.create_reagents(50) + else + emag.reagents.clear_reagents() + emag.reagents.add_reagent("beer2", 50) + emag.name = "Mickey Finn's Special Brew" - var/datum/reagents/R = new/datum/reagents(50) - src.emag.reagents = R - R.my_atom = src.emag - R.add_reagent("beer2", 50) - src.emag.name = "Mickey Finn's Special Brew" +/obj/item/robot_module/robot/clerical/service/finalize_equipment() + . = ..() + var/obj/item/rsf/M = locate() in modules + M.stored_matter = 30 + var/obj/item/flame/lighter/zippo/L = locate() in modules + L.lit = TRUE /obj/item/robot_module/robot/clerical/general name = "clerical robot module" + display_name = "Clerical" sprites = list( - "M-USE NanoTrasen" = "robotCler", - "Cabeiri" = "eyebot-standard", - "Haruka" = "marinaSV", - "Usagi" = "tallgreen", - "Telemachus" = "toiletbot", - "WTOperator" = "sleekclerical", - "WTOmni" = "omoikane", - "XI-GUS" = "spidercom", - "XI-ALP" = "heavyServ", - "Waitress" = "Service", - "Bro" = "Brobot", - "Rich" = "maximillion", - "Default" = "Service2", - "Drone" = "drone-blu", - "Usagi-II" = "tall2service", - "Pyralis" = "Glitterfly-Clerical", - "Decapod" = "decapod-Clerical", - "Pneuma" = "pneuma-Clerical", - "Tower" = "drider-Clerical" - ) - -/obj/item/robot_module/robot/clerical/general/Initialize() + "M-USE NanoTrasen" = "robotCler", + "Haruka" = "marinaSV", + "Usagi" = "tallgreen", + "Telemachus" = "toiletbot", + "WTOperator" = "sleekclerical", + "WTOmni" = "omoikane", + "XI-GUS" = "spidercom", + "XI-ALP" = "heavyServ", + "Waitress" = "Service", + "Bro" = "Brobot", + "Rich" = "maximillion", + "Default" = "Service2", + "Usagi-II" = "tall2service", + "Decapod" = "decapod-Clerical", + "Pneuma" = "pneuma-Clerical", + "Tower" = "drider-Clerical", + "Hedge" = "Hydrobot" + ) + modules = list( + /obj/item/pen/robopen, + /obj/item/form_printer, + /obj/item/gripper/paperwork, + /obj/item/hand_labeler, + /obj/item/stamp, + /obj/item/stamp/denied + ) + emag = /obj/item/pen/chameleon - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/pen/robopen(src) - src.modules += new /obj/item/form_printer(src) - src.modules += new /obj/item/gripper/paperwork(src) - src.modules += new /obj/item/hand_labeler(src) - src.modules += new /obj/item/stamp(src) - src.modules += new /obj/item/stamp/denied(src) - src.emag = new /obj/item/stamp/chameleon(src) - src.emag = new /obj/item/pen/chameleon(src) +/obj/item/robot_module/robot/clerical/general/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Eyebot" = "eyebot-standard", + "Drone" = "drone-blu", + "Service Drone" = "drone-service", + "Gravekeeper" = "drone-gravekeeper", + "Hydroponics Drone" = "drone-hydro", + "Pyralis" = "Glitterfly-Clerical" + ) /obj/item/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/reagent_containers/food/condiment/enzyme/E = locate() in src.modules @@ -738,275 +583,254 @@ var/global/list/robot_modules = list( /obj/item/robot_module/robot/miner name = "miner robot module" + display_name = "Miner" channels = list("Supply" = 1) networks = list(NETWORK_MINE) sprites = list( - "NM-USE NanoTrasen" = "robotMine", - "Cabeiri" = "eyebot-miner", - "Haruka" = "marinaMN", - "Telemachus" = "toiletbotminer", - "WTOperator" = "sleekminer", - "XI-GUS" = "spidermining", - "XI-ALP" = "heavyMiner", - "Basic" = "Miner_old", - "Advanced Droid" = "droid-miner", - "Treadhead" = "Miner", - "Drone" = "drone-miner", - "Usagi-II" = "tall2miner", - "Pyralis" = "Glitterfly-Miner", - "Decapod" = "decapod-Miner", - "Pneuma" = "pneuma-Miner", - "Tower" = "drider-Miner" - ) - -/obj/item/robot_module/robot/miner/Initialize() + "NM-USE NanoTrasen" = "robotMine", + "Haruka" = "marinaMN", + "Telemachus" = "toiletbotminer", + "WTOperator" = "sleekminer", + "XI-GUS" = "spidermining", + "XI-ALP" = "heavyMiner", + "Basic" = "Miner_old", + "Advanced Droid" = "droid-miner", + "Treadhead" = "Miner", + "Usagi-II" = "tall2miner", + "Decapod" = "decapod-Miner", + "Pneuma" = "pneuma-Miner", + "Tower" = "drider-Miner" + ) + modules = list( + /obj/item/borg/sight/material, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/screwdriver/cyborg, + /obj/item/storage/bag/ore, + /obj/item/pickaxe/borgdrill, + /obj/item/storage/bag/sheetsnatcher/borg, + /obj/item/gripper/miner, + /obj/item/mining_scanner + ) + emag = /obj/item/pickaxe/diamonddrill - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/borg/sight/material(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/storage/bag/ore(src) - src.modules += new /obj/item/pickaxe/borgdrill(src) - src.modules += new /obj/item/storage/bag/sheetsnatcher/borg(src) - src.modules += new /obj/item/gripper/miner(src) - src.modules += new /obj/item/mining_scanner(src) - src.emag = new /obj/item/pickaxe/plasmacutter(src) - src.emag = new /obj/item/pickaxe/diamonddrill(src) +/obj/item/robot_module/robot/miner/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Drone" = "drone-miner", + "Cabeiri" = "eyebot-miner", + "Pyralis" = "Glitterfly-Miner" + ) /obj/item/robot_module/robot/research name = "research module" + display_name = "Research" channels = list("Science" = 1) sprites = list( - "L'Ouef" = "peaceborg", - "Cabeiri" = "eyebot-science", - "Haruka" = "marinaSCI", - "WTDove" = "whitespider", - "WTOperator" = "sleekscience", - "Droid" = "droid-science", - "Drone" = "drone-science", - "Handy" = "handy-science", - "Insekt" = "insekt-Sci", - "Usagi-II" = "tall2peace", - "Pyralis" = "Glitterfly-Research", - "Decapod" = "decapod-Research", - "Pneuma" = "pneuma-Research", - "Tower" = "drider-Research" - ) - -/obj/item/robot_module/robot/research/Initialize() + "L'Ouef" = "peaceborg", + "Haruka" = "marinaSCI", + "WTDove" = "whitespider", + "WTOperator" = "sleekscience", + "Droid" = "droid-science", + "Insekt" = "insekt-Sci", + "Usagi-II" = "tall2peace", + "Decapod" = "decapod-Research", + "Pneuma" = "pneuma-Research", + "Tower" = "drider-Research" + ) + modules = list( + /obj/item/portable_destructive_analyzer, + /obj/item/gripper/research, + /obj/item/gripper/circuit, + /obj/item/gripper/no_use/organ/robotics, + /obj/item/gripper/no_use/mech, + /obj/item/gripper/no_use/loader, + /obj/item/robotanalyzer, + /obj/item/card/robot, + /obj/item/weldingtool/electric/mounted/cyborg, + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/multitool, + /obj/item/surgical/scalpel/cyborg, + /obj/item/surgical/circular_saw/cyborg, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/glass/beaker/large, + /obj/item/storage/part_replacer, + /obj/item/shockpaddles/robot/jumper, + /obj/item/melee/baton/slime/robot, + /obj/item/gun/energy/taser/xeno/robot, + /obj/item/xenoarch_multi_tool, + /obj/item/pickaxe/excavationdrill, + /obj/item/cataloguer, + /obj/item/stack/cable_coil/cyborg, + /obj/item/stack/nanopaste + ) + emag = /obj/item/hand_tele + synths = list( + /datum/matter_synth/nanite = 10000, + /datum/matter_synth/wire + ) +/obj/item/robot_module/robot/research/flying + module_category = ROBOT_MODULE_TYPE_FLYING + can_be_pushed = TRUE + sprites = list( + "Handy" = "handy-science", + "Drone" = "drone-science", + "Pyralis" = "Glitterfly-Research", + "Cabeiri" = "eyebot-science" + ) + +/obj/item/robot_module/robot/research/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/portable_destructive_analyzer(src) - src.modules += new /obj/item/gripper/research(src) - src.modules += new /obj/item/gripper/circuit(src) - src.modules += new /obj/item/gripper/no_use/organ/robotics(src) - src.modules += new /obj/item/gripper/no_use/mech(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/robotanalyzer(src) - src.modules += new /obj/item/card/robot(src) - src.modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool(src) - src.modules += new /obj/item/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/storage/part_replacer(src) - src.modules += new /obj/item/shockpaddles/robot/jumper(src) - src.modules += new /obj/item/melee/baton/slime/robot(src) - src.modules += new /obj/item/gun/energy/taser/xeno/robot(src) - src.modules += new /obj/item/xenoarch_multi_tool(src) - src.modules += new /obj/item/pickaxe/excavationdrill(src) - src.modules += new /obj/item/cataloguer(src) - - src.emag = new /obj/item/hand_tele(src) - - var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) - synths += nanite - var/datum/matter_synth/wire = new /datum/matter_synth/wire() //Added to allow repairs, would rather add cable now than be asked to add it later, - synths += wire //Cable code, taken from engiborg, - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + var/datum/matter_synth/nanite = locate() in synths + var/obj/item/stack/nanopaste/N = locate() in modules N.uses_charge = 1 N.charge_costs = list(1000) N.synths = list(nanite) - src.modules += N - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) //Cable code, taken from engiborg, + var/datum/matter_synth/wire = locate() in synths + var/obj/item/stack/cable_coil/cyborg/C = locate() in modules C.synths = list(wire) - src.modules += C /obj/item/robot_module/robot/research/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/reagent_containers/syringe/S = locate() in src.modules if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() - ..() - /obj/item/robot_module/robot/security/combat name = "combat robot module" + display_name = "Combat" + crisis_locked = TRUE hide_on_manifest = TRUE sprites = list( - "Haruka" = "marinaCB", - "Combat Android" = "droid-combat", - "Insekt" = "insekt-Combat", - "Decapod" = "decapod-Combat" - ) - -/obj/item/robot_module/robot/security/combat/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/flash(src) - src.modules += new /obj/item/borg/sight/thermal(src) - src.modules += new /obj/item/gun/energy/laser/mounted(src) - src.modules += new /obj/item/pickaxe/plasmacutter(src) - src.modules += new /obj/item/borg/combat/shield(src) - src.modules += new /obj/item/borg/combat/mobility(src) - src.emag = new /obj/item/gun/energy/lasercannon/mounted(src) - + "Haruka" = "marinaCB", + "Combat Android" = "droid-combat", + "Insekt" = "insekt-Combat", + "Decapod" = "decapod-Combat" + ) + modules = list( + /obj/item/flash, + /obj/item/borg/sight/thermal, + /obj/item/gun/energy/laser/mounted, + /obj/item/pickaxe/plasmacutter, + /obj/item/borg/combat/shield, + /obj/item/borg/combat/mobility + ) + emag = /obj/item/gun/energy/lasercannon/mounted /* Drones */ - /obj/item/robot_module/drone name = "drone module" + display_name = "Drone" + sprites = list("Drone" = "repairbot") + unavailable_by_default = TRUE hide_on_manifest = TRUE - no_slip = 1 + no_slip = TRUE networks = list(NETWORK_ENGINEERING) + modules = list( + /obj/item/borg/sight/meson, + /obj/item/weldingtool/electric/mounted/cyborg, + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/crowbar/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/t_scanner, + /obj/item/multitool, + /obj/item/lightreplacer, + /obj/item/gripper, + /obj/item/soap, + /obj/item/gripper/no_use/loader, + /obj/item/extinguisher, + /obj/item/pipe_painter, + /obj/item/floor_painter, + /obj/item/matter_decompiler, + /obj/item/stack/material/cyborg/steel, + /obj/item/stack/material/cyborg/glass, + /obj/item/stack/rods/cyborg, + /obj/item/stack/cable_coil/cyborg, + /obj/item/stack/tile/floor/cyborg, + /obj/item/stack/material/cyborg/glass/reinforced, + /obj/item/stack/tile/wood/cyborg, + /obj/item/stack/material/cyborg/wood, + /obj/item/stack/material/cyborg/plastic + ) + jetpack = /obj/item/tank/jetpack/carbondioxide + emag = /obj/item/pickaxe/plasmacutter + synths = list( + /datum/matter_synth/metal = 25000, + /datum/matter_synth/glass = 25000, + /datum/matter_synth/wood = 25000, + /datum/matter_synth/plastic = 25000, + /datum/matter_synth/wire = 30 + ) -/obj/item/robot_module/drone/Initialize(var/ml) - +/obj/item/robot_module/drone/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/crowbar/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/t_scanner(src) - src.modules += new /obj/item/multitool(src) - src.modules += new /obj/item/lightreplacer(src) - src.modules += new /obj/item/gripper(src) - src.modules += new /obj/item/soap(src) - src.modules += new /obj/item/gripper/no_use/loader(src) - src.modules += new /obj/item/extinguisher(src) - src.modules += new /obj/item/pipe_painter(src) - src.modules += new /obj/item/floor_painter(src) - - var/mob/living/silicon/robot/robit = loc - robit.internals = new/obj/item/tank/jetpack/carbondioxide(src) - src.modules += robit.internals - - src.emag = new /obj/item/pickaxe/plasmacutter(src) - src.emag.name = "Plasma Cutter" - - var/datum/matter_synth/metal = new /datum/matter_synth/metal(25000) - var/datum/matter_synth/glass = new /datum/matter_synth/glass(25000) - var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) - var/datum/matter_synth/plastic = new /datum/matter_synth/plastic(25000) - var/datum/matter_synth/wire = new /datum/matter_synth/wire(30) - synths += metal - synths += glass - synths += wood - synths += plastic - synths += wire - - var/obj/item/matter_decompiler/MD = new /obj/item/matter_decompiler(src) + var/datum/matter_synth/metal/metal = locate() in synths + var/datum/matter_synth/glass/glass = locate() in synths + var/datum/matter_synth/wood/wood = locate() in synths + var/datum/matter_synth/plastic/plastic = locate() in synths + var/datum/matter_synth/wire/wire = locate() in synths + + var/obj/item/matter_decompiler/MD = locate() in modules MD.metal = metal MD.glass = glass MD.wood = wood MD.plastic = plastic - src.modules += MD - var/obj/item/stack/material/cyborg/steel/M = new (src) + var/obj/item/stack/material/cyborg/steel/M = locate() in modules M.synths = list(metal) - src.modules += M - - var/obj/item/stack/material/cyborg/glass/G = new (src) + var/obj/item/stack/material/cyborg/glass/G = locate() in modules G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/R = new /obj/item/stack/rods/cyborg(src) + var/obj/item/stack/rods/cyborg/R = locate() in modules R.synths = list(metal) - src.modules += R - - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + var/obj/item/stack/cable_coil/cyborg/C = locate() in modules C.synths = list(wire) - src.modules += C - - var/obj/item/stack/tile/floor/cyborg/S = new /obj/item/stack/tile/floor/cyborg(src) + var/obj/item/stack/tile/floor/cyborg/S = locate() in modules S.synths = list(metal) - src.modules += S - - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + var/obj/item/stack/material/cyborg/glass/reinforced/RG = locate() in modules RG.synths = list(metal, glass) - src.modules += RG - - var/obj/item/stack/tile/wood/cyborg/WT = new /obj/item/stack/tile/wood/cyborg(src) + var/obj/item/stack/tile/wood/cyborg/WT = locate() in modules WT.synths = list(wood) - src.modules += WT - - var/obj/item/stack/material/cyborg/wood/W = new (src) + var/obj/item/stack/material/cyborg/wood/W = locate() in modules W.synths = list(wood) - src.modules += W - - var/obj/item/stack/material/cyborg/plastic/P = new (src) + var/obj/item/stack/material/cyborg/plastic/P = locate() in modules P.synths = list(plastic) - src.modules += P src.modules += new /obj/item/pipe_dispenser(src) // At the end to go beside the construction's RCD. /obj/item/robot_module/drone/construction name = "construction drone module" + display_name = "Construction Drone" hide_on_manifest = TRUE + sprites = list("Drone" = "constructiondrone") channels = list("Engineering" = 1) languages = list() -/obj/item/robot_module/drone/construction/Initialize() - +/obj/item/robot_module/drone/construction/build_equipment() + modules += /obj/item/rcd/electric/mounted/borg/lesser . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/rcd/electric/mounted/borg/lesser(src) /obj/item/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/lightreplacer/LR = locate() in src.modules LR.Charge(R, amount) ..() - return /obj/item/robot_module/drone/mining name = "miner drone module" + display_name = "Mining Drone" channels = list("Supply" = 1) networks = list(NETWORK_MINE) - -/obj/item/robot_module/drone/mining/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/borg/sight/material(src) - src.modules += new /obj/item/pickaxe/borgdrill(src) - src.modules += new /obj/item/storage/bag/ore(src) - src.modules += new /obj/item/storage/bag/sheetsnatcher/borg(src) - src.emag = new /obj/item/pickaxe/diamonddrill(src) + sprites = list("Drone" = "miningdrone") + modules = list( + /obj/item/borg/sight/material, + /obj/item/pickaxe/borgdrill, + /obj/item/storage/bag/ore, + /obj/item/storage/bag/sheetsnatcher/borg + ) + emag = /obj/item/pickaxe/diamonddrill diff --git a/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm b/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm index 55ae50cda1b..31dc08c544f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm @@ -1,32 +1,31 @@ /obj/item/robot_module/drone/swarm name = "swarm drone module" + display_name = "Swarm Drone" + unavailable_by_default = TRUE + modules = list( + /obj/item/rcd/electric/mounted/borg/swarm, + /obj/item/flash/robot, + /obj/item/handcuffs/cable/tape/cyborg, + /obj/item/melee/baton/robot, + /obj/item/gun/energy/taser/mounted/cyborg/swarm, + /obj/item/matter_decompiler/swarm + ) var/id -/obj/item/robot_module/drone/swarm/Initialize(var/ml) - +/obj/item/robot_module/drone/swarm/build_equipment() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - var/mob/living/silicon/robot/R = loc - id = R.idcard - src.modules += id - src.modules += new /obj/item/rcd/electric/mounted/borg/swarm(src) - src.modules += new /obj/item/flash/robot(src) - src.modules += new /obj/item/handcuffs/cable/tape/cyborg(src) - src.modules += new /obj/item/melee/baton/robot(src) - src.modules += new /obj/item/gun/energy/taser/mounted/cyborg/swarm(src) - src.modules += new /obj/item/matter_decompiler/swarm(src) + if(istype(R) && R.idcard) + id = R.idcard + modules += id /obj/item/robot_module/drone/swarm/ranged name = "swarm gunner module" -/obj/item/robot_module/drone/swarm/ranged/Initialize(var/ml) +/obj/item/robot_module/drone/swarm/ranged/build_equipment() . = ..() - if(. == INITIALIZE_HINT_NORMAL) - modules += new /obj/item/gun/energy/xray/swarm(src) + modules += new /obj/item/gun/energy/xray/swarm(src) -/obj/item/robot_module/drone/swarm/melee/Initialize(var/ml) +/obj/item/robot_module/drone/swarm/melee/build_equipment() . = ..() - if(. == INITIALIZE_HINT_NORMAL) - modules += new /obj/item/melee/energy/sword/ionic_rapier/lance(src) + modules += new /obj/item/melee/energy/sword/ionic_rapier/lance(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index a3d558466c6..d3de12b630e 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -2,7 +2,9 @@ /obj/item/robot_module/robot/syndicate name = "illegal robot module" + display_name = "Subverted" hide_on_manifest = TRUE + unavailable_by_default = TRUE languages = list( LANGUAGE_SOL_COMMON = 1, LANGUAGE_SIVIAN = 0, @@ -21,42 +23,42 @@ LANGUAGE_ZADDAT = 0 ) sprites = list( - "Cerberus" = "syndie_bloodhound", - "Cerberus - Treaded" = "syndie_treadhound", - "Ares" = "squats", - "Telemachus" = "toiletbotantag", - "WTOperator" = "hosborg", - "XI-GUS" = "spidersyndi", - "XI-ALP" = "syndi-heavy" - ) + "Cerberus" = "syndie_bloodhound", + "Cerberus - Treaded" = "syndie_treadhound", + "Ares" = "squats", + "Telemachus" = "toiletbotantag", + "XI-GUS" = "spidersyndi", + "XI-ALP" = "syndi-heavy" + ) + universal_equipment = list( + /obj/item/flash/robot, + /obj/item/tool/crowbar/cyborg, + /obj/item/extinguisher, + /obj/item/gps/robot, + /obj/item/pinpointer/shuttle/merc, + /obj/item/melee/energy/sword, + ) + jetpack = /obj/item/tank/jetpack/carbondioxide + synths = list( + /datum/matter_synth/cloth = 40000 + ) var/id // All syndie modules get these, and the base borg items (flash, crowbar, etc). -/obj/item/robot_module/robot/syndicate/Initialize() - +/obj/item/robot_module/robot/syndicate/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/pinpointer/shuttle/merc(src) - src.modules += new /obj/item/melee/energy/sword(src) - - var/datum/matter_synth/cloth = new /datum/matter_synth/cloth(40000) - synths += cloth - - var/obj/item/stack/sandbags/cyborg/SB = new /obj/item/stack/sandbags/cyborg(src) + var/datum/matter_synth/cloth/cloth = locate() in synths + var/obj/item/stack/sandbags/cyborg/SB = locate() in modules SB.synths += list(cloth) - var/jetpack = new/obj/item/tank/jetpack/carbondioxide(src) - src.modules += jetpack +/obj/item/robot_module/robot/syndicate/finalize_equipment() + . = ..() var/mob/living/silicon/robot/R = loc - R.internals = jetpack - - id = R.idcard - src.modules += id + if(istype(R)) + id = R.idcard + modules += id /obj/item/robot_module/robot/syndicate/Destroy() - src.modules -= id id = null return ..() @@ -69,17 +71,12 @@ "Ares" = "squats", "XI-ALP" = "syndi-heavy" ) - -/obj/item/robot_module/robot/syndicate/protector/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/shield_projector/rectangle/weak(src) - src.modules += new /obj/item/gun/energy/dakkalaser(src) - src.modules += new /obj/item/handcuffs/cyborg(src) - src.modules += new /obj/item/melee/baton/robot(src) + modules = list( + /obj/item/shield_projector/rectangle/weak, + /obj/item/gun/energy/dakkalaser, + /obj/item/handcuffs/cyborg, + /obj/item/melee/baton/robot + ) // 95% engi-borg and 15% roboticist. /obj/item/robot_module/robot/syndicate/mechanist @@ -87,133 +84,114 @@ sprites = list( "XI-GUS" = "spidersyndi", "WTOperator" = "sleekhos" - ) - -/obj/item/robot_module/robot/syndicate/mechanist/Initialize() - + ) + modules = list( + /obj/item/borg/sight/meson, + /obj/item/weldingtool/electric/mounted/cyborg, + /obj/item/tool/screwdriver/cyborg, + /obj/item/tool/wrench/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/multitool/ai_detector, + /obj/item/pickaxe/plasmacutter, + /obj/item/rcd/electric/mounted/borg/lesser, + /obj/item/melee/energy/sword/ionic_rapier, + /obj/item/robotanalyzer, + /obj/item/shockpaddles/robot/jumper, + /obj/item/gripper/no_use/organ/robotics, + /obj/item/card/robot/syndi, + /obj/item/card/emag, + /obj/item/stack/nanopaste, + /obj/item/stack/material/cyborg/steel, + /obj/item/stack/material/cyborg/glass, + /obj/item/stack/rods/cyborg, + /obj/item/stack/cable_coil/cyborg, + /obj/item/stack/material/cyborg/glass/reinforced + ) + synths = list( + /datum/matter_synth/nanite = 10000, + /datum/matter_synth/metal = 40000, + /datum/matter_synth/glass = 40000, + /datum/matter_synth/wire + ) + +/obj/item/robot_module/robot/syndicate/mechanist/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - // General engineering/hacking. - src.modules += new /obj/item/borg/sight/meson(src) - src.modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - src.modules += new /obj/item/tool/screwdriver/cyborg(src) - src.modules += new /obj/item/tool/wrench/cyborg(src) - src.modules += new /obj/item/tool/wirecutters/cyborg(src) - src.modules += new /obj/item/multitool/ai_detector(src) - src.modules += new /obj/item/pickaxe/plasmacutter(src) - src.modules += new /obj/item/rcd/electric/mounted/borg/lesser(src) // Can't eat rwalls to prevent AI core cheese. - src.modules += new /obj/item/melee/energy/sword/ionic_rapier(src) - - // FBP repair. - src.modules += new /obj/item/robotanalyzer(src) - src.modules += new /obj/item/shockpaddles/robot/jumper(src) - src.modules += new /obj/item/gripper/no_use/organ/robotics(src) - - // Hacking other things. - src.modules += new /obj/item/card/robot/syndi(src) - src.modules += new /obj/item/card/emag(src) - // Materials. - var/datum/matter_synth/nanite = new /datum/matter_synth/nanite(10000) - synths += nanite - var/datum/matter_synth/wire = new /datum/matter_synth/wire() - synths += wire - var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) - synths += metal - var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) - synths += glass - - var/obj/item/stack/nanopaste/N = new /obj/item/stack/nanopaste(src) + var/datum/matter_synth/nanite/nanite = locate() in synths + var/obj/item/stack/nanopaste/N = locate() in modules N.uses_charge = 1 N.charge_costs = list(1000) N.synths = list(nanite) - src.modules += N - var/obj/item/stack/material/cyborg/steel/M = new (src) + var/datum/matter_synth/metal/metal = locate() in synths + var/obj/item/stack/material/cyborg/steel/M = locate() in modules + var/obj/item/stack/rods/cyborg/rods = locate() in modules M.synths = list(metal) - src.modules += M + rods.synths = list(metal) - var/obj/item/stack/material/cyborg/glass/G = new (src) + var/datum/matter_synth/glass/glass = locate() in synths + var/obj/item/stack/material/cyborg/glass/G = locate() in modules G.synths = list(glass) - src.modules += G - - var/obj/item/stack/rods/cyborg/rods = new /obj/item/stack/rods/cyborg(src) - rods.synths = list(metal) - src.modules += rods - var/obj/item/stack/cable_coil/cyborg/C = new /obj/item/stack/cable_coil/cyborg(src) + var/datum/matter_synth/wire/wire = locate() in synths + var/obj/item/stack/cable_coil/cyborg/C = locate() in modules C.synths = list(wire) - src.modules += C - var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) + var/obj/item/stack/material/cyborg/glass/reinforced/RG = locate() in modules RG.synths = list(metal, glass) - src.modules += RG - - - // Mediborg optimized for on-the-field healing, but can also do surgery if needed. /obj/item/robot_module/robot/syndicate/combat_medic name = "combat medic robot module" sprites = list( "Telemachus" = "toiletbotantag" - ) - -/obj/item/robot_module/robot/syndicate/combat_medic/Initialize() - + ) + modules = list( + /obj/item/borg/sight/hud/med, + /obj/item/healthanalyzer/advanced, + /obj/item/reagent_containers/borghypo/merc, + /obj/item/autopsy_scanner, + /obj/item/surgical/scalpel/cyborg, + /obj/item/surgical/hemostat/cyborg, + /obj/item/surgical/retractor/cyborg, + /obj/item/surgical/cautery/cyborg, + /obj/item/surgical/bonegel/cyborg, + /obj/item/surgical/FixOVein/cyborg, + /obj/item/surgical/bonesetter/cyborg, + /obj/item/surgical/circular_saw/cyborg, + /obj/item/surgical/surgicaldrill/cyborg, + /obj/item/gripper/no_use/organ, + /obj/item/gripper/medical, + /obj/item/shockpaddles/robot/combat, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/syringe, + /obj/item/roller_holder, + /obj/item/stack/medical/advanced/ointment, + /obj/item/stack/medical/advanced/bruise_pack, + /obj/item/stack/medical/splint + ) + synths = list( + /datum/matter_synth/medicine = 15000 + ) + +/obj/item/robot_module/robot/syndicate/combat_medic/finalize_synths() . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - src.modules += new /obj/item/borg/sight/hud/med(src) - src.modules += new /obj/item/healthanalyzer/advanced(src) - src.modules += new /obj/item/reagent_containers/borghypo/merc(src) - - // Surgery things. - src.modules += new /obj/item/autopsy_scanner(src) - src.modules += new /obj/item/surgical/scalpel/cyborg(src) - src.modules += new /obj/item/surgical/hemostat/cyborg(src) - src.modules += new /obj/item/surgical/retractor/cyborg(src) - src.modules += new /obj/item/surgical/cautery/cyborg(src) - src.modules += new /obj/item/surgical/bonegel/cyborg(src) - src.modules += new /obj/item/surgical/FixOVein/cyborg(src) - src.modules += new /obj/item/surgical/bonesetter/cyborg(src) - src.modules += new /obj/item/surgical/circular_saw/cyborg(src) - src.modules += new /obj/item/surgical/surgicaldrill/cyborg(src) - src.modules += new /obj/item/gripper/no_use/organ(src) - - // General healing. - src.modules += new /obj/item/gripper/medical(src) - src.modules += new /obj/item/shockpaddles/robot/combat(src) - src.modules += new /obj/item/reagent_containers/dropper(src) // Allows borg to fix necrosis apparently - src.modules += new /obj/item/reagent_containers/syringe(src) - src.modules += new /obj/item/roller_holder(src) - - // Materials. - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000) - synths += medicine - - var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) - var/obj/item/stack/medical/advanced/bruise_pack/B = new /obj/item/stack/medical/advanced/bruise_pack(src) - var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) + var/datum/matter_synth/medicine/medicine = locate() in synths + var/obj/item/stack/medical/advanced/ointment/O = locate() in modules O.uses_charge = 1 O.charge_costs = list(1000) O.synths = list(medicine) + var/obj/item/stack/medical/advanced/bruise_pack/B = locate() in modules B.uses_charge = 1 B.charge_costs = list(1000) B.synths = list(medicine) + var/obj/item/stack/medical/splint/S = locate() in modules S.uses_charge = 1 S.charge_costs = list(1000) S.synths = list(medicine) - src.modules += O - src.modules += B - src.modules += S /obj/item/robot_module/robot/syndicate/combat_medic/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - - var/obj/item/reagent_containers/syringe/S = locate() in src.modules + var/obj/item/reagent_containers/syringe/S = locate() in modules if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index a554176536f..23edeb6877e 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,29 +1,11 @@ /mob/living/silicon/robot/get_jetpack() - if(module) - for(var/obj/item/tank/jetpack/J in module.modules) - return J + return module?.jetpack /mob/living/silicon/robot/Check_Shoegrip() return module && module.no_slip /mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip) - var/obj/item/tank/jetpack/thrust = get_jetpack() - if(thrust?.can_thrust(0.01)) - return 0 - if(module && module.no_slip) - return 0 - ..(prob_slip) - -/mob/living/silicon/robot/Process_Spacemove(var/check_drift = 0) - if(..())//Can move due to other reasons, don't use jetpack fuel - return 1 - - var/obj/item/tank/jetpack/thrust = get_jetpack() - if(thrust && (!check_drift || (check_drift && thrust.stabilization_on)) && thrust.do_thrust(0.01)) - inertia_dir = 0 - return 1 - - return 0 + return ..(module?.no_slip ? 0 : prob_slip) //No longer needed, but I'll leave it here incase we plan to re-use it. /mob/living/silicon/robot/movement_delay() @@ -43,7 +25,7 @@ return 0 var/datum/robot_component/actuator/A = get_component("actuator") - if (cell_use_power(A.active_usage)) + if (cell_use_power(A.active_usage * power_efficiency)) return ..() /mob/living/silicon/robot/Moved(atom/old_loc, direction, forced = FALSE) diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm index b99a141163d..f0735d3428a 100644 --- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm @@ -7,12 +7,17 @@ GLOBAL_LIST_EMPTY(available_ai_shells) var/deployed = FALSE var/mob/living/silicon/ai/mainframe = null -// Premade AI shell, for roundstart shells. +// Premade AI shells, for roundstart landmark spawn. /mob/living/silicon/robot/ai_shell/Initialize() mmi = new /obj/item/mmi/inert/ai_remote(src) post_mmi_setup() return ..() +/mob/living/silicon/robot/flying/ai_shell/Initialize() + mmi = new /obj/item/mmi/inert/ai_remote(src) + post_mmi_setup() + return ..() + // Call after inserting or instantiating an MMI. /mob/living/silicon/robot/proc/post_mmi_setup() if(istype(mmi, /obj/item/mmi/inert/ai_remote)) @@ -128,8 +133,12 @@ GLOBAL_LIST_EMPTY(available_ai_shells) icon = 'icons/mob/screen1.dmi' icon_state = "x3" delete_me = TRUE + var/shell_type = /mob/living/silicon/robot/ai_shell /obj/effect/landmark/free_ai_shell/Initialize() if(config.allow_ai_shells && config.give_free_ai_shell) - new /mob/living/silicon/robot/ai_shell(get_turf(src)) + new shell_type(get_turf(src)) return ..() + +/obj/effect/landmark/free_ai_shell/flying + shell_type = /mob/living/silicon/robot/flying/ai_shell diff --git a/code/modules/mob/living/silicon/robot/subtypes/flying.dm b/code/modules/mob/living/silicon/robot/subtypes/flying.dm new file mode 100644 index 00000000000..e2a89d7a4e7 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/flying.dm @@ -0,0 +1,65 @@ +/mob/living/silicon/robot/flying + desc = "A utility robot with an anti-gravity hover unit and a lightweight frame." + icon = 'icons/mob/robots/robots_flying.dmi' + module_category = ROBOT_MODULE_TYPE_FLYING + dismantle_type = /obj/item/robot_parts/frame/flyer + power_efficiency = 0.75 + + // They are not very heavy or strong. + mob_size = MOB_SMALL + mob_bump_flag = SIMPLE_ANIMAL + mob_swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL + mob_push_flags = MONKEY|SLIME|SIMPLE_ANIMAL + +/mob/living/silicon/robot/flying/update_floating() + if(hovering) + make_floating(TRUE) + return + ..() + +/mob/living/silicon/robot/flying/initialize_components() + components["actuator"] = new/datum/robot_component/actuator(src) + components["radio"] = new/datum/robot_component/radio(src) + components["power cell"] = new/datum/robot_component/cell(src) + components["diagnosis unit"] = new/datum/robot_component/diagnosis_unit(src) + components["camera"] = new /datum/robot_component/camera(src) + components["comms"] = new/datum/robot_component/binary_communication(src) + components["armour"] = new/datum/robot_component/armour/light(src) + +/mob/living/silicon/robot/flying/Life() + . = ..() + if(incapacitated() || !is_component_functioning("actuator")) + stop_hovering() + else + start_hovering() + +/mob/living/silicon/robot/flying/proc/start_hovering() + if(!hovering) + hovering = TRUE + pass_flags |= PASSTABLE + default_pixel_y = 0 + update_floating() + +/mob/living/silicon/robot/flying/proc/stop_hovering() + if(hovering) + hovering = FALSE + pass_flags &= ~PASSTABLE + default_pixel_y = -8 + update_floating() + +/mob/living/silicon/robot/flying/death() + . = ..() + if(!QDELETED(src) && stat == DEAD) + stop_hovering() + +/mob/living/silicon/robot/flying/Allow_Spacemove(var/dense_object) + return hovering || ..() + +/mob/living/silicon/robot/flying/Process_Spaceslipping(var/prob_slip = 5) + return ..(hovering ? 0 : prob_slip) + +/mob/living/silicon/robot/flying/can_fall(anchor_bypass = FALSE, turf/location_override = loc) + return !hovering && ..() + +/mob/living/silicon/robot/flying/can_overcome_gravity() + return hovering diff --git a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm index 3706f212c97..a71cd78a44c 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm @@ -11,17 +11,12 @@ /mob/living/silicon/robot/gravekeeper/init() aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) - mmi = new /obj/item/mmi/digital/robot(src) module = new /obj/item/robot_module/robot/gravekeeper(src) cut_overlays() init_id() - updatename("Gravekeeper") - if(!cell) cell = new /obj/item/cell/high(src) // 15k cell, as recharging stations are a lot more rare on the Surface. - laws = new /datum/ai_laws/gravekeeper() - playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0) diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm index 41a750332f4..5084e66018d 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/robot/lost +/mob/living/silicon/robot/flying/lost lawupdate = 0 scrambledcodes = 1 icon_state = "drone-lost" @@ -8,7 +8,7 @@ idcard_type = /obj/item/card/id icon_selected = FALSE -/mob/living/silicon/robot/lost/init() +/mob/living/silicon/robot/flying/lost/init() aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) mmi = new /obj/item/mmi/digital/robot(src) @@ -23,12 +23,12 @@ playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0) -/mob/living/silicon/robot/lost/speech_bubble_appearance() +/mob/living/silicon/robot/flying/lost/speech_bubble_appearance() return "synthetic_evil" -/mob/living/silicon/robot/lost/randomlaws +/mob/living/silicon/robot/flying/lost/randomlaws -/mob/living/silicon/robot/lost/randomlaws/init() +/mob/living/silicon/robot/flying/lost/randomlaws/init() ..() laws = give_random_lawset() diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm index 57c76909b94..c860b949775 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm @@ -1,28 +1,12 @@ -// Spawner landmarks are used because platforms that are mapped during -// SSatoms init try to Initialize() twice. I have no idea why and I am -// not paid enough to spend more time trying to debug it. -/obj/effect/landmark/robot_platform - name = "recon platform spawner" - icon = 'icons/mob/screen1.dmi' - icon_state = "x3" - delete_me = TRUE - var/platform_type - -/obj/effect/landmark/robot_platform/Initialize() - if(platform_type) - new platform_type(get_turf(src)) - return ..() - /mob/living/silicon/robot/platform name = "support platform" desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence." - icon = 'icons/mob/robots_thinktank.dmi' + icon = 'icons/mob/robots/robots_platform.dmi' icon_state = "tachi" color = "#68a2f2" cell = /obj/item/cell/mech idcard_type = /obj/item/card/id/platform - module = /obj/item/robot_module/robot/platform lawupdate = FALSE modtype = "Standard" @@ -33,6 +17,10 @@ mob_push_flags = HEAVY mob_size = MOB_LARGE + dismantle_type = /obj/item/robot_parts/frame/platform + module_category = ROBOT_MODULE_TYPE_PLATFORM + + var/mapped = FALSE var/has_had_player = FALSE var/const/platform_respawn_time = 3 MINUTES @@ -42,19 +30,6 @@ var/tmp/recharger_tick_cost = 80 KILOWATTS var/weakref/recharging - var/list/stored_atoms - var/max_stored_atoms = 1 - var/static/list/can_store_types = list( - /mob/living, - /obj/item, - /obj/structure, - /obj/machinery - ) - // Currently set to prevent tonks hauling a deliaminating SM into the middle of the station. - var/static/list/cannot_store_types = list( - /obj/machinery/power/supermatter - ) - /mob/living/silicon/robot/platform/Login() . = ..() has_had_player = TRUE @@ -66,9 +41,10 @@ /mob/living/silicon/robot/platform/Initialize(var/mapload) . = ..() - if(!mmi) - mmi = new /obj/item/mmi/digital/robot(src) - SetName("inactive [initial(name)]") + if(mapped) + if(!mmi) + mmi = new /obj/item/mmi/digital/robot(src) + SetName("inactive [initial(name)]") updateicon() // Copypasting from root proc to avoid calling ..() and accidentally creating duplicate armour etc. @@ -82,11 +58,13 @@ components["armour"] = new /datum/robot_component/armour/platform(src) /mob/living/silicon/robot/platform/Destroy() - for(var/weakref/drop_ref in stored_atoms) - var/atom/movable/drop_atom = drop_ref.resolve() - if(istype(drop_atom) && !QDELETED(drop_atom) && drop_atom.loc == src) - drop_atom.dropInto(loc) - stored_atoms = null + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(istype(thinktank_module)) + for(var/weakref/drop_ref in thinktank_module.stored_atoms) + var/atom/movable/drop_atom = drop_ref.resolve() + if(istype(drop_atom) && !QDELETED(drop_atom) && drop_atom.loc == src) + drop_atom.dropInto(loc) + thinktank_module.stored_atoms = null if(recharging) var/obj/item/recharging_atom = recharging.resolve() if(istype(recharging_atom) && recharging_atom.loc == src) @@ -108,9 +86,10 @@ else . += "Its recharging port is empty." - if(length(stored_atoms)) + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(istype(thinktank_module) && length(thinktank_module.stored_atoms)) var/list/atom_names = list() - for(var/weakref/stored_ref in stored_atoms) + for(var/weakref/stored_ref in thinktank_module.stored_atoms) var/atom/movable/AM = stored_ref.resolve() if(istype(AM)) atom_names += "\a [AM]" @@ -127,9 +106,6 @@ if(ispath(module, /obj/item/robot_module)) module = new module(src) -/mob/living/silicon/robot/platform/module_reset() - return FALSE - /mob/living/silicon/robot/platform/use_power() . = ..() diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm index cbc8c4e4a1c..245240efed7 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm @@ -5,56 +5,74 @@ cut_overlays() underlays.Cut() + + var/use_armor_color + var/use_pupil_color + var/use_base_color + var/use_eye_color + var/use_state + var/list/use_decals var/obj/item/robot_module/robot/platform/tank_module = module - if(!istype(tank_module)) - icon = initial(icon) - icon_state = initial(icon_state) - color = initial(color) - return + if(istype(tank_module)) + use_pupil_color = tank_module.pupil_color + use_base_color = tank_module.base_color + use_eye_color = tank_module.eye_color + use_armor_color = tank_module.armor_color + icon = tank_module.user_icon + use_state = tank_module.user_icon_state + use_decals = tank_module.decals + else + tank_module = /obj/item/robot_module/robot/platform + use_pupil_color = initial(tank_module.pupil_color) + use_base_color = initial(tank_module.base_color) + use_eye_color = initial(tank_module.eye_color) + use_armor_color = initial(tank_module.armor_color) + icon = initial(tank_module.user_icon) + use_state = initial(tank_module.user_icon_state) // This is necessary due to Polaris' liberal use of KEEP_TOGETHER and propensity for scaling transforms. // If we just apply state/colour to the base icon, RESET_COLOR on the additional overlays is ignored. - icon = tank_module.user_icon icon_state = "blank" color = null - var/image/I = image(tank_module.user_icon, tank_module.user_icon_state) - I.color = tank_module.base_color + + var/image/I = image(icon, use_state) + I.color = use_base_color I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) underlays += I - if(tank_module.armor_color) - I = image(icon, "[tank_module.user_icon_state]_armour") - I.color = tank_module.armor_color + if(use_armor_color) + I = image(icon, "[use_state]_armour") + I.color = use_armor_color I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) add_overlay(I) - for(var/decal in tank_module.decals) - I = image(icon, "[tank_module.user_icon_state]_[decal]") - I.color = tank_module.decals[decal] + for(var/decal in use_decals) + I = image(icon, "[use_state]_[decal]") + I.color = use_decals[decal] I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) add_overlay(I) - if(tank_module.eye_color) - I = image(icon, "[tank_module.user_icon_state]_eyes") - I.color = tank_module.eye_color + if(use_eye_color) + I = image(icon, "[use_state]_eyes") + I.color = use_eye_color I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) add_overlay(I) - if(client && key && stat == CONSCIOUS && tank_module.pupil_color) - I = image(icon, "[tank_module.user_icon_state]_pupils") - I.color = tank_module.pupil_color + if(use_pupil_color && client && key && stat == CONSCIOUS) + I = image(icon, "[use_state]_pupils") + I.color = use_pupil_color I.plane = PLANE_LIGHTING_ABOVE I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) add_overlay(I) if(opened) - add_overlay("[tank_module.user_icon_state]-open") + add_overlay("[use_state]-open") if(wiresexposed) - I = image(icon, "[tank_module.user_icon_state]-wires") + I = image(icon, "[use_state]-wires") else if(cell) - I = image(icon, "[tank_module.user_icon_state]-cell") + I = image(icon, "[use_state]-cell") else - I = image(icon, "[tank_module.user_icon_state]-nowires") + I = image(icon, "[use_state]-nowires") I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) add_overlay(I) diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm index f728e3bfd0b..c3f3383d2d4 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm @@ -34,7 +34,7 @@ /mob/living/silicon/robot/platform/attack_ghost(mob/observer/ghost/user) - if(client || key || stat == DEAD || !ticker || !ticker.mode) + if(!mapped || client || key || stat == DEAD || !ticker || !ticker.mode) return ..() var/confirm = alert("Do you wish to take control of \the [src]?", "Platform Control", "No", "Yes") @@ -43,7 +43,7 @@ if(jobban_isbanned(user, "Robot")) to_chat(user, SPAN_WARNING("You are banned from synthetic roles and cannot take control of \the [src].")) - return + return // Boilerplate from drone fabs, unsure if there's a shared proc to use instead. var/deathtime = world.time - user.timeofdeath diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm index c018fe30902..8e2ea9d50a0 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm @@ -1,25 +1,36 @@ /obj/item/robot_module/robot/platform - hide_on_manifest = TRUE + module_category = ROBOT_MODULE_TYPE_PLATFORM + unavailable_by_default = TRUE var/pupil_color = COLOR_CYAN var/base_color = COLOR_WHITE var/eye_color = COLOR_BEIGE var/armor_color = "#68a2f2" - var/user_icon = 'icons/mob/robots_thinktank.dmi' + var/user_icon = 'icons/mob/robots/robots_platform.dmi' var/user_icon_state = "tachi" var/list/decals var/list/available_decals = list( - "Stripe" = "stripe", + "Stripe" = "stripe", "Vertical Stripe" = "stripe_vertical" ) -// Only show on manifest if they have a player. -/obj/item/robot_module/robot/platform/hide_on_manifest() - if(isrobot(loc)) - var/mob/living/silicon/robot/R = loc - return !R.key + var/list/stored_atoms + var/max_stored_atoms = 1 + var/static/list/can_store_types = list( + /mob/living, + /obj/item, + /obj/structure, + /obj/machinery + ) + // Currently set to prevent tonks hauling a deliaminating SM into the middle of the station. + var/static/list/cannot_store_types = list( + /obj/machinery/power/supermatter + ) + +/obj/item/robot_module/robot/platform/Destroy() + QDEL_NULL_LIST(stored_atoms) return ..() /obj/item/robot_module/robot/platform/verb/set_eye_colour() @@ -31,11 +42,14 @@ var/new_pupil_color = input(usr, "Select a pupil colour.", "Pupil Colour Selection") as color|null if(usr.incapacitated() || QDELETED(usr) || QDELETED(src) || loc != usr) return - + pupil_color = new_pupil_color || initial(pupil_color) usr.update_icon() /obj/item/robot_module/robot/platform/explorer + name = "recon platform module" + display_name = "Recon" + unavailable_by_default = FALSE armor_color = "#528052" eye_color = "#7b7b46" decals = list( @@ -46,32 +60,28 @@ "Science" = 1, "Explorer" = 1 ) + modules = list( + /obj/item/tool/wrench/cyborg, + /obj/item/weldingtool/electric/mounted/cyborg, + /obj/item/tool/wirecutters/cyborg, + /obj/item/tool/screwdriver/cyborg, + /obj/item/pickaxe/plasmacutter, + /obj/item/material/knife/machete/cyborg, + /obj/item/gun/energy/phasegun/mounted/cyborg, + /obj/item/stack/medical/bruise_pack + ) + emag = /obj/item/chainsaw + synths = list( + /datum/matter_synth/medicine = 7500 + ) -/obj/item/robot_module/robot/platform/explorer/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - modules += new /obj/item/tool/wrench/cyborg(src) - modules += new /obj/item/weldingtool/electric/mounted/cyborg(src) - modules += new /obj/item/tool/wirecutters/cyborg(src) - modules += new /obj/item/tool/screwdriver/cyborg(src) - modules += new /obj/item/pickaxe/plasmacutter(src) - modules += new /obj/item/material/knife/machete/cyborg(src) - - var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(7500) - var/obj/item/stack/medical/bruise_pack/bandaid = new(src) +/obj/item/robot_module/robot/platform/explorer/finalize_synths() + ..() + var/datum/matter_synth/medicine/medicine = locate() in synths + var/obj/item/stack/medical/bruise_pack/bandaid = locate() in modules bandaid.uses_charge = 1 bandaid.charge_costs = list(1000) bandaid.synths = list(medicine) - modules += bandaid - synths += medicine - - var/obj/item/gun/energy/phasegun/mounted/cyborg/phasegun = new(src) - modules += phasegun - - emag = new /obj/item/chainsaw(src) /obj/item/robot_module/robot/platform/explorer/respawn_consumable(var/mob/living/silicon/robot/R, rate) . = ..() @@ -83,6 +93,9 @@ pew.charge_tick = 0 /obj/item/robot_module/robot/platform/cargo + name = "logistics platform module" + display_name = "Logistics" + unavailable_by_default = FALSE armor_color = "#d5b222" eye_color = "#686846" decals = list( @@ -91,17 +104,13 @@ ) channels = list("Supply" = 1) networks = list(NETWORK_MINE) - -/obj/item/robot_module/robot/platform/cargo/Initialize() - - . = ..() - if(. != INITIALIZE_HINT_NORMAL) - return - - modules += new /obj/item/packageWrap(src) - modules += new /obj/item/pen/multi(src) - modules += new /obj/item/destTagger(src) - emag = new /obj/item/stamp/denied + max_stored_atoms = 3 + modules = list( + /obj/item/packageWrap, + /obj/item/pen/multi, + /obj/item/destTagger, + ) + emag = /obj/item/stamp/denied /obj/item/robot_module/robot/platform/cargo/respawn_consumable(mob/living/silicon/robot/R, rate) . = ..() diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm index ec6d6f42678..ed01060cb45 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm @@ -9,18 +9,24 @@ recharging_atom.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30) recharging = null - if(length(stored_atoms)) - for(var/weakref/stored_ref in stored_atoms) + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(istype(thinktank_module) && length(thinktank_module.stored_atoms)) + for(var/weakref/stored_ref in thinktank_module.stored_atoms) var/atom/movable/dropping = stored_ref.resolve() if(istype(dropping) && !QDELETED(dropping) && dropping.loc == src) dropping.dropInto(loc) dropping.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30) - stored_atoms = null + thinktank_module.stored_atoms = null . = ..() /mob/living/silicon/robot/platform/proc/can_store_atom(var/atom/movable/storing, var/mob/user) + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(!istype(thinktank_module)) + to_chat(user, SPAN_WARNING("Select a module first!")) + return FALSE + if(!istype(storing)) var/storing_target = (user == src) ? "yourself" : "\the [src]" to_chat(user, SPAN_WARNING("You cannot store that inside [storing_target].")) @@ -38,7 +44,7 @@ to_chat(user, SPAN_WARNING("You cannot store [storing_target] inside [storing_target]!")) return FALSE - if(length(stored_atoms) >= max_stored_atoms) + if(length(thinktank_module.stored_atoms) >= thinktank_module.max_stored_atoms) var/storing_target = (user == src) ? "Your" : "\The [src]'s" to_chat(user, SPAN_WARNING("[storing_target] cargo compartment is full.")) return FALSE @@ -50,13 +56,13 @@ to_chat(user, SPAN_WARNING("\The [storing] is too big for [storing_target].")) return FALSE - for(var/store_type in can_store_types) + for(var/store_type in thinktank_module.can_store_types) if(istype(storing, store_type)) . = TRUE break if(.) - for(var/store_type in cannot_store_types) + for(var/store_type in thinktank_module.cannot_store_types) if(istype(storing, store_type)) . = FALSE break @@ -65,20 +71,25 @@ to_chat(user, SPAN_WARNING("You cannot store \the [storing] inside [storing_target].")) /mob/living/silicon/robot/platform/proc/store_atom(var/atom/movable/storing, var/mob/user) - if(istype(storing)) + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(istype(thinktank_module) && istype(storing)) storing.forceMove(src) - LAZYDISTINCTADD(stored_atoms, weakref(storing)) + LAZYDISTINCTADD(thinktank_module.stored_atoms, weakref(storing)) /mob/living/silicon/robot/platform/proc/drop_stored_atom(var/atom/movable/ejecting, var/mob/user) - if(!ejecting && length(stored_atoms)) - var/weakref/stored_ref = stored_atoms[1] + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(!istype(thinktank_module)) + return + + if(!ejecting && length(thinktank_module.stored_atoms)) + var/weakref/stored_ref = thinktank_module.stored_atoms[1] if(!istype(stored_ref)) - LAZYREMOVE(stored_atoms, stored_ref) + LAZYREMOVE(thinktank_module.stored_atoms, stored_ref) else ejecting = stored_ref?.resolve() - LAZYREMOVE(stored_atoms, weakref(ejecting)) + LAZYREMOVE(thinktank_module.stored_atoms, weakref(ejecting)) if(istype(ejecting) && !QDELETED(ejecting) && ejecting.loc == src) ejecting.dropInto(loc) if(user == src) @@ -90,14 +101,15 @@ if(isrobot(user) && user.Adjacent(src)) return try_remove_cargo(user) return ..() - + /mob/living/silicon/robot/platform/proc/try_remove_cargo(var/mob/user) - if(!length(stored_atoms) || !istype(user)) + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(!istype(thinktank_module) || !length(thinktank_module.stored_atoms) || !istype(user)) return FALSE - var/weakref/remove_ref = stored_atoms[length(stored_atoms)] + var/weakref/remove_ref = thinktank_module.stored_atoms[length(thinktank_module.stored_atoms)] var/atom/movable/removing = remove_ref?.resolve() if(!istype(removing) || QDELETED(removing) || removing.loc != src) - LAZYREMOVE(stored_atoms, remove_ref) + LAZYREMOVE(thinktank_module.stored_atoms, remove_ref) else user.visible_message(SPAN_NOTICE("\The [user] begins unloading \the [removing] from \the [src]'s cargo compartment.")) if(do_after(user, 3 SECONDS, src) && !QDELETED(removing) && removing.loc == src) @@ -113,7 +125,8 @@ to_chat(src, SPAN_WARNING("You are not in any state to do that.")) return - if(length(stored_atoms)) + var/obj/item/robot_module/robot/platform/thinktank_module = module + if(istype(thinktank_module) && length(thinktank_module.stored_atoms)) drop_stored_atom(user = src) else to_chat(src, SPAN_WARNING("You have nothing in your cargo compartment.")) @@ -136,4 +149,4 @@ return FALSE if(user.incapacitated() || !Adjacent(user) || !dropping.Adjacent(user)) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm deleted file mode 100644 index 1ffc3df88d9..00000000000 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm +++ /dev/null @@ -1,32 +0,0 @@ -/mob/living/silicon/robot/platform/explorer - name = "recon platform" - desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one is lightly armoured and fitted with all-terrain wheels." - modtype = "Recon" - module = /obj/item/robot_module/robot/platform/explorer - -/mob/living/silicon/robot/platform/explorer/Initialize() - . = ..() - laws = new /datum/ai_laws/explorer - -/mob/living/silicon/robot/platform/explorer/welcome_client() - ..() - if(client) // ganbatte tachikoma-san - to_chat(src, SPAN_NOTICE("You are tasked with supporting the Exploration and Science staff as they unearth the secrets of the planet. Do your best!")) - -/obj/effect/landmark/robot_platform/explorer - platform_type = /mob/living/silicon/robot/platform/explorer - -/mob/living/silicon/robot/platform/cargo - name = "logistics platform" - desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one has an expanded storage compartment." - modtype = "Logistics" - module = /obj/item/robot_module/robot/platform/cargo - max_stored_atoms = 3 - -/mob/living/silicon/robot/platform/cargo/welcome_client() - ..() - if(client) - to_chat(src, SPAN_NOTICE("You are tasked with supporting the Cargo and Supply staff as they handle operational logistics. Do your best!")) - -/obj/effect/landmark/robot_platform/cargo - platform_type = /mob/living/silicon/robot/platform/cargo diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm b/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm index f60f8ed04f5..ad134a391c2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/_animal_harness.dm @@ -14,6 +14,7 @@ var/const/ATTACHED_ARMOR = "armor plate" var/const/ATTACHED_LIGHT = "light" var/const/ATTACHED_ID = "access card" + var/const/ATTACHED_TAG = "tag" /// Contains valid types that the harness will attach to. var/list/harnessable_types diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm index 4065af0d70a..4b7559f49ec 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird.dm @@ -99,4 +99,4 @@ icon_scale_y = 0.5 /decl/mob_organ_names/bird - hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing") \ No newline at end of file + hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm index b8a953fbd8d..70fa7339090 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_harness.dm @@ -19,7 +19,8 @@ /obj/item/storage/animal_harness/grafadreka/proc/UpdateArmor ), /obj/item/card/id = ATTACHED_ID, - /obj/item/flashlight = ATTACHED_LIGHT + /obj/item/flashlight = ATTACHED_LIGHT, + /obj/item/clothing/accessory/medal = ATTACHED_TAG ) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_interaction.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_interaction.dm index 060e02c0a4f..4501655a386 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_interaction.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka/grafadreka_interaction.dm @@ -13,6 +13,14 @@ Open() +/obj/structure/fence/door/interaction_grafadreka(mob/living/simple_mob/animal/sif/grafadreka/drake) + . = TRUE + if (drake.a_intent == I_HURT) + return ..() + if (!open && !locked) + toggle(drake) + + /obj/structure/loot_pile/interaction_grafadreka(mob/living/simple_mob/animal/sif/grafadreka/drake) . = TRUE if (drake.a_intent == I_HURT) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/space.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/space.dm index b7f77e64104..a56227b63d4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/space.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/space.dm @@ -12,4 +12,4 @@ // They can also, you know, move around, in space /mob/living/simple_mob/animal/space/Process_Spacemove(var/check_drift = 0) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm index c28c4907892..c055da140fb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -430,4 +430,4 @@ /obj/random/projectile/scrapped_grenadelauncher = 100, /obj/item/grenade/spawnergrenade/manhacks/mercenary = 50, /obj/item/grenade/spawnergrenade/manhacks/mercenary = 30 - ) \ No newline at end of file + ) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm index f0f5647ce0f..5246478721a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm @@ -150,4 +150,4 @@ /decl/mob_organ_names/miningdrone - hit_zones = list("chassis", "comms array", "sensor suite", "left excavator module", "right excavator module", "maneuvering thruster") \ No newline at end of file + hit_zones = list("chassis", "comms array", "sensor suite", "left excavator module", "right excavator module", "maneuvering thruster") diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/hoverpod.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/hoverpod.dm index cf8dc16ae7f..be5cb7768e5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/hoverpod.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/hoverpod.dm @@ -44,4 +44,4 @@ return TRUE /decl/mob_organ_names/hoverpod - hit_zones = list("central chassis", "control module", "hydraulics", "left manipulator", "right manipulator", "left landing strut", "right landing strut", "maneuvering thruster", "sensor suite", "radiator", "power supply") \ No newline at end of file + hit_zones = list("central chassis", "control module", "hydraulics", "left manipulator", "right manipulator", "left landing strut", "right landing strut", "maneuvering thruster", "sensor suite", "radiator", "power supply") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index 3a3c95042aa..c58ce0bd7c8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -142,8 +142,8 @@ . += "It looks severely dented!" //Constructs levitate, can fall from a shuttle with no harm, and are piloted by either damned spirits or some otherworldly entity. Let 'em float in space. -/mob/living/simple_mob/construct/Process_Spacemove() - return 1 +/mob/living/simple_mob/construct/Process_Spacemove(var/check_drift = 0) + return TRUE /* // Glowing Procs @@ -155,4 +155,4 @@ /mob/living/simple_mob/construct/proc/remove_glow() overlays.Cut() -*/ \ No newline at end of file +*/ diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm index daca3721dac..f47d733ff67 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm @@ -43,7 +43,7 @@ minbodytemp = 0 /mob/living/simple_mob/faithless/Process_Spacemove(var/check_drift = 0) - return 1 + return TRUE /mob/living/simple_mob/faithless/apply_melee_effects(var/atom/A) if(isliving(A)) diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index 48efc9e9e11..984dafb0dcd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -238,4 +238,4 @@ var/global/list/_slime_default_emotes = list( visible_message("\The [src] squishes!") /decl/mob_organ_names/slime - hit_zones = list("cytoplasmic membrane") \ No newline at end of file + hit_zones = list("cytoplasmic membrane") diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/combat.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/combat.dm index f466bde00c4..b8539349eb1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/combat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/combat.dm @@ -12,7 +12,7 @@ if(ishuman(L)) var/mob/living/carbon/human/H = L - stun_power *= max(H.species.siemens_coefficient, 0) + stun_power *= max(H.species.get_siemens_coefficient(H), 0) if(prob(stun_power * 10)) // Try an electric shock. power_charge = max(0, power_charge - 3) diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index b8bfabd6640..82cd6346aea 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -149,6 +149,12 @@ /mob/living/simple_mob/slime/xenobio/orange ) + +/mob/living/simple_mob/slime/xenobio/yellow/ICheckRangedAttack(atom/A) + if (!ismob(A)) + return FALSE + return ..() + /mob/living/simple_mob/slime/xenobio/yellow/apply_melee_effects(atom/A) ..() if(isliving(A)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9a3265b6445..260ab4dee8a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -405,16 +405,18 @@ // Try harder to find a key to use if(!keytouse && key) keytouse = ckey(key) - else if(!keytouse && mind?.key) + if (!keytouse && mind?.key) keytouse = ckey(mind.key) - + if (!keytouse) + return GLOB.respawn_timers[keytouse] = world.time + time + /mob/observer/dead/set_respawn_timer() if(config.antag_hud_restricted && has_enabled_antagHUD) ..(-1) else - return // Don't set it, no need + ..() /mob/verb/abandon_mob() set name = "Return to Menu" @@ -1265,4 +1267,7 @@ return TRUE /mob/proc/hearing_boost_range() - return hearing_boost_range \ No newline at end of file + return hearing_boost_range + +/mob/proc/devour(atom/movable/victim) + return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 66c8cd4db6e..edfa588a131 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -333,8 +333,8 @@ pin_down(affecting, assailant) //clicking on yourself while grabbing them - if(M == assailant && state >= GRAB_AGGRESSIVE) - devour(affecting, assailant) + if(M == assailant && state >= GRAB_AGGRESSIVE && assailant.devour(affecting)) + qdel(src) /obj/item/grab/dropped() loc = null diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index 7bbc72844d2..0c62b9402f6 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -148,27 +148,3 @@ step_to(attacker, target) attacker.set_dir(EAST) //face the victim target.set_dir(SOUTH) //face up - -/obj/item/grab/proc/devour(mob/target, mob/user) - var/can_eat - if((FAT in user.mutations) && ismini(target)) - can_eat = 1 - else - var/mob/living/carbon/human/H = user - if(istype(H) && H.species.gluttonous) - if(H.species.gluttonous == 2) - can_eat = 2 - else if((H.mob_size > target.mob_size) && !ishuman(target) && ismini(target)) - can_eat = 1 - - if(can_eat) - var/mob/living/carbon/attacker = user - user.visible_message("[user] is attempting to devour [target]!") - if(can_eat == 2) - if(!do_mob(user, target)||!do_after(user, 30)) return - else - if(!do_mob(user, target)||!do_after(user, 70)) return - user.visible_message("[user] devours [target]!") - target.loc = user - attacker.stomach_contents.Add(target) - qdel(src) \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 2d467bc99f2..885666e65a8 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -26,13 +26,6 @@ return L.mob_size <= MOB_TINY return 0 - -/proc/ismini(A) - if(A && istype(A, /mob/living)) - var/mob/living/L = A - return L.mob_size <= MOB_MINISCULE - return 0 - /mob/living/silicon/isSynthetic() return 1 @@ -683,4 +676,4 @@ var/global/image/backplane item.screen_loc = screen_place /mob/proc/can_feed() - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 9e4aa252d0e..84add309d34 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -202,7 +202,7 @@ // Can't control ourselves when drifting if((isspace(loc) || my_mob.lastarea?.has_gravity == 0) && isturf(loc)) - if(!my_mob.Process_Spacemove(0)) + if(!my_mob.Process_Spacemove(FALSE)) return 0 // Inside an object, tell it we moved @@ -395,6 +395,16 @@ /mob/proc/get_jetpack() return +// Checks whether this mob is allowed to move in space +// Return 1 for movement, 0 for none, +/mob/proc/Allow_Spacemove(var/dense_object) + if(restrained()) + return FALSE + var/obj/item/tank/jetpack/J = get_jetpack() + if(J?.can_thrust(0.01)) + return TRUE + return !!dense_object + ///Process_Spacemove ///Called by /client/Move() ///For moving in space @@ -402,26 +412,31 @@ /mob/proc/Process_Spacemove(var/check_drift = 0) if(is_incorporeal()) - return + return FALSE - if(!Check_Dense_Object()) //Nothing to push off of so end here - update_floating(0) - return 0 + var/dense_object = Check_Dense_Object() + if(!Allow_Spacemove(dense_object)) + update_floating(dense_object) + return FALSE - update_floating(1) - - if(restrained()) //Check to see if we can do things - return 0 + var/obj/item/tank/jetpack/thrust = get_jetpack() + if(dense_object || ((!check_drift || thrust?.stabilization_on) && !lying && thrust.do_thrust(0.01, src))) + inertia_dir = 0 + return TRUE + else if(!dense_object) //Nothing to push off of so end here + update_floating(FALSE) + return FALSE //Check to see if we slipped if(prob(Process_Spaceslipping(5)) && !buckled) to_chat(src, "You slipped!") inertia_dir = last_move step(src, src.inertia_dir) // Not using Move for smooth glide here because this is a 'slip' so should be sudden. - return 0 + return FALSE + //If not then we can reset inertia and move inertia_dir = 0 - return 1 + return TRUE /mob/proc/Check_Dense_Object() //checks for anything to push off in the vicinity. also handles magboots on gravity-less floors tiles diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index ea7022a0604..b7b33494ac0 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -419,6 +419,13 @@ var/datum/job/J = SSjob.get_job(rank) + // Get the appropriate announcement title. + var/announce_rank = rank + if(J?.substitute_announce_title) + announce_rank = J.substitute_announce_title + else if(character.mind.role_alt_title) + announce_rank = character.mind.role_alt_title + // AIs don't need a spawnpoint, they must spawn at an empty core if(J.mob_type & JOB_SILICON_AI) @@ -431,7 +438,7 @@ // AIize the character, but don't move them yet character = character.AIize(move = FALSE) // Dupe of code in /datum/controller/subsystem/ticker/proc/create_characters() for non-latespawn, unify? - AnnounceCyborg(character, rank, "has been transferred to the empty core in \the [character.loc.loc]") + AnnounceCyborg(character, announce_rank, "has been transferred to the empty core in \the [character.loc.loc]") ticker.mode.latespawn(character) qdel(C) //Deletes empty core (really?) @@ -453,10 +460,10 @@ var/do_announce = join_props["announce"] && join_message && announce_channel if(J.mob_type & JOB_SILICON) if(do_announce) - AnnounceCyborg(character, rank, join_message, announce_channel, character.z) + AnnounceCyborg(character, announce_rank, join_message, announce_channel, character.z) else if(do_announce) - AnnounceArrival(character, J?.substitute_announce_title || rank, join_message, announce_channel, character.z) + AnnounceArrival(character, announce_rank, join_message, announce_channel, character.z) data_core.manifest_inject(character) ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn @@ -465,8 +472,6 @@ /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel) if (ticker.current_state == GAME_STATE_PLAYING) var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE, om_range = DEFAULT_OVERMAP_RANGE) : null - if(character.mind.role_alt_title) - rank = character.mind.role_alt_title // can't use their name here, since cyborg namepicking is done post-spawn, so we'll just say "A new Cyborg has arrived"/"A new Android has arrived"/etc. global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer", channel, zlevels) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 0afcaa41030..5a80d6f69f4 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1219,20 +1219,6 @@ icon_state = "hair_ziegler" flags = HAIR_TIEABLE -/datum/sprite_accessory/hair/una_hood - name = "Cobra Hood" - icon = 'icons/mob/human_face_alt.dmi' - icon_add = 'icons/mob/human_face_alt_add.dmi' - icon_state = "soghun_hood" - species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) - -/datum/sprite_accessory/hair/una_doublehorns - name = "Double Unathi Horns" - icon = 'icons/mob/human_face_alt.dmi' - icon_add = 'icons/mob/human_face_alt_add.dmi' - icon_state = "soghun_dubhorns" - species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) - /datum/sprite_accessory/hair/sergal_plain name = "Sergal Plain" icon = 'icons/mob/human_face_alt.dmi' @@ -1688,9 +1674,83 @@ shaved //Unathi Head-Bits /datum/sprite_accessory/hair/una - name = "Long Unathi Spines" - icon_state = "soghun_longspines" + name = "Long Unathi Spines" + icon_state = "soghun_longspines" species_allowed = list(SPECIES_UNATHI) + icon = 'icons/mob/hair_unathi.dmi' + icon_add = 'icons/mob/hair_unathi_add.dmi' + +/datum/sprite_accessory/hair/una/finhawk + name = "Unathi Finhawk" + icon_state = "fin_hawk" + +/datum/sprite_accessory/hair/una/downcurve_horns + name = "Downward-Curved Unathi Horns" + icon_state = "curved_down" + +/datum/sprite_accessory/hair/una/upcurve_horns + name = "Upward-Curved Unathi Horns" + icon_state = "curved_up" + +/datum/sprite_accessory/hair/una/samurai_horns + name = "Unathi Samurai Horns" + icon_state = "samurai" + +/datum/sprite_accessory/hair/una/big_frills + name = "Big Unathi Frills" + icon_state = "big_frills" + +/datum/sprite_accessory/hair/una/head_spikes + name = "Unathi Head Spikes" + icon_state = "head_spikes" + +/datum/sprite_accessory/hair/una/overgrown_spikes + name = "Overgrown Unathi Head Spikes" + icon_state = "overgrown_head_spikes" + +/datum/sprite_accessory/hair/una/cobrahood + name = "Unathi Cobra Hood" + icon_state = "unathi_cobrahood" + +/datum/sprite_accessory/hair/una/demon_horns + name = "Unathi Demon Horns" + icon_state = "unathi_horns_demon" + +/datum/sprite_accessory/hair/una/large_ram_horns + name = "Large Unathi Ram Horns" + icon_state = "unathi_horns_ram_big" + +/datum/sprite_accessory/hair/una/aqua_frills + name = "Unathi Aqua Frills" + icon_state = "unathi_frills_aqua" + +/datum/sprite_accessory/hair/una/curled_horns + name = "Curled Unathi Horns" + icon_state = "unathi_horns_curled" + +/datum/sprite_accessory/hair/una/ram_horns + name = "Unathi Ram Horns" + icon_state = "unathi_horns_ram" + +/datum/sprite_accessory/hair/una/thick_ram_horns + name = "Thick Unathi Ram Horns" + icon_state = "unathi_horns_ram_thick" + +/datum/sprite_accessory/hair/una/double_horns + name = "Double Unathi Horns" + icon_state = "unathi_horns_double" + +/datum/sprite_accessory/hair/una/swept_horns + name = "Swept Unathi Horns" + icon_state = "unathi_horns_swept" + +/datum/sprite_accessory/hair/una/short_spined_frills + name = "Short Spined Unathi Frills" + icon_state = "unathi_spined_short_frills" + +/datum/sprite_accessory/hair/una/long_spined_frills + name = "Long Spined Unathi Frills" + icon_state = "unathi_spined_long_frills" /datum/sprite_accessory/hair/una/spines_short name = "Short Unathi Spines" @@ -1726,9 +1786,11 @@ shaved //Skrell 'hairstyles' /datum/sprite_accessory/hair/skr - name = "Tentacles, Average" - icon_state = "skrell_short" + name = "Tentacles, Average" + icon_state = "skrell_short" species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + icon = 'icons/mob/hair_skrell.dmi' + icon_add = 'icons/mob/hair_skrell_add.dmi' /datum/sprite_accessory/hair/skr/pullback name = "Tentacles, Average, Pullback" @@ -1770,6 +1832,11 @@ shaved name = "Tentacles, Very Long, Wavy" icon_state = "skrell_very_long_wavy" +/datum/sprite_accessory/hair/skr/split + name = "Tentacles, Split" + icon_state = "skrell_split" + + //Tajaran hairstyles /datum/sprite_accessory/hair/taj name = "Tajaran Ears" @@ -2075,6 +2142,7 @@ shaved icon = 'icons/mob/hair_vox.dmi' icon_add = 'icons/mob/hair_vox_add.dmi' icon_state = "vox_longbraid" + color_blend_mode = ICON_MULTIPLY species_allowed = list(SPECIES_VOX) /datum/sprite_accessory/hair/vox/braid_short @@ -2085,6 +2153,10 @@ shaved name = "Short Vox Quills" icon_state = "vox_shortquills" +/datum/sprite_accessory/hair/vox/quills_long + name = "Long Vox Quills" + icon_state = "vox_longquills" + /datum/sprite_accessory/hair/vox/quills_kingly name = "Kingly Vox Quills" icon_state = "vox_kingly" diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm index 31a002ac182..cfec791b47d 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -230,6 +230,12 @@ species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) color_blend_mode = ICON_ADD +/datum/sprite_accessory/tail/special/unathi_yeosa + name = "Yeosa'unathi tail" + icon_state = "unathitail_yeosa_s" + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + color_blend_mode = ICON_ADD + /datum/sprite_accessory/tail/special/tajaran name = "Tajaran tail" icon_state = "tajtail_s" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c7f0efe4d28..022cba9ccc2 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -136,7 +136,7 @@ return O //human -> robot -/mob/living/carbon/human/proc/Robotize() +/mob/living/carbon/human/proc/Robotize(supplied_robot_type = /mob/living/silicon/robot) if (transforming) return for(var/obj/item/W in src) @@ -149,7 +149,7 @@ for(var/t in organs) qdel(t) - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc ) + var/mob/living/silicon/robot/O = new supplied_robot_type( loc ) // cyborgs produced by Robotize get an automatic power cell O.cell = new(O) @@ -171,15 +171,12 @@ O.loc = loc O.job = "Cyborg" + if(O.mind.assigned_role == "Cyborg") - if(O.mind.role_alt_title == "Robot") - O.mmi = new /obj/item/mmi/digital/posibrain(O) - else if(O.mind.role_alt_title == "Drone") - O.mmi = new /obj/item/mmi/digital/robot(O) - else - O.mmi = new /obj/item/mmi(O) - - O.mmi.transfer_identity(src) + var/mmi_type = SSrobots.get_mmi_type_by_title(O.mind.role_alt_title ? O.mind.role_alt_title : O.mind.assigned_role) + if(mmi_type) + O.mmi = new mmi_type(O) + O.mmi.transfer_identity(src) if(O.client && O.client.prefs) var/datum/preferences/B = O.client.prefs diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm index ec80cb397ec..4cb962a7fab 100644 --- a/code/modules/multiz/stairs.dm +++ b/code/modules/multiz/stairs.dm @@ -13,7 +13,7 @@ /obj/structure/stairs/Initialize() ..() return INITIALIZE_HINT_LATELOAD - + /obj/structure/stairs/LateInitialize() ..() if(check_integrity()) @@ -21,13 +21,13 @@ // Returns TRUE if the stairs are a complete and connected unit, FALSE if a piece is missing or obstructed // Will attempt to reconnect broken pieces -// Parameters: +// Parameters: // - B1: Loc of bottom stair // - B2: Loc of middle stair // - T1: Openspace over bottom stair // - T2: Loc of top stair, over middle stair -/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, - var/obj/structure/stairs/middle/M = null, +/obj/structure/stairs/proc/check_integrity(var/obj/structure/stairs/bottom/B = null, + var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) @@ -94,14 +94,14 @@ var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ B.Adjacent(M) && (GetBelow(O) == get_turf(B)) && T.Adjacent(O) && \ ..()) return TRUE - + // If we're already configured, just check those else if(istype(top) && istype(middle)) O = locate(/turf/simulated/open) in GetAbove(src) @@ -121,7 +121,7 @@ // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work // Everything is simply linked in our original direction - if(istype(M) && istype(T) && ..(src, M, T, O)) + if(istype(M) && istype(T) && ..(src, M, T, O)) return TRUE // Else, we have to look in other directions @@ -130,12 +130,12 @@ T2 = GetAbove(B2) if(!istype(B2) || !istype(T2)) continue - + T = locate(/obj/structure/stairs/top) in T2 M = locate(/obj/structure/stairs/middle) in B2 if(..(src, M, T, O)) return TRUE - + // Out of the dir check, we have no valid neighbors, and thus are not complete. return FALSE @@ -146,21 +146,24 @@ use_stairs(AM, oldloc) ..() -/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) +/obj/structure/stairs/bottom/use_stairs(var/atom/movable/AM, var/atom/oldloc) // If we're coming from the top of the stairs, don't trap us in an infinite staircase // Or if we fell down the openspace if((top in oldloc) || oldloc == GetAbove(src)) return - + if(isobserver(AM)) // Ghosts have their own methods for going up and down return - + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs return - + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to return + if(istype(AM, /obj/structure/blob)) // Blobs can't go down stairs normally. They kind of.. roll down them, when spreading. (See: They just fall.) + return + var/list/atom/movable/pulling = list() // Will also include grabbed mobs if(isliving(AM)) var/mob/living/L = AM @@ -176,7 +179,7 @@ pulling |= L.pulling for(var/obj/item/grab/G in list(L.l_hand, L.r_hand)) pulling |= G.affecting - + // If the stairs aren't broken, go up. if(check_integrity()) AM.dir = src.dir @@ -188,7 +191,7 @@ // Move to Top AM.forceMove(get_turf(top)) - + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays for(var/atom/movable/P in pulling) P.forceMove(get_turf(top)) // Just bring it along directly, no fussing with animation timing @@ -203,18 +206,21 @@ if(isobserver(AM)) // Ghosts have their own methods for going up and down return + if(istype(AM, /obj/structure/blob)) // Blobs can't go down stairs normally. They kind of.. roll down them, when spreading. (See: They just fall.) + return + if(isliving(AM)) var/mob/living/L = AM - + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. return - + if(L.has_buckled_mobs()) return if(L.buckled) L.buckled.forceMove(get_turf(top)) - + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling @@ -225,7 +231,7 @@ G.affecting.forceMove(get_turf(top)) L.forceMove(get_turf(top)) - + if(L.client) L.client.Process_Grab() else @@ -259,10 +265,10 @@ // These are necessarily fairly similar, but because the positional relations are different, we have to copy-pasta a fair bit /obj/structure/stairs/middle/check_integrity(var/obj/structure/stairs/bottom/B = null, - var/obj/structure/stairs/middle/M = null, + var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ @@ -285,7 +291,7 @@ // Top is static for Middle stair, if it's invalid we can't do much if(!istype(T)) return FALSE - + // If you set the dir, that's the dir it *wants* to connect in. It only chooses the others if that doesn't work // Everything is simply linked in our original direction if(istype(B1) && istype(T2) && istype(O) && ..(B, src, T, O)) @@ -297,11 +303,11 @@ O = GetAbove(B1) if(!istype(B1) || !istype(O)) continue - + B = locate(/obj/structure/stairs/bottom) in B1 if(..(B, src, T, O)) return TRUE - + // The middle stair has some further special logic, in that it can be climbed, and so is technically valid if only the top exists // T is enforced by a prior if T.middle = src @@ -345,7 +351,7 @@ var/obj/structure/stairs/middle/M = null, var/obj/structure/stairs/top/T = null, var/turf/simulated/open/O = null) - + // In the case where we're provided all the pieces, just try connecting them. // In order: all exist, they are appropriately adjacent, and they can connect if(istype(B) && istype(M) && istype(T) && istype(O) && \ @@ -381,11 +387,11 @@ B1 = GetBelow(O) if(!istype(B1) || !istype(O)) continue - + B = locate(/obj/structure/stairs/bottom) in B1 if((. = ..(B, M, src, O))) return - + // Out of the dir check, we have no valid neighbors, and thus are not complete. `.` was set by ..() return @@ -407,16 +413,19 @@ // Or if we climb up the middle if((bottom in oldloc) || oldloc == GetBelow(src)) return - + if(isobserver(AM)) // Ghosts have their own methods for going up and down return - + if(AM.pulledby) // Animating the movement of pulled things is handled when the puller goes up the stairs return - + if(AM.has_buckled_mobs()) // Similarly, the rider entering the turf will bring along whatever they're buckled to return + if(istype(AM, /obj/structure/blob)) // Blobs can't go down stairs normally. They kind of.. roll down them, when spreading. (See: They just fall.) + return + var/list/atom/movable/pulling = list() // Will also include grabbed mobs if(isliving(AM)) var/mob/living/L = AM @@ -432,7 +441,7 @@ pulling |= L.pulling for(var/obj/item/grab/G in list(L.l_hand, L.r_hand)) pulling |= G.affecting - + // If the stairs aren't broken, go up. if(check_integrity()) AM.dir = turn(src.dir, 180) @@ -442,7 +451,7 @@ // Move to Top AM.forceMove(get_turf(bottom)) - + // If something is being pulled, bring it along directly to avoid the mob being torn away from it due to movement delays for(var/atom/movable/P in pulling) P.forceMove(get_turf(bottom)) // Just bring it along directly, no fussing with animation timing @@ -457,18 +466,21 @@ if(isobserver(AM)) // Ghosts have their own methods for going up and down return + if(istype(AM, /obj/structure/blob)) // Blobs can't go down stairs normally. They kind of.. roll down them, when spreading. (See: They just fall.) + return + if(isliving(AM)) var/mob/living/L = AM - + if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs. return - + if(L.has_buckled_mobs()) return if(L.buckled) L.buckled.forceMove(get_turf(bottom)) - + // If the object is pulling or grabbing anything, we'll want to move those too. A grab chain may be disrupted in doing so. if(L.pulling && !L.pulling.anchored) var/atom/movable/P = L.pulling @@ -477,7 +489,7 @@ for(var/obj/item/grab/G in list(L.l_hand, L.r_hand)) G.affecting.forceMove(get_turf(bottom)) - + L.forceMove(get_turf(bottom)) if(L.client) @@ -498,14 +510,14 @@ var/turf/B2 = get_turf(src) var/turf/T1 = GetAbove(B1) var/turf/T2 = GetAbove(B2) - + if(!istype(B1) || !istype(B2)) warning("Stair created at invalid loc: ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL if(!istype(T1) || !istype(T2)) warning("Stair created without level above: ([loc.x], [loc.y], [loc.z])") return INITIALIZE_HINT_QDEL - + // Spawn the stairs // Railings sold separately var/turf/simulated/open/O = T1 @@ -521,7 +533,7 @@ B.check_integrity(B, M, T, O) return INITIALIZE_HINT_QDEL - + // For ease of spawning. While you *can* spawn the base type and set its dir, this is useful for adminbus and a little bit quicker to map in /obj/structure/stairs/spawner/north dir = NORTH diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm index 68ba76605da..7d9f47cb4e1 100644 --- a/code/modules/organs/internal/heart.dm +++ b/code/modules/organs/internal/heart.dm @@ -42,12 +42,9 @@ organ_tag = O_PUMP dead_icon = "pump-off" robotic = ORGAN_ROBOT - standard_pulse_level = PULSE_NONE -/obj/item/organ/internal/stomach/machine/handle_organ_proc_special() +/obj/item/organ/internal/heart/machine/handle_organ_proc_special() ..() if(owner && owner.stat != DEAD) owner.bodytemperature += round(owner.robobody_count * 0.25, 0.1) - - return diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index 2ebfefea615..7c65bfaf859 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -3,29 +3,35 @@ icon_state = "stomach" organ_tag = O_STOMACH parent_organ = BP_GROIN - unacidable = TRUE // Don't melt when holding your acid, dangit. var/acidtype = "stomacid" // Incase you want some stomach organ with, say, polyacid instead, or sulphuric. var/max_acid_volume = 30 - + var/stomach_capacity var/deadly_hold = TRUE // Does the stomach do damage to mobs eaten by its owner? Xenos should probably have this FALSE. /obj/item/organ/internal/stomach/Initialize() . = ..() - if(reagents) - reagents.maximum_volume = 30 - else + if(!reagents) create_reagents(30) + reagents.maximum_volume = 30 + return INITIALIZE_HINT_LATELOAD + +/obj/item/organ/internal/stomach/LateInitialize() + . = ..() + if(species && !stomach_capacity) + stomach_capacity = species.stomach_capacity /obj/item/organ/internal/stomach/handle_organ_proc_special() - if(owner && istype(owner, /mob/living/carbon/human)) + if(istype(owner, /mob/living/carbon/human)) if(reagents) if(reagents.total_volume + 2 < max_acid_volume && prob(20)) reagents.add_reagent(acidtype, rand(1,2)) - - for(var/mob/living/L in owner.stomach_contents) // Splashes mobs inside with acid. Twice as effective as being splashed with the same acid outside the body. - reagents.trans_to(L, 2, 2, 0) + if(reagents.total_volume) + for(var/mob/living/L in owner.stomach_contents) // Splashes mobs inside with acid. Twice as effective as being splashed with the same acid outside the body. + reagents.trans_to(L, 2, 2, 0) + for(var/atom/movable/AM in contents) + reagents.touch(AM) if(is_broken() && prob(1)) owner.custom_pain("There's a twisting pain in your abdomen!",1) @@ -45,6 +51,46 @@ owner.adjustToxLoss(3) owner.vomit(FALSE, TRUE) +/obj/item/organ/internal/stomach/proc/can_eat_atom(var/atom/movable/food) + return !isnull(get_devour_time(food)) + +/obj/item/organ/internal/stomach/proc/is_full(var/atom/movable/food) + var/total = round(reagents?.total_volume / 10) + for(var/a in contents + food) + if(ismob(a)) + var/mob/M = a + total += M.mob_size + else if(isobj(a)) + var/obj/item/I = a + total += I.get_storage_cost() + else + continue + if(total > stomach_capacity) + return TRUE + return FALSE + +/obj/item/organ/internal/stomach/proc/get_devour_time(var/atom/movable/food) + if(istype(food, /obj/item/holder)) // Don't eat holders. They are special. + food = locate(/mob) in food + if(iscarbon(food) || isanimal(food)) + var/mob/living/L = food + if((species.gluttonous & GLUT_TINY) && (L.mob_size <= MOB_TINY) && !ishuman(food)) // Anything MOB_TINY or smaller + return DEVOUR_SLOW + else if((species.gluttonous & GLUT_SMALLER) && owner.mob_size > L.mob_size) // Anything we're larger than + return DEVOUR_SLOW + else if(species.gluttonous & GLUT_ANYTHING) // Eat anything ever + return DEVOUR_FAST + else if(istype(food, /obj/item)) + var/obj/item/I = food + var/cost = I.get_storage_cost() + if(cost < ITEMSIZE_COST_NO_CONTAINER) + if((species.gluttonous & GLUT_ITEM_TINY) && cost < ITEMSIZE_COST_NORMAL) + return DEVOUR_SLOW + else if((species.gluttonous & GLUT_ITEM_NORMAL) && cost <= ITEMSIZE_COST_NORMAL) + return DEVOUR_SLOW + else if(species.gluttonous & GLUT_ITEM_ANYTHING) + return DEVOUR_FAST + /obj/item/organ/internal/stomach/xeno color = "#555555" acidtype = "pacid" @@ -53,20 +99,14 @@ name = "reagent cycler" icon_state = "cycler" organ_tag = O_CYCLER - robotic = ORGAN_ROBOT - acidtype = "sacid" /obj/item/organ/internal/stomach/machine/handle_organ_proc_special() ..() if(owner && owner.stat != DEAD) owner.bodytemperature += round(owner.robobody_count * 0.25, 0.1) - if(ishuman(owner)) var/mob/living/carbon/human/H = owner - if(H.ingested?.total_volume && H.bloodstr) H.ingested.trans_to_holder(H.bloodstr, rand(2,5)) - - return diff --git a/code/modules/organs/subtypes/vox.dm b/code/modules/organs/subtypes/vox.dm index 52b62005581..42bc9de63e3 100644 --- a/code/modules/organs/subtypes/vox.dm +++ b/code/modules/organs/subtypes/vox.dm @@ -29,3 +29,32 @@ /obj/item/organ/external/groin/vox //vox have an extended ribcage for extra protection. encased = "lower ribcage" + +/obj/item/organ/internal/stomach/vox + name = "processing tuble" + parent_organ = BP_TORSO + color = "#0033cc" + acidtype = "voxenzyme" + unacidable = TRUE + stomach_capacity = 20 + // Items to convert into nutriment during processing. + var/static/list/convert_into_nutriment = list( + /obj/item/trash = 10, + /obj/item/flame/candle = 5, + /obj/item/ore = 5, + /obj/item/soap = 5, + /obj/item/material/shard/shrapnel = 3 + ) + +/obj/item/organ/internal/stomach/vox/handle_organ_proc_special() + if(istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner + for(var/obj/item/thing in contents) + if(thing.unacidable) + continue + for(var/check_type in convert_into_nutriment) + if(istype(thing, check_type)) + H.ingested.add_reagent("nutriment", convert_into_nutriment[check_type]) + qdel(thing) + break + . = ..() diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 649a926fe26..ceb8b74d214 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -29,18 +29,6 @@ if(length(A.name) + length(label) > 64) to_chat(user, SPAN_WARNING("\The [src]'s label too big.")) return - if(istype(A, /mob/living/silicon/robot/platform)) - var/mob/living/silicon/robot/platform/P = A - if(!P.allowed(user)) - to_chat(usr, SPAN_WARNING("Access denied.")) - else if(P.client || P.key) - to_chat(user, SPAN_NOTICE("You rename \the [P] to [label].")) - to_chat(P, SPAN_NOTICE("\The [user] renames you to [label].")) - P.custom_name = label - P.SetName(P.custom_name) - else - to_chat(user, SPAN_WARNING("\The [src] is inactive and cannot be renamed.")) - return if(ishuman(A)) to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name].")) return @@ -80,4 +68,4 @@ label = str to_chat(user, SPAN_NOTICE("You set the text to '[str]'.")) else - to_chat(user, SPAN_NOTICE("You turn off \the [src].")) \ No newline at end of file + to_chat(user, SPAN_NOTICE("You turn off \the [src].")) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index fcd8eb86fa8..bd1c149d635 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -304,7 +304,7 @@ PN.trigger_warning(5) if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(H.species.siemens_coefficient <= 0) + if(H.species.get_siemens_coefficient(H) <= 0) return if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm index 196ff706519..d38c10b66d9 100644 --- a/code/modules/projectiles/ammunition/rounds.dm +++ b/code/modules/projectiles/ammunition/rounds.dm @@ -364,8 +364,8 @@ /obj/item/ammo_casing/a145/highvel desc = "A 14.5mm sabot shell." - projectile_type = /obj/item/projectile/bullet/rifle/a145 - + projectile_type = /obj/item/projectile/bullet/rifle/a145/highvel + /obj/item/ammo_casing/a145/bb desc = "A 14.5mm BB. That'll take someone's eye out." projectile_type = /obj/item/projectile/bullet/bb diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index f650accf356..51dd3b29d4c 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -6,7 +6,7 @@ icon_state = "laser" item_state = "laser" wielded_item_state = "laser-wielded" - fire_delay = 8 + fire_delay = 0.8 SECONDS slot_flags = SLOT_BELT|SLOT_BACK w_class = ITEMSIZE_LARGE force = 10 @@ -16,16 +16,16 @@ one_handed_penalty = 30 firemodes = list( - list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240), - list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), - ) + list(mode_name = "normal", projectile_type = /obj/item/projectile/beam/midlaser, charge_cost = 240), + list(mode_name = "suppressive", fire_delay = 0.6 SECONDS, projectile_type = /obj/item/projectile/beam/weaklaser, charge_cost = 60), + ) /obj/item/gun/energy/laser/empty cell_type = null /obj/item/gun/energy/laser/mounted - self_recharge = 1 - use_external_power = 1 + self_recharge = TRUE + use_external_power = TRUE one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. /obj/item/gun/energy/laser/mounted/augment @@ -49,9 +49,9 @@ cell_type = /obj/item/cell/device firemodes = list( - list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 48), - list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 12), - ) + list(mode_name = "normal", projectile_type = /obj/item/projectile/beam/practice, charge_cost = 48), + list(mode_name = "suppressive", projectile_type = /obj/item/projectile/beam/practice, charge_cost = 12), + ) //Functionally identical, but slightly higher tech due to rarer. /obj/item/gun/energy/laser/sleek @@ -71,7 +71,7 @@ icon_state = "mininglaser" item_state = "laser" wielded_item_state = "laser-wielded" - fire_delay = 8 + fire_delay = 0.8 SECONDS slot_flags = SLOT_BELT|SLOT_BACK w_class = ITEMSIZE_LARGE force = 15 @@ -81,9 +81,9 @@ one_handed_penalty = 30 firemodes = list( - list(mode_name="mining", fire_delay=8, projectile_type=/obj/item/projectile/beam/mininglaser, charge_cost = 200), - list(mode_name="deter", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 80), - ) + list(mode_name = "mining", projectile_type = /obj/item/projectile/beam/mininglaser, charge_cost = 200), + list(mode_name = "deter", fire_delay = 0.6 SECONDS, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 80), + ) /obj/item/gun/energy/retro name = "retro laser" @@ -93,11 +93,11 @@ slot_flags = SLOT_BELT w_class = ITEMSIZE_NORMAL projectile_type = /obj/item/projectile/beam - fire_delay = 10 //old technology + fire_delay = 1 SECOND //old technology /obj/item/gun/energy/retro/mounted - self_recharge = 1 - use_external_power = 1 + self_recharge = TRUE + use_external_power = TRUE /obj/item/gun/energy/retro/empty icon_state = "retro" @@ -138,7 +138,7 @@ catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol) icon_state = "alienpistol" item_state = "alienpistol" - fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose. + fire_delay = 1 SECOND // Handguns should be inferior to two-handed weapons. Even alien ones I suppose. charge_cost = 480 // Five shots. projectile_type = /obj/item/projectile/beam/cyan @@ -160,7 +160,7 @@ w_class = ITEMSIZE_NORMAL projectile_type = /obj/item/projectile/beam origin_tech = null - fire_delay = 10 //Old pistol + fire_delay = 1 SECOND //Old pistol charge_cost = 480 //to compensate a bit for self-recharging cell_type = /obj/item/cell/device/weapon/recharge/captain battery_lock = 1 @@ -176,22 +176,21 @@ slot_flags = SLOT_BELT|SLOT_BACK projectile_type = /obj/item/projectile/beam/heavylaser/cannon battery_lock = 1 - fire_delay = 20 + fire_delay = 2 SECONDS w_class = ITEMSIZE_LARGE one_handed_penalty = 90 // The thing's heavy and huge. accuracy = 45 charge_cost = 600 + recharge_time = 1 SECOND /obj/item/gun/energy/lasercannon/mounted name = "mounted laser cannon" - self_recharge = 1 - use_external_power = 1 - recharge_time = 10 + self_recharge = TRUE + use_external_power = TRUE accuracy = 0 // Mounted cannons are just fine the way they are. one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. projectile_type = /obj/item/projectile/beam/heavylaser charge_cost = 400 - fire_delay = 20 /obj/item/gun/energy/xray name = "xray laser gun" @@ -202,6 +201,7 @@ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) projectile_type = /obj/item/projectile/beam/xray charge_cost = 200 + fire_delay = 0.8 SECONDS /obj/item/gun/energy/sniperrifle name = "marksman energy rifle" @@ -218,11 +218,11 @@ action_button_name = "Use Scope" battery_lock = 1 charge_cost = 600 - fire_delay = 35 + fire_delay = 3.5 SECONDS force = 10 w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. accuracy = -45 //shooting at the hip - scoped_accuracy = 50 + scoped_accuracy = 75 one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. /obj/item/gun/energy/sniperrifle/ui_action_click() @@ -246,7 +246,7 @@ slot_flags = SLOT_BACK action_button_name = "Aim Down Sights" charge_cost = 1300 - fire_delay = 20 + fire_delay = 2 SECONDS force = 8 w_class = ITEMSIZE_LARGE accuracy = 10 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 0af15366f71..b42fbed8aed 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -4,7 +4,7 @@ description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies." icon_state = "energystun100" item_state = null //so the human update icon uses the icon_state instead. - fire_delay = 10 // Handguns should be inferior to two-handed weapons. + fire_delay = 1 SECOND // Handguns should be inferior to two-handed weapons. projectile_type = /obj/item/projectile/beam/stun/med origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) @@ -13,16 +13,16 @@ firemodes = list( list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="energystun", charge_cost = 240), list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", charge_cost = 480), - ) + ) /obj/item/gun/energy/gun/mounted name = "mounted energy gun" - self_recharge = 1 - use_external_power = 1 + self_recharge = TRUE + use_external_power = TRUE /obj/item/gun/energy/gun/burst - name = "burst laser" + name = "burst energy gun" desc = "The Lawson Arms FM-2t is a versatile energy based weapon, capable of switching between stun or kill with a three round burst option for both settings." description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies." icon_state = "riflestun100" @@ -30,7 +30,7 @@ charge_cost = 100 force = 8 w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later - fire_delay = 6 + fire_delay = 0.8 SECONDS projectile_type = /obj/item/projectile/beam/stun/weak origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3) @@ -40,11 +40,22 @@ // one_handed_penalty = 30 firemodes = list( - list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="riflestun", charge_cost = 100), - list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="riflestun"), - list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="riflekill", charge_cost = 200), - list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="riflekill"), - ) + list(mode_name = "stun", burst = 1, projectile_type = /obj/item/projectile/beam/stun/weak, + modifystate = "riflestun" + ), + list(mode_name = "stun burst", burst = 3, fire_delay = 1 SECOND, move_delay = 4, + burst_accuracy = list(0,0,0), dispersion = list(0.0, 0.2, 0.5), + projectile_type = /obj/item/projectile/beam/stun/weak, modifystate = "riflestun" + ), + list(mode_name = "lethal", burst = 1, projectile_type = /obj/item/projectile/beam/burstlaser, + modifystate = "riflekill", charge_cost = 200 + ), + list(mode_name = "lethal burst", burst = 3, fire_delay = 1 SECOND, move_delay = 4, + burst_accuracy = list(0,0,0), dispersion = list(0.0, 0.2, 0.5), + projectile_type = /obj/item/projectile/beam/burstlaser, modifystate = "riflekill", + charge_cost = 200 + ), + ) /obj/item/gun/energy/gun/nuclear name = "advanced energy gun" @@ -55,7 +66,7 @@ slot_flags = SLOT_BELT force = 8 //looks heavier than a pistol w_class = ITEMSIZE_LARGE //Looks bigger than a pistol, too. - fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else + fire_delay = 0.8 SECONDS //This one's not a handgun, it should have the same fire delay as everything else cell_type = /obj/item/cell/device/weapon/recharge battery_lock = 1 modifystate = null @@ -64,9 +75,9 @@ // one_handed_penalty = 15 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'. firemodes = list( - list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", charge_cost = 240), - list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", charge_cost = 480), - ) + list(mode_name = "stun", projectile_type = /obj/item/projectile/beam/stun, modifystate = "nucgunstun", charge_cost = 240), + list(mode_name = "lethal", projectile_type = /obj/item/projectile/beam, modifystate = "nucgunkill", charge_cost = 480), + ) //Functionally a Perun, but flavoured. /obj/item/gun/energy/gun/compact @@ -80,9 +91,9 @@ modifystate = "PDWstun" firemodes = list( - list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", charge_cost = 240), - list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", charge_cost = 480), - ) + list(mode_name = "stun", projectile_type = /obj/item/projectile/beam/stun/med, modifystate = "PDWstun", charge_cost = 240), + list(mode_name = "lethal", projectile_type = /obj/item/projectile/beam, modifystate = "PDWkill", charge_cost = 480), + ) //What if we went smaller? /obj/item/gun/energy/gun/pocket @@ -95,6 +106,6 @@ modifystate = "egunstun" firemodes = list( - list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="egunstun", charge_cost = 240), - list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="egunkill", charge_cost = 480), - ) + list(mode_name = "stun", projectile_type = /obj/item/projectile/beam/stun/med, modifystate = "egunstun", charge_cost = 240), + list(mode_name = "lethal", projectile_type = /obj/item/projectile/beam, modifystate = "egunkill", charge_cost = 480), + ) diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index e954c2ec0d1..89cdbd23d35 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -36,13 +36,13 @@ one_handed_penalty = 0 /obj/item/gun/energy/phasegun/mounted - self_recharge = 1 - use_external_power = 1 + self_recharge = TRUE + use_external_power = TRUE one_handed_penalty = 0 /obj/item/gun/energy/phasegun/mounted/cyborg charge_cost = 400 - recharge_time = 7 + recharge_time = 0.6 SECONDS /obj/item/gun/energy/phasegun/pistol name = "phase pistol" @@ -57,12 +57,12 @@ /obj/item/gun/energy/phasegun/pistol/mounted name = "mounted phase pistol" - self_recharge = 1 - use_external_power = 1 + self_recharge = TRUE + use_external_power = TRUE /obj/item/gun/energy/phasegun/pistol/mounted/cyborg charge_cost = 400 - recharge_time = 7 + recharge_time = 0.6 SECONDS /obj/item/gun/energy/phasegun/rifle name = "phase rifle" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 7f6536d1209..853485a11de 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -10,6 +10,7 @@ force = 10 slot_flags = SLOT_BACK projectile_type = /obj/item/projectile/ion + fire_delay = 0.8 SECONDS /obj/item/gun/energy/ionrifle/emp_act(severity) ..(max(severity, 4)) //so it doesn't EMP itself, I guess @@ -27,6 +28,7 @@ slot_flags = SLOT_BELT|SLOT_HOLSTER charge_cost = 480 projectile_type = /obj/item/projectile/ion/pistol + fire_delay = 1 SECOND /obj/item/gun/energy/decloner name = "biological demolecularisor" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 7415561a712..c6f0206b0f7 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -6,22 +6,23 @@ item_state = null //so the human update icon uses the icon_state instead. projectile_type = /obj/item/projectile/beam/stun charge_cost = 480 + fire_delay = 0.8 SECONDS /obj/item/gun/energy/taser/mounted name = "mounted taser gun" - self_recharge = 1 - use_external_power = 1 + self_recharge = TRUE + use_external_power = TRUE /obj/item/gun/energy/taser/mounted/augment - self_recharge = 1 - use_external_power = 0 + self_recharge = TRUE + use_external_power = FALSE use_organic_power = TRUE canremove = FALSE /obj/item/gun/energy/taser/mounted/cyborg name = "taser gun" - charge_cost = 400 - recharge_time = 7 //Time it takes for shots to recharge (in ticks) + charge_cost = 480 + recharge_time = 0.6 SECONDS /obj/item/gun/energy/taser/disabler name = "disabler" @@ -75,7 +76,7 @@ icon_state = "plasma_stun" item_state = "plasma_stun" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_POWER = 3) - fire_delay = 20 + fire_delay = 2 SECONDS charge_cost = 600 projectile_type = /obj/item/projectile/energy/plasmastun @@ -93,6 +94,7 @@ item_state = "stunrevolver" origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) projectile_type = /obj/item/projectile/energy/electrode/strong + fire_delay = 0.8 SECONDS charge_cost = 300 /obj/item/gun/energy/stunrevolver/vintage @@ -105,7 +107,6 @@ their own variants of the Stun Revolver." icon_state = "vinstunrevolver" item_state = "stunrevolver" - origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) /obj/item/gun/energy/stunrevolver/snubnose name = "snub stun revolver" @@ -118,4 +119,3 @@ icon_state = "snubstunrevolver" item_state = "stunrevolver" w_class = ITEMSIZE_SMALL - origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index bb187982f63..f2440436228 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -128,7 +128,7 @@ loading = TRUE while(mat_storage + SHEET_MATERIAL_AMOUNT <= max_mat_storage && do_after(user,1.5 SECONDS)) mat_storage += SHEET_MATERIAL_AMOUNT - playsound(src, 'sound/effects/phasein.ogg', 15, 1) + playsound(src, 'sound/effects/phoronborer.ogg', 15, 1) M.use(1) success = TRUE loading = FALSE diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 9c4f820135a..271f3febeb7 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -131,8 +131,8 @@ impact_type = /obj/effect/projectile/impact/laser_em /obj/item/projectile/beam/heavylaser/cannon - damage = 80 - armor_penetration = 50 + damage = 75 + armor_penetration = 40 light_color = "#FF0D00" hud_state = "laser_overcharge" @@ -140,8 +140,8 @@ name = "xray beam" icon_state = "xray" fire_sound = 'sound/weapons/eluger.ogg' - damage = 25 - armor_penetration = 50 + damage = 35 + armor_penetration = 60 light_color = "#00CC33" hud_state = "laser_sniper" @@ -265,8 +265,8 @@ name = "sniper beam" icon_state = "xray" fire_sound = 'sound/weapons/gauss_shoot.ogg' - damage = 50 - armor_penetration = 10 + damage = 45 + armor_penetration = 20 light_color = "#00CC33" hud_state = "laser_sniper" diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm index e3a33633c9e..8492da13f6a 100644 --- a/code/modules/reagents/reagents/core.dm +++ b/code/modules/reagents/reagents/core.dm @@ -34,12 +34,8 @@ ..() - if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human)) + if(!data["donor"] || ishuman(data["donor"])) blood_splatter(T, src, 1) - else if(istype(data["donor"], /mob/living/carbon/alien)) - var/obj/effect/decal/cleanable/blood/B = blood_splatter(T, src, 1) - if(B) - B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" /datum/reagent/blood/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm index eeefafa3025..1c6a81812ae 100644 --- a/code/modules/reagents/reagents/medicine.dm +++ b/code/modules/reagents/reagents/medicine.dm @@ -421,7 +421,7 @@ scannable = 1 /datum/reagent/mortiferin/on_mob_life(var/mob/living/carbon/M, var/alien, var/datum/reagents/metabolism/location) - if(M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse)) + if(M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump/corpse)) affects_dead = TRUE else affects_dead = FALSE @@ -429,7 +429,7 @@ . = ..(M, alien, location) /datum/reagent/mortiferin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(M.bodytemperature < (T0C - 10) || (M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse))) + if(M.bodytemperature < (T0C - 10) || (M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump/corpse))) var/chem_effective = 1 * M.species.chem_strength_heal if(alien == IS_SLIME) if(prob(10)) @@ -466,7 +466,7 @@ /datum/reagent/necroxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) var/chem_effective = 1 * M.species.chem_strength_heal - if(M.bodytemperature < 170 || (M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump_corpse))) + if(M.bodytemperature < 170 || (M.stat == DEAD && M.has_modifier_of_type(/datum/modifier/bloodpump/corpse))) if(alien == IS_SLIME) if(prob(10)) to_chat(M, "It's so cold. Something causes your cellular mass to harden sporadically, resulting in seizure-like twitching.") diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index c946f9db7cb..a8774af291a 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -31,9 +31,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). for(var/Name in name_to_material) if(Name in materials) continue - hidden_materials |= Name - materials[Name] = 0 default_apply_parts() diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 7597d01ecc0..d197b8f5728 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -83,7 +83,7 @@ H.b_skin = 0 H.dna.ResetUIFrom(H) - H.real_name = "Synthmorph #[rand(100,999)]" + H.real_name = "Synthbody #[rand(100,999)]" H.name = H.real_name H.dir = 2 H.add_language(LANGUAGE_EAL) @@ -277,10 +277,24 @@ /datum/design/item/prosfab/cyborg/exoskeleton name = "Robot Exoskeleton" id = "robot_exoskeleton" - build_path = /obj/item/robot_parts/robot_suit + build_path = /obj/item/robot_parts/frame time = 50 materials = list(MAT_STEEL = 37500) +/datum/design/item/prosfab/cyborg/exoskeleton_flying + name = "Flying Robot Exoskeleton" + id = "robot_exoskeleton_flyer" + build_path = /obj/item/robot_parts/frame/flyer + time = 40 + materials = list(MAT_STEEL = 32500) + +/datum/design/item/prosfab/cyborg/exoskeleton_platform + name = "Platform Exoskeleton" + id = "robot_exoskeleton_platform" + build_path = /obj/item/robot_parts/frame/platform + time = 60 + materials = list(MAT_STEEL = 42500) + /datum/design/item/prosfab/cyborg/torso name = "Robot Torso" id = "robot_torso" @@ -366,6 +380,11 @@ id = "platform_armour" build_path = /obj/item/robot_parts/robot_component/armour_platform +/datum/design/item/prosfab/cyborg/component/armour_light + name = "Armour Plating (Light)" + id = "light_armour" + build_path = /obj/item/robot_parts/robot_component/armour_light + /datum/design/item/prosfab/cyborg/component/ai_shell name = "AI Remote Interface" id = "mmi_ai_shell" @@ -441,10 +460,10 @@ materials = list(MAT_STEEL = 25000, MAT_GLASS = 3000, MAT_GOLD = 350) build_path = /obj/item/borg/upgrade/language -// Synthmorph Bags. +// Synthbody Bags. -/datum/design/item/prosfab/synthmorphbag - name = "Synthmorph Storage Bag" +/datum/design/item/prosfab/synthbodybag + name = "Synthbody Storage Bag" desc = "Used to store or slowly defragment an FBP." id = "misc_synth_bag" materials = list(MAT_STEEL = 250, MAT_GLASS = 250, MAT_PLASTIC = 2000) @@ -455,35 +474,35 @@ desc = "Used to identify an empty NanoTrasen FBP." id = "misc_synth_bag_tag_nt" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag /datum/design/item/prosfab/badge_morph name = "Morpheus Tag" desc = "Used to identify an empty Morpheus FBP." id = "misc_synth_bag_tag_morph" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/morpheus + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/morpheus /datum/design/item/prosfab/badge_wardtaka name = "Ward-Takahashi Tag" desc = "Used to identify an empty Ward-Takahashi FBP." id = "misc_synth_bag_tag_wardtaka" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/wardtaka + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/wardtaka /datum/design/item/prosfab/badge_zenghu name = "Zeng-Hu Tag" desc = "Used to identify an empty Zeng-Hu FBP." id = "misc_synth_bag_tag_zenghu" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/zenghu + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/zenghu /datum/design/item/prosfab/badge_gilthari name = "Gilthari Tag" desc = "Used to identify an empty Gilthari FBP." id = "misc_synth_bag_tag_gilthari" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_GOLD = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/gilthari + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/gilthari req_tech = list(TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_PHORON = 2) /datum/design/item/prosfab/badge_veymed @@ -491,7 +510,7 @@ desc = "Used to identify an empty Vey-Medical FBP." id = "misc_synth_bag_tag_veymed" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/veymed + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/veymed req_tech = list(TECH_MATERIAL = 3, TECH_ILLEGAL = 1, TECH_BIO = 4) /datum/design/item/prosfab/badge_hephaestus @@ -499,25 +518,25 @@ desc = "Used to identify an empty Hephaestus FBP." id = "misc_synth_bag_tag_heph" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/hephaestus + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/hephaestus /datum/design/item/prosfab/badge_grayson name = "Grayson Tag" desc = "Used to identify an empty Grayson FBP." id = "misc_synth_bag_tag_grayson" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/grayson + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/grayson /datum/design/item/prosfab/badge_xion name = "Xion Tag" desc = "Used to identify an empty Xion FBP." id = "misc_synth_bag_tag_xion" materials = list(MAT_STEEL = 1000, MAT_GLASS = 500, MAT_PLASTIC = 1000) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/xion + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/xion /datum/design/item/prosfab/badge_bishop name = "Bishop Tag" desc = "Used to identify an empty Bishop FBP." id = "misc_synth_bag_tag_bishop" materials = list(MAT_STEEL = 500, MAT_GLASS = 2000, MAT_PLASTIC = 500) - build_path = /obj/item/clothing/accessory/badge/corporate_tag/bishop + build_path = /obj/item/clothing/accessory/medal/badge/corporate_tag/bishop diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index de51f73c6ce..19d49ede8e0 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -26,9 +26,7 @@ for(var/Name in name_to_material) if(Name in materials) continue - hidden_materials |= Name - materials[Name] = 0 default_apply_parts() @@ -209,4 +207,4 @@ if(mat_efficiency != 1) // No matter out of nowhere if(new_item.matter && new_item.matter.len > 0) for(var/i in new_item.matter) - new_item.matter[i] = new_item.matter[i] * mat_efficiency \ No newline at end of file + new_item.matter[i] = new_item.matter[i] * mat_efficiency diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 66a392f8f77..df4c746869d 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -1,8 +1,8 @@ /obj/item/spellbook - name = "spell book" - desc = "The legendary book of spells of the wizard." - icon = 'icons/obj/library.dmi' - icon_state ="spellbook" + name = "nanomachine hive" //"Wizard" may be long deprecated but since these wizard-based items still show up on rare occasion for gimmicks... + desc = "A secure delivery system for highly experimental nanomachine swarms capable of rapidly installing (often illegal) biotech augments to those both educated in its usage, and reckness enough to try." + icon = 'icons/obj/wizard.dmi' + icon_state ="hive" throw_speed = 1 throw_range = 5 w_class = ITEMSIZE_SMALL @@ -15,7 +15,7 @@ if(!user) return if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(usr, "You stare at the book but cannot make sense of the markings!") + to_chat(usr, "You stare at the hive but cannot make sense of the control interface!") return user.set_machine(src) @@ -24,50 +24,49 @@ dat = "[temp]

Clear" else - // AUTOFIXED BY fix_string_idiocy.py - dat = {"The Book of Spells:
- Spells left to memorize: [uses]
+ dat = {"Augmentation Library:
+ Programmable Nanomachine Uses Remaining: [uses]

- Memorize which spell:
- The number after the spell name is the cooldown time.
+ Deploy which augment:
+ The number after the augment name is the cooldown time.
Magic Missile (10)
- This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.
+ This augment fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage.
Fireball (10)
- This spell fires a fireball in the direction you're facing and does not require wizard garb. Be careful not to fire it at people that are standing next to you.
+ This augment fires a fireball in the direction you're facing and does not require special attire. Be careful not to fire it at people that are standing next to you.
Disable Technology (60)
- This spell disables all weapons, cameras and most other technology in range.
+ This augment disables all weapons, cameras and most other technology in range.
Smoke (10)
- This spell spawns a cloud of choking smoke at your location and does not require wizard garb.
+ This augment spawns a cloud of choking smoke at your location and does not require special attire.
Blind (30)
- This spell temporarly blinds a single person and does not require wizard garb.
+ This augment temporarly blinds a single person and does not require special attire.
Subjugation (30)
- This spell temporarily subjugates a target's mind and does not require wizard garb.
+ This augment temporarily subjugates a target's mind and does not require special attire.
Forcewall (10)
- This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb.
+ This augment creates an unbreakable wall that lasts for 30 seconds and does not need special attire.
Blink (2)
- This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.
+ This augment randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience.
Teleport (60)
- This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.
+ This augment teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable.
Mutate (60)
- This spell causes you to turn into a hulk and gain telekinesis for a short while.
+ This augment causes you to turn into a hulk and gain telekinesis for a short while.
Ethereal Jaunt (60)
- This spell creates your ethereal form, temporarily making you invisible and able to pass through walls.
+ This augment creates your ethereal form, temporarily making you invisible and able to pass through walls.
Knock (10)
- This spell opens nearby doors and does not require wizard garb.
- Remove Clothes Requirement Warning: this takes away 2 spell choices.
+ This augment opens nearby doors and does not require special attire.
+ Remove Clothes Requirement Warning: this takes away 2 augment choices.

Artefacts:
- Powerful items imbued with eldritch magics. Summoning one will count towards your maximum number of spells.
+ Powerful items harnessing powerful nanomachines. Constructing one will count towards your maximum number of augments.
It is recommended that only experienced wizards attempt to wield such artefacts.

Mental Focus
An artefact that channels the will of the user into destructive bolts of force.

- Six Soul Stone Shards and the spell Artificer
- Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot.
+ Six Soul Stone Shards and the augment Artificer
+ Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The augment Artificer allows you to create arcane machines for the captured souls to pilot.

Mastercrafted Armor Set
- An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space.
+ An artefact suit of armor that allows you to use augments while providing more protection against attacks and the void of space.

Staff of Animation
An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines.
@@ -77,7 +76,7 @@
"} // END AUTOFIX if(op) - dat += "Re-memorize Spells
" + dat += "Re-program nanomachines
" user << browse(dat, "window=radio") onclose(user, "radio") return @@ -92,7 +91,7 @@ return 1 if(H.mind.special_role == "apprentice") - temp = "If you got caught sneaking a peak from your teacher's spellbook, you'd likely be expelled from the Wizard Academy. Better not." + temp = "You don't understand the usage of nanomachine hives well enough to risk messing with it." return if(loc == H || (in_range(src, H) && istype(loc, /turf))) @@ -103,10 +102,10 @@ if(usr in A.contents) uses = max_uses H.spellremove() - temp = "All spells have been removed. You may now memorize a new set of spells." + temp = "All augments have been removed. You may now memorize a new set of augments." feedback_add_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells else - temp = "You may only re-memorize spells whilst located inside the wizard sanctuary." + temp = "You may only re-program augments whilst located inside the wizard sanctuary." else if(uses >= 1 && max_uses >=1) if(href_list["spell_choice"] == "noclothes") if(uses < 2) @@ -114,18 +113,18 @@ uses-- /* */ - var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes") + var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", subjugation = "Subjugation", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", staffchange = "Staff of Change", mentalfocus = "Mental Focus", soulstone = "Six Soul Stone Shards and the augment Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", noclothes = "No Clothes") var/already_knows = 0 for(var/spell/aspell in H.spell_list) if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) already_knows = 1 if(!aspell.can_improve()) - temp = "This spell cannot be improved further." + temp = "This augment cannot be improved further." uses++ break else if(aspell.can_improve("speed") && aspell.can_improve("power")) - switch(alert(src, "Do you want to upgrade this spell's speed or power?", "Select Upgrade", "Speed", "Power", "Cancel")) + switch(alert(src, "Do you want to upgrade this augment's speed or power?", "Select Upgrade", "Speed", "Power", "Cancel")) if("Speed") temp = aspell.quicken_spell() if("Power") @@ -144,32 +143,32 @@ if("noclothes") feedback_add_details("wizard_spell_learned","NC") H.add_spell(new/spell/noclothes) - temp = "This teaches you how to use your spells without your magical garb, truely you are the wizardest." + temp = "This allows you to use your augments without specialist garb, truely you are the nano-wizardest." uses-- if("magicmissile") feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/projectile/magic_missile) - temp = "You have learned magic missile." + temp = "You have installed magic missile." if("fireball") feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/projectile/dumbfire/fireball) - temp = "You have learned fireball." + temp = "You have installed fireball." if("disabletech") feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/aoe_turf/disable_tech) - temp = "You have learned disable technology." + temp = "You have installed disable technology." if("smoke") feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/aoe_turf/smoke) - temp = "You have learned smoke." + temp = "You have installed smoke." if("blind") feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/genetic/blind) - temp = "You have learned blind." + temp = "You have installed blind." if("subjugation") feedback_add_details("wizard_spell_learned","SJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/subjugation) - temp = "You have learned subjugate." + temp = "You have installed subjugate." // if("mindswap") // feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells // H.add_spell(new/spell/targeted/mind_transfer) @@ -177,27 +176,27 @@ if("forcewall") feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/aoe_turf/conjure/forcewall) - temp = "You have learned forcewall." + temp = "You have installed forcewall." if("blink") feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/aoe_turf/blink) - temp = "You have learned blink." + temp = "You have installed blink." if("teleport") feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/area_teleport) - temp = "You have learned teleport." + temp = "You have installed teleport." if("mutate") feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/genetic/mutate) - temp = "You have learned mutate." + temp = "You have installed mutate." if("etherealjaunt") feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/targeted/ethereal_jaunt) - temp = "You have learned ethereal jaunt." + temp = "You have installed ethereal jaunt." if("knock") feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.add_spell(new/spell/aoe_turf/knock) - temp = "You have learned knock." + temp = "You have installed knock." // if("horseman") // feedback_add_details("wizard_spell_learned","HH") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells // H.add_spell(new/spell/targeted/equip_item/horsemask) @@ -211,7 +210,7 @@ feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/storage/belt/soulstone/full(get_turf(H)) H.add_spell(new/spell/aoe_turf/conjure/construct) - temp = "You have purchased a belt full of soulstones and have learned the artificer spell." + temp = "You have purchased a belt full of soulstones and have learned the artificer augment." max_uses-- if("armor") feedback_add_details("wizard_spell_learned","HS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells @@ -243,16 +242,17 @@ /obj/item/spellbook/oneuse var/spell = /spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic - var/spellname = "sandbox" + var/spellname = "" var/used = 0 - name = "spellbook of " + name = "unstable nanomachine hive: " uses = 1 max_uses = 1 - desc = "This template spellbook was never meant for the eyes of man..." + desc = "A secure delivery system for highly experimental nanomachine swarms capable of rapidly installing (often illegal) biotech augments to those both educated in its usage, and reckness enough to try. Insert hand when ready." /obj/item/spellbook/oneuse/Initialize() . = ..() name += spellname + icon_state = "hive[spellname]" /obj/item/spellbook/oneuse/attack_self(mob/user as mob) var/spell/S = new spell(user) @@ -261,33 +261,33 @@ if(user.mind) // TODO: Update to new antagonist system. if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard") - to_chat(user, "You're already far more versed in this spell than this flimsy how-to book can provide.") + to_chat(user, "You're already equipped with augments beyond what this small hive can provide.") else - to_chat(user, "You've already read this one.") + to_chat(user, "You've already applied the augment from this hive, the nanomachines remain dormant.") return if(used) recoil(user) else user.add_spell(S) - to_chat(user, "you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") + to_chat(user, "You place your hand in the hive's receptacle and feel an alien presence course through your body. Once the stinging subsides, you realise your body is capable of something new. You can now [spellname]!") user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).") onlearned(user) /obj/item/spellbook/oneuse/proc/recoil(mob/user as mob) - user.visible_message("[src] glows in a black light!") + playsound(src, 'sound/effects/refill.ogg', 50, 1) + user.visible_message("[src] rattles uncontrollably!") /obj/item/spellbook/oneuse/proc/onlearned(mob/user as mob) + playsound(src, 'sound/effects/hypospray.ogg', 50, 1) used = 1 - user.visible_message("[src] glows dark for a second!") + user.visible_message("[src] lights up, vibrating softly for a moment!") /obj/item/spellbook/oneuse/attackby() return /obj/item/spellbook/oneuse/fireball spell = /spell/targeted/projectile/dumbfire/fireball - spellname = "fireball" - icon_state ="bookfireball" - desc = "This book feels warm to the touch." + spellname = "superheat matter" /obj/item/spellbook/oneuse/fireball/recoil(mob/user as mob) ..() @@ -296,21 +296,17 @@ /obj/item/spellbook/oneuse/smoke spell = /spell/aoe_turf/smoke - spellname = "smoke" - icon_state ="booksmoke" - desc = "This book is overflowing with the dank arts." + spellname = "emit smoke" /obj/item/spellbook/oneuse/smoke/recoil(mob/living/user as mob) ..() - to_chat(user, "Your stomach rumbles...") + to_chat(user, "Your stomach lurches, you feel like you haven't eaten in days...") if(user.nutrition) user.adjust_nutrition(-200) /obj/item/spellbook/oneuse/blind spell = /spell/targeted/genetic/blind - spellname = "blind" - icon_state ="bookblind" - desc = "This book looks blurry, no matter how you look at it." + spellname = "ocular disruption" /obj/item/spellbook/oneuse/blind/recoil(mob/user as mob) ..() @@ -319,14 +315,12 @@ /obj/item/spellbook/oneuse/mindswap spell = /spell/targeted/mind_transfer - spellname = "mindswap" - icon_state ="bookmindswap" - desc = "This book's cover is pristine, though its pages look ragged and torn." + spellname = "neural replication" var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps /obj/item/spellbook/oneuse/mindswap/onlearned() - spellname = pick("fireball","smoke","blind","forcewall","knock","horses","charge") - icon_state = "book[spellname]" + spellname = pick("superheat matter","emit smoke","ocular disruption","restriction field","manipulate lock","horse","charging") + icon_state = "hive[spellname]" name = "spellbook of [spellname]" //Note, desc doesn't change by design ..() @@ -339,7 +333,7 @@ to_chat(user, "For a moment you feel like you don't even know who you are anymore.") return if(stored_swap == user) - to_chat(user, "You stare at the book some more, but there doesn't seem to be anything else to learn...") + to_chat(user, "You insert your hand into the nanomachine hive, but it doesn't seem to do anything more for you...") return if(user.mind.special_verbs.len) @@ -374,9 +368,7 @@ /obj/item/spellbook/oneuse/forcewall spell = /spell/aoe_turf/conjure/forcewall - spellname = "forcewall" - icon_state ="bookforcewall" - desc = "This book has a dedication to mimes everywhere inside the front cover." + spellname = "restriction field" /obj/item/spellbook/oneuse/forcewall/recoil(mob/user as mob) ..() @@ -388,24 +380,20 @@ /obj/item/spellbook/oneuse/knock spell = /spell/aoe_turf/knock - spellname = "knock" - icon_state ="bookknock" - desc = "This book is hard to hold closed properly." + spellname = "manipulate lock" /obj/item/spellbook/oneuse/knock/recoil(mob/user as mob) ..() - to_chat(user, "You're knocked down!") + to_chat(user, "Your limb joints go slack!") user.Weaken(20) /obj/item/spellbook/oneuse/horsemask spell = /spell/targeted/equip_item/horsemask - spellname = "horses" - icon_state ="bookhorses" - desc = "This book is more horse than your mind has room for." + spellname = "horse" /obj/item/spellbook/oneuse/horsemask/recoil(mob/living/carbon/user as mob) if(istype(user, /mob/living/carbon/human)) - to_chat(user, "HOR-SIE HAS RISEN") + to_chat(user, "HOR-SIE HAS RISEN!") var/obj/item/clothing/mask/costume/horsehead/magichead = new /obj/item/clothing/mask/costume/horsehead magichead.canremove = 0 //curses! magichead.flags_inv = null //so you can still see their face @@ -414,15 +402,13 @@ user.equip_to_slot_if_possible(magichead, slot_wear_mask, 1, 1) qdel(src) else - to_chat(user, "I say thee neigh") + to_chat(user, "I say thee neigh!") /obj/item/spellbook/oneuse/charge spell = /spell/aoe_turf/charge spellname = "charging" - icon_state ="bookcharge" - desc = "This book is made of 100% post-consumer wizard." /obj/item/spellbook/oneuse/charge/recoil(mob/user as mob) ..() - to_chat(user, "[src] suddenly feels very warm!") + to_chat(user, "[src] suddenly shorts out!") empulse(src, 1, 1, 1, 1) diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm index ec48c4ab492..839ea897a18 100644 --- a/code/modules/spells/targeted/projectile/fireball.dm +++ b/code/modules/spells/targeted/projectile/fireball.dm @@ -1,14 +1,14 @@ /spell/targeted/projectile/dumbfire/fireball name = "Fireball" - desc = "This spell fires a fireball at a target and does not require wizard garb." + desc = "This fires a fireball at a target and does not require special equipment." proj_type = /obj/item/projectile/spell_projectile/fireball school = "evocation" charge_max = 100 spell_flags = 0 - invocation = "ONI SOMA" - invocation_type = SpI_SHOUT + invocation = "manifests heat from within their body!" + invocation_type = SpI_EMOTE range = 20 cooldown_min = 20 //10 deciseconds reduction per rank @@ -36,4 +36,4 @@ /obj/item/projectile/spell_projectile/fireball name = "fireball" - icon_state = "fireball" \ No newline at end of file + icon_state = "fireball" diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index a5ec13d6053..6541bd86ca0 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -252,7 +252,7 @@ if(I.damage > 0 && (I.robotic >= ORGAN_ROBOT)) is_organ_damaged = 1 break - return affected.open == 3 && is_organ_damaged + return affected.open == (affected.encased ? 3 : 2) && is_organ_damaged /datum/surgery_step/robotics/fix_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index 99100030a56..f4a45f5f132 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -105,8 +105,8 @@ var/global/list/ventcrawl_machinery = list( if(canmove && pipe) return pipe -/mob/living/carbon/alien/ventcrawl_carry() - return 1 +/mob/living/carbon/diona/ventcrawl_carry() + return TRUE /mob/living/var/ventcrawl_layer = 3 diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 134fcd6243b..7789923b445 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -424,7 +424,7 @@ //robot remains apply_prefix = FALSE item_type = "[pick("mechanical","robotic","cyborg")] [pick("remains","chassis","debris")]" - icon = 'icons/mob/robots.dmi' + icon = 'icons/mob/robot_gibs.dmi' icon_state = "remainsrobot" additional_desc = pick("Almost mistakeable for the remains of a modern cyborg.",\ "They are barely recognisable as anything other than a pile of waste metals.",\ diff --git a/code/modules/xenoarcheaology/finds/talking.dm b/code/modules/xenoarcheaology/finds/talking.dm index c9c0b0c8eba..943b2cee501 100644 --- a/code/modules/xenoarcheaology/finds/talking.dm +++ b/code/modules/xenoarcheaology/finds/talking.dm @@ -108,15 +108,6 @@ else msg+="!" - var/list/listening = viewers(holder_atom) - for(var/mob/M in mob_list) - if (!M.client) - continue //skip monkeys and leavers - if (istype(M, /mob/new_player)) - continue - if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) - listening|=M - - for(var/mob/M in listening) + for(var/mob/M in viewers(holder_atom)) to_chat(M, "[bicon(holder_atom)] [holder_atom] reverberates, \"[msg]\"") last_talk_time = world.time diff --git a/code/modules/xenobio/items/weapons.dm b/code/modules/xenobio/items/weapons.dm index e91bbd7ae8d..53d779597d6 100644 --- a/code/modules/xenobio/items/weapons.dm +++ b/code/modules/xenobio/items/weapons.dm @@ -55,9 +55,8 @@ slime-based xeno lifeforms at a distance. It is ineffective at stunning non-slimy lifeforms such as humanoids." /obj/item/gun/energy/taser/xeno/robot // Borg version - self_recharge = 1 - use_external_power = 1 - recharge_time = 3 + self_recharge = TRUE + use_external_power = TRUE /obj/item/gun/energy/taser/xeno/sec //NT's corner-cutting option for their on-station security. desc = "An NT Mk30 NL retrofitted to fire beams for subduing non-humanoid slimy xeno life forms." @@ -69,9 +68,8 @@ description_fluff = "An NT Mk30 NL retrofitted after the events that occurred aboard the NRS Prometheus." /obj/item/gun/energy/taser/xeno/sec/robot //Cyborg variant of the security xeno-taser. - self_recharge = 1 - use_external_power = 1 - recharge_time = 3 + self_recharge = TRUE + use_external_power = TRUE /obj/item/projectile/beam/stun/xeno icon_state = "omni" diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm new file mode 100644 index 00000000000..e3cb07eb34f --- /dev/null +++ b/code/unit_tests/icon_tests.dm @@ -0,0 +1,139 @@ +/datum/unit_test/robot_module_icons_shall_be_valid + name = "ICONS: Robot module icons shall be valid" + var/list/check_module_categories = list( + ROBOT_MODULE_TYPE_GROUNDED, + ROBOT_MODULE_TYPE_FLYING + ) + var/list/panel_overlays = list( + "ov-openpanel +w", + "ov-openpanel +c", + "ov-openpanel -c" + ) + var/list/gear_to_check = list( + /obj/item/borg/combat/shield = "-shield", + /obj/item/borg/combat/mobility = "-roll" + ) + +/datum/unit_test/robot_module_icons_shall_be_valid/start_test() + + var/list/failures = list() + // fetch our icon states to check against + var/list/icon_state_cache = list( + ROBOT_MODULE_TYPE_GROUNDED = icon_states('icons/mob/robots/robots_grounded.dmi'), + ROBOT_MODULE_TYPE_FLYING = icon_states('icons/mob/robots/robots_flying.dmi') + ) + + var/list/found_states = list() // Keep track of this for checking for unused states later. + + // Kick it off by doing a sprite check on all flying and grounded modules. + for(var/module_type in typesof(/obj/item/robot_module)) + + // Skip abstract modules and think-tanks as they do icon gen differently. + var/obj/item/robot_module/module = module_type + if(!initial(module.display_name) || !(initial(module.module_category) in check_module_categories)) + continue + + module = new module // this will automatically qdelete, but we just want the sprites. + + // Check that the expected states are actually in the icon file. + var/check_states = icon_state_cache[module.module_category] + for(var/sprite in module.sprites) + + // Basic sprite. + var/check_state = module.sprites[sprite] + if(check_state in check_states) + LAZYDISTINCTADD(found_states[module.module_category], check_state) + else + failures += "missing base state '[check_state]' for [module.display_name] ([module.module_category])" + + // Eyes overlay. + var/eye_check_state = "eyes-[check_state]" + if(eye_check_state in check_states) + LAZYDISTINCTADD(found_states[module.module_category], eye_check_state) + else + failures += "missing eyes state '[eye_check_state]' for [module.display_name] ([module.module_category])" + + // Equipment overlays. + for(var/geartype in gear_to_check) + var/suffix = gear_to_check[geartype] + for(var/gear in module.modules) + if(!ispath(gear, geartype)) + continue + var/gear_check_state = "[check_state][suffix]" + if(gear_check_state in check_states) + LAZYDISTINCTADD(found_states[module.module_category], gear_check_state) + else + failures += "missing gear state '[gear_check_state]' for [module.display_name] ([module.module_category])" + break + + // Check for drone AI eyes. + if(istype(module, /obj/item/robot_module/drone)) + var/ai_eye_state = "[eye_check_state]-ai" + if(ai_eye_state in check_states) + LAZYDISTINCTADD(found_states[module.module_category], ai_eye_state) + else + failures += "missing drone AI control state '[ai_eye_state]' for [module.display_name] ([module.module_category])" + + // Check for missing panel states. + for(var/module_category in check_module_categories) + var/list/check_states = icon_state_cache[module_category] + for(var/panel_state in panel_overlays) + if(panel_state in check_states) + LAZYDISTINCTADD(found_states[module_category], panel_state) + else + failures += "missing panel state '[panel_state]' for [module_category]" + + // Now we can do tachikoma sprites. + var/list/tachikoma_icon_states = list() + for(var/module_type in typesof(/obj/item/robot_module/robot/platform)) + // Skip abstract modules. + var/obj/item/robot_module/robot/platform/module = module_type + if(!initial(module.display_name) || !initial(module.module_category) || !initial(module.user_icon)) + continue + + // We need a module instance to check the decal list. + module = new module_type + if(!tachikoma_icon_states[module.user_icon]) + tachikoma_icon_states[module.user_icon] = icon_states(module.user_icon) + LAZYDISTINCTADD(icon_state_cache[ROBOT_MODULE_TYPE_PLATFORM], tachikoma_icon_states[module.user_icon]) + +/* +unexpected state 'tachi_cross' for platform +unexpected state 'tachi-open-wires' for platform +unexpected state 'tachi-open-cell' for platform +*/ + var/list/states_to_check = list( + "blank", + module.user_icon_state, + "[module.user_icon_state]-open", + "[module.user_icon_state]-wires", + "[module.user_icon_state]-cell", + "[module.user_icon_state]-nowires" + ) + if(module.armor_color) + states_to_check += "[module.user_icon_state]_armour" + for(var/decal in module.decals) + states_to_check += "[module.user_icon_state]_[decal]" + if(module.eye_color) + states_to_check += "[module.user_icon_state]_eyes" + if(module.pupil_color) + states_to_check += "[module.user_icon_state]_pupils" + + for(var/check_state in states_to_check) + if(check_state in tachikoma_icon_states[module.user_icon]) + LAZYDISTINCTADD(found_states[ROBOT_MODULE_TYPE_PLATFORM], check_state) + else + failures += "missing platform state '[check_state]' in icon file [module.user_icon]" + + // Check that there aren't any unexpected states. + for(var/module_category in icon_state_cache) + var/list/check_found_states = LAZYACCESS(found_states, module_category) + for(var/check_state in icon_state_cache[module_category]) + if(!(check_state in check_found_states)) + failures += "unexpected state '[check_state]' for [module_category]" + + if(length(failures)) + fail("Some robot module sprites are invalid:\n" + failures.Join("\n")) + else + pass("All robot module sprites are valid.") + return 1 diff --git a/icons/effects/species_tails.dmi b/icons/effects/species_tails.dmi index 4ac841f64cd..88cd2c05caa 100644 Binary files a/icons/effects/species_tails.dmi and b/icons/effects/species_tails.dmi differ diff --git a/icons/mob/hair_skrell.dmi b/icons/mob/hair_skrell.dmi new file mode 100644 index 00000000000..9e1aabf98b5 Binary files /dev/null and b/icons/mob/hair_skrell.dmi differ diff --git a/icons/mob/hair_skrell_add.dmi b/icons/mob/hair_skrell_add.dmi new file mode 100644 index 00000000000..27c7cd1441b Binary files /dev/null and b/icons/mob/hair_skrell_add.dmi differ diff --git a/icons/mob/hair_unathi.dmi b/icons/mob/hair_unathi.dmi new file mode 100644 index 00000000000..ae0822d068b Binary files /dev/null and b/icons/mob/hair_unathi.dmi differ diff --git a/icons/mob/hair_unathi_add.dmi b/icons/mob/hair_unathi_add.dmi new file mode 100644 index 00000000000..c2356fe596b Binary files /dev/null and b/icons/mob/hair_unathi_add.dmi differ diff --git a/icons/mob/hair_vox.dmi b/icons/mob/hair_vox.dmi index da7b6585b0f..cdd7afae8c1 100644 Binary files a/icons/mob/hair_vox.dmi and b/icons/mob/hair_vox.dmi differ diff --git a/icons/mob/hair_vox_add.dmi b/icons/mob/hair_vox_add.dmi index da7b6585b0f..6e5d5c4b82f 100644 Binary files a/icons/mob/hair_vox_add.dmi and b/icons/mob/hair_vox_add.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index db81f40edfa..8fe8eeef2fd 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index f8bb6376f55..d9415d17f99 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_face_alt.dmi b/icons/mob/human_face_alt.dmi index 6811bb8fd6d..0935de1789d 100644 Binary files a/icons/mob/human_face_alt.dmi and b/icons/mob/human_face_alt.dmi differ diff --git a/icons/mob/human_face_alt_add.dmi b/icons/mob/human_face_alt_add.dmi index 9007a281f59..27a24a6bd50 100644 Binary files a/icons/mob/human_face_alt_add.dmi and b/icons/mob/human_face_alt_add.dmi differ diff --git a/icons/mob/human_face_m.dmi b/icons/mob/human_face_m.dmi index 501312dc69d..f8a1b4e24e5 100644 Binary files a/icons/mob/human_face_m.dmi and b/icons/mob/human_face_m.dmi differ diff --git a/icons/mob/items/lefthand_storage.dmi b/icons/mob/items/lefthand_storage.dmi index d8c05acfab3..e34515e2beb 100644 Binary files a/icons/mob/items/lefthand_storage.dmi and b/icons/mob/items/lefthand_storage.dmi differ diff --git a/icons/mob/items/righthand_storage.dmi b/icons/mob/items/righthand_storage.dmi index b1e294552b0..539a4b6de54 100644 Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ diff --git a/icons/mob/robot_gibs.dmi b/icons/mob/robot_gibs.dmi new file mode 100644 index 00000000000..79ccbf73703 Binary files /dev/null and b/icons/mob/robot_gibs.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi deleted file mode 100644 index 42ffba5547c..00000000000 Binary files a/icons/mob/robots.dmi and /dev/null differ diff --git a/icons/mob/robots/robot_unused.dmi b/icons/mob/robots/robot_unused.dmi new file mode 100644 index 00000000000..63c52b2eb1c Binary files /dev/null and b/icons/mob/robots/robot_unused.dmi differ diff --git a/icons/mob/robots/robots_flying.dmi b/icons/mob/robots/robots_flying.dmi new file mode 100644 index 00000000000..472fd220fb5 Binary files /dev/null and b/icons/mob/robots/robots_flying.dmi differ diff --git a/icons/mob/robots/robots_grounded.dmi b/icons/mob/robots/robots_grounded.dmi new file mode 100644 index 00000000000..d7b1df3a71c Binary files /dev/null and b/icons/mob/robots/robots_grounded.dmi differ diff --git a/icons/mob/robots/robots_platform.dmi b/icons/mob/robots/robots_platform.dmi new file mode 100644 index 00000000000..364eaef48d5 Binary files /dev/null and b/icons/mob/robots/robots_platform.dmi differ diff --git a/icons/mob/robots_thinktank.dmi b/icons/mob/robots_thinktank.dmi deleted file mode 100644 index 471647bf603..00000000000 Binary files a/icons/mob/robots_thinktank.dmi and /dev/null differ diff --git a/icons/mob/species/teshari/back.dmi b/icons/mob/species/teshari/back.dmi index 74db9cb10c0..121ee85ade4 100644 Binary files a/icons/mob/species/teshari/back.dmi and b/icons/mob/species/teshari/back.dmi differ diff --git a/icons/mob/species/teshari/ties.dmi b/icons/mob/species/teshari/ties.dmi index 38514d4eeff..17aed58c783 100644 Binary files a/icons/mob/species/teshari/ties.dmi and b/icons/mob/species/teshari/ties.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 56dbd9e56a7..aa3f0bfe338 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/clothing/backpack.dmi b/icons/obj/clothing/backpack.dmi index b2bbcab5d53..8922e024253 100644 Binary files a/icons/obj/clothing/backpack.dmi and b/icons/obj/clothing/backpack.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index aebccfc49fc..481a11f9c1e 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 38b057c8c20..30e1e0da4c9 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits_1.dmi b/icons/obj/clothing/suits_1.dmi index 830e253433a..3f99601b138 100644 Binary files a/icons/obj/clothing/suits_1.dmi and b/icons/obj/clothing/suits_1.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 0db3c66874f..37e89004a36 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/robobag.dmi b/icons/obj/robobag.dmi index f87d96ce072..431da9c2065 100644 Binary files a/icons/obj/robobag.dmi and b/icons/obj/robobag.dmi differ diff --git a/icons/obj/robot_parts.dmi b/icons/obj/robot_parts.dmi index 9461028091f..724a179adda 100644 Binary files a/icons/obj/robot_parts.dmi and b/icons/obj/robot_parts.dmi differ diff --git a/icons/obj/robot_parts_flying.dmi b/icons/obj/robot_parts_flying.dmi new file mode 100644 index 00000000000..43c81d957d8 Binary files /dev/null and b/icons/obj/robot_parts_flying.dmi differ diff --git a/icons/obj/robot_parts_platform.dmi b/icons/obj/robot_parts_platform.dmi new file mode 100644 index 00000000000..390c3e7ba32 Binary files /dev/null and b/icons/obj/robot_parts_platform.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 609b48bcf68..1542c261ac1 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 08783115198..45b4dc967bc 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/maps/_templates_and_guidance/Templates/shelter_Medical.dmm b/maps/_templates_and_guidance/Templates/shelter_Medical.dmm index 1a5f109ef70..0294d4c5845 100644 --- a/maps/_templates_and_guidance/Templates/shelter_Medical.dmm +++ b/maps/_templates_and_guidance/Templates/shelter_Medical.dmm @@ -4,7 +4,7 @@ "d" = (/turf/simulated/shuttle/floor/voidcraft/dark,/area/survivalpod) "e" = (/obj/machinery/light/small,/obj/structure/sink{dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/shuttle/floor/voidcraft/light,/area/survivalpod) "f" = (/obj/structure/window/reinforced/survival_pod{dir = 1},/obj/structure/bed/chair/comfy/black{dir = 8},/turf/simulated/shuttle/floor/voidcraft/dark,/area/survivalpod) -"g" = (/obj/structure/table/glass,/obj/structure/closet/secure_closet/guncabinet/phase{pixel_y = -32},/obj/item/gun/energy/locked/frontier/holdout,/obj/item/gun/energy/locked/frontier/holdout,/obj/item/clothing/accessory/permit/gun/planetside,/obj/item/clothing/accessory/permit/gun/planetside,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/simulated/shuttle/floor/voidcraft/dark,/area/survivalpod) +"g" = (/obj/structure/table/glass,/obj/structure/closet/secure_closet/guncabinet/phase{pixel_y = -32},/obj/item/gun/energy/locked/frontier/holdout,/obj/item/gun/energy/locked/frontier/holdout,/obj/item/clothing/accessory/medal/permit/gun/planetside,/obj/item/clothing/accessory/medal/permit/gun/planetside,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/simulated/shuttle/floor/voidcraft/dark,/area/survivalpod) "h" = (/obj/structure/sign/mining/survival{dir = 8},/turf/simulated/shuttle/wall/voidcraft/survival/hard_corner,/area/survivalpod) "i" = (/obj/effect/floor_decal/industrial/danger/full,/obj/structure/fans/tiny,/obj/machinery/door/airlock/voidcraft/survival_pod,/turf/simulated/shuttle/floor/voidcraft/dark,/area/survivalpod) "j" = (/obj/structure/sign/mining/survival,/turf/simulated/shuttle/wall/voidcraft/survival,/area/survivalpod) diff --git a/maps/cynosure/cynosure-1.dmm b/maps/cynosure/cynosure-1.dmm index b45c8b22370..5a8a3fd1772 100644 --- a/maps/cynosure/cynosure-1.dmm +++ b/maps/cynosure/cynosure-1.dmm @@ -171,6 +171,13 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/surface/station/rnd/mixing) +"av" = ( +/obj/effect/floor_decal/rust, +/obj/machinery/door/airlock/maintenance/rnd{ + name = "Research Testing Site" + }, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "aw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -1350,6 +1357,9 @@ "cN" = ( /turf/simulated/wall/concrete, /area/surface/station/construction/elevator) +"cO" = ( +/turf/simulated/mineral/ignore_mapgen/sif, +/area/surface/cave/unexplored/deep) "cP" = ( /obj/effect/floor_decal/industrial/hatch/yellow, /obj/effect/map_helper/airlock/door/ext_door, @@ -1439,6 +1449,19 @@ /obj/random/obstruction, /turf/simulated/floor/plating, /area/surface/station/maintenance/weststairwell/bmt) +"cZ" = ( +/obj/effect/floor_decal/rust, +/obj/structure/cable/heavyduty{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research{ + name = "Research Testing Site"; + req_one_access = list(47) + }, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "da" = ( /obj/effect/floor_decal/industrial/warning, /turf/simulated/floor/tiled/dark, @@ -1538,6 +1561,10 @@ }, /turf/simulated/floor/plating, /area/surface/station/maintenance/substation/medbay/bmt) +"dm" = ( +/obj/item/frame/light, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "dn" = ( /obj/vehicle/train/engine{ dir = 8 @@ -1896,6 +1923,16 @@ }, /turf/simulated/floor/tiled/old_tile/gray, /area/surface/station/medical/morgue) +"ed" = ( +/obj/effect/floor_decal/industrial/warning/dust{ + dir = 9 + }, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "ee" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2696,6 +2733,10 @@ }, /turf/simulated/floor/tiled, /area/surface/station/mining_main) +"fS" = ( +/obj/structure/table/steel, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "fT" = ( /obj/effect/floor_decal/rust, /obj/effect/floor_decal/industrial/hatch/yellow, @@ -3153,6 +3194,18 @@ }, /turf/simulated/floor/tiled/old_cargo/gray, /area/surface/outpost/research/xenoarcheology/anomaly) +"gR" = ( +/obj/structure/cable/heavyduty{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/cave/explored/normal) "gS" = ( /obj/machinery/door/firedoor/border_only, /obj/structure/cable{ @@ -4338,6 +4391,11 @@ }, /turf/simulated/floor/tiled, /area/surface/station/mining_main/storage) +"ji" = ( +/obj/structure/table/steel, +/obj/item/stack/cable_coil/cyan, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "jj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5908,6 +5966,17 @@ }, /turf/simulated/floor/tiled/freezer, /area/surface/outpost/research/xenoarcheology/restroom) +"mk" = ( +/obj/machinery/power/smes/buildable{ + RCon_tag = "Substation - Research Testing Site"; + charge = 4e+005 + }, +/obj/structure/cable/cyan{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/surface/station/rnd/testingsite) "mm" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -6292,6 +6361,12 @@ }, /turf/simulated/floor/tiled/old_tile/gray, /area/surface/station/mining_main/refinery) +"mZ" = ( +/obj/item/stool{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "na" = ( /obj/machinery/disposal/deliveryChute{ dir = 4 @@ -6449,6 +6524,12 @@ outdoors = 0 }, /area/surface/station/maintenance/medical/west) +"nq" = ( +/turf/simulated/floor/plating/sif/planetuse{ + icon_state = "asteroidplating2"; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "nr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -6659,6 +6740,14 @@ }, /turf/simulated/floor/tiled/techfloor/grid, /area/surface/station/rnd/hallway/bmt) +"nX" = ( +/obj/structure/table/steel, +/obj/machinery/camera/network/research{ + c_tag = "SCI - Research Testing Site"; + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "nY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -7308,6 +7397,14 @@ }, /turf/simulated/floor/tiled, /area/surface/station/engineering/hallway/bmt) +"po" = ( +/obj/structure/cable/heavyduty{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "pp" = ( /obj/effect/floor_decal/spline/plain{ dir = 9 @@ -7431,10 +7528,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/maintenance{ - req_one_access = list(5,12,47) + name = "Xenofauna Maintenance Access"; + req_access = list(12, 67) }, -/obj/machinery/door/firedoor/border_only, /turf/simulated/floor/plating, /area/surface/station/maintenance/medical/west) "pC" = ( @@ -7509,6 +7607,15 @@ /obj/effect/catwalk_plated/dark, /turf/simulated/floor/plating, /area/surface/station/maintenance/research/south) +"pI" = ( +/obj/machinery/alarm/outside{ + dir = 8; + pixel_x = 22; + req_one_access = null + }, +/obj/machinery/floodlight, +/turf/simulated/floor/plating, +/area/surface/station/rnd/testingsite) "pJ" = ( /obj/structure/table/rack, /obj/random/maintenance/medical, @@ -10210,6 +10317,17 @@ }, /turf/simulated/floor/tiled/white, /area/surface/outpost/research/xenoarcheology/entrance) +"vi" = ( +/obj/structure/cable/heavyduty{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/catwalk_plated/dark, +/turf/simulated/floor/plating, +/area/surface/station/rnd/testingsite) "vj" = ( /obj/effect/floor_decal/industrial/warning{ dir = 8 @@ -11520,6 +11638,14 @@ }, /turf/simulated/floor/plating, /area/surface/station/maintenance/substation/research/bmt) +"xR" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/plating, +/area/surface/station/rnd/testingsite) "xT" = ( /obj/machinery/status_display, /turf/simulated/wall/r_concrete, @@ -12243,6 +12369,13 @@ outdoors = 0 }, /area/surface/station/mining_main/exterior) +"zm" = ( +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "zn" = ( /obj/effect/floor_decal/techfloor{ dir = 6 @@ -13981,6 +14114,12 @@ }, /turf/simulated/floor/tiled/old_cargo/gray, /area/surface/outpost/research/xenoarcheology/anomaly) +"CK" = ( +/obj/structure/closet/crate/science, +/obj/random/maintenance/research, +/obj/random/maintenance/research, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "CL" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -14526,6 +14665,16 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/old_cargo/gray, /area/surface/station/maintenance/incinerator) +"DU" = ( +/obj/machinery/light/spot{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "DV" = ( /obj/machinery/door/firedoor/border_only, /obj/structure/cable{ @@ -19155,6 +19304,16 @@ "NY" = ( /turf/simulated/wall/r_wall, /area/surface/station/mining_main/refinery) +"NZ" = ( +/obj/effect/floor_decal/industrial/warning/dust{ + dir = 5 + }, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "Ob" = ( /obj/structure/ore_box, /obj/effect/floor_decal/borderfloor{ @@ -20397,6 +20556,14 @@ /obj/structure/disposalpipe/segment, /turf/simulated/wall/r_wall, /area/surface/outpost/research/xenoarcheology/smes) +"Qn" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "Qo" = ( /obj/structure/sign/warning/fire, /turf/simulated/wall/r_wall, @@ -21823,6 +21990,16 @@ }, /turf/simulated/floor/tiled/steel_grid, /area/surface/station/hallway/primary/bmt/east) +"Th" = ( +/obj/effect/floor_decal/industrial/warning/dust{ + dir = 6 + }, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "Ti" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -21968,6 +22145,9 @@ }, /turf/simulated/floor/plating, /area/surface/station/maintenance/eaststairwell) +"TE" = ( +/turf/simulated/wall/r_wall, +/area/surface/station/rnd/testingsite) "TF" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 6 @@ -22573,6 +22753,10 @@ outdoors = 0 }, /area/surface/station/rnd/toxins_launch) +"UT" = ( +/obj/machinery/light, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "UU" = ( /obj/item/radio/intercom{ dir = 1; @@ -22992,6 +23176,11 @@ d2 = 4; icon_state = "2-4" }, +/obj/structure/cable/heavyduty{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, /turf/simulated/floor/tiled/steel/sif/planetuse{ icon_state = "asteroidfloor"; initial_flooring = /decl/flooring/tiling/asteroidfloor; @@ -23045,6 +23234,11 @@ "VS" = ( /turf/simulated/wall/concrete, /area/surface/station/construction/bmt/construction3) +"VT" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor/plating, +/area/surface/station/rnd/testingsite) "VU" = ( /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -23176,6 +23370,16 @@ /obj/structure/sign/warning/high_voltage, /turf/simulated/wall/r_concrete, /area/surface/station/storage/tech) +"Wi" = ( +/obj/effect/floor_decal/industrial/warning/dust{ + dir = 10 + }, +/turf/simulated/floor/tiled/steel/sif/planetuse{ + icon_state = "asteroidfloor"; + initial_flooring = /decl/flooring/tiling/asteroidfloor; + outdoors = 0 + }, +/area/surface/station/rnd/testingsite) "Wk" = ( /obj/effect/floor_decal/steeldecal/steel_decals4{ dir = 8 @@ -23515,6 +23719,18 @@ /obj/machinery/portable_atmospherics/powered/pump/filled, /turf/simulated/floor/tiled/monotile, /area/surface/station/engineering/auxiliary_engineering) +"WP" = ( +/obj/structure/cable/heavyduty{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating/sif/planetuse{ + icon_state = "asteroidplating2"; + outdoors = 0 + }, +/area/surface/cave/explored/normal) "WQ" = ( /obj/effect/floor_decal/industrial/warning/dust/corner{ dir = 1 @@ -23729,6 +23945,9 @@ /obj/effect/map_helper/airlock/atmos/chamber_pump, /turf/simulated/floor/tiled/techfloor/grid, /area/surface/outpost/research/xenoarcheology/entrance) +"Xn" = ( +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "Xo" = ( /obj/structure/table/rack, /obj/random/maintenance/medical, @@ -23919,6 +24138,26 @@ /obj/effect/floor_decal/corner/purple/border, /turf/simulated/floor/tiled/white, /area/surface/outpost/research/xenoarcheology) +"XJ" = ( +/obj/structure/cable/cyan{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc{ + dir = 1; + name = "north bump"; + nightshift_setting = 2; + pixel_y = 24 + }, +/obj/machinery/light_switch{ + pixel_x = 12; + pixel_y = 24 + }, +/obj/effect/floor_decal/steeldecal/steel_decals_central7{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/surface/station/rnd/testingsite) "XL" = ( /obj/machinery/door/firedoor/border_only, /obj/structure/grille, @@ -43886,15 +44125,15 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +cO +cO +cO +TE +cO +cO +cO +cO RQ RQ RQ @@ -44142,17 +44381,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +cO +zm +zm +zm +DU +zm +zm +zm +cO +cO RQ RQ RQ @@ -44399,17 +44638,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +Qn +ed +zm +zm +zm +zm +zm +Wi +Qn +cO RQ RQ RQ @@ -44656,17 +44895,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +zm +zm +ed +zm +zm +zm +Wi +zm +Qn +cO RQ RQ RQ @@ -44733,10 +44972,10 @@ VE VE mV HE -HE -HE -HE -HE +Kj +Kj +Kj +Kj HE HE HE @@ -44913,17 +45152,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +zm +zm +zm +ed +zm +Wi +zm +zm +Qn +cO RQ RQ RQ @@ -44993,8 +45232,8 @@ Kj Kj Kj Kj -HE -HE +Kj +Kj HE HE HE @@ -45170,17 +45409,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +zm +zm +zm +zm +Qn +zm +zm +zm +nq +cO RQ RQ RQ @@ -45248,7 +45487,8 @@ Kj Kj Kj Kj -Kj +Fp +Fp Kj Kj HE @@ -45256,7 +45496,6 @@ HE HE HE HE -HE WS HE HE @@ -45265,8 +45504,8 @@ HE HE HE HE -HE -HE +Fp +Fp HE HE HE @@ -45427,17 +45666,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +zm +zm +zm +NZ +zm +Th +zm +zm +nq +cO RQ RQ RQ @@ -45505,8 +45744,8 @@ BK mV Kj HE -Kj -Kj +Fp +Fp Kj Kj Kj @@ -45522,8 +45761,8 @@ HE HE HE HE -HE -HE +Fp +Fp HE HE HE @@ -45684,17 +45923,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +zm +zm +NZ +zm +zm +zm +Th +zm +zm +cO RQ HE HE @@ -45762,8 +46001,8 @@ HP lw Kj HE -Kj -Kj +HE +HE Kj Kj Kj @@ -45941,17 +46180,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +zm +NZ +zm +zm +zm +zm +zm +Th +Qn +cO RQ HE HE @@ -46198,17 +46437,17 @@ RQ RQ RQ RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ -RQ +cO +TE +zm +zm +zm +zm +zm +Qn +Qn +TE +cO RQ HE HE @@ -46456,15 +46695,15 @@ RQ RQ RQ HE -HE -HE -HE -HE -HE -HE -HE -HE -HE +TE +VT +VT +VT +av +VT +VT +VT +TE HE HE HE @@ -46713,15 +46952,15 @@ RQ RQ HE HE -HE -HE -HE -HE -HE -HE -HE -HE -HE +TE +fS +ji +fS +Xn +nX +fS +fS +TE HE HE HE @@ -46970,15 +47209,15 @@ RQ RQ HE HE -HE -HE -HE -HE -HE -HE -HE -HE -HE +TE +dm +Xn +Xn +Xn +Xn +mZ +UT +TE HE HE HE @@ -47227,15 +47466,15 @@ RQ RQ HE HE -HE -HE -HE -HE -HE -HE -HE -HE -HE +TE +XJ +xR +Xn +Xn +Xn +Xn +CK +TE HE HE HE @@ -47484,15 +47723,15 @@ RQ RQ HE HE -HE -HE -HE -HE -HE -HE -HE -HE -HE +TE +TE +mk +vi +po +Xn +pI +TE +TE HE HE HE @@ -47742,13 +47981,13 @@ RQ HE HE HE -HE -HE -HE -HE -HE -HE -HE +TE +TE +TE +cZ +TE +TE +TE HE HE HE @@ -48000,12 +48239,12 @@ HE HE HE HE -HE -HE -HE -HE -HE -HE +Yw +Yw +gR +Yw +Yw +Yw HE HE HE @@ -48259,8 +48498,8 @@ HE HE HE HE -HE -HE +gR +Kj HE HE HE @@ -48515,9 +48754,9 @@ HE HE HE HE -HE -HE -HE +Kj +gR +Kj HE HE HE @@ -48772,8 +49011,8 @@ HE HE HE HE -HE -HE +Kj +gR HE HE HE @@ -49029,8 +49268,8 @@ HE HE HE HE -HE -HE +Kj +gR HE HE HE @@ -49285,9 +49524,9 @@ HE HE HE HE -HE -HE -HE +Kj +Kj +gR HE HE HE @@ -49542,9 +49781,9 @@ HE HE HE HE -HE -HE -HE +Kj +Kj +WP HE HE HE @@ -49799,9 +50038,9 @@ HE HE HE HE -HE -HE -HE +Kj +Kj +gR HE HE HE @@ -50056,9 +50295,9 @@ HE HE HE HE -HE -HE -HE +Kj +Kj +gR HE HE HE @@ -50314,9 +50553,9 @@ HE HE HE HE -HE -HE -HE +Kj +gR +Kj HE HE HE @@ -50571,9 +50810,9 @@ HE HE HE HE -HE -HE -HE +Kj +gR +Kj HE HE HE @@ -50829,8 +51068,8 @@ HE HE HE HE -HE -HE +gR +Kj HE HE HE @@ -51086,9 +51325,9 @@ HE HE HE HE -HE -HE -HE +gR +Kj +Kj HE HE HE @@ -51343,9 +51582,9 @@ HE HE HE HE -HE -HE -HE +gR +Kj +Kj Kj Kj mH @@ -54776,8 +55015,8 @@ HE HE HE HE -HE -HE +Fp +Fp HE HE HE @@ -55033,8 +55272,8 @@ HE HE HE HE -HE -HE +Fp +Fp HE HE HE diff --git a/maps/cynosure/cynosure-2.dmm b/maps/cynosure/cynosure-2.dmm index b9a4e6d10f0..0e725a49fd3 100644 --- a/maps/cynosure/cynosure-2.dmm +++ b/maps/cynosure/cynosure-2.dmm @@ -126,9 +126,6 @@ /turf/simulated/floor/tiled, /area/surface/station/hallway/primary/groundfloor/north) "aef" = ( -/obj/effect/floor_decal/corner/purple/bordercorner{ - dir = 1 - }, /obj/effect/floor_decal/corner/purple/bordercorner{ dir = 4 }, @@ -2021,6 +2018,10 @@ name = "Trained Drake" }, /obj/structure/animal_den, +/obj/machinery/camera/network/ground_floor{ + c_tag = "Ground Floor - East Hallway 1"; + dir = 4 + }, /turf/simulated/floor/outdoors/dirt/sif, /area/rnd/xenobiology/xenofauna) "aXC" = ( @@ -2750,6 +2751,12 @@ }, /turf/simulated/floor/reinforced, /area/surface/station/rnd/misc_lab) +"bmB" = ( +/obj/structure/railing/grey{ + dir = 8 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "bmW" = ( /turf/simulated/floor/water, /area/surface/outside/plains/station) @@ -3218,6 +3225,17 @@ }, /turf/simulated/floor/tiled/techmaint, /area/surface/station/medical/etc) +"bwx" = ( +/obj/effect/landmark/start{ + name = "Trained Drake" + }, +/obj/structure/animal_den, +/obj/machinery/camera/network/ground_floor{ + c_tag = "Ground Floor - Garage"; + dir = 8 + }, +/turf/simulated/floor/outdoors/dirt/sif, +/area/rnd/xenobiology/xenofauna) "bwR" = ( /obj/structure/stairs/spawner/north, /turf/simulated/floor/plating, @@ -6955,9 +6973,6 @@ }, /turf/simulated/floor/plating, /area/surface/station/janitor) -"dgP" = ( -/turf/simulated/floor/outdoors/dirt/sif/planetuse/presnowed, -/area/space) "diu" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/table/rack, @@ -8161,8 +8176,7 @@ dir = 2 }, /obj/structure/railing/grey{ - dir = 4; - pixel_y = 8 + dir = 4 }, /turf/simulated/floor/outdoors/mask, /area/surface/outside/plains/plateau) @@ -11262,7 +11276,7 @@ "eYF" = ( /obj/machinery/door/airlock/glass_research{ name = "Xenofauna Lab"; - req_one_access = list(55) + req_one_access = list(67) }, /obj/machinery/door/firedoor/border_only, /obj/effect/floor_decal/corner/purple/bordercorner, @@ -13834,6 +13848,11 @@ }, /obj/item/reagent_containers/syringe/bicaridine, /obj/item/storage/firstaid/surgery/simple, +/obj/machinery/camera/network/ground_floor{ + c_tag = "Ground Floor - East Hallway 1"; + dir = 4 + }, +/obj/item/reagent_containers/food/snacks/xenomeat/spidermeat, /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/xenofauna) "giV" = ( @@ -15324,10 +15343,6 @@ name = "north bump"; pixel_y = 24 }, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -22 - }, /obj/structure/cable/green{ d2 = 4; icon_state = "0-4" @@ -15339,6 +15354,10 @@ /obj/item/melee/umbrella/random, /obj/item/melee/umbrella/random, /obj/item/melee/umbrella/random, +/obj/machinery/alarm/outside{ + dir = 4; + pixel_x = -22 + }, /turf/simulated/floor/tiled/techmaint, /area/rnd/xenobiology/xenofauna) "gPq" = ( @@ -15375,6 +15394,15 @@ /obj/effect/zone_divider, /turf/simulated/wall, /area/surface/station/engineering/reactor_room) +"gQc" = ( +/obj/structure/railing/grey{ + dir = 4 + }, +/obj/structure/railing/grey{ + dir = 1 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "gQu" = ( /obj/effect/floor_decal/borderfloorwhite, /obj/effect/floor_decal/corner/paleblue/border, @@ -17003,6 +17031,7 @@ /obj/effect/landmark/start{ name = "Xenofauna Technician" }, +/obj/item/book/manual/drake_handling, /turf/simulated/floor/tiled/techmaint, /area/rnd/xenobiology/xenofauna) "hGr" = ( @@ -17890,6 +17919,10 @@ pixel_x = -18; pixel_y = -4 }, +/obj/machinery/camera/network/ground_floor{ + c_tag = "Ground Floor - East Hallway 1"; + dir = 4 + }, /turf/simulated/floor/tiled/techmaint, /area/rnd/xenobiology/xenofauna) "idR" = ( @@ -19397,7 +19430,7 @@ }, /obj/machinery/door/airlock/glass_research{ name = "Xenofauna Lab"; - req_one_access = list(55) + req_one_access = list(67) }, /turf/simulated/floor/tiled/steel_grid, /area/rnd/xenobiology/xenofauna) @@ -20735,9 +20768,9 @@ dir = 6 }, /obj/structure/closet/wardrobe/red, -/obj/item/clothing/accessory/badge/holo, -/obj/item/clothing/accessory/badge/holo, -/obj/item/clothing/accessory/badge/holo/cord, +/obj/item/clothing/accessory/medal/badge/holo, +/obj/item/clothing/accessory/medal/badge/holo, +/obj/item/clothing/accessory/medal/badge/holo/cord, /obj/item/clothing/suit/storage/hazardvest/green, /obj/item/clothing/suit/storage/hazardvest/green, /turf/simulated/floor/tiled/techmaint, @@ -20908,7 +20941,6 @@ /area/shuttle/exploration/general) "jDG" = ( /obj/machinery/mech_recharger, -/obj/effect/landmark/robot_platform/cargo, /turf/simulated/floor/tiled/dark, /area/surface/station/quartermaster/lockerroom) "jDW" = ( @@ -20921,6 +20953,12 @@ /obj/effect/floor_decal/steeldecal/steel_decals_central2, /turf/simulated/floor/tiled/monotile, /area/surface/station/park) +"jDZ" = ( +/obj/structure/railing/grey{ + dir = 2 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "jEc" = ( /obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/glass_medical{ @@ -21507,8 +21545,7 @@ /area/shuttle/exploration/general) "jQs" = ( /obj/structure/railing/grey{ - dir = 4; - pixel_y = 8 + dir = 4 }, /turf/simulated/floor/outdoors/mask, /area/surface/outside/plains/plateau) @@ -21781,7 +21818,7 @@ icon_state = "steel_dirty"; initial_flooring = /decl/flooring/tiling/steel_dirty }, -/area/space) +/area/surface/outside/plains/station) "jUL" = ( /obj/machinery/cryopod/robot/door/checkpoint, /turf/simulated/floor/outdoors/dirt/sif, @@ -23426,7 +23463,7 @@ }, /obj/machinery/computer/security/telescreen{ name = "Test Chamber Monitor"; - network = list("Miscellaneous Reseach"); + network = list("Miscellaneous Research"); pixel_y = -32 }, /turf/simulated/floor/tiled/white, @@ -23553,6 +23590,12 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/monotile, /area/surface/station/quartermaster/storage) +"kGl" = ( +/obj/structure/railing/grey{ + dir = 1 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "kGs" = ( /obj/effect/floor_decal/corner/purple/bordercorner{ dir = 1 @@ -25251,12 +25294,11 @@ /turf/simulated/floor/tiled/white, /area/surface/station/medical/etc) "lwJ" = ( -/obj/structure/table/steel_reinforced, -/obj/item/book/manual/drake_handling, -/obj/effect/floor_decal/corner/purple/border{ - dir = 9 +/obj/effect/floor_decal/industrial/warning{ + dir = 5 }, -/turf/simulated/floor/tiled/techmaint, +/obj/structure/stasis_cage, +/turf/simulated/floor/plating, /area/rnd/xenobiology/xenofauna) "lwM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -26155,7 +26197,6 @@ /turf/simulated/floor/tiled, /area/surface/station/security/processing) "lQt" = ( -/obj/structure/plasticflaps/mining, /obj/effect/floor_decal/corner/purple/bordercorner{ dir = 4 }, @@ -26163,7 +26204,9 @@ dir = 1 }, /obj/machinery/door/firedoor/border_only, -/turf/simulated/floor/tiled/techmaint, +/obj/effect/floor_decal/industrial/warning/full, +/obj/structure/plasticflaps/xenofauna, +/turf/simulated/floor/plating, /area/rnd/xenobiology/xenofauna) "lQz" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, @@ -34249,7 +34292,7 @@ /obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/glass_research{ name = "Xenofauna Lab"; - req_one_access = list(55) + req_one_access = list(67) }, /turf/simulated/floor/tiled/steel_grid, /area/rnd/xenobiology/xenofauna) @@ -37431,10 +37474,11 @@ /turf/simulated/floor/carpet, /area/surface/station/library) "qwP" = ( -/obj/effect/floor_decal/corner/purple/border{ - dir = 10 +/obj/effect/floor_decal/industrial/warning{ + dir = 6 }, -/turf/simulated/floor/tiled/techmaint, +/obj/structure/stasis_cage, +/turf/simulated/floor/plating, /area/rnd/xenobiology/xenofauna) "qwT" = ( /obj/structure/flora/ausbushes/sparsegrass, @@ -37716,7 +37760,6 @@ /area/surface/station/library) "qCU" = ( /obj/machinery/mech_recharger, -/obj/effect/landmark/robot_platform/explorer, /turf/simulated/floor/tiled/dark, /area/surface/station/garage) "qCW" = ( @@ -37819,6 +37862,15 @@ /obj/effect/zone_divider, /turf/simulated/wall, /area/surface/station/engineering/reactor_airlock) +"qEF" = ( +/obj/structure/railing/grey{ + dir = 4 + }, +/obj/structure/railing/grey{ + dir = 2 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "qEU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ dir = 10 @@ -39550,6 +39602,12 @@ /obj/effect/floor_decal/rust, /turf/simulated/floor/tiled/neutral, /area/surface/station/medical/cloning) +"rsl" = ( +/obj/structure/railing/grey{ + dir = 4 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "rsE" = ( /turf/simulated/floor/tiled/old_cargo/gray, /area/surface/station/janitor) @@ -39648,7 +39706,7 @@ /obj/machinery/camera/network/research{ c_tag = "Research - Miscellaneous Test Chamber"; dir = 5; - network = list("Research","Miscellaneous Reseach") + network = list("Research","Miscellaneous Research") }, /turf/simulated/floor/reinforced, /area/surface/station/rnd/misc_lab) @@ -39852,8 +39910,7 @@ dir = 2 }, /obj/structure/railing/grey{ - dir = 8; - pixel_y = 9 + dir = 8 }, /turf/simulated/floor/outdoors/mask, /area/surface/outside/plains/plateau) @@ -41132,9 +41189,6 @@ /area/shuttle/exploration/general) "sem" = ( /obj/effect/floor_decal/corner/purple/bordercorner, -/obj/effect/floor_decal/corner/purple/bordercorner{ - dir = 8 - }, /turf/simulated/floor/tiled/techmaint, /area/rnd/xenobiology/xenofauna) "seC" = ( @@ -43185,7 +43239,6 @@ /area/surface/station/quartermaster/lockerroom) "tdK" = ( /obj/machinery/mech_recharger, -/obj/effect/landmark/robot_platform/explorer, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -44379,14 +44432,13 @@ /area/surface/station/hallway/primary/groundfloor/south) "tFs" = ( /obj/structure/railing/grey{ - dir = 4; - pixel_y = 8 + dir = 8 }, /obj/structure/railing/grey{ dir = 2 }, -/turf/simulated/floor/outdoors/mask, -/area/surface/outside/plains/plateau) +/turf/simulated/open, +/area/surface/outside/plains/station) "tFB" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -47577,7 +47629,9 @@ /turf/simulated/floor/bluegrid, /area/surface/station/ai/server_room) "vfE" = ( -/obj/machinery/door/window/brigdoor/northleft, +/obj/machinery/door/window/brigdoor/northleft{ + req_access = list(67) + }, /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/xenofauna) "vfM" = ( @@ -48680,6 +48734,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, +/obj/machinery/camera/network/ground_floor{ + c_tag = "Ground Floor - Garage"; + dir = 8 + }, +/obj/machinery/alarm/outside{ + dir = 8; + pixel_x = 22 + }, /turf/simulated/floor/tiled/techmaint, /area/rnd/xenobiology/xenofauna) "vCf" = ( @@ -51259,18 +51321,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/surface/station/security/interrogation) -"wPB" = ( -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/airlock/glass_research{ - name = "Xenofauna Lab"; - req_one_access = list(55) - }, -/obj/effect/floor_decal/corner/purple/bordercorner, -/obj/effect/floor_decal/corner/purple/bordercorner{ - dir = 8 - }, -/turf/simulated/floor/tiled/steel_grid, -/area/rnd/xenobiology/xenofauna) "wPJ" = ( /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ dir = 6 @@ -52883,6 +52933,11 @@ c_tag = "CIV - Pool East"; dir = 8 }, +/obj/item/reagent_containers/hypospray/autoinjector/detox{ + filled_reagents = list("anti_toxin" = 10); + amount_per_transfer_from_this = 10; + volume = 10 + }, /turf/simulated/floor/tiled/freezer, /area/surface/station/crew_quarters/pool) "xAM" = ( @@ -53107,6 +53162,16 @@ /obj/item/bodybag/cryobag, /obj/item/storage/firstaid/regular, /obj/item/storage/pill_bottle/spaceacillin, +/obj/item/reagent_containers/hypospray/autoinjector/detox{ + filled_reagents = list("anti_toxin" = 10); + amount_per_transfer_from_this = 10; + volume = 10 + }, +/obj/item/reagent_containers/hypospray/autoinjector/detox{ + filled_reagents = list("anti_toxin" = 10); + amount_per_transfer_from_this = 10; + volume = 10 + }, /turf/simulated/floor/wood, /area/surface/station/crew_quarters/cafeteria) "xFI" = ( @@ -54060,6 +54125,15 @@ /obj/effect/zone_divider, /turf/simulated/floor/outdoors/mask, /area/surface/outside/plains/station) +"xXg" = ( +/obj/structure/railing/grey{ + dir = 1 + }, +/obj/structure/railing/grey{ + dir = 8 + }, +/turf/simulated/open, +/area/surface/outside/plains/station) "xXF" = ( /obj/structure/closet{ name = "evidence locker" @@ -75007,9 +75081,9 @@ nCe nCe yel cxc -cMW -cMW -cMW +xXg +bmB +tFs cxc nCe nCe @@ -75264,9 +75338,9 @@ nCe nCe sLu cxc +kGl cMW -cMW -cMW +jDZ cxc nCe nCe @@ -75521,9 +75595,9 @@ nCe nCe yel cxc -cMW -cMW -cMW +gQc +rsl +qEF cxc nCe nCe @@ -83314,7 +83388,7 @@ cVy son qVN cVy -dgP +aqn hAR sTw hAR @@ -83461,7 +83535,7 @@ xbF kRE kRE jUn -aWY +bwx jUn jUn iRX @@ -83571,7 +83645,7 @@ cVy pqo pro cVy -dgP +aqn xyp sTw xyp @@ -84233,7 +84307,7 @@ kRE kRE kRE vfV -wPB +bok dzA dwh pYW @@ -85924,7 +85998,7 @@ jhv eXA jQs jQs -tFs +dJA aHG vZt vwy diff --git a/maps/cynosure/cynosure-3.dmm b/maps/cynosure/cynosure-3.dmm index 222fc649958..a5b9cff7cbc 100644 --- a/maps/cynosure/cynosure-3.dmm +++ b/maps/cynosure/cynosure-3.dmm @@ -1146,7 +1146,7 @@ /area/surface/station/crew_quarters/heads/rdoffice) "aMD" = ( /turf/simulated/wall/r_wall, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "aNp" = ( /obj/machinery/cryopod, /obj/effect/floor_decal/techfloor{ @@ -2045,6 +2045,7 @@ /obj/effect/floor_decal/corner/yellow/bordercorner{ dir = 1 }, +/obj/item/gps, /turf/simulated/floor/tiled, /area/surface/station/storage/art) "bvI" = ( @@ -4396,6 +4397,8 @@ req_one_access = list(18) }, /obj/structure/window/reinforced, +/obj/item/gps, +/obj/item/gps, /turf/simulated/floor/tiled/old_cargo/gray, /area/surface/station/ai_monitored/storage/eva) "cRg" = ( @@ -9245,12 +9248,6 @@ }, /turf/simulated/floor/tiled, /area/surface/station/engineering/hallway/snd) -"gaZ" = ( -/obj/structure/sign/directions/roomnum{ - dir = 6 - }, -/turf/simulated/wall, -/area/surface/station/crew_quarters/sleep/Dorm_5) "gbs" = ( /obj/machinery/door/firedoor/border_only, /obj/structure/cable/green{ @@ -10880,8 +10877,8 @@ /turf/simulated/wall, /area/surface/station/maintenance/substation/command) "gWu" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/brown, +/obj/structure/bed/double/padded, +/obj/item/bedsheet/browndouble, /obj/effect/zone_divider, /turf/simulated/floor/carpet, /area/surface/station/crew_quarters/sleep/Dorm_4) @@ -14287,7 +14284,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/effect/landmark/free_ai_shell, +/obj/effect/landmark/free_ai_shell/flying, /turf/simulated/floor/tiled/techfloor, /area/surface/station/ai) "iUT" = ( @@ -14708,9 +14705,12 @@ /obj/machinery/newscaster{ pixel_x = -28 }, -/obj/structure/closet/secure_closet/personal, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "jgu" = ( /obj/structure/disposalpipe/segment{ dir = 2; @@ -16214,14 +16214,38 @@ /turf/simulated/floor/tiled/neutral, /area/surface/station/medical/lockerroom) "jUn" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -24 +/obj/machinery/hologram/holopad, +/obj/effect/floor_decal/industrial/outline/grey, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 8 + }, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 9 + }, +/obj/effect/floor_decal/steeldecal/steel_decals3, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 5 + }, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 4 + }, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 10 + }, +/obj/effect/floor_decal/steeldecal/steel_decals3{ + dir = 6 }, /obj/machinery/light{ dir = 8 }, -/turf/simulated/floor/wood, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -24 + }, +/turf/simulated/floor/tiled/techmaint, /area/unionoffice) "jVB" = ( /obj/machinery/door/firedoor/glass, @@ -19036,14 +19060,6 @@ }, /turf/simulated/floor/tiled, /area/surface/station/hallway/secondary/secondfloor/westskybridge) -"miE" = ( -/obj/structure/bed/double/padded, -/obj/item/bedsheet/browndouble, -/obj/structure/sign/clock{ - pixel_x = 32 - }, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) "mjt" = ( /obj/machinery/porta_turret/ai_defense, /obj/structure/cable{ @@ -19777,11 +19793,11 @@ /turf/simulated/floor/plating, /area/surface/station/maintenance/substation/command) "mHW" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/obj/machinery/door/airlock{ + name = "Unit 2" }, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/turf/simulated/floor/tiled, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "mHY" = ( /obj/machinery/door/firedoor/border_only, /obj/structure/cable/green{ @@ -19807,19 +19823,23 @@ /turf/simulated/floor/tiled/old_tile/gray, /area/surface/station/security/warden) "mIP" = ( -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 9 }, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/obj/machinery/power/apc{ + dir = 4; + name = "east bump"; + pixel_x = 24 + }, +/obj/structure/cable/green{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "mIW" = ( /obj/effect/floor_decal/industrial/warning/corner{ dir = 1 @@ -20588,26 +20608,13 @@ /turf/simulated/open, /area/surface/station/ai) "nmx" = ( -/obj/structure/cable/green{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "east bump"; - pixel_x = 24 - }, /obj/machinery/light_switch{ dir = 8; pixel_x = 24; pixel_y = -12 }, -/obj/structure/table/standard, -/obj/machinery/light{ - dir = 4 - }, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/turf/simulated/wall, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "nmz" = ( /obj/effect/floor_decal/corner/white{ dir = 5 @@ -21930,31 +21937,12 @@ /turf/simulated/wall/r_wall, /area/surface/station/engineering/hallway/sndaccess) "olt" = ( -/obj/machinery/hologram/holopad, -/obj/effect/floor_decal/industrial/outline/grey, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 8 - }, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 9 - }, -/obj/effect/floor_decal/steeldecal/steel_decals3, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 5 - }, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 10 +/obj/structure/bed/chair/wood/pine{ + color = "#3a6ecf"; + name = "undersized chair"; + desc = "Damn, that's uncomfortable..." }, -/obj/effect/floor_decal/steeldecal/steel_decals3{ - dir = 6 - }, -/turf/simulated/floor/tiled/techmaint, +/turf/simulated/floor/wood, /area/unionoffice) "olA" = ( /obj/effect/floor_decal/borderfloorblack{ @@ -22966,18 +22954,11 @@ dir = 1; pixel_y = -24 }, -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/head/kitty, -/obj/machinery/button/remote/airlock{ - dir = 4; - id = "droom5"; - name = "Door Bolt Control"; - pixel_x = -24; - pixel_y = 7; - specialfunctions = 4 +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 }, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/turf/simulated/floor/tiled, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "oSS" = ( /obj/machinery/ai_status_display, /turf/simulated/wall, @@ -25121,6 +25102,7 @@ pixel_y = 8; specialfunctions = 4 }, +/obj/item/clothing/head/kitty, /turf/simulated/floor/carpet, /area/surface/station/crew_quarters/sleep/Dorm_4) "qkI" = ( @@ -29369,6 +29351,9 @@ dir = 1; pixel_y = -22 }, +/obj/structure/noticeboard{ + pixel_x = -32 + }, /turf/simulated/floor/wood, /area/unionoffice) "tdB" = ( @@ -30642,6 +30627,11 @@ /obj/item/bodybag/cryobag, /obj/item/storage/firstaid/regular, /obj/item/storage/pill_bottle/spaceacillin, +/obj/item/reagent_containers/hypospray/autoinjector/detox{ + filled_reagents = list("anti_toxin"=10); + amount_per_transfer_from_this = 10; + volume = 10 + }, /turf/simulated/floor/tiled, /area/surface/station/command/operations) "tOU" = ( @@ -31046,8 +31036,8 @@ /turf/simulated/floor/tiled/dark, /area/surface/station/engineering/engine_eva) "ucJ" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/brown, +/obj/structure/bed/double/padded, +/obj/item/bedsheet/browndouble, /obj/structure/sign/clock{ pixel_x = -32 }, @@ -31499,6 +31489,12 @@ pixel_x = -11; pixel_y = 9 }, +/obj/item/paper_bin, +/obj/item/pen/red{ + pixel_x = -4; + pixel_y = -4 + }, +/obj/item/pen/blue, /turf/simulated/floor/wood, /area/unionoffice) "usA" = ( @@ -32130,11 +32126,10 @@ dir = 4 }, /obj/machinery/door/airlock{ - id_tag = "droom5"; - name = "Room 5" + name = "Recharging Station" }, /turf/simulated/floor/tiled/steel_grid, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "uOA" = ( /obj/machinery/hologram/holopad, /obj/effect/floor_decal/industrial/outline/grey, @@ -32682,20 +32677,6 @@ "veS" = ( /turf/simulated/wall/r_concrete, /area/surface/station/maintenance/substation/research/snd) -"vft" = ( -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) "vfC" = ( /obj/machinery/firealarm{ dir = 4; @@ -33739,13 +33720,7 @@ /turf/simulated/wall/r_wall, /area/surface/station/crew_quarters/sleep/Dorm_3) "vPF" = ( -/obj/structure/table/woodentable, -/obj/item/paper_bin, -/obj/item/pen/red{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/pen/blue, +/obj/item/modular_computer/console/preset/civilian, /turf/simulated/floor/wood, /area/unionoffice) "vPY" = ( @@ -33916,7 +33891,7 @@ /area/surface/station/ai_monitored/storage/eva) "vXG" = ( /turf/simulated/wall, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "vXN" = ( /obj/structure/sink{ dir = 8; @@ -35820,10 +35795,12 @@ /turf/simulated/floor/tiled/white, /area/surface/station/medical/office) "xgD" = ( -/obj/structure/bed/double/padded, -/obj/item/bedsheet/browndouble, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/recharge_station, +/turf/simulated/floor/tiled, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "xgF" = ( /obj/structure/cable, /obj/machinery/power/apc{ @@ -37446,9 +37423,11 @@ /obj/machinery/alarm{ pixel_y = 22 }, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/simulated/floor/carpet, -/area/surface/station/crew_quarters/sleep/Dorm_5) +/obj/machinery/door/airlock{ + name = "Unit 1" + }, +/turf/simulated/floor/tiled, +/area/surface/station/crew_quarters/sleep/Dorm_Charge) "xZo" = ( /obj/effect/floor_decal/borderfloor{ dir = 4 @@ -64082,7 +64061,7 @@ bHs vXG vXG uNR -gaZ +vXG aMD dFJ sBb @@ -64595,7 +64574,7 @@ tgO eaQ vXG xYW -vft +vXG mHW aMD sBb @@ -64853,7 +64832,7 @@ ymd vXG xgD nmx -miE +xgD aMD sBb sBb diff --git a/maps/cynosure/cynosure-6.dmm b/maps/cynosure/cynosure-6.dmm index e496aeebdb0..ed96d787a21 100644 --- a/maps/cynosure/cynosure-6.dmm +++ b/maps/cynosure/cynosure-6.dmm @@ -7793,7 +7793,7 @@ /turf/simulated/floor/tiled/milspec/dark, /area/shuttle/escape/centcom) "iNR" = ( -/obj/item/robot_parts/robot_suit, +/obj/item/robot_parts/frame, /obj/item/robot_parts/r_leg, /obj/item/robot_parts/r_arm, /turf/simulated/shuttle/plating, @@ -10661,9 +10661,9 @@ /area/shuttle/merchant/home) "lMq" = ( /obj/structure/table/standard, -/obj/item/clothing/accessory/permit, -/obj/item/clothing/accessory/permit, -/obj/item/clothing/accessory/permit, +/obj/item/clothing/accessory/medal/permit, +/obj/item/clothing/accessory/medal/permit, +/obj/item/clothing/accessory/medal/permit, /turf/unsimulated/floor{ icon_state = "steel" }, diff --git a/maps/cynosure/cynosure.dm b/maps/cynosure/cynosure.dm index f2423632a53..26fe33d8d35 100644 --- a/maps/cynosure/cynosure.dm +++ b/maps/cynosure/cynosure.dm @@ -5,7 +5,6 @@ #include "cynosure_jobs.dm" #include "cynosure_elevator.dm" #include "cynosure_events.dm" - #include "cynosure_overrides.dm" #include "cynosure_presets.dm" #include "cynosure_shuttles.dm" @@ -15,6 +14,7 @@ #include "loadout/loadout_uniform.dm" #include "datums/supplypacks/munitions.dm" + #include "datums/supplypacks/science.dm" #include "datums/random_map.dm" #include "datums/spawn.dm" diff --git a/maps/cynosure/cynosure_areas.dm b/maps/cynosure/cynosure_areas.dm index a07f192e8bd..008c549aad2 100644 --- a/maps/cynosure/cynosure_areas.dm +++ b/maps/cynosure/cynosure_areas.dm @@ -416,8 +416,8 @@ icon_state = "Sleep" holomap_color = HOLOMAP_AREACOLOR_DORMS -/area/surface/station/crew_quarters/sleep/Dorm_5 - name = "\improper Dormitory Room 5" +/area/surface/station/crew_quarters/sleep/Dorm_Charge + name = "\improper Dormitory Charging Station" icon_state = "Sleep" holomap_color = HOLOMAP_AREACOLOR_DORMS @@ -1217,6 +1217,9 @@ name = "\improper Research - Mech Bay" icon_state = "mechbay" +/area/surface/station/rnd/testingsite + name = "\improper Research - Testing Site" + //Security /area/surface/station/security diff --git a/maps/cynosure/cynosure_jobs.dm b/maps/cynosure/cynosure_jobs.dm index fc33100ae64..2cf98922fab 100644 --- a/maps/cynosure/cynosure_jobs.dm +++ b/maps/cynosure/cynosure_jobs.dm @@ -323,8 +323,11 @@ var/global/const/access_explorer = 43 /obj/item/card/id/drake_expedition name = "animal access card" - access = list(access_explorer, access_research) - + access = list( + access_explorer, + access_research, + access_xenofauna + ) /obj/item/storage/animal_harness/grafadreka/expedition name = "expedition harness" diff --git a/maps/cynosure/cynosure_overrides.dm b/maps/cynosure/cynosure_overrides.dm deleted file mode 100644 index ec7b607d0b7..00000000000 --- a/maps/cynosure/cynosure_overrides.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/silicon/robot/platform/explorer - req_access = list(access_explorer) - -/mob/living/silicon/robot/platform/cargo - req_access = list(access_cargo_bot) - -/obj/item/card/id/platform/Initialize() - . = ..() - access |= access_explorer diff --git a/maps/cynosure/datums/supplypacks/munitions.dm b/maps/cynosure/datums/supplypacks/munitions.dm index f32f3a3ec93..2359a1577b0 100644 --- a/maps/cynosure/datums/supplypacks/munitions.dm +++ b/maps/cynosure/datums/supplypacks/munitions.dm @@ -32,4 +32,24 @@ cost = 50 containertype = /obj/structure/closet/crate/secure/ward containername = "Phase Rifle crate" - access = access_explorer \ No newline at end of file + access = access_explorer + +/datum/supply_pack/munitions/tranq_pistols_xenofauna + name = "Weapons - Surplus Tranquilizer Pistols" + contains = list( + /obj/item/gun/energy/phasegun/tranq_pistol = 2, + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure/ward + containername = "tranquilizer pistol crate" + access = access_xenofauna + +/datum/supply_pack/munitions/tranq_rifles_xenofauna + name = "Weapons - Surplus Tranquilizer Rifles" + contains = list( + /obj/item/gun/energy/phasegun/tranq_rifle = 2, + ) + cost = 50 + containertype = /obj/structure/closet/crate/secure/ward + containername = "tranquilizer rifle crate" + access = access_xenofauna diff --git a/maps/cynosure/datums/supplypacks/science.dm b/maps/cynosure/datums/supplypacks/science.dm new file mode 100644 index 00000000000..817b316ec42 --- /dev/null +++ b/maps/cynosure/datums/supplypacks/science.dm @@ -0,0 +1,9 @@ +/datum/supply_pack/sci/stasis_cages + name = "Stasis Cage" + contains = list( + /obj/structure/stasis_cage = 1 + ) + cost = 30 + containertype = /obj/structure/closet/crate/large + containername = "stasis cage crate" + access = access_xenofauna diff --git a/maps/cynosure/job/outfits.dm b/maps/cynosure/job/outfits.dm index a6d37754e2e..c3b7d5c0c69 100644 --- a/maps/cynosure/job/outfits.dm +++ b/maps/cynosure/job/outfits.dm @@ -17,11 +17,11 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go id_type = /obj/item/card/id/civilian id_pda_assignment = "Explorer" flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL - backpack_contents = list(/obj/item/clothing/accessory/permit/gun/planetside = 1) + backpack_contents = list(/obj/item/clothing/accessory/medal/permit/gun/planetside = 1) /decl/hierarchy/outfit/job/explorer2/post_equip(mob/living/carbon/human/H) ..() - for(var/obj/item/clothing/accessory/permit/gun/planetside/permit in H.back.contents) + for(var/obj/item/clothing/accessory/medal/permit/gun/planetside/permit in H.back.contents) permit.set_name(H.real_name) /decl/hierarchy/outfit/job/explorer2/technician diff --git a/maps/cynosure/structures/closets/misc.dm b/maps/cynosure/structures/closets/misc.dm index 6eed4e191b2..36159bcf13c 100644 --- a/maps/cynosure/structures/closets/misc.dm +++ b/maps/cynosure/structures/closets/misc.dm @@ -31,7 +31,7 @@ /obj/item/gun/energy/phasegun = 2, /obj/item/gun/energy/phasegun/pistol, /obj/item/cell/device/weapon = 2, - /obj/item/clothing/accessory/permit/gun/planetside) + /obj/item/clothing/accessory/medal/permit/gun/planetside) /obj/structure/closet/secure_closet/guncabinet/tranq name = "tranquilizer rifle cabinet" @@ -41,7 +41,7 @@ /obj/item/gun/energy/phasegun/tranq_pistol, /obj/item/gun/energy/phasegun/pistol, /obj/item/cell/device/weapon = 2, - /obj/item/clothing/accessory/permit/gun/planetside + /obj/item/clothing/accessory/medal/permit/gun/planetside ) //Explorer Lockers diff --git a/maps/cynosure/structures/closets/security.dm b/maps/cynosure/structures/closets/security.dm index 03959da1e4a..576008cbeee 100644 --- a/maps/cynosure/structures/closets/security.dm +++ b/maps/cynosure/structures/closets/security.dm @@ -21,7 +21,7 @@ /obj/item/shield/riot, /obj/item/shield/riot/tele, /obj/item/storage/box/holobadge/hos, - /obj/item/clothing/accessory/badge/holo/hos, + /obj/item/clothing/accessory/medal/badge/holo/hos, /obj/item/reagent_containers/spray/pepper, /obj/item/tool/crowbar/red, /obj/item/storage/box/flashbangs, @@ -69,7 +69,7 @@ /obj/item/radio/headset/headset_sec/alt, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/taperoll/police, - /obj/item/clothing/accessory/badge/holo/warden, + /obj/item/clothing/accessory/medal/badge/holo/warden, /obj/item/storage/box/flashbangs, /obj/item/storage/belt/security, /obj/item/reagent_containers/spray/pepper, @@ -160,7 +160,7 @@ closet_appearance = /decl/closet_appearance/cabinet/secure starts_with = list( - /obj/item/clothing/accessory/badge/holo/detective, + /obj/item/clothing/accessory/medal/badge/holo/detective, /obj/item/clothing/gloves/black, /obj/item/gunbox, /obj/item/storage/belt/detective, diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index ba71c6bd3e7..8fbfe1e3f4d 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -886,7 +886,7 @@ "arb" = (/obj/effect/floor_decal/corner/red,/obj/machinery/camera/network/security{c_tag = "SEC - Briefing"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) "arc" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom) "ard" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/glasses/hud/security,/turf/simulated/floor/tiled,/area/security/security_lockerroom) -"are" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo,/obj/item/clothing/accessory/badge/holo/cord,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/security/security_lockerroom) +"are" = (/obj/structure/table/standard,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/accessory/medal/badge/holo,/obj/item/clothing/accessory/medal/badge/holo,/obj/item/clothing/accessory/medal/badge/holo/cord,/obj/effect/floor_decal/corner/red/full,/turf/simulated/floor/tiled,/area/security/security_lockerroom) "arf" = (/obj/structure/table/standard,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/radio,/obj/item/radio,/obj/item/radio,/obj/item/radio,/obj/item/radio,/obj/item/radio,/obj/item/flashlight,/obj/item/flashlight,/obj/item/flashlight,/obj/item/flashlight,/obj/item/flashlight,/obj/item/flashlight,/obj/item/tool/crowbar,/obj/item/tool/crowbar,/obj/item/tool/crowbar,/obj/item/tool/crowbar,/obj/item/tool/crowbar,/obj/item/tool/crowbar,/turf/simulated/floor/tiled,/area/security/security_lockerroom) "arg" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/northleft{name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom) "arh" = (/obj/structure/curtain/open/shower/security,/obj/machinery/shower{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northright{dir = 1; name = "Shower"; req_access = list()},/turf/simulated/floor/tiled/freezer,/area/security/security_bathroom) diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm index f7a285787fd..3c6cc6c4d1f 100644 --- a/maps/northern_star/polaris-2.dmm +++ b/maps/northern_star/polaris-2.dmm @@ -2285,7 +2285,7 @@ "RW" = (/obj/structure/table/rack,/obj/item/grenade/empgrenade,/obj/item/grenade/flashbang,/obj/item/grenade/spawnergrenade/manhacks,/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) "RX" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/red,/area/skipjack_station/start) "RY" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"RZ" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"RZ" = (/obj/item/robot_parts/frame,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Sa" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "Sb" = (/obj/structure/sign/double/map/left{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) "Sc" = (/obj/structure/sign/double/map/right{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) diff --git a/maps/overmap/bearcat/bearcat.dmm b/maps/overmap/bearcat/bearcat.dmm index cd69db0be24..51f6df01f6f 100644 --- a/maps/overmap/bearcat/bearcat.dmm +++ b/maps/overmap/bearcat/bearcat.dmm @@ -107,7 +107,7 @@ "cc" = (/obj/machinery/light/small{ icon_state = "bulb1"; dir = 4},/obj/machinery/atmospherics/pipe/simple{ icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/crew) "cd" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/saloon) "ce" = (/obj/machinery/atmospherics/pipe/simple{ icon_state = "intact"; dir = 2; level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance_hatch{name = "Hatch"; normalspeed = 0},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/saloon) -"cf" = (/obj/machinery/light/small{ icon_state = "bulb1"; dir = 8},/obj/item/crowbar,/obj/machinery/atmospherics/pipe/simple{ icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/crew) +"cf" = (/obj/machinery/light/small{ icon_state = "bulb1"; dir = 8},/obj/item/tool/crowbar,/obj/machinery/atmospherics/pipe/simple{ icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/crew) "cg" = (/turf/simulated/wall/r_wall,/area/ship/scrap/crew/dorms) "ch" = (/obj/structure/sign/poster,/turf/simulated/wall,/area/ship/scrap/crew/dorms) "ci" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "scraplock"; name = "External Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/floor{icon_state = "white"},/area/ship/scrap/crew/dorms) @@ -229,7 +229,7 @@ "eu" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/ship/scrap/maintenance/engine) "ev" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/ship/scrap/maintenance/engine) "ew" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/light/small{ icon_state = "bulb1"; dir = 1},/turf/simulated/floor/plating/airless,/area/ship/scrap/maintenance/engine) -"ex" = (/obj/item/screwdriver,/turf/simulated/floor/plating,/area) +"ex" = (/obj/item/tool/screwdriver,/turf/simulated/floor/plating,/area) "ey" = (/turf/simulated/wall,/area/ship/scrap/crew/wash) "ez" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor{ icon_state = "bot"; dir = 2},/area/ship/scrap/cargo) "eA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple{ icon_state = "intact"; dir = 2; level = 2},/turf/simulated/floor,/area/ship/scrap/cargo) @@ -326,7 +326,7 @@ "gn" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{ icon_state = "floorgrime"; dir = 6},/area/ship/scrap/maintenance) "go" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/turf/simulated/floor/plating,/area/ship/scrap/maintenance) "gp" = (/obj/machinery/atmospherics/pipe/manifold4w{level = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8; icon_state = "bulb1"; pixel_y = 16},/turf/simulated/floor,/area/ship/scrap/maintenance) -"gq" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/light/small{ icon_state = "bulb1"; dir = 1},/obj/item/crowbar,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) +"gq" = (/obj/machinery/atmospherics/pipe/simple{dir = 4; icon_state = "intact"; level = 2},/obj/machinery/light/small{ icon_state = "bulb1"; dir = 1},/obj/item/tool/crowbar,/turf/simulated/floor/plating,/area/ship/scrap/maintenance) "gr" = (/obj/machinery/atmospherics/pipe/simple{dir = 9; icon_state = "intact"; level = 2},/turf/simulated/floor{ icon_state = "wall_thermite"; dir = 2},/area/ship/scrap/maintenance) "gs" = (/turf/simulated/wall/r_wall,/area/ship/scrap/maintenance/atmos) "gt" = (/turf/simulated/wall,/area/ship/scrap/maintenance/atmos) diff --git a/maps/southern_cross/job/outfits.dm b/maps/southern_cross/job/outfits.dm index 2b6a83e827b..9085127b2f8 100644 --- a/maps/southern_cross/job/outfits.dm +++ b/maps/southern_cross/job/outfits.dm @@ -17,11 +17,11 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go id_type = /obj/item/card/id/science/explorer id_pda_assignment = "Explorer" flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL - backpack_contents = list(/obj/item/clothing/accessory/permit/gun/planetside = 1) + backpack_contents = list(/obj/item/clothing/accessory/medal/permit/gun/planetside = 1) /decl/hierarchy/outfit/job/explorer2/post_equip(mob/living/carbon/human/H) ..() - for(var/obj/item/clothing/accessory/permit/gun/planetside/permit in H.back.contents) + for(var/obj/item/clothing/accessory/medal/permit/gun/planetside/permit in H.back.contents) permit.set_name(H.real_name) /decl/hierarchy/outfit/job/explorer2/technician @@ -63,4 +63,4 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go pda_slot = slot_l_store id_type = /obj/item/card/id/medical/sar id_pda_assignment = "Search and Rescue" - flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL \ No newline at end of file + flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index 12fb0ff0624..25aebcf1ec3 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -26231,9 +26231,9 @@ /area/security/security_restroom) "aYL" = ( /obj/structure/closet/wardrobe/red, -/obj/item/clothing/accessory/badge/holo, -/obj/item/clothing/accessory/badge/holo, -/obj/item/clothing/accessory/badge/holo/cord, +/obj/item/clothing/accessory/medal/badge/holo, +/obj/item/clothing/accessory/medal/badge/holo, +/obj/item/clothing/accessory/medal/badge/holo/cord, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -72947,7 +72947,6 @@ }, /obj/machinery/mech_recharger, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/effect/landmark/robot_platform/cargo, /turf/simulated/floor/tiled/steel, /area/quartermaster/warehouse) "cHa" = ( diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm index 6b0e9bdea6f..c4df22abeb8 100644 --- a/maps/southern_cross/southern_cross-3.dmm +++ b/maps/southern_cross/southern_cross-3.dmm @@ -13977,7 +13977,6 @@ dir = 4 }, /obj/machinery/mech_recharger, -/obj/effect/landmark/robot_platform/explorer, /turf/simulated/floor/plating, /area/surface/outpost/main/garage) "GT" = ( @@ -14102,7 +14101,6 @@ "Lz" = ( /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/mech_recharger, -/obj/effect/landmark/robot_platform/explorer, /turf/simulated/floor/plating, /area/surface/outpost/main/garage) "LH" = ( diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm index 12bdd3b9078..63b0baebcd6 100644 --- a/maps/southern_cross/southern_cross-6.dmm +++ b/maps/southern_cross/southern_cross-6.dmm @@ -961,7 +961,7 @@ "sy" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 5"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac) "sz" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) "sA" = (/obj/structure/table/standard,/obj/item/soap/deluxe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade) -"sB" = (/obj/structure/table/standard,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) +"sB" = (/obj/structure/table/standard,/obj/item/clothing/accessory/medal/permit,/obj/item/clothing/accessory/medal/permit,/obj/item/clothing/accessory/medal/permit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) "sC" = (/obj/structure/closet/wardrobe/white,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) "sD" = (/obj/structure/closet/wardrobe/green,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) "sE" = (/obj/structure/closet/wardrobe/grey,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade) @@ -2135,7 +2135,7 @@ "Pc" = (/obj/structure/table/steel,/obj/machinery/recharger,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) "Pd" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor/darkred,/area/skipjack_station/start) "Pe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/shuttle/plating,/area/skipjack_station/start) -"Pf" = (/obj/item/robot_parts/robot_suit,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) +"Pf" = (/obj/item/robot_parts/frame,/obj/item/robot_parts/r_leg,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/plating,/area/skipjack_station/start) "Pg" = (/obj/structure/flight_left{icon_state = "left"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start) "Ph" = (/obj/item/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start) "Pi" = (/obj/item/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor/voidcraft/dark,/area/syndicate_station/start) diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm index 8339b085cce..ed9528b5528 100644 --- a/maps/southern_cross/southern_cross.dm +++ b/maps/southern_cross/southern_cross.dm @@ -7,7 +7,6 @@ #include "southern_cross_jobs.dm" #include "southern_cross_elevator.dm" #include "southern_cross_events.dm" - #include "southern_cross_overrides.dm" #include "southern_cross_presets.dm" #include "southern_cross_shuttles.dm" @@ -56,4 +55,4 @@ #warn A map has already been included, ignoring Southern Cross -#endif \ No newline at end of file +#endif diff --git a/maps/southern_cross/southern_cross_overrides.dm b/maps/southern_cross/southern_cross_overrides.dm deleted file mode 100644 index 5458cb51dac..00000000000 --- a/maps/southern_cross/southern_cross_overrides.dm +++ /dev/null @@ -1,10 +0,0 @@ -/mob/living/silicon/robot/platform/explorer - req_access = list(access_explorer) - -/mob/living/silicon/robot/platform/cargo - req_access = list(access_cargo_bot) - -/obj/item/card/id/platform/Initialize() - . = ..() - access |= access_explorer - access |= access_pilot diff --git a/maps/southern_cross/structures/closets/misc.dm b/maps/southern_cross/structures/closets/misc.dm index 9e733d471a7..46c8eee1f09 100644 --- a/maps/southern_cross/structures/closets/misc.dm +++ b/maps/southern_cross/structures/closets/misc.dm @@ -31,7 +31,7 @@ /obj/item/gun/energy/phasegun = 2, /obj/item/gun/energy/phasegun/pistol, /obj/item/cell/device/weapon = 2, - /obj/item/clothing/accessory/permit/gun/planetside) + /obj/item/clothing/accessory/medal/permit/gun/planetside) //Explorer Lockers diff --git a/maps/southern_cross/structures/closets/security.dm b/maps/southern_cross/structures/closets/security.dm index faa07d88573..bbabf4910fb 100644 --- a/maps/southern_cross/structures/closets/security.dm +++ b/maps/southern_cross/structures/closets/security.dm @@ -17,7 +17,7 @@ /obj/item/radio/headset/heads/hos, /obj/item/clothing/glasses/sunglasses/sechud, /obj/item/storage/box/holobadge/hos, - /obj/item/clothing/accessory/badge/holo/hos, + /obj/item/clothing/accessory/medal/badge/holo/hos, /obj/item/clothing/accessory/holster/waist, /obj/item/clothing/head/beret/sec/corporate/hos, /obj/item/clothing/mask/gas/half) diff --git a/maps/submaps/surface_submaps/plains/plains.dm b/maps/submaps/surface_submaps/plains/plains.dm index 54df78baa29..4c6f36264e0 100644 --- a/maps/submaps/surface_submaps/plains/plains.dm +++ b/maps/submaps/surface_submaps/plains/plains.dm @@ -38,6 +38,7 @@ #include "priderock.dmm" #include "oldhotel.dmm" #include "VRDen.dmm" +#include "reststop.dmm" #endif @@ -289,8 +290,8 @@ mappath = 'maps/submaps/surface_submaps/plains/VRDen.dmm' cost = 10 -/datum/map_template/surface/reststop +/datum/map_template/surface/plains/reststop name = "Rest Stop" desc = "Once this place was a nice spot to take a load off, now the wildlife call it home." mappath = 'maps/submaps/surface_submaps/plains/reststop.dmm' - cost = 15 + cost = 10 diff --git a/maps/submaps/surface_submaps/plains/reststop.dmm b/maps/submaps/surface_submaps/plains/reststop.dmm index 07e598a58eb..f89558747e5 100644 --- a/maps/submaps/surface_submaps/plains/reststop.dmm +++ b/maps/submaps/surface_submaps/plains/reststop.dmm @@ -126,7 +126,7 @@ /area/submap/reststop) "nO" = ( /obj/structure/loot_pile/maint/junk, -/turf/simulated/floor/outdoors/dirt/sif, +/turf/simulated/floor/outdoors/dirt, /area/submap/reststop) "nW" = ( /obj/structure/toilet, @@ -301,7 +301,7 @@ "FT" = ( /obj/effect/floor_decal/rust, /obj/structure/girder/displaced, -/turf/simulated/floor/plating/sif/planetuse, +/turf/simulated/floor/plating, /area/submap/reststop) "Gf" = ( /obj/structure/table/standard, @@ -331,7 +331,7 @@ /turf/simulated/floor/tiled/hydro, /area/submap/reststop) "Jd" = ( -/turf/simulated/floor/outdoors/dirt/sif, +/turf/simulated/floor/outdoors/dirt, /area/submap/reststop) "Jp" = ( /obj/structure/cable{ @@ -351,7 +351,7 @@ /obj/random/trash, /obj/random/junk, /obj/random/junk, -/turf/simulated/floor/outdoors/dirt/sif, +/turf/simulated/floor/outdoors/dirt, /area/submap/reststop) "Mh" = ( /obj/effect/decal/cleanable/dirt, @@ -404,7 +404,7 @@ /area/submap/reststop) "TK" = ( /obj/structure/flora/tree/sif, -/turf/simulated/floor/outdoors/dirt/sif, +/turf/simulated/floor/outdoors/dirt, /area/submap/reststop) "UM" = ( /obj/structure/window/basic, @@ -446,7 +446,7 @@ /obj/machinery/light/small{ dir = 4 }, -/turf/simulated/floor/outdoors/dirt/sif, +/turf/simulated/floor/outdoors/dirt, /area/submap/reststop) "ZN" = ( /obj/effect/floor_decal/rust, diff --git a/maps/submaps/surface_submaps/wilderness/MCamp1.dmm b/maps/submaps/surface_submaps/wilderness/MCamp1.dmm index 0a181efc90f..8a152c3f320 100644 --- a/maps/submaps/surface_submaps/wilderness/MCamp1.dmm +++ b/maps/submaps/surface_submaps/wilderness/MCamp1.dmm @@ -1,622 +1,739 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( +"bB" = ( +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"cH" = ( +/mob/living/simple_mob/mechanical/viscerator, /turf/template_noop, /area/submap/MilitaryCamp1) -"c" = ( +"do" = ( /turf/simulated/floor/outdoors/dirt, /area/submap/MilitaryCamp1) -"d" = ( -/obj/random/landmine, -/turf/template_noop, +"dH" = ( +/obj/machinery/light/small, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"e" = ( -/obj/structure/flora/bush, -/turf/template_noop, +"dM" = ( +/obj/item/cell/device/weapon/empty, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"f" = ( -/obj/effect/decal/cleanable/blood, +"fS" = ( +/obj/structure/closet, +/obj/random/maintenance/clean, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"gc" = ( +/obj/structure/foamedmetal, +/turf/simulated/floor, +/area/submap/MilitaryCamp1) +"ge" = ( /turf/template_noop, /area/submap/MilitaryCamp1) -"g" = ( -/obj/random/landmine, -/turf/simulated/floor/outdoors/dirt, +"jr" = ( +/obj/structure/loot_pile/maint/junk, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"h" = ( -/obj/effect/decal/remains, -/turf/simulated/floor/outdoors/dirt, +"ju" = ( +/obj/structure/bed/roller, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"i" = ( -/obj/random/landmine, -/turf/template_noop, +"jL" = ( +/obj/structure/inflatable, +/turf/simulated/floor, +/area/submap/MilitaryCamp1) +"kd" = ( +/mob/living/simple_mob/mechanical/viscerator, +/obj/item/stack/rods, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"kv" = ( +/obj/structure/bed/chair/office/dark, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"j" = ( +"ln" = ( /obj/effect/decal/remains, -/obj/random/landmine, -/turf/simulated/floor/outdoors/dirt, +/obj/random/maintenance/anom, +/mob/living/simple_mob/mechanical/viscerator, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"k" = ( -/obj/structure/flora/tree/sif, +"lO" = ( +/obj/structure/bed/chair/office/dark{ + dir = 1 + }, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"mE" = ( +/obj/machinery/computer/security, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"nl" = ( +/obj/structure/table/standard, +/mob/living/simple_mob/mechanical/viscerator, +/obj/item/paper_bin, +/obj/item/pen, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"nW" = ( +/obj/structure/flora/bush, /turf/template_noop, /area/submap/MilitaryCamp1) -"l" = ( +"or" = ( /obj/item/stack/rods, -/turf/template_noop, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"m" = ( -/obj/machinery/door/airlock, +"ow" = ( +/obj/structure/bed/padded, +/obj/machinery/light/small{ + dir = 4 + }, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"n" = ( -/obj/random/landmine, +"pI" = ( +/obj/structure/barricade, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"o" = ( +"qi" = ( +/obj/structure/bed/padded, +/obj/item/bedsheet/blue, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"p" = ( -/obj/item/material/shard, +"qx" = ( +/obj/structure/flora/tree/dead, /turf/template_noop, /area/submap/MilitaryCamp1) -"q" = ( -/mob/living/simple_mob/mechanical/viscerator, +"qF" = ( +/obj/structure/table/standard, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/frame/apc, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"r" = ( -/obj/structure/girder, -/turf/simulated/floor, +"tS" = ( +/obj/item/material/shard, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"s" = ( -/obj/machinery/computer/communications, -/mob/living/simple_mob/mechanical/viscerator, -/mob/living/simple_mob/mechanical/viscerator, +"uo" = ( +/obj/structure/closet, +/obj/random/toolbox, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"t" = ( -/obj/structure/table/standard, +"vP" = ( /obj/random/energy, -/mob/living/simple_mob/mechanical/viscerator, +/obj/structure/table/rack/shelf, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"vX" = ( +/obj/structure/foamedmetal, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"wc" = ( +/obj/random/landmine, /mob/living/simple_mob/mechanical/viscerator, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"u" = ( +"xo" = ( /obj/random/landmine, +/turf/simulated/floor/outdoors/dirt, +/area/submap/MilitaryCamp1) +"xt" = ( +/obj/structure/filingcabinet/chestdrawer, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"v" = ( -/obj/effect/decal/cleanable/dirt, +"ye" = ( +/obj/random/junk, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"w" = ( -/obj/machinery/computer/security, -/mob/living/simple_mob/mechanical/viscerator, -/mob/living/simple_mob/mechanical/viscerator, +"yr" = ( +/obj/effect/decal/cleanable/blood, +/turf/template_noop, +/area/submap/MilitaryCamp1) +"zZ" = ( +/obj/random/helmet, +/obj/structure/closet, +/obj/random/maintenance, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"x" = ( -/mob/living/simple_mob/mechanical/viscerator, +"Af" = ( +/obj/item/material/shard, /mob/living/simple_mob/mechanical/viscerator, +/turf/template_noop, +/area/submap/MilitaryCamp1) +"AH" = ( +/obj/effect/decal/cleanable/blood, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"y" = ( +"By" = ( +/mob/living/simple_mob/mechanical/viscerator, /obj/item/material/shard, -/obj/random/landmine, -/turf/template_noop, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"z" = ( -/obj/machinery/door/airlock, +"CF" = ( +/obj/structure/girder, /turf/simulated/floor, /area/submap/MilitaryCamp1) -"A" = ( -/obj/effect/decal/cleanable/dirt, +"DX" = ( +/turf/simulated/wall/r_concrete, +/area/submap/MilitaryCamp1) +"DZ" = ( +/obj/structure/flora/tree/sif, +/turf/template_noop, +/area/submap/MilitaryCamp1) +"Ep" = ( +/turf/simulated/wall/concrete, +/area/submap/MilitaryCamp1) +"Iu" = ( /mob/living/simple_mob/mechanical/viscerator, +/obj/structure/bed/chair/office/dark{ + dir = 8 + }, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"B" = ( +"Jh" = ( /mob/living/simple_mob/mechanical/viscerator, -/turf/template_noop, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"C" = ( -/obj/structure/table, +"JM" = ( +/obj/structure/closet, +/obj/random/maintenance/clean, +/obj/machinery/light/small{ + dir = 8 + }, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"D" = ( -/obj/structure/table/standard, -/obj/random/firstaid, +"Lb" = ( +/obj/effect/decal/remains, +/obj/structure/bed/padded, +/obj/item/bedsheet/blue, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"E" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/landmine, +"LQ" = ( +/mob/living/simple_mob/mechanical/viscerator, +/obj/machinery/light/small{ + dir = 4 + }, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"F" = ( -/obj/machinery/door/airlock, -/obj/random/landmine, +"LX" = ( +/obj/machinery/door/airlock/maintenance/sec, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"G" = ( -/obj/structure/flora/tree/dead, -/turf/template_noop, +"LY" = ( +/obj/item/material/shard, +/mob/living/simple_mob/mechanical/viscerator, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"H" = ( -/obj/random/landmine, +"Nv" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/submap/MilitaryCamp1) +"Og" = ( +/obj/structure/loot_pile/surface/medicine_cabinet, +/turf/simulated/wall/concrete, +/area/submap/MilitaryCamp1) +"OI" = ( /turf/template_noop, /area/template_noop) -"I" = ( -/obj/structure/table/standard, -/obj/random/cigarettes, -/obj/item/flame/lighter/random, -/obj/random/maintenance/anom, +"Pu" = ( +/mob/living/simple_mob/mechanical/viscerator, +/obj/structure/bed/padded, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"J" = ( +"PF" = ( +/obj/random/firstaid, /obj/structure/table/standard, -/obj/random/toolbox, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"K" = ( -/obj/effect/decal/cleanable/blood, +"Qv" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"Qx" = ( /obj/random/landmine, /turf/template_noop, /area/submap/MilitaryCamp1) -"M" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/helmet, +"QD" = ( +/obj/structure/table/rack/shelf, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"P" = ( -/obj/item/cell/device/weapon/empty, +"QX" = ( +/obj/effect/decal/remains, +/obj/random/landmine, +/turf/template_noop, +/area/submap/MilitaryCamp1) +"RD" = ( /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"V" = ( -/turf/simulated/wall/concrete, +"Uy" = ( +/obj/random/landmine, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"UC" = ( +/obj/machinery/iv_drip, +/turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) -"Z" = ( +"WT" = ( +/obj/machinery/door/airlock, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"WY" = ( +/obj/random/dufflebag, +/obj/structure/table/rack/shelf, +/turf/simulated/floor/concrete, +/area/submap/MilitaryCamp1) +"YB" = ( +/obj/item/material/shard, +/turf/template_noop, +/area/submap/MilitaryCamp1) +"Zz" = ( +/obj/structure/bed/padded, +/obj/item/bedsheet/blue, /mob/living/simple_mob/mechanical/viscerator, -/obj/item/cell/device/weapon/empty, /turf/simulated/floor/concrete, /area/submap/MilitaryCamp1) (1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -H -a -a -a -a -a -a -a +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI "} (2,1,1) = {" -a -b -g -b -d -b -b -b -b -b -f -b -b -G -b -b -b -c -b -a +OI +ge +Nv +Nv +Nv +Qx +yr +qx +yr +ge +QX +ge +Nv +Nv +Nv +yr +ge +Qx +ge +OI "} (3,1,1) = {" -a -b -h -c -k -b -b -b -b -b -d -b -b -b -b -d -c -j -c -a +OI +Nv +Nv +Nv +Nv +Nv +do +xo +cH +ge +ge +Nv +Nv +Nv +Nv +Nv +ge +qx +ge +OI "} (4,1,1) = {" -a -c -c -c -b -b -d -b -y -b -b -b -B -b -e -d -b -c -c -a +OI +Nv +Nv +Nv +Ep +Ep +Ep +vX +Ep +WT +Ep +Ep +Ep +Nv +Nv +Nv +Nv +ge +Qx +OI "} (5,1,1) = {" -a -b -d -b -b -b -V -V -V -o -o -r -V -V -b -b -b -d -e -a +OI +Nv +Nv +Ep +Ep +bB +RD +RD +RD +AH +Jh +RD +Ep +Ep +Nv +Nv +Nv +Nv +ge +OI "} (6,1,1) = {" -a -d -b -b -l -V -V -V -V -V -V -V -V -V -V -b -d -b -b -a +OI +Nv +Nv +Ep +jr +kd +RD +Jh +RD +Uy +RD +RD +dM +Ep +Ep +Ep +Ep +Nv +Nv +OI "} (7,1,1) = {" -a -b -b -d -V -V -q -q -z -q -q -m -q -I -V -V -b -b -d -a +OI +yr +Nv +Ep +RD +RD +RD +kv +qF +lO +RD +By +RD +Ep +nl +mE +Ep +Nv +Nv +OI "} (8,1,1) = {" -a -e -b -b -V -V -o -r -V -o -P -F -o -J -V -V -V -b -b -a +OI +Qx +nW +gc +pI +RD +DX +DX +DX +DX +DX +pI +RD +WT +By +Iu +Ep +Nv +Nv +OI "} (9,1,1) = {" -a -f -b -b -n -o -o -u -V -o -o -V -r -V -V -V -V -i -k -a +OI +ge +Qx +jL +Jh +dH +DX +WY +QD +vP +DX +Qv +RD +Ep +uo +xt +Ep +Nv +ge +OI "} (10,1,1) = {" -a -d -b -k -o -n -r -v -A -v -C -V -v -o -m -v -b -d -f -a +OI +ge +Qx +Ep +RD +RD +DX +Jh +wc +Jh +LX +RD +Jh +Ep +Ep +Ep +Ep +Nv +ge +OI "} (11,1,1) = {" -a -b -b -l -V -V -V -V -V -o -D -V -E -o -o -o -y -b -b -a +OI +ge +ge +Ep +RD +Jh +DX +ln +LQ +LY +DX +RD +RD +Ep +Nv +Nv +Nv +Nv +Qx +OI "} (12,1,1) = {" -a -b -f -b -V -V -s -w -V -q -q -V -v -q -V -V -V -l -b -a +OI +Qx +DZ +Ep +WT +Ep +DX +CF +DX +DX +DX +WT +Ep +Ep +Nv +Nv +Nv +Qx +ge +OI "} (13,1,1) = {" -a -b -i -b -n -V -t -x -V -A -E -m -q -q -V -V -V -b -d -a +OI +ge +Nv +Ep +Jh +ju +PF +Ep +zZ +JM +fS +RD +ye +Ep +Nv +do +nW +Af +ge +OI "} (14,1,1) = {" -a -b -b -b -V -V -Z -x -m -M -v -m -q -q -V -V -b -d -c -a +OI +Nv +Nv +Og +UC +By +Jh +WT +RD +ye +Jh +or +RD +gc +do +Qx +ge +ge +Qx +OI "} (15,1,1) = {" -a -b -c -c -p -V -V -V -V -V -V -V -V -V -V -b -g -c -c -a +OI +Nv +Nv +Ep +Ep +ow +Pu +Ep +RD +Jh +tS +Jh +RD +gc +xo +YB +ge +qx +ge +OI "} (16,1,1) = {" -a -b -j -c -c -b -V -V -r -V -V -r -V -V -b -c -c -j -b -a +OI +Nv +Nv +Nv +Ep +Ep +Ep +Ep +Zz +Lb +qi +Lb +qi +Ep +ge +cH +ge +ge +ge +OI "} (17,1,1) = {" -a -b -b -g -b -d -b -b -B -b -b -b -b -p -i -c -b -k -b -a +OI +Nv +Nv +Nv +Nv +Nv +Nv +Ep +Ep +Ep +Ep +Ep +Ep +Ep +Nv +ge +Qx +ge +ge +OI "} (18,1,1) = {" -a -b -b -k -b -b -e -b -d -b -i -G -b -b -b -i -b -b -b -a +OI +ge +Nv +Nv +Nv +Nv +ge +ge +Qx +ge +ge +Qx +ge +Nv +Nv +DZ +ge +yr +ge +OI "} (19,1,1) = {" -a -b -b -b -b -d -b -d -b -b -d -b -b -K -b -b -b -b -b -a +OI +ge +ge +Qx +ge +ge +Qx +ge +ge +qx +cH +ge +ge +ge +Qx +ge +ge +ge +Qx +OI "} (20,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI +OI "} diff --git a/maps/submaps/surface_submaps/wilderness/Shelter.dmm b/maps/submaps/surface_submaps/wilderness/Shelter.dmm index c56d16de25a..9415cbb9c97 100644 --- a/maps/submaps/surface_submaps/wilderness/Shelter.dmm +++ b/maps/submaps/surface_submaps/wilderness/Shelter.dmm @@ -9,7 +9,7 @@ "i" = (/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1) "j" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1) "k" = (/obj/random/mob/robotic,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1) -"l" = (/obj/structure/bed/roller/adv,/obj/random/humanoidremains,/obj/random/cash,/obj/random/cigarettes,/obj/item/clothing/under/explorer,/obj/item/clothing/shoes/boots/winter/explorer,/obj/item/clothing/mask/gas/explorer,/obj/item/clothing/accessory/permit/gun/planetside,/obj/item/clothing/suit/armor/pcarrier/light/nt,/obj/random/projectile/scrapped_smg,/obj/random/projectile/scrapped_pistol,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1) +"l" = (/obj/structure/bed/roller/adv,/obj/random/humanoidremains,/obj/random/cash,/obj/random/cigarettes,/obj/item/clothing/under/explorer,/obj/item/clothing/shoes/boots/winter/explorer,/obj/item/clothing/mask/gas/explorer,/obj/item/clothing/accessory/medal/permit/gun/planetside,/obj/item/clothing/suit/armor/pcarrier/light/nt,/obj/random/projectile/scrapped_smg,/obj/random/projectile/scrapped_pistol,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1) "m" = (/obj/random/medical/lite,/obj/random/toolbox,/obj/random/trash,/obj/random/technology_scanner/anom,/obj/random/tool/anom,/turf/simulated/floor/outdoors/rocks/caves,/area/submap/Shelter1) "n" = (/obj/structure/fence/corner{dir = 1; icon_state = "corner"},/obj/effect/landmark/snowy_turf,/turf/template_noop,/area/submap/Shelter1) "o" = (/obj/structure/fence/door/locked{dir = 1; icon_state = "door_closed"},/obj/effect/landmark/snowy_turf,/turf/template_noop,/area/submap/Shelter1) diff --git a/maps/submaps/surface_submaps/wilderness/chasm.dmm b/maps/submaps/surface_submaps/wilderness/chasm.dmm index 87a5b393ac4..2917abec18e 100644 --- a/maps/submaps/surface_submaps/wilderness/chasm.dmm +++ b/maps/submaps/surface_submaps/wilderness/chasm.dmm @@ -29,12 +29,12 @@ "pk" = (/obj/random/maintenance,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) "qx" = (/obj/structure/cliff/automatic{dir = 2},/obj/item/bone/arm,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "qB" = (/obj/random/trash,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) -"rI" = (/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) +"rI" = (/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/obj/item/clothing/suit/caution{desc = "A badly damaged and warped wet floor sign. Its half-melted plastic cause it to sag towards the ground."; name = "battered wet floor sign"},/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) "rR" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) "rY" = (/obj/structure/cliff/automatic{dir = 8},/obj/structure/ledge/ledge_stairs{dir = 1},/obj/structure/barricade,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/Chasm) "sg" = (/obj/structure/loot_pile/mecha/odysseus,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "st" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/item/bone/arm,/turf/simulated/floor/plating,/area/submap/Chasm) -"tg" = (/obj/structure/ledge/ledge_stairs{dir = 1; name = "loose rock stairs"},/obj/effect/step_trigger/thrower,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) +"tg" = (/obj/structure/ledge/ledge_stairs{dir = 1; name = "loose rock stairs"; desc = "A colorful set of rocky stairs. A few stones are loose, making for dangerous footing."},/obj/effect/step_trigger/thrower,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "uc" = (/obj/item/bone,/obj/random/junk,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/submap/Chasm) "uf" = (/obj/structure/cliff/automatic,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "uh" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) @@ -55,7 +55,7 @@ "BQ" = (/obj/item/bone,/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "BU" = (/obj/structure/cliff/automatic/corner{dir = 10},/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "Co" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/mob/living/simple_mob/animal/giant_spider/nurse/hat,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/Chasm) -"Cs" = (/obj/effect/step_trigger/thrower,/obj/structure/ledge/ledge_stairs{dir = 1; name = "loose rock stairs"},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) +"Cs" = (/obj/effect/step_trigger/thrower,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/spider/stickyweb/dark,/obj/structure/ledge/ledge_stairs{dir = 1; name = "loose rock stairs"; desc = "A colorful set of rocky stairs. A few stones are loose, making for dangerous footing."},/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) "Da" = (/obj/random/maintenance,/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Chasm) "Di" = (/obj/effect/floor_decal/rust,/obj/random/humanoidremains,/mob/living/simple_mob/animal/giant_spider/webslinger,/turf/simulated/floor/plating,/area/submap/Chasm) "DH" = (/mob/living/simple_mob/animal/giant_spider/tunneler/frequent,/obj/effect/spider/stickyweb/dark,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/Chasm) diff --git a/maps/submaps/surface_submaps/wilderness/collapsedmine.dmm b/maps/submaps/surface_submaps/wilderness/collapsedmine.dmm new file mode 100644 index 00000000000..0cc08ff8622 --- /dev/null +++ b/maps/submaps/surface_submaps/wilderness/collapsedmine.dmm @@ -0,0 +1,6932 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ae" = ( +/obj/structure/ore_box, +/obj/effect/floor_decal/corner/yellow/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"af" = ( +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/pink/border{ + dir = 8 + }, +/obj/item/surgical/cautery, +/obj/item/surgical/hemostat, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"as" = ( +/obj/machinery/mineral/processing_unit_console, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"ay" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/asteroid_steel, +/area/submap/CollapsedMine) +"az" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"aD" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"aJ" = ( +/obj/effect/spawner/gibs/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"aO" = ( +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"aW" = ( +/obj/machinery/light, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"bf" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bi" = ( +/obj/effect/floor_decal/corner/red/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bl" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bn" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bp" = ( +/obj/random/junk, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bs" = ( +/obj/structure/grille/broken, +/obj/item/material/shard, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"bu" = ( +/obj/machinery/computer/arcade, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"bx" = ( +/obj/machinery/sleep_console{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"bC" = ( +/obj/structure/animal_den, +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"bH" = ( +/obj/structure/table/steel_reinforced, +/obj/machinery/door/window/eastright, +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/random/mug, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bI" = ( +/obj/structure/bed/padded, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"bJ" = ( +/obj/item/ore/glass, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"bK" = ( +/obj/item/ore/slag{ + desc = "Well at least Arthur doesn't have to share now..."; + name = "pet rock" + }, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"bQ" = ( +/obj/effect/decal/cleanable/filth, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"bR" = ( +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"cb" = ( +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 9 + }, +/obj/item/reagent_containers/blood/OMinus, +/obj/random/maintenance/medical, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"cg" = ( +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 8 + }, +/obj/random/medical/lite, +/obj/random/medical/pillbottle, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"ch" = ( +/obj/random/mob/spider, +/obj/structure/animal_den, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"ck" = ( +/turf/simulated/floor/tiled/asteroid_steel, +/area/submap/CollapsedMine) +"ct" = ( +/obj/structure/bed/chair/sofa/beige/corner{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"cz" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/template_noop) +"cB" = ( +/obj/effect/decal/cleanable/blood, +/obj/item/material/shard, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"cH" = ( +/obj/structure/grille/broken, +/obj/item/material/shard, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"cX" = ( +/obj/machinery/floodlight, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"db" = ( +/obj/effect/spider/spiderling/non_growing, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"dc" = ( +/obj/effect/decal/remains/human, +/obj/random/mob/spider/mutant, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"dq" = ( +/obj/structure/girder/displaced, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"dt" = ( +/turf/simulated/wall/concrete, +/area/submap/CollapsedMine) +"dC" = ( +/obj/structure/loot_pile/maint/junk, +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"dI" = ( +/obj/structure/barricade, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"dM" = ( +/obj/machinery/door/airlock/glass_security, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"dV" = ( +/obj/structure/table/standard, +/obj/structure/table/standard, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"ea" = ( +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ee" = ( +/obj/structure/animal_den, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"eg" = ( +/obj/effect/decal/cleanable/blood, +/obj/random/maintenance/security, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ei" = ( +/obj/item/clothing/glasses/welding, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"ej" = ( +/obj/structure/salvageable/console_os{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"ek" = ( +/obj/structure/loot_pile/surface/medicine_cabinet, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"er" = ( +/obj/random/projectile/sec, +/obj/machinery/door/window/eastleft, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"eu" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/obj/random/maintenance/security, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ey" = ( +/obj/machinery/recharge_station, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"eH" = ( +/obj/machinery/light/small/emergency{ + dir = 1 + }, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"eQ" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + icon_state = "frame"; + pixel_y = 32 + }, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/structure/table/rack/shelf/steel, +/obj/item/pickaxe/hand, +/obj/item/shovel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"fc" = ( +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/obj/random/mob/spider, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"fd" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/machinery/photocopier, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"fm" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 5 + }, +/obj/machinery/light{ + dir = 4 + }, +/mob/living/simple_mob/mechanical/mining_drone, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"fn" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spawner/gibs/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"fp" = ( +/obj/machinery/light, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"fG" = ( +/mob/living/simple_mob/animal/giant_spider/lurker, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"fP" = ( +/obj/structure/bed/chair/sofa/beige/corner{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"fS" = ( +/obj/machinery/optable, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/remains/mummy1, +/obj/effect/decal/cleanable/vomit, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"fT" = ( +/turf/simulated/floor/wood/broken, +/area/submap/CollapsedMine) +"gh" = ( +/obj/structure/barricade, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"gi" = ( +/obj/random/toolbox, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"gm" = ( +/obj/effect/floor_decal/techfloor/hole/right, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"go" = ( +/obj/structure/table/rack/shelf/steel, +/obj/random/tool, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"gD" = ( +/obj/effect/spider/stickyweb, +/obj/random/maintenance/security, +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"gE" = ( +/obj/random/maintenance/engineering, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"gJ" = ( +/obj/machinery/mech_recharger, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"gQ" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/rigged, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"gY" = ( +/obj/structure/closet/crate/freezer, +/obj/random/meat, +/obj/effect/spider/stickyweb, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"ha" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 5 + }, +/obj/structure/table/bench/sifwooden/padded, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hb" = ( +/obj/item/stool/padded{ + dir = 1 + }, +/obj/random/junk, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"hd" = ( +/obj/structure/table/steel_reinforced, +/obj/random/tech_supply/nofail, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hf" = ( +/obj/machinery/washing_machine, +/obj/item/clothing/under/corp/grayson, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hg" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hh" = ( +/obj/structure/animal_den, +/obj/effect/spawner/gibs/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"hr" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hs" = ( +/obj/effect/spider/stickyweb/dark, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/standard, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"ht" = ( +/obj/machinery/iv_drip, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"hx" = ( +/obj/structure/window/reinforced/holowindow{ + dir = 4 + }, +/obj/structure/window/reinforced/holowindow, +/obj/random/gun/random/anomalous, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hy" = ( +/obj/structure/table/woodentable, +/obj/random/maintenance/cargo, +/turf/simulated/floor/tiled/old_cargo/green, +/area/submap/CollapsedMine) +"hB" = ( +/obj/effect/decal/remains/human, +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"hF" = ( +/obj/machinery/door/airlock{ + welded = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"hG" = ( +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/red/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"hI" = ( +/obj/machinery/shower{ + dir = 8; + pixel_x = -5; + pixel_y = -1 + }, +/obj/structure/curtain/open/shower/security, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/CollapsedMine) +"hK" = ( +/obj/structure/curtain/open/bed{ + name = "shower curtain" + }, +/obj/machinery/shower, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"hN" = ( +/obj/structure/table/rack, +/obj/structure/table/rack, +/turf/template_noop, +/area/submap/CollapsedMine) +"hV" = ( +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/effect/spawner/gibs, +/obj/random/mob/spider/mutant, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ib" = ( +/obj/machinery/vending/dinnerware, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"ig" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ii" = ( +/obj/structure/loot_pile/maint/technical, +/obj/effect/floor_decal/corner/yellow/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"in" = ( +/obj/random/trash, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ip" = ( +/obj/item/cell/high, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"iq" = ( +/obj/structure/salvageable/console_os{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ir" = ( +/obj/effect/floor_decal/corner/red/border, +/obj/item/material/shard, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"iu" = ( +/obj/structure/closet/crate/grayson, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"iw" = ( +/obj/structure/bed/chair/comfy/teal{ + dir = 8 + }, +/obj/item/toy/plushie/marble_fox, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"ix" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/structure/loot_pile/maint/junk, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"iz" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/asteroid_steel, +/area/submap/CollapsedMine) +"iB" = ( +/obj/structure/table/steel_reinforced, +/obj/item/towel/random, +/obj/item/towel/random, +/obj/machinery/light/small, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"iE" = ( +/obj/structure/ore_box, +/turf/template_noop, +/area/submap/CollapsedMine) +"iF" = ( +/obj/structure/bed/chair/office/dark{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/border, +/obj/machinery/light, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"iK" = ( +/obj/structure/table/woodentable, +/obj/item/ammo_casing/a45, +/obj/item/material/knife/machete/hatchet, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"iL" = ( +/obj/machinery/neonsign/cafe, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"iN" = ( +/obj/effect/floor_decal/corner/red/border, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"iP" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"iT" = ( +/obj/structure/bed/chair/wood{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"iU" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/effect/decal/cleanable/vomit, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"iW" = ( +/obj/random/projectile/scrapped_smg, +/obj/structure/table/steel_reinforced, +/obj/effect/spider/stickyweb/dark, +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"jf" = ( +/obj/effect/spider/spiderling, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"jo" = ( +/obj/structure/bed/chair/office/dark{ + dir = 8 + }, +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"jt" = ( +/obj/structure/table/rack, +/obj/item/storage/box/flare, +/obj/item/shovel, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"jx" = ( +/obj/machinery/sleep_console{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/border, +/obj/machinery/light, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"jz" = ( +/obj/structure/table/marble, +/obj/random/drinkbottle/anom, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"jA" = ( +/obj/item/clothing/mask/surgical, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"jB" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"jG" = ( +/obj/item/clothing/head/collectable/police, +/obj/machinery/door/window/northleft, +/obj/item/clothing/accessory/armor/armorplate/riot, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"jJ" = ( +/obj/random/junk, +/obj/random/junk, +/obj/random/junk, +/obj/random/junk, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"jK" = ( +/obj/structure/bed/chair/wood{ + dir = 1 + }, +/turf/simulated/floor/wood/broken, +/area/submap/CollapsedMine) +"jM" = ( +/obj/effect/spider/stickyweb, +/mob/living/simple_mob/animal/giant_spider/tunneler, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"jO" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 9 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"jU" = ( +/obj/machinery/conveyor, +/obj/item/material/shard, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ki" = ( +/obj/structure/bed/chair/wood, +/obj/item/ammo_casing/a12g/pellet, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ko" = ( +/obj/structure/closet/wardrobe/red, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"kv" = ( +/obj/structure/closet/crate/grayson, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"kA" = ( +/obj/effect/floor_decal/corner/red/border, +/obj/effect/spider/cocoon, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"kI" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/structure/ore_box, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"kO" = ( +/obj/structure/table/steel_reinforced, +/obj/machinery/recharger, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border, +/obj/structure/window/reinforced/holowindow{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"kY" = ( +/obj/structure/table/bench/sifwooden/padded, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"lc" = ( +/obj/item/shield/riot, +/obj/structure/window/reinforced/holowindow{ + dir = 4 + }, +/obj/structure/window/reinforced/holowindow{ + dir = 1 + }, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"lg" = ( +/obj/structure/bed/roller, +/obj/random/medical/lite, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"lo" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"lq" = ( +/obj/item/ore/glass, +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"lt" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"lR" = ( +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"lS" = ( +/obj/effect/floor_decal/corner/red/border, +/mob/living/simple_mob/animal/giant_spider/electric, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"mf" = ( +/obj/item/ore/glass, +/obj/random/mob/spider, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"mh" = ( +/obj/random/trash, +/obj/random/junk, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"mk" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ml" = ( +/obj/structure/bed/chair/office/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"mv" = ( +/obj/effect/floor_decal/corner/pink/border, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"mx" = ( +/obj/effect/floor_decal/carpet, +/obj/random/trash, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"mz" = ( +/obj/structure/table/standard, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"mH" = ( +/obj/structure/girder/reinforced, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"mM" = ( +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"mU" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"nf" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ng" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"nq" = ( +/turf/template_noop, +/area/submap/CollapsedMine) +"nu" = ( +/obj/effect/floor_decal/carpet, +/obj/random/junk, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"ny" = ( +/obj/structure/bed/chair/sofa/beige/left, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"nD" = ( +/obj/item/material/shard, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"nW" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"oe" = ( +/obj/effect/spider/stickyweb, +/obj/random/meat, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"oj" = ( +/obj/structure/bed/chair/sofa/beige/corner{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"oJ" = ( +/obj/random/meat, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"oV" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"pb" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"pe" = ( +/obj/structure/loot_pile/maint/junk, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"pi" = ( +/obj/effect/floor_decal/corner/yellow/border, +/obj/structure/ore_box, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"pm" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"px" = ( +/obj/effect/decal/cleanable/blood/gibs/robot, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"py" = ( +/obj/effect/spider/spiderling/non_growing, +/obj/structure/table/wooden_reinforced, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"pD" = ( +/obj/effect/floor_decal/carpet, +/obj/random/maintenance/anom, +/obj/random/cash/huge, +/obj/random/contraband, +/obj/random/contraband, +/obj/structure/closet/crate/secure/grayson, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"pL" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/turf/simulated/floor/tiled/asteroid_steel, +/area/submap/CollapsedMine) +"pR" = ( +/obj/structure/table/rack/shelf/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"pT" = ( +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"qc" = ( +/obj/structure/table/steel_reinforced, +/obj/machinery/door/window/eastleft, +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"qd" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"qe" = ( +/obj/structure/table/rack, +/obj/item/pickaxe, +/obj/item/clothing/glasses/meson, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"qr" = ( +/obj/structure/bed/roller, +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"qs" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/effect/decal/cleanable/spiderling_remains, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"qD" = ( +/obj/structure/sink{ + pixel_y = 17 + }, +/obj/random/junk, +/obj/random/junk, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"qH" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 9 + }, +/obj/effect/floor_decal/industrial/loading{ + dir = 8 + }, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"qI" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/structure/table/bench/sifwooden/padded, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"qV" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 9 + }, +/obj/structure/flora/pottedplant/dead, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"qX" = ( +/obj/effect/floor_decal/corner/pink/border{ + dir = 6 + }, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/blood/empty, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"rg" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"rl" = ( +/obj/item/stack/material/wood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"rm" = ( +/obj/item/material/shard, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ro" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border, +/obj/structure/window/reinforced/holowindow{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"rz" = ( +/obj/effect/spider/stickyweb/dark, +/obj/random/mob/spider/mutant, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"rE" = ( +/obj/structure/closet/crate/grayson, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 9 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"rG" = ( +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"rR" = ( +/obj/effect/spider/spiderling/non_growing, +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"rV" = ( +/obj/structure/sign/warning, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"rY" = ( +/obj/item/pickaxe/hand, +/turf/simulated/floor/tiled/old_cargo/green, +/area/submap/CollapsedMine) +"sm" = ( +/obj/structure/window/basic{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/CollapsedMine) +"so" = ( +/obj/structure/table/marble, +/obj/item/deskbell, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"sr" = ( +/obj/structure/salvageable/computer, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"sA" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"sB" = ( +/obj/structure/barricade, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"sC" = ( +/obj/random/outcrop, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"sI" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 5 + }, +/obj/structure/window/reinforced/holowindow{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"sR" = ( +/obj/structure/loot_pile/maint/junk, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"tk" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/remains/human, +/obj/item/clothing/under/corp/grayson, +/obj/item/clothing/shoes/boots/workboots, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"tl" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"tu" = ( +/obj/effect/decal/remains/mummy1, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"tD" = ( +/obj/item/clothing/accessory/armor/armguards, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"tJ" = ( +/obj/random/mob/spider, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"tM" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"tR" = ( +/obj/item/stack/material/wood, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"tU" = ( +/obj/structure/bed/chair/wood, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ul" = ( +/obj/structure/salvageable/console_broken_os{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"up" = ( +/obj/machinery/door/airlock/glass_medical, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"us" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"uu" = ( +/obj/machinery/mineral/processing_unit, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"uw" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/item/stack/material/wood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"uC" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"uL" = ( +/obj/structure/loot_pile/mecha/ripley, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"uR" = ( +/obj/structure/table/woodentable, +/obj/item/cell/device/weapon/empty, +/turf/simulated/floor/tiled/old_cargo/green, +/area/submap/CollapsedMine) +"uU" = ( +/obj/random/ammo, +/obj/machinery/door/window/southleft, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vb" = ( +/obj/effect/floor_decal/techfloor/hole, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vd" = ( +/obj/machinery/door/airlock/highsecurity{ + welded = 1 + }, +/obj/machinery/door/blast/regular, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vf" = ( +/obj/machinery/door/airlock/multi_tile/metal, +/obj/structure/barricade, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vg" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/steel_reinforced, +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/random/maintenance/security, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vj" = ( +/obj/structure/table/marble, +/obj/machinery/chemical_dispenser/bar_coffee, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"vp" = ( +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vv" = ( +/obj/effect/spider/stickyweb, +/obj/effect/decal/remains/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"vw" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 5 + }, +/obj/structure/table/rack/shelf/steel, +/obj/item/pickaxe/hand, +/obj/item/storage/excavation, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vN" = ( +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vU" = ( +/obj/structure/table/rack, +/obj/item/shovel, +/obj/item/clothing/glasses/meson, +/turf/template_noop, +/area/submap/CollapsedMine) +"vV" = ( +/obj/effect/spawner/gibs/human, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"vZ" = ( +/obj/structure/table/standard, +/obj/item/surgical/FixOVein, +/obj/item/surgical/bone_clamp, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"wa" = ( +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wc" = ( +/obj/effect/spider/stickyweb, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"wf" = ( +/obj/structure/simple_door/wood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wh" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/obj/structure/flora/pottedplant/dead, +/obj/structure/table/wooden_reinforced, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"wi" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wl" = ( +/obj/item/cell/device/weapon/empty, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wm" = ( +/obj/effect/floor_decal/carpet, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"ww" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spawner/gibs, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"wz" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wB" = ( +/obj/effect/spider/stickyweb, +/obj/item/stack/material/wood, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"wF" = ( +/obj/random/tech_supply, +/obj/structure/table/steel_reinforced, +/obj/random/tech_supply/component, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/obj/random/tech_supply/component, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wL" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/random/material/refined, +/obj/random/material/refined, +/obj/structure/closet/crate/grayson, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"wP" = ( +/obj/item/material/shard, +/obj/structure/grille/broken, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"wR" = ( +/obj/random/junk, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"xg" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 10 + }, +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"xh" = ( +/obj/structure/closet/secure_closet/medical_wall/anesthetics{ + pixel_x = -32 + }, +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/pink/border{ + dir = 10 + }, +/obj/item/surgical/retractor, +/obj/item/surgical/scalpel, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"xo" = ( +/obj/structure/table/standard, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"xq" = ( +/obj/structure/closet{ + name = "Prisoner's Locker" + }, +/obj/random/maintenance/anom, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"xu" = ( +/obj/machinery/door/airlock{ + p_open = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"xz" = ( +/obj/machinery/appliance/cooker/oven, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"xA" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/light/small{ + dir = 4; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"xB" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"xM" = ( +/obj/structure/bed/double, +/obj/effect/decal/remains/mummy1, +/obj/item/bedsheet/browndouble, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"xR" = ( +/obj/machinery/door/airlock/freezer, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"xS" = ( +/obj/effect/floor_decal/carpet, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/clothing/under/corp/grayson_jump, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/gloves/duty, +/obj/structure/closet, +/obj/item/clothing/glasses/meson/aviator, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"xZ" = ( +/obj/structure/table/steel_reinforced, +/obj/random/tech_supply/component, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"yc" = ( +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"yr" = ( +/obj/item/ammo_casing/a45, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"yv" = ( +/obj/machinery/door/airlock/security, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"yw" = ( +/obj/machinery/door/airlock/security{ + locked = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"yJ" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"yN" = ( +/obj/machinery/door/airlock/glass_security{ + name = "Security Cells"; + req_access = list(1) + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"yO" = ( +/obj/machinery/shower{ + dir = 8; + pixel_x = -5; + pixel_y = -1 + }, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/structure/curtain/open/bed{ + name = "shower curtain" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/CollapsedMine) +"yY" = ( +/obj/structure/bed/chair/sofa/beige{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"zk" = ( +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"zs" = ( +/obj/structure/barricade, +/obj/effect/floor_decal/corner/yellow/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"zw" = ( +/obj/random/junk, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"zy" = ( +/obj/effect/floor_decal/corner/pink/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"zA" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 5 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"zE" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"zF" = ( +/obj/structure/sign/warning/moving_parts, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"zM" = ( +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"zY" = ( +/obj/random/mob/spider, +/obj/effect/spider/stickyweb, +/obj/structure/animal_den, +/obj/effect/spawner/gibs/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"zZ" = ( +/obj/structure/table/woodentable, +/obj/item/ammo_casing/a45, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Ac" = ( +/obj/structure/table/woodentable, +/obj/item/clothing/accessory/material/makeshift/armguards, +/turf/simulated/floor/tiled/old_cargo/green, +/area/submap/CollapsedMine) +"Ai" = ( +/obj/effect/decal/cleanable/spiderling_remains, +/obj/effect/floor_decal/industrial/loading{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Al" = ( +/obj/structure/table/steel_reinforced, +/obj/random/maintenance/security, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/item/material/shard, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"An" = ( +/obj/structure/bed/chair/sofa/beige/right, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Ap" = ( +/obj/structure/table/rack, +/obj/random/powercell, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Av" = ( +/obj/structure/bed/chair/wood{ + dir = 1 + }, +/obj/machinery/light, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"AO" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/obj/structure/ore_box, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"AP" = ( +/obj/machinery/vending/snack, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"AQ" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/random/maintenance/security, +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"AV" = ( +/obj/structure/window/basic{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"AX" = ( +/obj/item/clothing/under/corp/grayson, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/gloves/duty, +/obj/structure/closet, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"Ba" = ( +/obj/item/clothing/under/corp/grayson_jump, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/gloves/duty, +/obj/structure/closet, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"Bc" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Bh" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/browndouble, +/obj/random/junk/anom, +/obj/effect/decal/remains/mummy1, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"Bq" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Bt" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/table/standard, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"By" = ( +/obj/machinery/computer/security/telescreen/entertainment{ + icon_state = "frame"; + pixel_y = 32 + }, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/structure/table/rack/shelf/steel, +/obj/item/gun/energy/mininglaser, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"BH" = ( +/obj/structure/bed/chair/sofa/beige/right{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"BI" = ( +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"BL" = ( +/obj/structure/window/reinforced/holowindow, +/obj/structure/window/reinforced/holowindow{ + dir = 8 + }, +/obj/random/energy/sec, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"BV" = ( +/obj/structure/barricade, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Cr" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"Cv" = ( +/obj/structure/table/standard, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 8 + }, +/obj/item/toy/desk/fan, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"CB" = ( +/obj/effect/spider/stickyweb/dark, +/obj/random/junk, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"CH" = ( +/obj/effect/spider/stickyweb, +/mob/living/simple_mob/animal/giant_spider/webslinger, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"CL" = ( +/obj/structure/bed/chair/sofa/beige/left{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"CR" = ( +/obj/structure/table/standard, +/obj/item/pen, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"CS" = ( +/obj/structure/table/steel_reinforced, +/obj/random/tech_supply, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 9 + }, +/obj/random/tech_supply/component, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Dh" = ( +/obj/effect/floor_decal/corner/paleblue/border, +/obj/effect/decal/cleanable/blood/drip, +/obj/random/medical/lite, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Dm" = ( +/obj/item/frame/apc, +/obj/structure/closet/crate/grayson, +/obj/item/circuitboard/broken, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 6 + }, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Do" = ( +/obj/machinery/shower, +/obj/effect/decal/remains/mummy2, +/obj/random/revolver, +/obj/structure/curtain/open/bed{ + name = "shower curtain" + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"Dq" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/floor_decal/corner/paleblue/border, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"DF" = ( +/obj/structure/table/steel_reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/red/border{ + dir = 5 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"DI" = ( +/obj/structure/sign/directions/medical/surgery, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"DP" = ( +/obj/effect/spider/stickyweb/dark, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"DR" = ( +/obj/structure/table/marble, +/obj/machinery/chemical_dispenser/bar_alc, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"DX" = ( +/obj/machinery/door/airlock/multi_tile/metal, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Ed" = ( +/obj/random/mob/spider, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Eo" = ( +/obj/structure/table/woodentable, +/obj/random/maintenance, +/turf/simulated/floor/tiled/old_cargo/green, +/area/submap/CollapsedMine) +"Eq" = ( +/obj/structure/table/marble, +/obj/item/ammo_casing/a45, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Et" = ( +/obj/structure/closet{ + name = "Prisoner's Locker" + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"EC" = ( +/obj/item/ore/slag, +/obj/item/ore/gold, +/obj/item/ore/gold, +/obj/item/ore/gold, +/obj/item/ore/gold, +/obj/item/ore/gold, +/obj/item/ore/gold, +/obj/item/ore/gold, +/obj/item/ore/iron, +/obj/item/ore/iron, +/obj/item/ore/iron, +/obj/item/ore/iron, +/obj/item/ore/iron, +/obj/item/ore/iron, +/obj/item/ore/iron, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/diamond, +/obj/structure/closet/crate/grayson, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"EE" = ( +/obj/item/clothing/under/corp/grayson, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/gloves/duty, +/obj/structure/closet, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"EO" = ( +/obj/structure/sink{ + pixel_y = 16 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"EQ" = ( +/obj/structure/girder/displaced, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"ET" = ( +/obj/structure/table/bench/sifwooden/padded, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Fg" = ( +/obj/structure/table/marble, +/obj/machinery/light{ + dir = 1 + }, +/obj/random/drinkbottle, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Ft" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Fz" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"FG" = ( +/obj/structure/kitchenspike, +/obj/effect/spider/stickyweb, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"FH" = ( +/obj/item/ore/glass, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"FR" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/structure/ore_box, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"FS" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/obj/structure/closet/wardrobe/suit, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"FV" = ( +/obj/structure/table/standard, +/obj/item/roller/adv, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 10 + }, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Gb" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Gc" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 5 + }, +/obj/structure/table/standard, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Gg" = ( +/obj/effect/spawner/gibs/human, +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Go" = ( +/obj/random/trash, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Gs" = ( +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/paleblue/border, +/obj/random/medical/lite/anom, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Gt" = ( +/obj/random/junk, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"Gu" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/machinery/vending/security, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Gv" = ( +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"GM" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/structure/table/bench/sifwooden/padded, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"GN" = ( +/obj/structure/bed/roller, +/obj/effect/decal/remains/mummy1, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"GR" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"GV" = ( +/obj/effect/spider/stickyweb, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Hd" = ( +/obj/random/trash, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"He" = ( +/obj/item/beartrap/hunting{ + anchored = 1; + deployed = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Hq" = ( +/obj/structure/closet/crate/grayson, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/slag, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/obj/item/ore/coal, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Hs" = ( +/obj/effect/spider/stickyweb, +/turf/simulated/mineral/ignore_mapgen, +/area/submap/CollapsedMine) +"Hv" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"HA" = ( +/obj/random/vendorfood, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"HE" = ( +/obj/effect/floor_decal/corner/red/border, +/obj/structure/loot_pile/maint/junk, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"HL" = ( +/obj/effect/decal/remains/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"HP" = ( +/obj/structure/curtain/open/privacy, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"HR" = ( +/obj/item/pickaxe/drill, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"HV" = ( +/obj/effect/spider/stickyweb, +/obj/effect/decal/remains/human, +/obj/item/clothing/under/corp/grayson, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/pickaxe/drill, +/obj/random/projectile/scrapped_shotgun, +/obj/effect/spawner/gibs/human, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"HW" = ( +/obj/structure/bed/chair/sofa/beige/corner, +/obj/random/maintenance, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"HZ" = ( +/obj/structure/bed/chair/wood{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Ig" = ( +/obj/structure/barricade, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Io" = ( +/obj/structure/table/rack, +/obj/item/stack/marker_beacon, +/obj/item/stack/marker_beacon, +/obj/item/gps/mining, +/turf/template_noop, +/area/submap/CollapsedMine) +"Ip" = ( +/obj/random/meat, +/obj/effect/spider/stickyweb, +/obj/effect/spider/spiderling/non_growing, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Ir" = ( +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/pink/border{ + dir = 9 + }, +/obj/item/surgical/bonegel, +/obj/item/surgical/surgicaldrill, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Is" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/structure/ore_box, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Iu" = ( +/obj/structure/table/woodentable, +/obj/effect/spider/spiderling/non_growing, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Ix" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Iz" = ( +/obj/structure/table/woodentable, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"IA" = ( +/obj/structure/table/woodentable, +/obj/random/medical/lite/anom, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ID" = ( +/obj/structure/bed/chair/office/dark{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"IE" = ( +/obj/structure/salvageable/console_broken_os{ + dir = 4 + }, +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/machinery/light/poi{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"II" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/browndouble, +/obj/random/plushie/anom, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"IK" = ( +/obj/structure/table/marble, +/obj/machinery/light{ + dir = 1 + }, +/obj/random/junk, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"IM" = ( +/obj/structure/animal_den, +/obj/random/mob/spider, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"IQ" = ( +/obj/effect/spawner/gibs/human, +/obj/random/maintenance/anom, +/obj/effect/decal/remains/human, +/obj/item/clothing/head/helmet/space/void/mining/alt, +/obj/item/clothing/suit/space/void/mining/alt, +/obj/machinery/conveyor, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"IR" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"IT" = ( +/obj/machinery/mech_recharger, +/obj/mecha/working/ripley/mining/old, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"IV" = ( +/obj/effect/floor_decal/carpet, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"IX" = ( +/obj/structure/salvageable/console_broken_os{ + dir = 4 + }, +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"IZ" = ( +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"Je" = ( +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Jf" = ( +/obj/structure/table/steel_reinforced, +/obj/random/tech_supply/component, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 9 + }, +/obj/random/maintenance/anom, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Jg" = ( +/obj/structure/table/bench/sifwooden/padded, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 6 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Jj" = ( +/obj/item/ore/glass, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Jl" = ( +/obj/structure/table/woodentable, +/obj/item/shovel, +/obj/random/tool, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Jm" = ( +/mob/living/simple_mob/mechanical/mecha/ripley{ + faction = "malf_drone" + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Jn" = ( +/obj/structure/ore_box, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Jv" = ( +/obj/effect/floor_decal/carpet, +/obj/item/weldingtool/hugetank, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"JA" = ( +/obj/effect/decal/remains/human, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"JH" = ( +/obj/item/flashlight/lamp, +/obj/structure/table/wooden_reinforced, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"JI" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/obj/structure/table/steel_reinforced, +/obj/random/mug/anom, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"JJ" = ( +/obj/effect/floor_decal/corner/pink/border{ + dir = 4 + }, +/obj/item/paper/crumpled/bloody{ + name = "to whoever finds me"; + info = "On the back of this patient scan report is the following hurried message: My name is doctor zamoya. The blood on this paper is not my own, but a consequence of us foolishly attempting to tame the SAR. I will die all the same. Please do not blame Nightingale for what they do. I do not think they can tell friend from foe anymore. This is too much for them, it is too much for us all. Put them to better use, put me to rest. May things be better beyond." + }, +/obj/item/pen, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"JK" = ( +/obj/structure/table/standard, +/obj/item/pickaxe, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"JM" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 6 + }, +/obj/structure/filingcabinet/chestdrawer, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Ke" = ( +/obj/effect/decal/cleanable/flour, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Ko" = ( +/obj/structure/sign/greencross, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"Ky" = ( +/obj/effect/floor_decal/industrial/loading{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"KB" = ( +/obj/machinery/door/airlock/glass_mining, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"KE" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"KV" = ( +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"KX" = ( +/obj/machinery/iv_drip, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Ld" = ( +/obj/random/medical/lite, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Lf" = ( +/obj/effect/floor_decal/corner/pink/border{ + dir = 6 + }, +/obj/item/clothing/under/rank/medical/scrubs/navyblue, +/obj/item/clothing/head/surgery/navyblue, +/obj/effect/decal/remains/mummy1, +/obj/random/medical/lite/anom, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"LJ" = ( +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = -2 + }, +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = 6 + }, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"LK" = ( +/obj/structure/window/reinforced/holowindow{ + dir = 1 + }, +/obj/structure/window/reinforced/holowindow{ + dir = 8 + }, +/obj/random/ammo, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"LM" = ( +/obj/item/material/shard, +/obj/structure/table/steel_reinforced, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"LQ" = ( +/obj/item/material/shard, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"LR" = ( +/obj/structure/ore_box, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"LS" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 6 + }, +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"LU" = ( +/obj/structure/table/marble, +/obj/random/drinkbottle, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"LW" = ( +/obj/item/stool/padded{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Md" = ( +/obj/structure/sign/directions/security{ + dir = 4; + pixel_y = -2 + }, +/obj/structure/sign/directions/dorms{ + dir = 4; + pixel_y = 6 + }, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"Mk" = ( +/obj/machinery/floodlight, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"MM" = ( +/obj/effect/spider/stickyweb, +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"MT" = ( +/obj/random/vendorall, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"MU" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/effect/decal/remains/human, +/obj/item/clothing/under/corp/grayson, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"MW" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Ne" = ( +/obj/effect/floor_decal/industrial/loading{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Nj" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/obj/item/stack/material/wood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Nn" = ( +/obj/structure/loot_pile/surface/medicine_cabinet/fresh, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"Np" = ( +/obj/structure/bed/roller, +/obj/effect/decal/remains/mummy1, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Nr" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 10 + }, +/obj/structure/loot_pile/maint/trash, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Nx" = ( +/obj/structure/bed/chair/office/dark{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"NC" = ( +/obj/effect/spider/stickyweb, +/obj/random/mob/spider, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"ND" = ( +/obj/item/broken_device, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"NI" = ( +/obj/item/ore/glass, +/obj/random/mob/spider/mutant, +/obj/machinery/light, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"NL" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"NS" = ( +/obj/effect/floor_decal/corner/paleblue/border, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"NV" = ( +/obj/structure/table/marble, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Om" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Oo" = ( +/obj/structure/table/marble, +/obj/item/ammo_casing/a12g/pellet, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Ov" = ( +/obj/machinery/recharge_station, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Ow" = ( +/obj/structure/kitchenspike, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"Oy" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/machinery/vending/medical, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"OD" = ( +/obj/structure/table/steel_reinforced, +/obj/item/towel/random, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"OJ" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 5 + }, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"OL" = ( +/obj/structure/bed/padded, +/obj/item/toy/plushie/spider, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"OW" = ( +/mob/living/simple_mob/animal/giant_spider/carrier, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"OX" = ( +/obj/effect/decal/remains/human, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Pa" = ( +/obj/structure/table/rack, +/obj/random/powercell/anom, +/obj/random/powercell, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Pg" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Pk" = ( +/obj/effect/floor_decal/corner/pink/border{ + dir = 10 + }, +/obj/random/medical/lite, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Po" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Pq" = ( +/obj/effect/spider/stickyweb, +/obj/structure/grille/broken, +/turf/simulated/floor/plating, +/area/submap/CollapsedMine) +"Py" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/structure/salvageable/console_broken_os{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"PB" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"PK" = ( +/obj/machinery/door/airlock, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"PS" = ( +/obj/effect/floor_decal/corner/red/border, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Qb" = ( +/obj/structure/window/basic{ + dir = 8 + }, +/obj/item/towel/random, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/CollapsedMine) +"Qg" = ( +/obj/structure/bed/padded, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Qj" = ( +/obj/item/beartrap/hunting{ + anchored = 1; + deployed = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"Ql" = ( +/obj/structure/bed/chair/wood, +/turf/simulated/floor/wood/broken, +/area/submap/CollapsedMine) +"Qq" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Qr" = ( +/obj/machinery/light, +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"QN" = ( +/obj/structure/barricade, +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"QO" = ( +/obj/structure/bed/chair/wood, +/obj/item/ammo_casing/a45, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"QT" = ( +/obj/item/surgical/circular_saw, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"QV" = ( +/obj/structure/closet/secure_closet/freezer, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"Rf" = ( +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Ri" = ( +/obj/structure/sink{ + pixel_y = 17 + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"Ry" = ( +/obj/random/maintenance/security, +/obj/machinery/door/window/westleft, +/obj/structure/table/rack/gun_rack/steel, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"RM" = ( +/obj/effect/decal/cleanable/blood/drip, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Sa" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Sf" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Sp" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/submap/CollapsedMine) +"Sq" = ( +/obj/machinery/conveyor, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Sv" = ( +/obj/effect/floor_decal/techfloor/hole/right, +/obj/effect/floor_decal/corner/yellow/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"SA" = ( +/obj/structure/sink{ + pixel_y = 17 + }, +/obj/random/junk, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"SM" = ( +/obj/effect/spider/stickyweb, +/obj/random/meat, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"SP" = ( +/obj/structure/loot_pile/maint/trash, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"ST" = ( +/obj/item/stack/cable_coil/random, +/obj/item/cell/hyper/empty, +/obj/effect/floor_decal/corner/yellow/border, +/obj/random/tool/power, +/obj/machinery/power/apc{ + start_charge = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Tc" = ( +/obj/effect/decal/remains/ribcage, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Tj" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 6 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"To" = ( +/obj/effect/spider/spiderling/non_growing, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Tu" = ( +/obj/structure/table/bench/sifwooden/padded, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"TB" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 5 + }, +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/effect/decal/cleanable/cobweb2, +/obj/machinery/deployable/barrier, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"TH" = ( +/obj/machinery/light, +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"TK" = ( +/obj/structure/salvageable/console_broken_os{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"TR" = ( +/obj/item/stack/material/wood, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"TV" = ( +/turf/simulated/mineral/floor/ignore_mapgen, +/area/template_noop) +"TW" = ( +/turf/template_noop, +/area/template_noop) +"Ue" = ( +/obj/structure/closet/crate/freezer, +/obj/random/meat, +/obj/effect/spider/stickyweb, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"Ui" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Un" = ( +/obj/item/material/shard, +/obj/structure/table/steel_reinforced, +/obj/effect/spider/stickyweb/dark, +/obj/effect/floor_decal/corner/red/border{ + dir = 4 + }, +/obj/random/maintenance/security, +/obj/structure/window/reinforced/holowindow{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Uq" = ( +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Us" = ( +/obj/structure/table/steel_reinforced, +/obj/item/pen, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"UF" = ( +/mob/living/simple_mob/mechanical/mecha/odysseus, +/obj/structure/bed/roller, +/obj/effect/decal/cleanable/vomit, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"UI" = ( +/obj/effect/decal/remains/human, +/obj/item/clothing/under/corp/grayson, +/obj/item/clothing/head/hardhat/dblue, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/pickaxe, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"UM" = ( +/obj/item/clothing/under/corp/grayson, +/obj/item/clothing/shoes/boots/workboots, +/obj/item/clothing/head/hardhat/dblue, +/obj/structure/closet, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"UU" = ( +/obj/random/trash, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Vf" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 10 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/loot_pile/maint/trash, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Vg" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 1 + }, +/obj/effect/decal/remains/human, +/obj/effect/spider/cocoon, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Vj" = ( +/turf/simulated/floor/tiled/old_cargo/green, +/area/submap/CollapsedMine) +"Vu" = ( +/obj/machinery/light/small{ + dir = 4; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"VB" = ( +/obj/structure/table/standard, +/obj/item/clothing/suit/chef, +/obj/item/clothing/head/chefhat, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"VE" = ( +/obj/structure/bed/chair/wood{ + dir = 1 + }, +/obj/random/junk, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"VG" = ( +/obj/random/junk, +/mob/living/simple_mob/mechanical/mecha/ripley/firefighter{ + faction = "malf_drone" + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"VH" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/structure/dogbed, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"VL" = ( +/obj/structure/bed/chair/office/dark{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"VP" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/loot_pile/maint/junk, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"VT" = ( +/obj/machinery/washing_machine, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"VW" = ( +/obj/item/ammo_casing/a12g/pellet, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"VX" = ( +/mob/living/simple_mob/animal/giant_spider/tunneler, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"Wx" = ( +/obj/machinery/appliance/cooker/grill, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Wy" = ( +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Wz" = ( +/obj/structure/noticeboard, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"WC" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/obj/structure/loot_pile/maint/boxfort, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"WF" = ( +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"WG" = ( +/obj/item/ore/glass, +/obj/effect/spider/stickyweb, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"WH" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 9 + }, +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"WI" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"WL" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 5 + }, +/obj/random/medical/lite, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"WO" = ( +/obj/random/mob/spider, +/turf/template_noop, +/area/submap/CollapsedMine) +"WP" = ( +/obj/effect/floor_decal/corner/yellow/border, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"WY" = ( +/obj/structure/sign/warning/secure_area/armory, +/turf/simulated/wall/r_concrete, +/area/submap/CollapsedMine) +"Xg" = ( +/obj/structure/bed/chair/wood{ + dir = 1 + }, +/obj/effect/spawner/gibs/human, +/obj/machinery/light, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Xs" = ( +/obj/effect/floor_decal/corner/red/border{ + dir = 10 + }, +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"XG" = ( +/obj/machinery/shower, +/obj/structure/curtain/open/bed{ + name = "shower curtain" + }, +/turf/simulated/floor/tiled/dark, +/area/submap/CollapsedMine) +"XM" = ( +/obj/structure/table/standard, +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 8 + }, +/obj/random/medical, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"XR" = ( +/obj/item/ammo_casing/a45, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"XT" = ( +/obj/effect/floor_decal/corner/yellow/border{ + dir = 9 + }, +/obj/structure/table/rack/shelf/steel, +/obj/item/pickaxe/drill, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"XW" = ( +/obj/effect/spawner/gibs, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"XY" = ( +/obj/random/meat, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"Yg" = ( +/obj/random/vendordrink, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Yh" = ( +/obj/machinery/vending/cigarette, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"Yv" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 9 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Yy" = ( +/mob/living/simple_mob/mechanical/mecha/ripley/deathripley{ + faction = "malf_drone" + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"YE" = ( +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/CollapsedMine) +"YG" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/browndouble, +/turf/simulated/floor/carpet, +/area/submap/CollapsedMine) +"YH" = ( +/obj/effect/spider/stickyweb, +/obj/random/mob/spider/mutant, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"YJ" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Zb" = ( +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"Zm" = ( +/obj/machinery/appliance/cooker/fryer, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) +"Zq" = ( +/obj/effect/floor_decal/corner/paleblue/border{ + dir = 1 + }, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/white, +/area/submap/CollapsedMine) +"Zs" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/freezer, +/area/submap/CollapsedMine) +"ZE" = ( +/obj/effect/decal/remains/human, +/obj/random/maintenance/security, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ZF" = ( +/obj/item/cell/high, +/obj/effect/decal/cleanable/blood, +/obj/effect/floor_decal/corner/yellow/border{ + dir = 4 + }, +/obj/item/clothing/under/corp/grayson, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ZI" = ( +/obj/effect/decal/cleanable/spiderling_remains, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ZR" = ( +/obj/random/junk, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"ZU" = ( +/obj/item/toy/desk/officetoy, +/obj/effect/floor_decal/corner/red/border{ + dir = 8 + }, +/obj/structure/table/wooden_reinforced, +/turf/simulated/floor/wood, +/area/submap/CollapsedMine) +"ZV" = ( +/obj/effect/spider/stickyweb, +/obj/effect/spider/stickyweb, +/obj/effect/spider/spiderling, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/CollapsedMine) +"ZW" = ( +/obj/structure/table/steel_reinforced, +/obj/machinery/door/window/eastleft, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ZX" = ( +/obj/structure/bed/chair/sofa/beige{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/submap/CollapsedMine) +"ZY" = ( +/obj/structure/table/standard, +/obj/effect/spider/stickyweb/dark, +/turf/simulated/floor/tiled/eris/cafe, +/area/submap/CollapsedMine) + +(1,1,1) = {" +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +"} +(2,1,1) = {" +TW +TW +TW +TW +TW +TW +TW +Sp +Sp +Sp +Sp +TW +TW +TW +TW +TW +TW +TW +cz +TW +TW +TW +TV +TV +TV +TW +TW +TW +TV +TV +TV +TV +TV +TV +TW +TW +TW +TW +TW +TW +TW +Sp +Sp +Sp +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +"} +(3,1,1) = {" +TW +TW +TW +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TV +TV +TV +TV +TV +Uq +Uq +Uq +Uq +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +"} +(4,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +sC +Uq +tJ +Jj +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +TV +TV +TW +TW +TW +TW +TW +TW +TW +TW +"} +(5,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +ee +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +TV +TW +TW +TW +TW +TW +TW +TW +"} +(6,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +Sp +IZ +IZ +Jf +us +wF +sr +Sp +Sp +Sp +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +IZ +IZ +ek +Nn +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Uq +Uq +TV +TW +TW +TW +TW +TW +TW +"} +(7,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +IZ +IZ +CS +Zb +vp +ZI +ea +xZ +Sp +Sp +Sp +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +EQ +IZ +Sp +IZ +IZ +IZ +IZ +IZ +cb +XM +cg +FV +Cr +Ir +af +xh +IZ +IZ +Sp +Sp +Sp +Sp +Uq +Uq +TV +TW +TW +TW +TW +TW +"} +(8,1,1) = {" +TW +TW +TW +TW +Sp +Sp +IZ +IZ +Yv +hd +ea +ea +ea +gE +Mk +ea +Sp +Sp +Sp +Sp +LR +Ig +LR +ea +He +xB +ea +Ld +Mk +uC +gi +IZ +IZ +IZ +jO +Cv +ul +dt +Oy +WF +WF +Gs +Cr +vZ +WF +WF +Pk +IZ +Sp +Sp +Sp +Sp +Sp +Sp +TV +TW +TW +TW +TW +TW +"} +(9,1,1) = {" +TW +TW +TW +TW +Sp +Sp +IZ +gQ +MU +ea +vN +ea +ea +vN +ea +ea +HR +ea +Sp +Sp +LR +Ig +pR +ea +ea +ea +ea +ea +ea +ea +ea +Zb +Ko +qV +WF +xo +iF +dt +sA +ht +WF +NS +IZ +EO +Pg +fS +mv +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +TW +TW +TW +TW +"} +(10,1,1) = {" +TW +TW +TW +TW +Sp +Sp +IZ +IT +KE +ea +ea +ND +ea +ea +ea +Jm +ea +Sp +Sp +Sp +LR +Ig +LR +He +ea +JK +lg +GN +Np +ea +ea +YJ +vf +iP +WF +CR +NS +HP +Zq +qr +UF +Dh +up +Pg +jA +QT +qX +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +TW +TW +"} +(11,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +mU +KE +ea +ea +ea +gi +ZF +ey +Ov +Sp +Sp +IZ +IZ +IZ +IZ +dq +mH +IZ +IZ +IZ +IZ +IZ +He +ea +ea +QN +ng +Pg +dV +Dq +dt +NL +WF +Pg +NS +Cr +zy +JJ +Lf +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +TW +"} +(12,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +gJ +KE +ea +ea +ea +ST +IZ +IZ +Sp +Sp +IZ +IZ +sC +Sp +rG +rG +Sp +Sp +Sp +Sp +Sp +IZ +FR +pR +pR +IZ +Tu +WF +WF +NS +up +iU +bx +WF +jx +DI +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +"} +(13,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +mU +lt +ea +Yy +ea +Dm +IZ +Sp +Sp +Sp +Sp +ee +Jj +rG +rG +Sp +Sp +Sp +Sp +Sp +Sp +IZ +Ig +Ig +Ig +IZ +Gc +ET +kY +Jg +dt +WL +Hv +KX +LS +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +IZ +Sp +TW +"} +(14,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +gJ +KE +gE +ea +ip +IZ +Sp +Sp +Sp +lq +Sp +rG +rG +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +IZ +RM +LR +LR +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +IZ +IZ +IZ +TW +"} +(15,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +Pa +KE +ea +ea +ea +Jn +Sp +Sp +Sp +rG +rG +rG +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +IZ +LR +ea +ea +IZ +hf +ea +ea +OD +IZ +kI +kI +wL +tM +VL +Wy +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +IZ +rV +TW +"} +(16,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +Ap +qs +ea +tk +Tj +Sp +Sp +Sp +CH +rG +Sp +DP +rG +tR +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +YJ +ea +ea +IZ +VT +ea +ea +iB +IZ +Ky +Ky +Ai +ea +Wy +iq +IZ +IZ +IZ +ck +Sp +IZ +Sp +Uq +Sp +Jj +Uq +Uq +Uq +Uq +nq +TV +"} +(17,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +IZ +KE +vN +ae +IZ +IZ +Sp +Sp +rG +sC +Sp +Sp +Uq +Jj +MW +KV +HZ +MW +KV +Yh +IZ +LJ +ea +ea +ea +DX +ea +ea +ea +ea +Jm +ea +ea +ea +ea +mU +bf +bf +DX +ck +ck +iz +Rf +Uq +Uq +Uq +Uq +Uq +Uq +Uq +Uq +Uq +TW +"} +(18,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +IZ +KE +LR +zs +IZ +Sp +rG +rG +rG +Sp +Sp +Sp +sB +KV +KV +Ql +Iu +KV +zw +KV +KV +Md +ea +ea +ea +ea +ea +ea +ea +ea +ea +ea +ea +ea +ea +mU +bf +bf +ea +ck +ck +ck +iz +iz +Uq +Uq +Sp +Sp +Uq +Uq +IZ +IZ +TW +"} +(19,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +IZ +Nj +Ig +Sp +Sp +HV +rG +Sp +Sp +Sp +Sp +Sp +IZ +KV +zw +KV +KV +in +tU +Iz +Av +IZ +YJ +ea +ea +IZ +Qb +YE +YE +sm +IZ +Ne +Ne +Ne +ea +Us +TK +IZ +IZ +IZ +ck +ck +ck +ck +iz +Sp +Sp +Sp +Sp +IZ +IZ +IZ +TW +"} +(20,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +IZ +Jj +Sp +Sp +Sp +Sp +rG +Sp +dt +dt +dt +dt +dt +mM +NV +NV +KV +KV +QO +Iz +iT +Cr +ea +YJ +fp +IZ +yO +yO +yO +yO +IZ +kI +mU +mU +Vu +Nx +Wy +IZ +IZ +Sp +Sp +ay +pL +ay +Sp +Sp +Sp +Sp +Sp +Sp +IZ +Sp +TW +"} +(21,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +IZ +Sp +Sp +Sp +Sp +rG +tl +SM +dt +xz +Wx +ib +dt +mM +mM +LU +LW +KV +tU +Iz +VE +Cr +Ig +ea +ea +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +Cr +ZW +Cr +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +TW +"} +(22,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +IZ +Sp +Sp +Sp +IZ +IZ +IZ +aO +dt +zk +bQ +mM +qd +mM +UU +Oo +fT +KV +KV +KV +KV +bs +YJ +ea +ea +IZ +IZ +IX +IE +Om +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +ko +ko +IZ +JI +jo +AQ +Xs +IZ +Sp +Sp +Sp +Sp +Sp +Sp +TW +"} +(23,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +IZ +Sp +Sp +hh +IZ +oe +oe +fn +dt +Bt +OX +ZY +dt +IK +mM +NV +hb +KV +VW +KV +TH +iL +ea +ea +ea +IZ +WH +VL +ea +lS +dM +Ui +pb +pb +pb +MM +rR +yv +ea +ea +yw +Fz +ea +To +bi +IZ +Sp +Sp +Sp +Sp +Sp +Uq +TV +"} +(24,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +IZ +Sp +Sp +NI +IZ +FG +pT +oJ +dt +mz +OW +ZY +Cr +DR +mM +NV +KV +zw +KV +KV +fT +wf +ea +ea +wa +IZ +DF +bH +qc +vg +bs +Fz +nD +ea +ea +ea +hG +IZ +ea +AV +IZ +TB +xA +Py +JM +IZ +Sp +Sp +Sp +Sp +Sp +Uq +TV +"} +(25,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +IZ +Sp +Sp +WP +IZ +gY +pT +bR +dt +mz +zk +ZY +Cr +vj +mM +NV +LW +KV +KV +KV +VW +wf +ea +wa +wa +IZ +yJ +pb +pb +wz +Cr +Fz +ea +ea +ix +dC +hg +IZ +hI +hI +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Jj +TV +"} +(26,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +IZ +Sp +Sp +Uq +IZ +Ue +oJ +XY +dt +hs +zk +ZY +dt +Fg +mM +NV +VW +nf +zw +in +aW +IZ +ea +ea +ea +Po +ea +ea +ea +bi +dM +Fz +ea +kA +IZ +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +ee +Jj +Uq +Uq +TW +"} +(27,1,1) = {" +TW +TW +TW +Sp +Sp +UI +Sp +Sp +Sp +Jj +HL +IZ +QV +pT +pT +dt +jB +zk +UU +NV +mM +bQ +NV +LW +cX +KV +KV +KV +Cr +ea +ea +ea +GR +ea +ea +ea +bi +dM +Fz +ea +bi +yN +bI +lR +rG +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +tJ +Uq +Uq +Uq +TW +"} +(28,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Sp +WP +IZ +Ow +oJ +oJ +xR +zE +mM +Ke +so +mM +mM +Eq +LW +KV +tU +IA +yr +Cr +ea +ea +fp +IZ +ha +GM +GM +qI +Cr +IR +ea +bi +Pq +lR +rG +zY +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +sC +Uq +Uq +Uq +Uq +TV +"} +(29,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Jj +Sv +IZ +Ip +pT +Zs +dt +Zm +oV +VB +dt +mM +jz +NV +KV +Ix +tU +iK +iT +Cr +ea +ea +ea +IZ +Cr +Cr +Cr +Cr +IZ +IR +ea +ir +IZ +dt +dt +dt +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Jj +Uq +Uq +Uq +Uq +Uq +TV +"} +(30,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +IZ +KE +ea +Jj +IZ +IZ +aO +dt +dt +dt +dt +dt +dt +KV +KV +KV +zw +KV +tU +zZ +Xg +IZ +ea +ea +ea +Cr +FS +ZU +VH +wh +Cr +Fz +ea +HE +yN +ea +ea +ea +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +Uq +TV +"} +(31,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +KE +ea +rG +IZ +Sp +Jj +Sp +Sp +Sp +Sp +Sp +IZ +gh +gh +ki +Jl +jK +nf +KV +GV +IZ +ea +vp +ea +Cr +ml +py +ID +iN +Cr +Fz +ea +bi +Cr +OL +ea +Et +IZ +Sp +Sp +Sp +Sp +Sp +sC +sC +Uq +Uq +Uq +Uq +Uq +Jj +TV +"} +(32,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +gm +Uq +Uq +DP +rG +Uq +rG +Sp +Sp +Sp +Sp +IZ +IZ +GV +KV +nW +TR +VW +bu +IZ +IZ +ea +ea +nD +Cr +mk +JH +KV +iN +dM +Vg +ea +bi +IZ +dt +dt +dt +IZ +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +Uq +Uq +Uq +TV +"} +(33,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +vb +Jj +Sp +Sp +rG +Uq +Uq +rG +rG +Sp +Sp +Sp +IZ +IZ +wB +IZ +XR +rG +IZ +IZ +IZ +EC +ea +ea +wP +OJ +ig +ig +fd +Cr +Fz +ea +bi +yN +ea +Go +tu +IZ +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +Uq +Uq +Uq +TV +"} +(34,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +mf +Sp +Sp +Sp +sC +Uq +Sp +Sp +HL +Jj +tJ +Sp +Sp +Sp +rG +Gg +rG +DP +rz +Sp +IZ +Sp +ea +wa +IZ +IZ +IZ +IZ +IZ +IZ +Fz +ea +PS +Cr +Qg +ea +xq +IZ +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +Uq +Uq +TV +TV +"} +(35,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +Sp +Sp +zs +IZ +pe +Uq +Sp +Sp +Sp +Sp +rG +rG +rG +rG +Sp +Sp +DP +DP +ee +Sp +IZ +VP +lR +vV +IZ +Sp +Sp +Sp +IZ +IZ +zA +ea +Gu +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +IZ +eH +Uq +qe +Jn +Jn +jt +Uq +TV +TW +"} +(36,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +Sp +IZ +dI +rl +WP +IZ +Sp +rG +rG +Sp +Sp +IZ +IZ +IZ +IZ +rG +Uq +rG +Sp +Sp +Sp +Sp +IZ +lR +WG +lR +IZ +Sp +Sp +Sp +IZ +IZ +WY +vd +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +Uq +Uq +Uq +TV +TW +"} +(37,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +IZ +Sf +ea +WP +IZ +IZ +Sp +rG +lq +IZ +Sp +IQ +uu +Sq +jU +Hs +Uq +aJ +Sp +Sp +Sp +mH +jf +NC +gD +IZ +Sp +Sp +IZ +IZ +IZ +bl +pm +Sa +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Jj +Uq +Uq +Uq +Uq +Uq +Uq +Uq +TV +TW +"} +(38,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +IZ +rE +ea +Go +ea +Vf +IZ +IZ +Sp +ee +tl +Sp +Qq +as +cH +zF +Qq +rG +hB +rG +rG +Sp +mH +Sp +ee +Sp +Sp +Sp +Sp +Sp +IZ +WC +LQ +JA +lR +Je +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +ee +Uq +Uq +nq +Uq +Uq +Uq +Uq +TV +TW +"} +(39,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +XT +ea +ea +vN +wl +ea +Nr +IZ +IZ +Sp +rG +qH +AO +Jn +BI +lo +rG +rG +IZ +Uq +Uq +rG +rg +Sp +Sp +Sp +Sp +uL +Sp +Sp +Sp +wa +Ft +lR +ea +wa +fc +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Uq +VX +Uq +nq +nq +Uq +Uq +TV +TW +TW +"} +(40,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +By +ea +oj +ZX +ZX +fP +ea +hr +IZ +IZ +IZ +lR +lR +nD +ea +rG +wa +Sp +IZ +Sp +Sp +DP +IM +Sp +Sp +hh +Sp +rG +ww +Sp +Sp +CB +FH +ea +rm +ZE +cB +eu +IZ +IZ +Sp +Sp +Sp +Jn +Uq +HL +Uq +Uq +nq +Uq +TV +TW +TW +TW +"} +(41,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +Yg +ea +ny +Eo +uR +BH +ea +ea +xg +IZ +Sp +Sp +YH +lR +lR +ea +lR +ii +Sp +Sp +Sp +rG +Sp +Sp +jM +rG +rG +rG +rG +rG +lR +vN +LK +Ry +BL +ea +vN +ro +IZ +IZ +Sp +Sp +Sp +pe +Uq +Uq +Uq +Uq +nq +nq +TW +TW +TW +TW +"} +(42,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +AP +ea +ea +Vj +rY +ea +VG +Go +Qr +IZ +Sp +Sp +wa +Sp +lR +wa +bC +Sp +Sp +Sp +Sp +Sp +Sp +rG +rG +rG +rG +Sp +ZV +rG +rG +dc +jG +IZ +uU +bn +lR +kO +IZ +IZ +Sp +Sp +Sp +SP +bK +Uq +Uq +Uq +Uq +nq +TW +TW +TW +TW +"} +(43,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +MT +ea +ea +Vj +Vj +ea +ea +ea +pi +IZ +IZ +Sp +yc +Sp +Sp +Gb +Sp +Sp +IZ +Sp +Sp +Sp +sC +Jj +rG +rG +pe +Sp +Sp +Sp +vv +XW +lc +er +hx +lR +lR +Al +IZ +IZ +Sp +Sp +Sp +Hq +Uq +Uq +Uq +Uq +Uq +nq +WO +TW +TW +TW +"} +(44,1,1) = {" +TW +TW +TW +Sp +Sp +IZ +HA +wl +An +hy +Ac +CL +ea +ea +ea +kv +IZ +IZ +KB +wc +IZ +bJ +Sp +Sp +IZ +IZ +IZ +IZ +IZ +rG +Sp +rG +Sp +Sp +IZ +Sp +rG +ee +lR +ea +bn +lR +hV +IZ +IZ +IZ +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +nq +nq +TW +TW +TW +TW +"} +(45,1,1) = {" +TW +TW +Sp +Sp +Sp +IZ +eQ +ea +HW +yY +yY +ct +ea +ea +ea +ea +BV +Sp +lo +Jj +Uq +Uq +az +Sp +sB +Sp +ZR +lo +wa +lR +lR +rG +Sp +IZ +IZ +IZ +Sp +eg +tD +Ed +lR +hg +IZ +IZ +IZ +Sp +Sp +Sp +Sp +sC +Uq +Uq +Uq +Uq +Uq +TV +TW +TW +TW +TW +"} +(46,1,1) = {" +TW +TW +Sp +Sp +Sp +IZ +vw +ea +Go +ea +wl +vN +ea +ea +bp +ea +rl +Sp +ea +ea +Uq +db +Uq +Uq +ea +Tc +ea +ea +ea +wa +wa +sR +IZ +IZ +IZ +IZ +IZ +sI +LM +Un +iW +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +Io +TV +TW +TW +TW +TW +"} +(47,1,1) = {" +TW +TW +Sp +Sp +Sp +IZ +IZ +fm +WI +aD +aD +wi +aD +Bq +aD +uw +aD +Is +Sp +Sp +wi +Uq +HL +Sp +Sp +Sp +ee +Bc +aD +lR +Sp +IZ +IZ +Sp +Sp +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +hN +TV +TW +TW +TW +TW +"} +(48,1,1) = {" +TW +TW +Sp +Sp +Sp +Sp +IZ +IZ +IZ +px +IZ +IZ +Wz +hF +IZ +IZ +IZ +PK +IZ +IZ +IZ +xu +IZ +IZ +IZ +PK +IZ +IZ +IZ +PK +IZ +IZ +Sp +Sp +Sp +Sp +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +TV +TW +TW +TW +TW +"} +(49,1,1) = {" +TW +TW +Sp +Sp +Sp +Sp +IZ +UM +pD +Gv +dt +EE +Jv +Qj +dt +AX +IV +Gv +dt +AX +IV +fG +dt +Ba +nu +Hd +dt +ej +xS +Gv +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +sC +Uq +Uq +Uq +Uq +TV +TV +TW +TW +TW +"} +(50,1,1) = {" +TW +TW +Sp +Sp +Sp +Sp +IZ +zM +IV +Gv +dt +jJ +IV +ei +dt +zM +mx +Gv +mH +Gt +IV +Gv +dt +Gt +IV +Gv +dt +iw +IV +Gv +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +Uq +Uq +Uq +TV +Uq +TV +TW +TW +"} +(51,1,1) = {" +TW +TW +Sp +Sp +Sp +Sp +IZ +II +wm +Hd +dt +xM +wm +Qj +dt +YG +wm +Gv +dt +YG +wm +Hd +dt +Bh +wm +Gv +dt +YG +wm +Gv +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +uL +nq +nq +Uq +Uq +Uq +Uq +Jj +TV +TW +TW +"} +(52,1,1) = {" +TW +TW +Sp +Sp +Sp +Sp +IZ +IZ +IZ +PK +dt +IZ +IZ +hF +dt +IZ +IZ +PK +dt +IZ +IZ +PK +dt +IZ +IZ +PK +dt +IZ +IZ +PK +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +nq +nq +nq +Uq +Uq +Uq +Uq +Uq +TV +TW +TW +"} +(53,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +hK +Gv +Gv +dt +XG +Gv +Gv +dt +XG +Gv +Gv +dt +Do +mh +Qj +dt +XG +wR +Gv +dt +XG +Gv +Gv +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +IZ +Sp +Uq +Jj +nq +nq +nq +Uq +Uq +Uq +Uq +TV +TW +TW +TW +"} +(54,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +Ri +PB +Gv +dt +Ri +PB +Gv +dt +Ri +PB +Hd +dt +qD +PB +Gv +dt +SA +PB +Gv +dt +Ri +PB +Gv +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +iu +Rf +ee +Jj +nq +nq +WO +nq +nq +Uq +Uq +TV +TW +TW +TW +TW +"} +(55,1,1) = {" +TW +TW +TW +Sp +Sp +Sp +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +IZ +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Uq +Uq +nq +nq +nq +nq +nq +nq +nq +Uq +Uq +TV +TW +TW +TW +TW +TW +"} +(56,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +go +go +Uq +Uq +Uq +Uq +Uq +vU +iE +Uq +Uq +Uq +TV +TW +TW +TW +TW +TW +TW +"} +(57,1,1) = {" +TW +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +ch +Uq +sC +Sp +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +TW +TV +Uq +sC +sC +Uq +Uq +Uq +Uq +Uq +Jj +TV +TV +Uq +Uq +TV +TV +TV +TW +TW +TW +TW +TW +TW +TW +"} +(58,1,1) = {" +TW +TW +TW +TW +TW +Sp +Sp +Sp +Sp +Sp +Sp +Sp +TW +Sp +Sp +Sp +Sp +Sp +cz +TW +TV +Jj +Uq +Uq +Uq +TV +TW +TW +Sp +Sp +Sp +Sp +TW +Sp +TW +TW +TW +TV +TV +TV +Uq +Uq +Uq +Uq +nq +TV +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +"} +(59,1,1) = {" +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TV +TV +TV +TV +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TV +TV +TV +TV +TV +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +"} +(60,1,1) = {" +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +TW +"} diff --git a/maps/submaps/surface_submaps/wilderness/wilderness.dm b/maps/submaps/surface_submaps/wilderness/wilderness.dm index 7fc09affe74..dec28117825 100644 --- a/maps/submaps/surface_submaps/wilderness/wilderness.dm +++ b/maps/submaps/surface_submaps/wilderness/wilderness.dm @@ -42,6 +42,7 @@ #include "borglab.dmm" #include "chasm.dmm" #include "deathden.dmm" +#include "collapsedmine.dmm" #endif @@ -354,3 +355,10 @@ desc = "A covert gene research lab guarded by combat drones." mappath = 'maps/submaps/surface_submaps/wilderness/Research1.dmm' cost = 30 + +/datum/map_template/surface/wilderness/deep/CollapsedMine + name = "Collapsed Mine" + desc = "A Grayson expeditionary base, filled with spiders and drone defenders." + mappath = 'maps/submaps/surface_submaps/wilderness/collapsedmine.dmm' + cost = 45 + diff --git a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm index c508985b013..f3dd1c01048 100644 --- a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm +++ b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm @@ -187,3 +187,7 @@ name = "POI - Gene Lab" ambience = AMBIENCE_HIGHSEC requires_power = FALSE + +/area/submap/CollapsedMine + name = "POI - Collapsed Mine" + ambience = AMBIENCE_FOREBODING diff --git a/maps/submaps/surface_submaps/wilderness/xenohive.dmm b/maps/submaps/surface_submaps/wilderness/xenohive.dmm index 481d041074b..e917156e9b8 100644 --- a/maps/submaps/surface_submaps/wilderness/xenohive.dmm +++ b/maps/submaps/surface_submaps/wilderness/xenohive.dmm @@ -1,120 +1,1275 @@ -"av" = (/obj/structure/table/steel_reinforced,/obj/structure/salvageable/personal,/obj/effect/alien/weeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"aS" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds/node,/obj/effect/alien/weeds,/turf/simulated/floor,/area/submap/XenoHive) -"bq" = (/obj/effect/alien/weeds,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/engineering,/obj/random/plushie,/obj/item/organ/internal/augment/armmounted,/obj/item/organ/internal/intestine,/obj/structure/safe,/obj/random/projectile/scrapped_laser,/obj/random/contraband,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"bO" = (/obj/effect/alien/weeds,/obj/structure/simple_door/resin,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"co" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"dk" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds,/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"dm" = (/obj/effect/alien/weeds,/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"dn" = (/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"eM" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/outdoors/dirt,/area/template_noop) -"fw" = (/turf/template_noop,/area/submap/XenoHive) -"fG" = (/obj/effect/alien/weeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"fW" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt,/area/submap/XenoHive) -"gl" = (/obj/effect/alien/weeds,/obj/random/toolbox/anom,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"gO" = (/obj/effect/alien/weeds,/obj/item/organ/internal/heart,/obj/item/organ/internal/kidneys/vox,/obj/structure/safe,/obj/random/multiple/gun/projectile/shotgun,/obj/random/contraband/anom,/turf/simulated/floor,/area/submap/XenoHive) -"gS" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/ignore_mapgen,/area/template_noop) -"hx" = (/obj/effect/alien/weeds,/obj/machinery/telecomms/broadcaster,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/XenoHive) -"il" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/corpse/hedberg/merc,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"im" = (/obj/effect/alien/weeds,/obj/structure/table/rack,/obj/item/clothing/suit/armor/pcarrier/tan/tactical,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"iF" = (/obj/structure/bed/chair{dir = 8},/obj/effect/alien/weeds,/obj/effect/spawner/gibs/human,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"iJ" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds,/obj/machinery/light/small/emergency/flicker{dir = 1},/obj/item/ore/magmellite,/turf/simulated/floor,/area/submap/XenoHive) -"jY" = (/mob/living/simple_mob/animal/space/alien/queen/empress,/obj/effect/alien/weeds,/turf/simulated/floor,/area/submap/XenoHive) -"kl" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"lb" = (/turf/template_noop,/area/template_noop) -"mE" = (/obj/effect/alien/weeds,/obj/random/junk,/turf/simulated/floor,/area/submap/XenoHive) -"nd" = (/obj/structure/salvageable/server,/obj/effect/alien/weeds,/obj/effect/alien/weeds,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/XenoHive) -"oo" = (/mob/living/simple_mob/animal/space/alien/drone,/obj/effect/alien/weeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"ps" = (/obj/effect/alien/weeds,/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"qz" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds,/turf/simulated/floor,/area/submap/XenoHive) -"qI" = (/obj/effect/alien/weeds/node,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor,/area/submap/XenoHive) -"rL" = (/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt,/area/submap/XenoHive) -"sp" = (/obj/effect/alien/weeds/node,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"sy" = (/turf/simulated/mineral/ignore_mapgen,/area/template_noop) -"sX" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor,/area/submap/XenoHive) -"tz" = (/obj/effect/alien/weeds,/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"tA" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/corpse/hedberg,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"uJ" = (/obj/structure/sign/biohazard,/turf/simulated/wall/skipjack,/area/submap/XenoHive) -"va" = (/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"vu" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"wH" = (/obj/effect/alien/weeds,/obj/structure/loot_pile/mecha/durand,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"xB" = (/turf/simulated/wall/skipjack,/area/submap/XenoHive) -"xQ" = (/obj/effect/decal/cleanable/dirt,/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"yb" = (/obj/effect/alien/weeds,/obj/effect/landmark/corpse/hedberg/merc,/turf/simulated/floor,/area/submap/XenoHive) -"yx" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds,/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt,/area/submap/XenoHive) -"yS" = (/obj/structure/table/steel_reinforced,/obj/effect/alien/weeds,/obj/item/toy/plushie/face_hugger,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/XenoHive) -"zU" = (/obj/structure/salvageable/autolathe,/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"zV" = (/obj/effect/alien/weeds,/obj/item/ore/magmellite,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Ak" = (/obj/effect/alien/weeds,/obj/item/ore/magmellite,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"AA" = (/obj/effect/alien/resin/wall,/obj/effect/alien/weeds,/turf/simulated/mineral/ignore_mapgen,/area/submap/XenoHive) -"AB" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/ignore_mapgen,/area/submap/XenoHive) -"BD" = (/obj/effect/alien/resin/membrane,/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Cb" = (/obj/structure/bed/chair,/obj/effect/alien/weeds,/obj/effect/spawner/gibs/human,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"Ce" = (/obj/effect/alien/weeds,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/item/organ/internal/eyes/replicant,/obj/structure/safe,/obj/random/multiple/gun/projectile/rifle,/obj/random/contraband,/turf/simulated/floor,/area/submap/XenoHive) -"CR" = (/obj/effect/alien/resin/wall,/turf/simulated/floor/outdoors/dirt,/area/template_noop) -"De" = (/obj/effect/alien/weeds,/obj/effect/spawner/gibs/human,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Dh" = (/obj/effect/alien/weeds,/obj/random/medical/anom,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"DN" = (/obj/effect/alien/weeds,/obj/random/maintenance/anom,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Et" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/XenoHive) -"FE" = (/mob/living/simple_mob/animal/space/alien/drone,/obj/effect/alien/weeds,/turf/simulated/floor,/area/submap/XenoHive) -"Gw" = (/obj/structure/table,/obj/effect/alien/weeds,/obj/item/stack/material/phoron{amount = 10},/turf/simulated/floor,/area/submap/XenoHive) -"Gy" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"GN" = (/obj/effect/alien/weeds,/obj/effect/alien/resin/membrane,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Hr" = (/turf/simulated/floor/outdoors/dirt,/area/template_noop) -"Hu" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/blood/skathari,/turf/simulated/floor,/area/submap/XenoHive) -"Hx" = (/obj/item/portable_destructive_analyzer,/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Hz" = (/obj/effect/alien/weeds,/obj/structure/simple_door/resin,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"HI" = (/obj/effect/alien/weeds,/obj/structure/prop/blackbox/quarantined_shuttle,/turf/simulated/floor/tiled/techfloor/grid,/area/submap/XenoHive) -"HJ" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"HO" = (/obj/structure/table,/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/item/storage/backpack/holding,/turf/simulated/floor,/area/submap/XenoHive) -"Ir" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/floor,/area/submap/XenoHive) -"Is" = (/obj/effect/alien/weeds,/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"IY" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"Jj" = (/obj/effect/alien/weeds,/obj/item/stack/material/phoron{amount = 10},/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"JV" = (/obj/effect/alien/weeds,/obj/structure/simple_door/resin,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"LB" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/XenoHive) -"Mx" = (/obj/machinery/door/airlock/vault,/turf/simulated/floor/tiled/techfloor,/area/submap/XenoHive) -"MJ" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/outdoors/dirt,/area/submap/XenoHive) -"MZ" = (/obj/effect/alien/weeds,/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Or" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"Pe" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds,/obj/machinery/telecomms/receiver,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"Pq" = (/obj/structure/simple_door/resin,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Pv" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"PX" = (/obj/effect/decal/cleanable/dirt,/obj/structure/loot_pile/mecha/gygax/dark/adv,/turf/template_noop,/area/submap/XenoHive) -"QC" = (/obj/effect/alien/weeds,/obj/item/organ/internal/intestine/xeno,/obj/structure/safe,/obj/random/multiple/gun/projectile/handgun,/obj/random/contraband,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"QG" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds,/turf/simulated/floor,/area/submap/XenoHive) -"Rr" = (/obj/structure/noticeboard/anomaly,/turf/simulated/wall/skipjack,/area/submap/XenoHive) -"Sl" = (/obj/structure/salvageable/bliss,/obj/effect/alien/weeds,/turf/simulated/floor,/area/submap/XenoHive) -"SO" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/item/ore/magmellite,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"Tb" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"Tq" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Tv" = (/mob/living/simple_mob/animal/space/alien,/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/floor/outdoors/rocks{outdoors = 0},/area/submap/XenoHive) -"Vg" = (/obj/effect/alien/weeds,/obj/structure/prop/transmitter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/XenoHive) -"Vj" = (/turf/simulated/floor/outdoors/dirt,/area/submap/XenoHive) -"Vu" = (/obj/effect/alien/weeds/node,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"VA" = (/obj/effect/alien/weeds/node,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"WD" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"WE" = (/obj/effect/alien/weeds,/obj/structure/mopbucket,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Xa" = (/obj/effect/alien/weeds,/obj/structure/prop/nest{creature_types = list(/mob/living/simple_mob/animal/space/alien/drone); desc = "An underground nest of Skathari."; icon = 'icons/mob/alien.dmi'; icon_state = "nest"; interaction_message = "You feel like you shouldn't be sticking your nose into this thing."; name = "skathari nest"; total_creature_max = 10},/turf/simulated/floor,/area/submap/XenoHive) -"Xy" = (/obj/structure/table/steel_reinforced,/obj/effect/alien/weeds,/obj/machinery/light/small/emergency/flicker{dir = 8},/obj/item/reagent_containers/food/snacks/truffle/random,/turf/simulated/floor,/area/submap/XenoHive) -"YG" = (/obj/effect/alien/weeds,/obj/effect/landmark/corpse/hedberg/merc,/turf/simulated/floor/tiled/steel_dirty,/area/submap/XenoHive) -"YL" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/corpse/sifguard,/turf/simulated/floor/outdoors/dirt,/area/submap/XenoHive) -"Zc" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) -"Zx" = (/obj/effect/alien/weeds,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/landmark/corpse/hedberg,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/XenoHive) +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ct" = ( +/obj/structure/girder/reinforced, +/obj/item/stack/material/steel, +/obj/item/stack/material/steel, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"cJ" = ( +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"cP" = ( +/obj/machinery/optable, +/obj/effect/decal/cleanable/blood, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"dG" = ( +/obj/effect/floor_decal/rust, +/obj/structure/loot_pile/mecha/gygax/dark/adv, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"ec" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/mob/living/simple_mob/animal/space/alien/drone, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"ee" = ( +/obj/item/material/shard, +/obj/structure/grille/broken, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/XenoHive) +"eB" = ( +/obj/effect/alien/weeds, +/obj/effect/landmark/corpse/hedberg, +/obj/random/maintenance/security, +/obj/random/projectile/sec, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"eY" = ( +/obj/effect/alien/weeds, +/obj/structure/simple_door/resin, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"fz" = ( +/obj/effect/alien/weeds, +/obj/structure/loot_pile/mecha/durand, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"fC" = ( +/obj/structure/simple_door/resin, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"fM" = ( +/turf/simulated/floor/outdoors/dirt, +/area/submap/XenoHive) +"fT" = ( +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"fX" = ( +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"go" = ( +/turf/simulated/floor/outdoors/dirt, +/area/template_noop) +"gu" = ( +/obj/item/bodybag, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"hL" = ( +/obj/effect/alien/weeds, +/obj/structure/loot_pile/maint/technical, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"hQ" = ( +/obj/structure/salvageable/bliss, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"iv" = ( +/obj/random/junk, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"jr" = ( +/obj/machinery/light/small, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"jK" = ( +/obj/effect/floor_decal/milspec/box, +/obj/machinery/telecomms/receiver, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"kg" = ( +/obj/effect/alien/weeds, +/obj/item/ore/magmellite, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"km" = ( +/obj/effect/alien/weeds, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"kK" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/alien/weeds, +/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"lb" = ( +/obj/effect/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"lD" = ( +/mob/living/simple_mob/animal/space/alien/queen/empress, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"lH" = ( +/obj/effect/alien/resin/wall, +/obj/effect/alien/resin/wall, +/turf/simulated/wall/r_wall, +/area/submap/XenoHive) +"mf" = ( +/obj/effect/alien/weeds, +/mob/living/simple_mob/animal/space/alien/drone, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"mV" = ( +/obj/structure/salvageable/autolathe, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"mW" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/XenoHive) +"nd" = ( +/obj/effect/landmark/corpse/hedberg/merc, +/obj/random/maintenance/security, +/obj/random/contraband, +/obj/random/multiple/gun/projectile/rifle, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"nG" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"nK" = ( +/obj/effect/alien/weeds, +/obj/structure/simple_door/resin, +/obj/effect/decal/cleanable/blood/drip, +/turf/space, +/area/submap/XenoHive) +"nV" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"oC" = ( +/obj/machinery/light/small, +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"oY" = ( +/obj/effect/landmark/corpse/sifguard, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"pk" = ( +/obj/machinery/floodlight, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"qe" = ( +/obj/structure/sign/warning/secure_area, +/turf/simulated/wall/r_wall, +/area/submap/XenoHive) +"rg" = ( +/obj/structure/girder/displaced, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"rp" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/submap/XenoHive) +"rB" = ( +/mob/living/simple_mob/animal/space/alien/drone, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"rW" = ( +/obj/effect/alien/weeds, +/obj/effect/landmark/corpse/hedberg, +/obj/random/maintenance/security, +/obj/random/projectile/sec, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"tS" = ( +/obj/structure/table/steel_reinforced, +/obj/random/maintenance/anom, +/obj/structure/noticeboard/anomaly, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"ut" = ( +/obj/effect/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"uH" = ( +/obj/effect/alien/weeds, +/obj/structure/table, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"uI" = ( +/obj/structure/salvageable/server, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"vG" = ( +/obj/machinery/door/airlock/highsecurity, +/turf/simulated/floor/tiled/dark, +/area/submap/XenoHive) +"vU" = ( +/obj/item/clothing/suit/armor/pcarrier/tan/tactical, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"wT" = ( +/obj/structure/table/steel_reinforced, +/obj/structure/salvageable/personal, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"ym" = ( +/obj/effect/alien/weeds, +/obj/effect/landmark/corpse/hedberg, +/obj/random/maintenance/security, +/obj/random/projectile/scrapped_shotgun, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"yq" = ( +/obj/effect/alien/weeds, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"yE" = ( +/obj/structure/simple_door/resin, +/obj/effect/alien/weeds, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"AC" = ( +/obj/effect/alien/resin/wall, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"AK" = ( +/obj/structure/table/steel_reinforced, +/obj/item/storage/firstaid/surgery/simple, +/obj/item/autopsy_scanner, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Bf" = ( +/mob/living/simple_mob/animal/space/alien/drone, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"Bk" = ( +/obj/structure/bed/chair/office/dark{ + dir = 8 + }, +/obj/structure/loot_pile/surface/bones, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Bv" = ( +/obj/random/obstruction, +/turf/simulated/floor/outdoors/dirt, +/area/submap/XenoHive) +"BQ" = ( +/obj/structure/prop/blackbox/quarantined_shuttle, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"BT" = ( +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Cx" = ( +/obj/effect/alien/weeds, +/obj/structure/table/steel_reinforced, +/obj/fiftyspawner/phoron, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Cy" = ( +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"CF" = ( +/obj/effect/alien/weeds, +/obj/effect/alien/weeds, +/obj/structure/simple_door/resin, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"El" = ( +/obj/effect/alien/weeds, +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Fc" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"FQ" = ( +/turf/simulated/wall/skipjack, +/area/submap/XenoHive) +"Gt" = ( +/obj/structure/grille, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/XenoHive) +"GO" = ( +/obj/structure/bed/chair/office/dark{ + dir = 1 + }, +/obj/structure/loot_pile/surface/bones, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"GV" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/alien/weeds, +/obj/item/reagent_containers/food/snacks/truffle/random, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Hb" = ( +/obj/structure/safe, +/obj/item/organ/internal/augment/armmounted, +/obj/item/organ/internal/kidneys/vox, +/obj/item/organ/internal/eyes/replicant, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Hg" = ( +/obj/effect/alien/weeds, +/obj/effect/landmark/corpse/hedberg/merc, +/obj/random/contraband, +/obj/random/maintenance/security, +/obj/random/projectile/scrapped_bulldog, +/obj/effect/decal/cleanable/blood, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"Ii" = ( +/obj/structure/table/rack, +/obj/random/medical/anom, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"Iu" = ( +/obj/effect/floor_decal/milspec/box, +/obj/machinery/telecomms/broadcaster, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"Jn" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/item/storage/backpack/holding, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"JL" = ( +/obj/effect/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"KL" = ( +/obj/effect/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"KM" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Lc" = ( +/obj/effect/floor_decal/milspec/box, +/obj/structure/prop/transmitter, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"Lg" = ( +/obj/effect/alien/weeds, +/obj/item/ore/magmellite, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"Ln" = ( +/obj/effect/alien/resin/wall, +/turf/simulated/wall/r_wall, +/area/submap/XenoHive) +"Lq" = ( +/obj/effect/alien/resin/wall, +/turf/simulated/wall/skipjack, +/area/submap/XenoHive) +"LD" = ( +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"LR" = ( +/obj/random/toolbox/anom, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"LX" = ( +/obj/structure/foamedmetal, +/turf/simulated/floor/outdoors/dirt, +/area/submap/XenoHive) +"Mt" = ( +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"MN" = ( +/obj/effect/alien/weeds, +/mob/living/simple_mob/animal/space/alien, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"Nw" = ( +/mob/living/simple_mob/animal/space/alien, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"Nz" = ( +/obj/effect/floor_decal/rust, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"NK" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Oc" = ( +/obj/structure/table/rack/shelf, +/obj/random/tech_supply, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Ot" = ( +/obj/effect/alien/weeds, +/obj/effect/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Ov" = ( +/obj/structure/table/steel_reinforced, +/obj/item/portable_destructive_analyzer, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Pd" = ( +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Qn" = ( +/obj/effect/alien/weeds, +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"QO" = ( +/obj/structure/table/steel_reinforced, +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/random/maintenance/medical, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Ri" = ( +/obj/effect/spawner/gibs/human, +/obj/structure/grille/broken, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/XenoHive) +"Rj" = ( +/turf/simulated/wall/r_wall, +/area/submap/XenoHive) +"Rp" = ( +/obj/effect/alien/resin/membrane, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"RA" = ( +/obj/effect/decal/cleanable/blood/drip, +/turf/simulated/floor/outdoors/dirt, +/area/submap/XenoHive) +"RG" = ( +/obj/structure/table/rack/shelf, +/obj/random/maintenance/engineering, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"SB" = ( +/obj/effect/alien/weeds, +/mob/living/simple_mob/animal/space/alien/queen/empress, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"ST" = ( +/obj/structure/salvageable/server, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/milspec/raised, +/area/submap/XenoHive) +"SU" = ( +/mob/living/simple_mob/animal/space/alien, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"TZ" = ( +/obj/effect/alien/weeds, +/obj/structure/loot_pile/surface/bones, +/turf/simulated/floor/tiled/techfloor/grid, +/area/submap/XenoHive) +"UJ" = ( +/obj/machinery/light/small/emergency{ + dir = 8 + }, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"UR" = ( +/turf/template_noop, +/area/template_noop) +"UV" = ( +/obj/effect/landmark/corpse/hedberg, +/obj/structure/bed/roller, +/obj/effect/decal/cleanable/blood, +/obj/random/projectile/scrapped_gun, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"VG" = ( +/obj/item/organ/internal/intestine, +/obj/item/organ/internal/kidneys, +/obj/structure/closet/crate/freezer, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"VK" = ( +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"VS" = ( +/obj/structure/table/rack/shelf, +/obj/random/powercell, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Wi" = ( +/obj/effect/alien/weeds, +/obj/item/ore/magmellite, +/mob/living/simple_mob/animal/space/alien, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"WG" = ( +/obj/effect/alien/weeds, +/obj/item/ore/magmellite, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"WR" = ( +/obj/effect/alien/weeds, +/mob/living/simple_mob/animal/space/alien, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"WU" = ( +/obj/effect/alien/weeds, +/obj/structure/bed/nest, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Xc" = ( +/obj/effect/alien/weeds, +/obj/structure/bed/chair/office/dark{ + dir = 4 + }, +/turf/simulated/floor/tiled/milspec/dark, +/area/submap/XenoHive) +"Xr" = ( +/obj/structure/simple_door/resin, +/obj/effect/alien/weeds, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"Xs" = ( +/obj/effect/alien/weeds, +/obj/structure/loot_pile/surface/bones, +/turf/simulated/floor/tiled/white, +/area/submap/XenoHive) +"XW" = ( +/obj/effect/alien/weeds, +/turf/simulated/floor/plating, +/area/submap/XenoHive) +"Yp" = ( +/obj/effect/alien/weeds, +/obj/effect/spawner/gibs/human, +/turf/simulated/floor/tiled/techfloor, +/area/submap/XenoHive) +"Yt" = ( +/mob/living/simple_mob/animal/space/alien/drone, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) +"ZA" = ( +/obj/effect/decal/cleanable/vomit, +/turf/simulated/floor/tiled/milspec, +/area/submap/XenoHive) (1,1,1) = {" -lblblbsysysysysysylblblbHrsyeMlblblblbHrlblbsysylb -lbsysyABABABABABABsysysyrLABrLHrsysysyrLrLABsysylb -lbsyxBxBIsvuvaimRrxBxBEtdndndnEtEtEtEtEtyxrLMJfwlb -syABxBHIndqzGwaviJgOxBABEtdkEtEtABEtABEtEtEtVjfwlb -syABTvfGooqItAiFjYIrbqABEtEtEtEtPvdnDhMZABEtEtEtlb -syABHxSlilhxVgPeYGIYQCABEtEtABwHdnDeVuklHzPvABEtsy -syABdmJjsXfGTbmEFECexBABABABWEklZcZxklzVBDxQxQEtsy -syABpsHOTbCbLBHuABABxBtzcoJVdnklPvdnABEtEtxQspzVsy -syABxBySSOybzUuJxBxBxBWDOrBDDNABABEtEtEtEtABPqPqCR -lbsyxBXyfGaSLBMxGyGNHJVAAkAAABEtEtEtEtEtEtEtTqfWeM -lbsyxBABABXafGMxQGbOklABABABEtEttzdnPvglEtEtABYLlb -lbsyEtEtxBxBxBxBxBABABABEtEtEtdnPvdnABrLrLEtEtPXlb -lblblbsysysysysysysysysylblbMJrLsygSsysyMJVjEtEtlb -lblblblblblbsysysysylblblblblbsysysysysysylblbsylb -lblblblblblblblblblblblblblblblblblblblblblblblblb +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +"} +(2,1,1) = {" +UR +UR +UR +rp +rp +rp +rp +rp +rp +rp +rp +rp +UR +UR +rp +rp +rp +rp +rp +rp +rp +UR +UR +UR +UR +"} +(3,1,1) = {" +UR +UR +rp +rp +Rj +Rj +Rj +Rj +Rj +Rj +Rj +Rj +rp +rp +rp +Rj +Rj +Rj +Ln +Ln +rp +rp +rp +UR +UR +"} +(4,1,1) = {" +UR +rp +rp +Rj +Rj +Lq +Lq +Lq +Lq +Lq +Lq +Lq +Rj +rp +Rj +Rj +AK +cP +uH +Ln +Ln +rp +rp +UR +UR +"} +(5,1,1) = {" +UR +rp +rp +Rj +Lq +Lq +ut +ut +ut +ut +ut +Lq +Lq +Ln +Ln +VG +VK +Pd +lb +Hb +Ln +Ln +rp +rp +UR +"} +(6,1,1) = {" +UR +rp +rp +Rj +Lq +ut +Yp +Cy +lD +Cy +SB +ut +Lq +fz +Ln +nV +Ot +Pd +mf +Pd +lb +Ln +rp +rp +UR +"} +(7,1,1) = {" +UR +rp +rp +Rj +Lq +Cy +MN +Iu +Lc +jK +Hg +Cy +Lq +XW +WU +lb +mf +Pd +Pd +Pd +lb +Ln +rp +rp +UR +"} +(8,1,1) = {" +UR +rp +rp +Rj +Lq +ut +Cy +Cy +cJ +Bf +Cy +ut +Lq +XW +XW +Pd +Pd +Pd +lb +WG +Xs +Ln +rp +rp +UR +"} +(9,1,1) = {" +UR +rp +rp +Rj +FQ +FQ +mW +ee +Ri +TZ +Gt +Rp +Lq +XW +JL +fT +Ln +km +KL +eB +AC +Ln +rp +rp +UR +"} +(10,1,1) = {" +UR +rp +rp +Rj +FQ +Jn +QO +QO +KM +Pd +Qn +GV +Lq +XW +Lg +BT +BT +yq +BT +WU +BT +Ln +rp +rp +UR +"} +(11,1,1) = {" +UR +rp +rp +Rj +FQ +tS +rB +nd +VK +VK +Pd +Pd +yE +XW +JL +El +BT +WU +Xc +BT +Ov +Rj +rp +rp +UR +"} +(12,1,1) = {" +UR +rp +rp +Rj +FQ +wT +GO +VK +lb +Pd +Pd +lb +Lq +XW +Ln +El +BT +Cx +kK +iv +oC +Rj +rp +rp +UR +"} +(13,1,1) = {" +UR +rp +rp +Rj +Rj +FQ +BQ +Pd +Pd +ym +lb +Lq +Lq +XW +lH +hL +BT +BT +Mt +Mt +mV +Rj +rp +fM +UR +"} +(14,1,1) = {" +UR +rp +rp +Rj +Rj +Rj +Lq +Lq +Xr +Lq +Ln +Lq +WR +XW +Ln +Ln +Ln +CF +Rj +Rj +Rj +Rj +rp +fM +UR +"} +(15,1,1) = {" +UR +UR +rp +rp +rp +Rj +Ln +BT +BT +Wi +Ln +Ln +XW +Ln +Ln +Rj +Mt +BT +BT +Ln +Ln +rp +fM +UR +UR +"} +(16,1,1) = {" +UR +rp +rp +rp +Rj +Rj +nG +Mt +BT +BT +BT +Ln +fC +Ln +Rj +UJ +Mt +Mt +BT +BT +Ln +Ln +rp +UR +UR +"} +(17,1,1) = {" +UR +rp +rp +Rj +Rj +uI +Mt +uI +Mt +ST +BT +rW +kg +Ln +pk +Mt +Nw +ZA +fX +BT +BT +Ln +qe +rp +UR +"} +(18,1,1) = {" +UR +rp +rp +Rj +uI +LR +SU +uI +Mt +uI +BT +BT +BT +eY +Mt +NK +UV +Rj +KL +BT +BT +vG +RA +fM +UR +"} +(19,1,1) = {" +UR +rp +rp +Rj +hQ +Bk +Mt +uI +LD +uI +Mt +BT +BT +nK +Mt +Mt +Ii +Rj +Yt +BT +BT +vG +fM +RA +go +"} +(20,1,1) = {" +UR +rp +rp +Rj +Rj +uI +Mt +uI +Mt +uI +Mt +uI +ST +Rj +BT +BT +fX +fX +fX +Mt +BT +Ln +qe +fM +go +"} +(21,1,1) = {" +UR +rp +rp +rp +Rj +Rj +ec +Mt +Mt +Mt +jr +Rj +Ln +Ln +Rj +vU +Nz +oY +Mt +Fc +Ln +Ln +rp +rp +UR +"} +(22,1,1) = {" +UR +UR +rp +rp +rp +Rj +Rj +Oc +RG +VS +Rj +Rj +rp +rp +ct +rg +dG +Nz +gu +Rj +Ln +rp +rp +rp +UR +"} +(23,1,1) = {" +UR +UR +UR +rp +rp +rp +Rj +Rj +Rj +Rj +Rj +rp +rp +Bv +LX +Rj +Rj +Rj +Rj +Rj +rp +rp +rp +rp +UR +"} +(24,1,1) = {" +UR +UR +UR +UR +rp +rp +rp +rp +rp +rp +rp +rp +fM +fM +rp +rp +rp +fM +rp +rp +rp +rp +UR +UR +UR +"} +(25,1,1) = {" +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR +UR "} diff --git a/nano/templates/mechfab.tmpl b/nano/templates/mechfab.tmpl index bc218c81257..8569c54165c 100644 --- a/nano/templates/mechfab.tmpl +++ b/nano/templates/mechfab.tmpl @@ -88,4 +88,3 @@ {{/for}} - diff --git a/polaris.dme b/polaris.dme index be8eeacc525..e907bfe7022 100644 --- a/polaris.dme +++ b/polaris.dme @@ -139,7 +139,7 @@ #include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\diona_nymph.dm" #include "code\_onclick\hud\fullscreen.dm" #include "code\_onclick\hud\ghost.dm" #include "code\_onclick\hud\gun_mode.dm" @@ -244,6 +244,7 @@ #include "code\controllers\subsystems\persistence.dm" #include "code\controllers\subsystems\planets.dm" #include "code\controllers\subsystems\radiation.dm" +#include "code\controllers\subsystems\robots.dm" #include "code\controllers\subsystems\shuttles.dm" #include "code\controllers\subsystems\skybox.dm" #include "code\controllers\subsystems\sqlite.dm" @@ -1029,6 +1030,7 @@ #include "code\game\objects\items\mines\mine_sleeping.dm" #include "code\game\objects\items\mines\mine_stun.dm" #include "code\game\objects\items\mines\mine_training.dm" +#include "code\game\objects\items\robot\robot_frame.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" #include "code\game\objects\items\robot\robot_upgrades.dm" @@ -1414,7 +1416,6 @@ #include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" #include "code\modules\admin\secrets\random_events\gravity.dm" #include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" -#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" #include "code\modules\admin\verbs\adminpm.dm" @@ -1496,7 +1497,6 @@ #include "code\modules\antagonist\antagonist_print.dm" #include "code\modules\antagonist\antagonist_update.dm" #include "code\modules\antagonist\alien\borer.dm" -#include "code\modules\antagonist\alien\xenomorph.dm" #include "code\modules\antagonist\outsider\commando.dm" #include "code\modules\antagonist\outsider\deathsquad.dm" #include "code\modules\antagonist\outsider\ert.dm" @@ -1753,6 +1753,7 @@ #include "code\modules\clothing\under\accessories\torch.dm" #include "code\modules\clothing\under\accessories\crafted\poncho.dm" #include "code\modules\clothing\under\accessories\temperature\poncho.dm" +#include "code\modules\clothing\under\accessories\xeno\teshari.dm" #include "code\modules\clothing\under\jobs\civilian.dm" #include "code\modules\clothing\under\jobs\engineering.dm" #include "code\modules\clothing\under\jobs\medsci.dm" @@ -2447,10 +2448,12 @@ #include "code\modules\mob\living\silicon\robot\drone\swarm.dm" #include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" #include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\_module.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" #include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\flying.dm" #include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" #include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" #include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" @@ -2459,7 +2462,6 @@ #include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" #include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" #include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" #include "code\modules\mob\living\simple_mob\appearance.dm" #include "code\modules\mob\living\simple_mob\butchering.dm" #include "code\modules\mob\living\simple_mob\combat.dm" @@ -3314,6 +3316,7 @@ #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" #include "code\unit_tests\decl_tests.dm" +#include "code\unit_tests\icon_tests.dm" #include "code\unit_tests\language_tests.dm" #include "code\unit_tests\loadout_tests.dm" #include "code\unit_tests\map_tests.dm" diff --git a/sound/effects/phoronborer.ogg b/sound/effects/phoronborer.ogg new file mode 100644 index 00000000000..de76a7ab4b3 Binary files /dev/null and b/sound/effects/phoronborer.ogg differ diff --git a/sound/misc/dingaling1.ogg b/sound/misc/dingaling1.ogg new file mode 100644 index 00000000000..973e86f4885 Binary files /dev/null and b/sound/misc/dingaling1.ogg differ diff --git a/sound/misc/dingaling2.ogg b/sound/misc/dingaling2.ogg new file mode 100644 index 00000000000..b470f66fde1 Binary files /dev/null and b/sound/misc/dingaling2.ogg differ diff --git a/sound/misc/dingaling3.ogg b/sound/misc/dingaling3.ogg new file mode 100644 index 00000000000..e95e0915c17 Binary files /dev/null and b/sound/misc/dingaling3.ogg differ diff --git a/sound/misc/dingaling4.ogg b/sound/misc/dingaling4.ogg new file mode 100644 index 00000000000..e2e45cb6b38 Binary files /dev/null and b/sound/misc/dingaling4.ogg differ