diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index 810f0da00b..c86e66f1c0 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -1,4 +1,5 @@ // Normal digestion modes +#define DM_DEFAULT "Default" // Not a real bellymode, used for handling on 'selective' bellymode prefs. #define DM_HOLD "Hold" #define DM_HOLD_ABSORBED "Hold Absorbed" // Not a real bellymode, used for handling different idle messages for absorbed prey. #define DM_DIGEST "Digest" @@ -10,6 +11,7 @@ #define DM_SIZE_STEAL "Size Steal" #define DM_HEAL "Heal" #define DM_EGG "Encase In Egg" +#define DM_SELECT "Selective" //Addon mode flags #define DM_FLAG_NUMBING 0x1 diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 208984584a..d7d180d4df 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -65,6 +65,7 @@ var/global/list/classic_vore_sounds = list( "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Zipper" = 'sound/items/zip.ogg', "None" = null) var/global/list/classic_release_sounds = list( @@ -73,6 +74,7 @@ var/global/list/classic_release_sounds = list( "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Zipper" = 'sound/items/zip.ogg', "Splatter" = 'sound/effects/splat.ogg', "None" = null ) @@ -95,6 +97,7 @@ var/global/list/fancy_vore_sounds = list( "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Zipper" = 'sound/items/zip.ogg', "None" = null ) @@ -104,6 +107,7 @@ var/global/list/fancy_release_sounds = list( "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Zipper" = 'sound/items/zip.ogg', "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg', "Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg', "Splatter" = 'sound/effects/splat.ogg', diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 33398d6a87..84844936c4 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1161,7 +1161,7 @@ var/list/WALLITEMS = list( if(length(temp_col )<2) temp_col = "0[temp_col]" colour += temp_col - return colour + return "#[colour]" /proc/color_square(red, green, blue, hex) var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" @@ -1178,7 +1178,7 @@ var/mob/dview/dview_mob = new log_error("Had to recreate the dview mob!") dview_mob.loc = center - + dview_mob.see_invisible = invis_flags . = view(range, dview_mob) @@ -1497,7 +1497,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) . += new /obj/screen/plane_master/lighting //Lighting system (but different!) . += new /obj/screen/plane_master/o_light_visual //Object lighting (using masks) . += new /obj/screen/plane_master/emissive //Emissive overlays - + . += new /obj/screen/plane_master/ghosts //Ghosts! . += new /obj/screen/plane_master{plane = PLANE_AI_EYE} //AI Eye! diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm index 7d870c7200..4fe380e063 100644 --- a/code/game/jobs/job/engineering_vr.dm +++ b/code/game/jobs/job/engineering_vr.dm @@ -27,13 +27,18 @@ /datum/job/engineer pto_type = PTO_ENGINEERING alt_titles = list("Maintenance Technician" = /datum/alt_title/maint_tech, "Engine Technician" = /datum/alt_title/engine_tech, - "Electrician" = /datum/alt_title/electrician, "Construction Engineer" = /datum/alt_title/construction_engi, "Station Engineer" = /datum/alt_title/station_engineer ) //YW: added "Station Engineer" Alt Title + "Electrician" = /datum/alt_title/electrician, "Construction Engineer" = /datum/alt_title/construction_engi, "Engineering Contractor" = /datum/alt_title/engineering_contractor, "Station Engineer" = /datum/alt_title/station_engineer ) //YW: added "Station Engineer" Alt Title /datum/alt_title/construction_engi title = "Construction Engineer" title_blurb = "A Construction Engineer fulfills similar duties to other engineers, but usually occupies spare time with construction of extra facilities in dedicated areas or \ as additions to station layout." +/datum/alt_title/engineering_contractor + title = "Engineering Contractor" + title_blurb = "An Engineering Contractor fulfills similar duties to other engineers, but isn't directly employed by NT proper." + + /datum/job/atmos @@ -54,4 +59,4 @@ // YW Alt Titles /datum/alt_title/station_engineer title = "Station Engineer" - title_blurb = "A Station Engineer is a maintenance engineer who is responsible for the maintenance of the station's airlock systems, and the maintenance of the station's airlock systems." \ No newline at end of file + title_blurb = "A Station Engineer is a maintenance engineer who is responsible for the maintenance of the station's airlock systems, and the maintenance of the station's airlock systems." diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm index 0124acc391..601c616e4f 100644 --- a/code/game/jobs/job/medical_vr.dm +++ b/code/game/jobs/job/medical_vr.dm @@ -27,7 +27,7 @@ pto_type = PTO_MEDICAL alt_titles = list("Physician" = /datum/alt_title/physician, "Medical Practitioner" = /datum/alt_title/medical_practitioner, "Surgeon" = /datum/alt_title/surgeon, "Emergency Physician" = /datum/alt_title/emergency_physician, "Nurse" = /datum/alt_title/nurse, "Orderly" = /datum/alt_title/orderly, - "Virologist" = /datum/alt_title/virologist) + "Virologist" = /datum/alt_title/virologist, "Medical Contractor" = /datum/alt_title/medical_contractor) /datum/alt_title/physician @@ -42,6 +42,10 @@ and dirty labor around the department." title_outfit = /decl/hierarchy/outfit/job/medical/doctor/nurse +/datum/alt_title/medical_contractor + title = "Medical Contractor" + title_blurb = "A Medical Contractor can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper." + /datum/job/chemist pto_type = PTO_MEDICAL @@ -80,4 +84,4 @@ title_outfit = /decl/hierarchy/outfit/job/medical/paramedic/emt /datum/alt_title/sar - title = "Search and Rescue" \ No newline at end of file + title = "Search and Rescue" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index b32777c65a..6f96ec1689 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -52,7 +52,7 @@ var/global/list/image/splatter_cache=list() addtimer(CALLBACK(src, .proc/dry), DRYING_TIME * (amount+1)) /obj/effect/decal/cleanable/blood/update_icon() - if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]" + if(basecolor == "rainbow") basecolor = get_random_colour(1) color = basecolor if(basecolor == SYNTH_BLOOD_COLOUR) @@ -184,11 +184,11 @@ var/global/list/image/splatter_cache=list() var/image/giblets = new(base_icon, "[icon_state]_flesh", dir) if(!fleshcolor || fleshcolor == "rainbow") - fleshcolor = "#[get_random_colour(1)]" + fleshcolor = get_random_colour(1) giblets.color = fleshcolor var/icon/blood = new(base_icon,"[icon_state]",dir) - if(basecolor == "rainbow") basecolor = "#[get_random_colour(1)]" + if(basecolor == "rainbow") basecolor = get_random_colour(1) blood.Blend(basecolor,ICON_MULTIPLY) icon = blood diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8b45f1d001..5fc3eff231 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -159,6 +159,10 @@ var/obj/item/organ/external/hand = H.organs_by_name[check_hand] if(istype(hand) && hand.is_usable()) return TRUE + var/mob/living/simple_mob/S = M + if(istype(S) && S.has_hands) //Are they a mob? And do they have hands? + return TRUE + return FALSE @@ -254,6 +258,15 @@ var/obj/effect/temporary_effect/item_pickup_ghost/ghost = new(old_loc) ghost.assumeform(src) ghost.animate_towards(user) + //VORESTATION EDIT START. This handles possessed items. + if(src.possessed_voice.len && !(user.ckey in warned_of_possession)) //Is this item possessed? + warned_of_possession |= user.ckey + tgui_alert_async(user,{" + THIS ITEM IS POSSESSED BY A PLAYER CURRENTLY IN THE ROUND. This could be by anomalous means or otherwise. + If this is not something you wish to partake in, it is highly suggested you place the item back down. + If this is fine to you, ensure that the other player is fine with you doing things to them beforehand! + "},"OOC Warning") + //VORESTATION EDIT END. return /obj/item/attack_ai(mob/user as mob) diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm index ca35911448..9fbc319d6d 100644 --- a/code/game/objects/items/devices/scanners/gas.dm +++ b/code/game/objects/items/devices/scanners/gas.dm @@ -23,7 +23,7 @@ /obj/item/device/analyzer/attack_self(mob/user as mob) if (user.stat) return - if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") + if (!user.IsAdvancedToolUser()) to_chat(usr, "You don't have the dexterity to do this!") return diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 98aa6ec2db..02b33bdec5 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -41,7 +41,7 @@ dat += "Body Temperature: ???" user.show_message("[dat]", 1) return - if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") + if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm index fee41eb880..5c044fc535 100644 --- a/code/game/objects/items/devices/scanners/mass_spectrometer.dm +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -30,7 +30,7 @@ /obj/item/device/mass_spectrometer/attack_self(mob/user as mob) if (user.stat) return - if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") + if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return if(reagents.total_volume) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index f065ec3ea1..9676919792 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -20,8 +20,7 @@ to_chat(user, "\The [src] cannot be applied to [M]!") return 1 - if ( ! (istype(user, /mob/living/carbon/human) || \ - istype(user, /mob/living/silicon)) ) + if (!M.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return 1 @@ -129,7 +128,7 @@ if(used >= available) to_chat(user, "You run out of [src]!") break - + if (W.current_stage <= W.max_bleeding_stage) user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ "You bandage \a [W.desc] on [M]'s [affecting.name]." ) diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 6fddd15013..5930c1ad7e 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -57,7 +57,7 @@ // Randomizes color /obj/item/weapon/melee/umbrella/random/New() - color = "#"+get_random_colour() + color = get_random_colour() ..() /obj/item/weapon/melee/cursedblade @@ -95,4 +95,4 @@ new_voice.name = "cursed sword" //Cursed swords shouldn't be known characters. new_voice.real_name = "cursed sword" voice_mobs.Add(new_voice) - listening_objects |= src \ No newline at end of file + listening_objects |= src diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index b36078028b..232ef11600 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -107,7 +107,7 @@ /obj/item/weapon/storage/wallet/poly/New() ..() verbs |= /obj/item/weapon/storage/wallet/poly/proc/change_color - color = "#"+get_random_colour() + color = get_random_colour() update_icon() /obj/item/weapon/storage/wallet/poly/proc/change_color() @@ -196,4 +196,4 @@ icon_state = "casinowallet_white" return else - icon_state = "casinowallet_black" \ No newline at end of file + icon_state = "casinowallet_black" diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 119c9d7419..df027debd4 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -31,4 +31,4 @@ /obj/item/weapon/towel/random/New() ..() - color = "#"+get_random_colour() \ No newline at end of file + color = get_random_colour() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 02c25c736d..26f3200242 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -19,7 +19,7 @@ user.setClickCooldown(user.get_attack_speed(src)) user.do_attack_animation(M) - if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return diff --git a/code/game/objects/items_vr.dm b/code/game/objects/items_vr.dm new file mode 100644 index 0000000000..4b8dbcaae5 --- /dev/null +++ b/code/game/objects/items_vr.dm @@ -0,0 +1,27 @@ +/obj/item + var/list/possessed_voice //Allows for items to be possessed/inhabited by voices. + var/list/warned_of_possession //Checks to see who has been informed this item is possessed. + + +/obj/item/proc/inhabit_item(var/mob/candidate, var/candidate_name, var/mob/living/candidate_original_form) + //This makes it so that any object in the game can have something put in it like the cursed sword! + //This means the proc can also be manually called by admin commands. + //Handle moving the person into the object. + if(!possessed_voice) //Create the list for possessed_voice if it doesn't already have one. + possessed_voice = list() + if(!warned_of_possession) //Creates a list of warned users. + warned_of_possession = list() + var/mob/living/voice/new_voice = new /mob/living/voice(src) //Make the voice mob the person is going to be. + new_voice.transfer_identity(candidate) //Now make the voice mob load from the ghost's active character in preferences. + new_voice.mind = candidate.mind //Transfer the mind, if any. + new_voice.ckey = candidate.ckey //Finally, bring the client over. + new_voice.tf_mob_holder = candidate_original_form //Save what mob they are! We'll need this for OOC escape and transformation back to their normal form. + if(candidate_name) //Were we given a candidate_name? Great! Name them that. + new_voice.name = "[candidate_name]" + else + new_voice.name = "[name]" //No name given? Give them the name of the object they're inhabiting. + new_voice.real_name = "[new_voice.real_name]" //We still know their real name though! + possessed_voice.Add(new_voice) + listening_objects |= src + new_voice.verbs -= /mob/living/voice/verb/change_name //No changing your name! Bad! + new_voice.verbs -= /mob/living/voice/verb/hang_up //Also you can't hang up. You are the item! \ No newline at end of file diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm index 908f68747c..2e22537287 100644 --- a/code/game/objects/structures/trash_pile_vr.dm +++ b/code/game/objects/structures/trash_pile_vr.dm @@ -84,6 +84,49 @@ else return ..() +/obj/structure/trash_pile/attack_ghost(mob/observer/user as mob) + if(config.disable_player_mice) + to_chat(user, "Spawning as a mouse is currently disabled.") + return + + //VOREStation Add Start + if(jobban_isbanned(user, "GhostRoles")) + to_chat(user, "You cannot become a mouse because you are banned from playing ghost roles.") + return + //VOREStation Add End + + if(!user.MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(user, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - user.client.time_died_as_mouse + if(user.client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(user, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(user, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + var/mob/living/simple_mob/animal/passive/mouse/host + host = new /mob/living/simple_mob/animal/passive/mouse(get_turf(src)) + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = user.ckey + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + + var/atom/A = get_holder_at_turf_level(src) + A.visible_message("[host] crawls out of \the [src].") + return + /obj/structure/trash_pile/attack_hand(mob/user) //Human mob if(ishuman(user)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index e8bfad6c0c..31773e10b4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,5 +1,3 @@ - -var/global/BSACooldown = 0 var/global/floorIsLava = 0 @@ -1565,8 +1563,8 @@ var/datum/announcement/minor/admin_min_announcer = new for(var/client/C in GLOB.admins) if((R_ADMIN | R_MOD | R_EVENT) & C.holder.rights) to_chat(C, "FAX LOG:[key_name_admin(src.owner)] has sent a fax message to [destination.department] (VIEW)") - - var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]" + + var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]" var/fax_text = paper_html_to_plaintext(P.info) log_game(plaintext_title) log_game(fax_text) diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm index 78fd832f11..a407454d2b 100644 --- a/code/modules/admin/verbs/smite.dm +++ b/code/modules/admin/verbs/smite.dm @@ -25,21 +25,21 @@ broken_legs++ if(!broken_legs) to_chat(src,"[target] didn't have any breakable legs, sorry.") - + if(SMITE_BLUESPACEARTILLERY) bluespace_artillery(target,src) - + if(SMITE_SPONTANEOUSCOMBUSTION) target.adjust_fire_stacks(10) target.IgniteMob() target.visible_message("[target] bursts into flames!") - + if(SMITE_LIGHTNINGBOLT) var/turf/T = get_step(get_step(target, NORTH), NORTH) T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5) target.electrocute_act(75,def_zone = BP_HEAD) target.visible_message("[target] is struck by lightning!") - + else return //Injection? Don't print any messages. @@ -50,14 +50,6 @@ if(!istype(target)) return - if(BSACooldown) - if(user) - to_chat(user,"BSA is still cooling down, please wait!") - return - - BSACooldown = 1 - VARSET_IN(global, BSACooldown, FALSE, 5 SECONDS) - to_chat(target,"You've been hit by bluespace artillery!") log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]") @@ -68,10 +60,12 @@ if(prob(80)) T.break_tile_to_plating() else T.break_tile() - if(target.health == 1) + playsound(T, get_sfx("explosion"), 100, 1, get_rand_frequency(), falloff = 5) // get_sfx() is so that everyone gets the same sound + + if(target.health < 10) target.gib() else - target.adjustBruteLoss( min( 99 , (target.health - 1) ) ) + target.adjustBruteLoss( max( 99 , (target.health - 1) ) ) target.Stun(20) target.Weaken(20) target.stuttering = 20 diff --git a/code/modules/ai/ai_holder_fleeing.dm b/code/modules/ai/ai_holder_fleeing.dm index 83a7be94b8..7e9b78b1f4 100644 --- a/code/modules/ai/ai_holder_fleeing.dm +++ b/code/modules/ai/ai_holder_fleeing.dm @@ -18,6 +18,8 @@ if(can_flee) if(special_flee_check()) return TRUE + if(isbelly(holder.loc)) //VOREStation Add - Don't flee while you're in a tummy, silly + return FALSE //VOREStation Add if(!hostile && !retaliate) return TRUE // We're not hostile and someone attacked us first. if(flee_when_dying && (holder.health / holder.getMaxHealth()) <= dying_threshold) diff --git a/code/modules/client/preference_setup/general/06_flavor.dm b/code/modules/client/preference_setup/general/06_flavor.dm index aaee96959d..794fba3e2f 100644 --- a/code/modules/client/preference_setup/general/06_flavor.dm +++ b/code/modules/client/preference_setup/general/06_flavor.dm @@ -59,12 +59,12 @@ switch(href_list["flavor_text"]) if("open") if("general") - var/msg = sanitize(tgui_input_text(usr,"Give a general description of your character. This will be shown regardless of clothings.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Give a general description of your character. This will be shown regardless of clothings. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) //VOREStation Edit: separating out OOC notes + if(CanUseTopic(user) && !isnull(msg)) pref.flavor_texts[href_list["flavor_text"]] = msg else - var/msg = sanitize(tgui_input_text(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Set the flavor text for your [href_list["flavor_text"]]. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) + if(CanUseTopic(user) && !isnull(msg)) pref.flavor_texts[href_list["flavor_text"]] = msg SetFlavorText(user) return TOPIC_HANDLED @@ -73,12 +73,12 @@ switch(href_list["flavour_text_robot"]) if("open") if("Default") - var/msg = sanitize(tgui_input_text(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), multiline = TRUE, prevent_enter = TRUE), extra = 0) - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), multiline = TRUE, prevent_enter = TRUE), extra = 0) + if(CanUseTopic(user) && !isnull(msg)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg else - var/msg = sanitize(tgui_input_text(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) - if(CanUseTopic(user)) + var/msg = sanitize(tgui_input_text(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this blank, default flavour text will be used for this module. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]]), multiline = TRUE, prevent_enter = TRUE), extra = 0) + if(CanUseTopic(user) && !isnull(msg)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg SetFlavourTextRobot(user) return TOPIC_HANDLED diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index caf9e125d1..60d976b12e 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -35,6 +35,8 @@ if(istype(I,/obj/item/weapon/holder/micro)) var/full = 0 for(var/mob/M in src) + if(istype(M,/mob/living/voice)) //Don't count voices as people! + continue full++ if(full >= 2) to_chat(user, "You can't fit anyone else into \the [src]!") @@ -51,6 +53,8 @@ /obj/item/clothing/shoes/attack_self(var/mob/user) for(var/mob/M in src) + if(istype(M,/mob/living/voice)) //Don't knock voices out! + continue M.forceMove(get_turf(user)) to_chat(M, "[user] shakes you out of \the [src]!") to_chat(user, "You shake [M] out of \the [src]!") @@ -59,6 +63,8 @@ /obj/item/clothing/shoes/container_resist(mob/living/micro) var/mob/living/carbon/human/macro = loc + if(istype(micro,/mob/living/voice)) //Voices shouldn't be able to resist but we have this here just in case. + return if(!istype(macro)) to_chat(micro, "You start to climb out of [src]!") if(do_after(micro, 50, src)) @@ -106,14 +112,20 @@ spawn(100) recent_struggle = 0 - if(ishuman(src.loc)) + if(ishuman(src.loc)) //Is this on a person? var/mob/living/carbon/human/H = src.loc - if(H.shoes == src) + if(istype(user,/mob/living/voice)) //Is this a possessed item? Spooky. It can move on it's own! + to_chat(H, "The [src] shifts about, almost as if squirming!") + to_chat(user, "You cause the [src] to shift against [H]'s form! Well, what little you can get to, given your current state!") + else if(H.shoes == src) to_chat(H, "[user]'s tiny body presses against you in \the [src], squirming!") to_chat(user, "Your body presses out against [H]'s form! Well, what little you can get to!") else to_chat(H, "[user]'s form shifts around in the \the [src], squirming!") to_chat(user, "You move around inside the [src], to no avail.") + else if(istype(user,/mob/living/voice)) //Possessed! + src.visible_message("The [src] shifts about!") + to_chat(user, "You cause the [src] to shift about!") else src.visible_message("\The [src] moves a little!") to_chat(user, "You throw yourself against the inside of \the [src]!") diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 64c2be1887..d2fc36d350 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -419,8 +419,8 @@ set_trait(TRAIT_POTENCY,rand(5,30),200,0) set_trait(TRAIT_PRODUCT_ICON,pick(SSplants.accessible_product_sprites)) set_trait(TRAIT_PLANT_ICON,pick(SSplants.accessible_plant_sprites)) - set_trait(TRAIT_PLANT_COLOUR,"#[get_random_colour(0,75,190)]") - set_trait(TRAIT_PRODUCT_COLOUR,"#[get_random_colour(0,75,190)]") + set_trait(TRAIT_PLANT_COLOUR,get_random_colour(0,75,190)) + set_trait(TRAIT_PRODUCT_COLOUR,get_random_colour(0,75,190)) update_growth_stages() if(prob(20)) @@ -548,7 +548,7 @@ if(prob(5)) set_trait(TRAIT_BIOLUM,1) - set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]") + set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) if(prob(3)) set_trait(TRAIT_SPORING,1) @@ -654,7 +654,7 @@ if(get_trait(TRAIT_BIOLUM)) source_turf.visible_message("\The [display_name] begins to glow!") if(prob(degree*2)) - set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]") + set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) source_turf.visible_message("\The [display_name]'s glow changes colour!") else source_turf.visible_message("\The [display_name]'s glow dims...") diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 09e1ccbe9e..a4d0ca08b6 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -409,7 +409,7 @@ // harvested yet and it's safe to assume it's restricted to this tray. if(!isnull(SSplants.seeds[seed.name])) seed = seed.diverge() - seed.mutate(severity,get_turf(src)) + seed.mutate(severity,get_turf(src)) return diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 47649a2bb9..b4633f1cf5 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -363,7 +363,7 @@ var/list/mining_overlay_cache = list() //Not even going to touch this pile of spaghetti /turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") + if (!user.IsAdvancedToolUser()) to_chat(user, "You don't have the dexterity to do this!") return diff --git a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm index 110b76ef9b..2c79aaee37 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm @@ -60,4 +60,21 @@ /datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) ..() if(!(target == user)) - user.shadekin_adjust_energy(attack_damage) \ No newline at end of file + user.shadekin_adjust_energy(attack_damage) + +/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier + +/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user) + return user.feral/5 + +/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone) + ..() + if(user.feral && !(target == user)) + var/selfdamage = ((user.feral/10)-7.5) + if(selfdamage > 0) + var/selfdamagezone = null + if (user.hand) + selfdamagezone=pick(BP_L_ARM, BP_L_HAND) + else + selfdamagezone=pick(BP_R_ARM, BP_R_HAND) + user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 34a7054643..a4333760a8 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -3,10 +3,18 @@ set category = "Abilities" // Sanity is mostly handled in chimera_regenerate() - - var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to twenty minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No")) - if(confirm == "Yes") - chimera_regenerate() + if(stat == DEAD) + var/confirm = tgui_alert(usr, "Are you sure you want to regenerate your corpse? This process can take up to thirty minutes.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + chimera_regenerate() + else if (quickcheckuninjured()) + var/confirm = tgui_alert(usr, "Are you sure you want to regenerate? As you are uninjured this will only take 30 seconds and match your appearance to your character slot.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + chimera_regenerate() + else + var/confirm = tgui_alert(usr, "Are you sure you want to completely reconstruct your form? This process can take up to fifteen minutes, depending on how hungry you are, and you will be unable to move.", "Confirm Regeneration", list("Yes", "No")) + if(confirm == "Yes") + chimera_regenerate() /mob/living/carbon/human/proc/chimera_regenerate() //If they're already regenerating @@ -21,40 +29,40 @@ to_chat(src, "You can't use that ability again so soon!") return - var/nutrition_used = nutrition * 0.5 - var/time = (240+960/(1 + nutrition_used/75)) + var/time = min(900, (120+780/(1 + nutrition/100))) //capped at 15 mins, roughly 6 minutes at 250 (yellow) nutrition, 4.1 minutes at 500 (grey), cannot be below 2 mins + if (quickcheckuninjured()) //if you're completely uninjured, then you get a speedymode - check health first for quickness + time = 30 //Clicked regen while dead. if(stat == DEAD) - //Has nutrition and dead, allow regen. - if(hasnutriment()) - to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.") + //reviving from dead takes extra nutriment to be provided from outside OR takes twice as long and consumes extra at the end + if(!hasnutriment()) + time = time*2 - //Scary spawnerization. - revive_ready = REVIVING_NOW - revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently. - throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution) - spawn(time SECONDS) - // Was dead, now not dead. - if(stat != DEAD) - to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.") - revive_ready = REVIVING_READY //reset their cooldown - clear_alert("regen") - throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) + to_chat(src, "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds.") - // Was dead, still dead. - else - to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch.") - verbs |= /mob/living/carbon/human/proc/hatch - revive_ready = REVIVING_DONE - src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30) - clear_alert("regen") - throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) + //Scary spawnerization. + revive_ready = REVIVING_NOW + revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently. + throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution) + spawn(time SECONDS) + // check to see if they've been fixed by outside forces in the meantime such as defibbing + if(stat != DEAD) + to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.") + revive_ready = REVIVING_READY //reset their cooldown + clear_alert("regen") + throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) + + // Was dead, still dead. + else + to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch.") + verbs |= /mob/living/carbon/human/proc/hatch + revive_ready = REVIVING_DONE + src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30) + clear_alert("regen") + throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) - //Dead until nutrition injected. - else - to_chat(src, "Your body is too damaged to regenerate without additional nutrients to feed what few living cells remain.") //Clicked regen while NOT dead else @@ -66,29 +74,17 @@ throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution) spawn(time SECONDS) - //If they're still alive after regenning. - if(stat != DEAD) + //Slightly different flavour messages + if(stat != DEAD || hasnutriment()) to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..") - verbs |= /mob/living/carbon/human/proc/hatch - revive_ready = REVIVING_DONE - src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30) - clear_alert("regen") - throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) - - //Was alive, now dead - else if(hasnutriment()) - to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..") - verbs |= /mob/living/carbon/human/proc/hatch - revive_ready = REVIVING_DONE - src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30) - clear_alert("regen") - throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) - - //Dead until nutrition injected. else - to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.") - revive_ready = REVIVING_READY //reset their cooldown - clear_alert("regen") + to_chat(src, "Consciousness begins to stir as your battered body struggles to recover from its ordeal..") + verbs |= /mob/living/carbon/human/proc/hatch + revive_ready = REVIVING_DONE + src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30) + clear_alert("regen") + throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch) + /mob/living/carbon/human/proc/hasnutriment() if (bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein. @@ -97,6 +93,16 @@ return TRUE else return FALSE +/mob/living/carbon/human/proc/quickcheckuninjured() + if (getBruteLoss() || getFireLoss() || getHalLoss() || getToxLoss() || getOxyLoss() || getBrainLoss()) //fails if they have any of the main damage types + return FALSE + for (var/obj/item/organ/O in organs) //check their organs just in case they're being sneaky and somehow have organ damage but no health damage + if (O.damage) + return FALSE + for (var/obj/item/organ/O in internal_organs) //check their organs just in case they're being sneaky and somehow have organ damage but no health damage + if (O.damage) + return FALSE + return TRUE /mob/living/carbon/human/proc/hatch() set name = "Hatch" @@ -112,58 +118,54 @@ //Dead when hatching if(stat == DEAD) - //Check again for nutriment (necessary?) - if(hasnutriment()) - chimera_hatch() - adjustBrainLoss(10) // if they're reviving from dead, they come back with 10 brainloss on top of whatever's unhealed. - visible_message("

The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.

") //Bloody hell... - clear_alert("hatch") - return - - //Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch. - else - to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.") - verbs -= /mob/living/carbon/human/proc/hatch - revive_ready = REVIVING_READY //reset their cooldown they can try again when they're given a kickstart - clear_alert("hatch") + //Reviving from ded takes extra nutrition - if it isn't provided from outside sources, it comes from you + if(!hasnutriment()) + nutrition=nutrition * 0.75 + chimera_hatch() + adjustBrainLoss(5) // if they're reviving from dead, they come back with 5 brainloss on top of whatever's unhealed. + visible_message("

The former corpse staggers to its feet, all its former wounds having vanished...

") //Bloody hell... + clear_alert("hatch") + return //Alive when hatching else chimera_hatch() - visible_message("

The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.

") //Bloody hell... + + visible_message("

[src] rises to \his feet.

") //Bloody hell... clear_alert("hatch") /mob/living/carbon/human/proc/chimera_hatch() verbs -= /mob/living/carbon/human/proc/hatch to_chat(src, "Your new body awakens, bursting free from your old skin.") - //Modify and record values (half nutrition and braindamage) - var/old_nutrition = nutrition * 0.5 - var/braindamage = (brainloss * 0.5) //Can only heal half brain damage. - + var/old_nutrition = nutrition + var/braindamage = min(5, max(0, (brainloss-1) * 0.5)) //brainloss is tricky to heal and might take a couple of goes to get rid of completely. + var/uninjured=quickcheckuninjured() //I did have special snowflake code, but this is easier. revive() mutations.Remove(HUSK) - nutrition = old_nutrition setBrainLoss(braindamage) - //Drop everything - for(var/obj/item/W in src) - drop_from_inventory(W) + if(!uninjured) + nutrition = old_nutrition * 0.5 + //Drop everything + for(var/obj/item/W in src) + drop_from_inventory(W) + //Visual effects + var/T = get_turf(src) + var/blood_color = species.blood_color + var/flesh_color = species.flesh_color + new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color) + visible_message("

The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.

") //Bloody hell... + playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50) + else //lower cost for doing a quick cosmetic revive + nutrition = old_nutrition * 0.9 //Unfreeze some things does_not_breathe = FALSE update_canmove() weakened = 2 - //Visual effects - var/T = get_turf(src) - var/blood_color = species.blood_color - var/flesh_color = species.flesh_color - new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color) - - playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50) - revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often. /mob/living/carbon/human/proc/revivingreset() // keep this as a debug proc or potential future use diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index 7c30b9df50..26ced96f0a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -9,7 +9,7 @@ name_plural = "Xenochimeras" icobase = 'icons/mob/human_races/r_xenochimera.dmi' deform = 'icons/mob/human_races/r_def_xenochimera.dmi' - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp) darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara. slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari. brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though. @@ -55,13 +55,13 @@ genders = list(MALE, FEMALE, PLURAL, NEUTER) - has_organ = list( //Same organ list as tajarans. + has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN. O_HEART = /obj/item/organ/internal/heart, O_LUNGS = /obj/item/organ/internal/lungs, O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain, + O_BRAIN = /obj/item/organ/internal/brain/xenochimera, O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, O_INTESTINE = /obj/item/organ/internal/intestine @@ -97,6 +97,9 @@ //Very low pressure damage if(adjusted_pressure2 <= 20) H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") + //they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments + if(H.getOxyLoss() >= 50) + H.does_not_breathe = TRUE //Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral. //NB: 'body_temperature' used here is the 'setpoint' species var @@ -105,17 +108,24 @@ H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale H.eye_blurry = max(5,H.eye_blurry) +/obj/item/organ/internal/brain/xenochimera + var/laststress = 0 /datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H) + //first, calculate how stressed the chimera is + var/laststress = 0 + var/obj/item/organ/internal/brain/xenochimera/B = H.internal_organs_by_name[O_BRAIN] + if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection + laststress = B.laststress - //Low-ish nutrition has messages and eventually feral - var/hungry = H.nutrition <= 200 + //Low-ish nutrition has messages and can eventually cause feralness + var/hunger = max(0, 150 - H.nutrition) - //At 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat. - var/shock = H.traumatic_shock > min(60, H.nutrition/10) + //pain makes feralness a thing + var/shock = 0.75*H.traumatic_shock - //Caffeinated xenochimera can become feral and have special messages - var/jittery = H.jitteriness >= 100 + //Caffeinated or otherwise overexcited xenochimera can become feral and have special messages + var/jittery = max(0, H.jitteriness - 100) //To reduce distant object references var/feral = H.feral @@ -124,11 +134,25 @@ var/danger = FALSE var/feral_state = FALSE - //Handle feral triggers and pre-feral messages - if(!feral && (hungry || shock || jittery)) + //finally, calculate the current stress total the chimera is operating under, and the cause + var/currentstress = (hunger + shock + jittery) + var/cause = "stress" + if(hunger > shock && hunger > jittery) + cause = "hunger" + else if (shock > hunger && shock > jittery) + cause = "shock" + else if (jittery > shock && jittery > hunger) + cause = "jittery" - // If they're hungry, give nag messages (when not bellied) - if(H.nutrition >= 100 && prob(0.5) && !isbelly(H.loc)) + //check to see if they go feral if they weren't before + if(!feral) + // if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed + if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) ) + go_feral(H, currentstress, cause) + feral = currentstress //update the local var + + //they didn't go feral, give 'em a chance of hunger messages + else if(H.nutrition <= 200 && prob(0.5) && !isbelly(H.loc)) switch(H.nutrition) if(150 to 200) to_chat(H,"You feel rather hungry. It might be a good idea to find some some food...") @@ -136,81 +160,26 @@ to_chat(H,"You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...") danger = TRUE - // Going feral due to hunger - else if(H.nutrition < 100 && !isbelly(H.loc)) - to_chat(H,"Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.") - log_and_message_admins("has gone feral due to hunger.", H) - feral = 5 - danger = TRUE - feral_state = TRUE - if(!H.stat) - H.emote("twitch") - - // If they're hurt, chance of snapping. - else if(shock) - - //If the majority of their shock is due to halloss, greater chance of snapping. - if(2.5*H.halloss >= H.traumatic_shock) - if(prob(min(10,(0.2 * H.traumatic_shock)))) - to_chat(H,"The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...") - log_and_message_admins("has gone feral due to halloss.", H) - feral = 5 - danger = TRUE - feral_state = TRUE - if(!H.stat) - H.emote("twitch") - - //Majority due to other damage sources - else if(prob(min(10,(0.1 * H.traumatic_shock)))) - to_chat(H,"Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.") - feral = 5 - danger = TRUE - feral_state = TRUE - log_and_message_admins("has gone feral due to injury.", H) - if(!H.stat) - H.emote("twitch") - - //No hungry or shock, but jittery - else if(jittery) - to_chat(H,"Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!") - feral = 5 - danger = TRUE - feral_state = TRUE - log_and_message_admins("has gone feral due to jitteriness.", H) - if(!H.stat) - H.emote("twitch") + //now the check's done, update their brain so it remembers how stressed they were + B.laststress = currentstress // Handle being feral if(feral) //We're feral feral_state = TRUE - //Shock due to mostly halloss. More feral. - if(shock && 2.5*H.halloss >= H.traumatic_shock) + //If they're still stressed, they stay feral + if(currentstress >= 15) danger = TRUE - feral = max(feral, H.halloss) + feral = max(feral, currentstress) - //Shock due to mostly injury. More feral. - else if(shock) - danger = TRUE - feral = max(feral, H.traumatic_shock * 2) - - //Still jittery? More feral. - if(jittery) - danger = TRUE - feral = max(feral, H.jitteriness-100) - - //Still hungry? More feral. - if(H.feral + H.nutrition < 150) - danger = TRUE - feral++ else feral = max(0,--feral) - // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9 - var/turf/T = get_turf(H) - if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1)) - feral = max(0,--feral) + // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9 + var/turf/T = get_turf(H) + if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1)) + feral = max(0,--feral) //Set our real mob's var to our temp var H.feral = feral @@ -227,7 +196,7 @@ H.shock_stage = max(H.shock_stage-(feral/20), 0) //Handle light/dark areas - // var/turf/T = get_turf(H) // Moved up to before the in-belly/dark combined check, should still safely reach here just fine. + var/turf/T = get_turf(H) if(!T) update_xenochimera_hud(H, danger, feral_state) return //Nullspace @@ -257,15 +226,15 @@ // In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage. if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case. // If hurt, tell 'em to heal up - if (shock) + if (cause == "shock") to_chat(H,"This place seems safe, secure, hidden, a place to lick your wounds and recover...") //If hungry, nag them to go and find someone or something to eat. - else if(hungry) + else if(cause == "hunger") to_chat(H,"Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...") //If jittery, etc - else if(jittery) + else if(cause == "jittery") to_chat(H,"sneakysneakyyesyesyescleverhidingfindthingsyessssss") //Otherwise, just tell them to keep hiding. @@ -284,16 +253,16 @@ // Someone/something nearby if(nearby.len) var/M = pick(nearby) - if(shock) + if(cause == "shock") to_chat(H,"You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...") - else if(hungry || jittery) + else to_chat(H,"Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...") // Nobody around else - if(hungry) + if(cause == "hunger") to_chat(H,"Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.") - else if(jittery) + else if(cause == "jittery") to_chat(H,"yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes") else to_chat(H,"Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...") @@ -301,6 +270,37 @@ // HUD update time update_xenochimera_hud(H, danger, feral_state) +/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause) + // Going feral due to hunger + if(cause == "hunger") + to_chat(H,"Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.") + log_and_message_admins("has gone feral due to hunger.", H) + + // If they're hurt, chance of snapping. + else if(cause == "shock") + //If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part) + if(3*H.halloss >= H.traumatic_shock) + to_chat(H,"The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...") + log_and_message_admins("has gone feral due to halloss.", H) + + //Majority due to other damage sources + else + to_chat(H,"Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.") + log_and_message_admins("has gone feral due to injury.", H) + + //No hungry or shock, but jittery + else if(cause == "jittery") + to_chat(H,"Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!") + log_and_message_admins("has gone feral due to jitteriness.", H) + + else // catch-all just in case something weird happens + to_chat(H,"The stress of your situation is too much for you, and your survival instincts kick in!") + log_and_message_admins("has gone feral for unknown reasons.", H) + //finally, set their feral var + H.feral = stress + if(!H.stat) + H.emote("twitch") + /datum/species/xenochimera/get_race_key() var/datum/species/real = GLOB.all_species[base_species] return real.race_key diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index 1340beb8d5..7c31c3c83d 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -45,7 +45,22 @@ if(I_HURT) var/armor = run_armor_check(def_zone = null, attack_flag = "melee") - apply_damage(damage = harm_intent_damage, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) + if(istype(L,/mob/living/carbon/human)) //VOREStation EDIT START Is it a human? + var/mob/living/carbon/human/attacker = L //We are a human! + var/datum/unarmed_attack/attack = attacker.get_unarmed_attack(src, BP_TORSO) //What attack are we using? Also, just default to attacking the chest. + var/rand_damage = rand(1, 5) //Like normal human attacks, let's randomize the damage... + var/real_damage = rand_damage //Let's go ahead and start calculating our damage. + var/hit_dam_type = attack.damage_type //Let's get the type of damage. Brute? Burn? Defined by the unarmed_attack. + real_damage += attack.get_unarmed_damage(attacker) //Add the damage that their special attack has. Some have 0. Some have 15. + if(real_damage <= damage_threshold) + L.visible_message("\The [L] uselessly hits \the [src]!") + L.do_attack_animation(src) + return + apply_damage(damage = real_damage, damagetype = hit_dam_type, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) + L.visible_message("\The [L] [pick(attack.attack_verb)] \the [src]!") + L.do_attack_animation(src) + return //VOREStation EDIT END + apply_damage(damage = harm_intent_damage, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) //VOREStation EDIT Somebody set this to burn instead of brute. L.visible_message("\The [L] [response_harm] \the [src]!") L.do_attack_animation(src) diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index ebbb7bd73e..72cf906d67 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -51,6 +51,7 @@ var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans. does_spin = FALSE can_be_drop_pred = TRUE // Mobs are pred by default. + var/damage_threshold = 0 //For some mobs, they have a damage threshold required to deal damage to them. // Release belly contents before being gc'd! diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm index 0520bd5351..3d7c0d4059 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm @@ -192,7 +192,7 @@ . = ..() icon_living = "spookyghost-[rand(1,2)]" icon_state = icon_living - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, .proc/death), 35 SECONDS) update_icon() /datum/ai_holder/simple_mob/melee/space_ghost diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm index c4f41bd3ba..840b424994 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose.dm @@ -47,4 +47,12 @@ add_modifier(/datum/modifier/berserk, 30 SECONDS) /decl/mob_organ_names/goose - hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck") \ No newline at end of file + hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck") + +/mob/living/simple_mob/animal/space/goose/white + icon = 'icons/mob/animal_vr.dmi' + icon_state = "whitegoose" + icon_living = "whitegoose" + icon_dead = "whitegoose_dead" + name = "white goose" + desc = "And just when you thought it was a lovely day..." \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm index e43caff8c3..eaa796f45c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/mecha.dm @@ -13,6 +13,7 @@ turn_sound = 'sound/mecha/mechturn.ogg' maxHealth = 300 mob_size = MOB_LARGE + damage_threshold = 5 //Anything that's 5 or less damage will not do damage. organ_names = /decl/mob_organ_names/mecha diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index 706031ce78..48953e15a8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -11,6 +11,31 @@ verbs |= /mob/living/simple_mob/proc/set_name verbs |= /mob/living/simple_mob/proc/set_desc + ooc_notes = client.prefs.metadata + digestable = client.prefs_vr.digestable + devourable = client.prefs_vr.devourable + absorbable = client.prefs_vr.absorbable + feeding = client.prefs_vr.feeding + can_be_drop_prey = client.prefs_vr.can_be_drop_prey + can_be_drop_pred = client.prefs_vr.can_be_drop_pred + allow_inbelly_spawning = client.prefs_vr.allow_inbelly_spawning + allow_spontaneous_tf = client.prefs_vr.allow_spontaneous_tf + digest_leave_remains = client.prefs_vr.digest_leave_remains + allowmobvore = client.prefs_vr.allowmobvore + permit_healbelly = client.prefs_vr.permit_healbelly + noisy = client.prefs_vr.noisy + selective_preference = client.prefs_vr.selective_preference + + drop_vore = client.prefs_vr.drop_vore + stumble_vore = client.prefs_vr.stumble_vore + slip_vore = client.prefs_vr.slip_vore + + resizable = client.prefs_vr.resizable + show_vore_fx = client.prefs_vr.show_vore_fx + step_mechanics_pref = client.prefs_vr.step_mechanics_pref + pickup_pref = client.prefs_vr.pickup_pref + + /mob/living/simple_mob/proc/set_name() set name = "Set Name" set desc = "Sets your mobs name. You only get to do this once." diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm index 2cd26b7f4b..96d80669c1 100644 --- a/code/modules/organs/robolimbs_custom.dm +++ b/code/modules/organs/robolimbs_custom.dm @@ -175,3 +175,31 @@ VS Edit - anyone can select these. */ /obj/item/weapon/disk/limb/dsi_teshari company = "DSI - Teshari" + +/datum/robolimb/dsi_zorren + company = "DSI - Zorren" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Zorren" + +/obj/item/weapon/disk/limb/dsi_zorren + company = "DSI - Zorren" + +/datum/robolimb/dsi_fennec + company = "DSI - Fennec" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Fennec" + +/obj/item/weapon/disk/limb/dsi_fennec + company = "DSI - Fennec" diff --git a/code/modules/planet/virgo3c_vr.dm b/code/modules/planet/virgo3c_vr.dm index 0555d29a3a..3afd9ca6c4 100644 --- a/code/modules/planet/virgo3c_vr.dm +++ b/code/modules/planet/virgo3c_vr.dm @@ -147,11 +147,11 @@ var/datum/planet/virgo3c/planet_virgo3c = null /datum/weather/virgo3c/clear name = "clear" transition_chances = list( - WEATHER_CLEAR = 60, - WEATHER_OVERCAST = 20, - WEATHER_LIGHT_SNOW = 1, - WEATHER_BLOOD_MOON = 1, - WEATHER_EMBERFALL = 0.5) + WEATHER_CLEAR = 120, + WEATHER_OVERCAST = 40, + WEATHER_LIGHT_SNOW = 2, + WEATHER_BLOOD_MOON = 2, + WEATHER_EMBERFALL = 1) transition_messages = list( "The sky clears up.", "The sky is visible.", diff --git a/code/modules/projectiles/ammunition/ammo_boxes.dm b/code/modules/projectiles/ammunition/ammo_boxes.dm index 566b878c44..533a27bc4c 100644 --- a/code/modules/projectiles/ammunition/ammo_boxes.dm +++ b/code/modules/projectiles/ammunition/ammo_boxes.dm @@ -10,7 +10,7 @@ # # Use this format, followed by the caliber. For example, a shotgun's caliber # variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g", -# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion +# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion // Avoid confusion my ass, when ammo is called only shells and suddenly switches to being called some obscure-ass military number # for developers and in-game admins spawning these items, stick to this format. # Likewise, when creating new rounds, the caliber variable should match whatever # the name says. diff --git a/code/modules/tgs/v5/chat_commands.dm b/code/modules/tgs/v5/chat_commands.dm index 53aeb57a3a..5a4386e6da 100644 --- a/code/modules/tgs/v5/chat_commands.dm +++ b/code/modules/tgs/v5/chat_commands.dm @@ -4,8 +4,26 @@ admin_only = FALSE /* YW EDIT: replaced by yw variant /datum/tgs_chat_command/status/Run(datum/tgs_chat_user/sender, params) - return "Current server status:\n**Web Manifest:** \n**Players:** [TGS_CLIENT_COUNT]\n**Round Duration:** [roundduration2text()]" + var/counts = 0 + var/afks = 0 + var/active = 0 + var/bellied = 0 + + for(var/X in GLOB.clients) + var/client/C = X + if(C) + counts++ + if(C && !(istype(C.mob,/mob/new_player) || istype(C.mob, /mob/observer))) + if(C && C.mob && isbelly(C.mob.loc)) + bellied++ + if(C.is_afk()) + afks++ + else + active++ + + return "Current server status:\n**Web Manifest:** \n**Players:** [counts]\n**Active:** [active]\n**AFK:** [afks]\n**Bellied:** [bellied]\n\n**Round Duration:** [roundduration2text()]" */ + /datum/tgs_chat_command/parsetest name = "parsetest" help_text = "Shows the current production server status" @@ -76,13 +94,13 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations) query.Execute() if(query.NextRow()) return "[sender.friendly_name], your Discord ID is already registered to a Byond username. Please contact an administrator if you changed your Byond username or Discord ID." - + var/key_to_find = "[ckey(params)]" // They didn't provide anything worth looking up. if(!length(key_to_find)) return "[sender.friendly_name], you need to provide your Byond username at the end of the command. It can be in 'key' format (with spaces and characters) or 'ckey' format (without spaces or special characters)." - + // Try to find their client. var/client/user for(var/client/C in GLOB.clients) @@ -93,7 +111,7 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations) // Couldn't find them logged in. if(!user) return "[sender.friendly_name], I couldn't find a logged-in user with the username of '[key_to_find]', which is what you provided after conversion to Byond's ckey format. Please connect to the game server and try again." - + var/sql_ckey = sql_sanitize_text(key_to_find) query = dbcon.NewQuery("SELECT discord_id FROM erro_player WHERE ckey = '[sql_ckey]'") query.Execute() @@ -101,11 +119,11 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations) // We somehow found their client, BUT they don't exist in the database if(!query.NextRow()) return "[sender.friendly_name], the server's database is either not responding or there's no evidence you've ever logged in. Please contact an administrator." - + // We found them in the database, AND they already have a discord ID assigned if(query.item[1]) return "[sender.friendly_name], it appears you've already registered your chat and game IDs. If you've changed game or chat usernames, please contact an administrator for help." - + // Okay. We found them, they're in the DB, and they have no discord ID set. var/message = "A request has been sent from Discord to validate your Byond username, by '[sender.friendly_name]' in '[sender.channel.friendly_name]'\
If you did not send this request, do not click the link below, and do notify an administrator in-game or on Discord ASAP.\ @@ -115,13 +133,26 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations) // To stifle href hacking GLOB.pending_discord_registrations.len++ GLOB.pending_discord_registrations[GLOB.pending_discord_registrations.len] = list("ckey" = key_to_find, "id" = sender.id, "time" = world.realtime) - + return "[sender.friendly_name], I've sent you a message in-game. Please verify your username there to complete your registration within 10 minutes." //YW Commands //Status /datum/tgs_chat_command/status/Run(datum/tgs_chat_user/sender, params) - return "Current server status:**Players:** [TGS_CLIENT_COUNT]\n**Round Duration:** [roundduration2text()]" + var/counts = 0 + var/afks = 0 + var/active = 0 + + for(var/X in GLOB.clients) + var/client/C = X + if(C) + counts++ + if(C.is_afk()) + afks++ + else + active++ + + return "Current server status: **Players:** [counts]\n**Active:** [active]\n**AFK:** [afks]\n\n**Round Duration:** [roundduration2text()]" // - FAX /datum/tgs_chat_command/readfax @@ -134,4 +165,4 @@ GLOBAL_LIST_EMPTY(pending_discord_registrations) var/list/all_params = splittext(params, " ") var/faxid = all_params[1] var/faxmsg = return_file_text("[config.fax_export_dir]/fax_[faxid].html") - return "FAX: ```[strip_html_properly(faxmsg)]```" \ No newline at end of file + return "FAX: ```[strip_html_properly(faxmsg)]```" diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 6ffdd0cca5..6904014e2d 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -50,6 +50,7 @@ var/emote_time = 60 // How long between stomach emotes at prey (in seconds) var/emote_active = TRUE // Are we even giving emotes out at all or not? var/next_emote = 0 // When we're supposed to print our next emote, as a world.time + var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to? // Generally just used by AI var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location @@ -58,7 +59,7 @@ //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes - var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG) + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_SELECT,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG) //Digest mode addon flags var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY, "Affect Worn Items" = DM_FLAG_AFFECTWORN, "Jams Sensors" = DM_FLAG_JAMSENSORS, "Complete Absorb" = DM_FLAG_FORCEPSAY) //Item related modes @@ -200,6 +201,7 @@ "emote_lists", "emote_time", "emote_active", + "selective_preference", "mode_flags", "item_digest_mode", "contaminates", @@ -1128,6 +1130,7 @@ dupe.egg_type = egg_type dupe.emote_time = emote_time dupe.emote_active = emote_active + dupe.selective_preference = selective_preference dupe.save_digest_mode = save_digest_mode //// Object-holding variables diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index 8e3ec8a1fe..6eb115e044 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -218,3 +218,40 @@ GLOBAL_LIST_INIT(digest_modes, list()) B.ownegg = null return list("to_update" = TRUE) return + +/datum/digest_mode/selective //unselectable, "smart" digestion mode for mobs only + id = DM_SELECT + +/datum/digest_mode/selective/process_mob(obj/belly/B, mob/living/L) + var/datum/digest_mode/tempmode = GLOB.digest_modes[DM_HOLD] // Default to Hold in case of big oof fallback + //if not absorbed, see if they're food + switch(L.selective_preference) // First, we respect prey prefs + if(DM_DIGEST) + if(L.digestable) + tempmode = GLOB.digest_modes[DM_DIGEST] // They want to be digested and can be, Digest + else + tempmode = GLOB.digest_modes[DM_DRAIN] // They want to be digested but can't be! Drain. + if(DM_ABSORB) + if(L.absorbable) + tempmode = GLOB.digest_modes[DM_ABSORB] // They want to be absorbed and can be. Absorb. + else + tempmode = GLOB.digest_modes[DM_DRAIN] // They want to be absorbed but can't be! Drain. + if(DM_DRAIN) + tempmode = GLOB.digest_modes[DM_DRAIN] // They want to be drained. Drain. + if(DM_DEFAULT) + switch(B.selective_preference) // They don't actually care? Time for our own preference. + if(DM_DIGEST) + if(L.digestable) + tempmode = GLOB.digest_modes[DM_DIGEST] // We prefer digestion and they're digestible? Digest + else if(L.absorbable) + tempmode = GLOB.digest_modes[DM_ABSORB] // If not digestible, are they absorbable? Then absorb. + else + tempmode = GLOB.digest_modes[DM_DRAIN] // Otherwise drain. + if(DM_ABSORB) + if(L.absorbable) + tempmode = GLOB.digest_modes[DM_ABSORB] // We prefer absorption and they're absorbable? Absorb. + else if(L.digestable) + tempmode = GLOB.digest_modes[DM_DIGEST] // If not absorbable, are they digestible? Then digest. + else + tempmode = GLOB.digest_modes[DM_DRAIN] // Otherwise drain. + return tempmode.process_mob(B, L) diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index b26a7a4693..e2c244be53 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -106,7 +106,7 @@ if(emote_active) var/list/EL = emote_lists[digest_mode] - if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD]))) && next_emote <= world.time) + if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD])) || (digest_mode == DM_SELECT && (LAZYLEN(emote_lists[DM_HOLD])||LAZYLEN(emote_lists[DM_DIGEST])||LAZYLEN(emote_lists[DM_ABSORB])) )) && next_emote <= world.time) var/living_count = 0 var/absorbed_count = 0 for(var/mob/living/L in contents) @@ -127,7 +127,14 @@ if(formatted_message) to_chat(M, "[formatted_message]") else - if(digest_mode == DM_DIGEST && !M.digestable) + if (digest_mode == DM_SELECT) + if (M.digestable) + EL = emote_lists[DM_DIGEST] + else if (M.absorbable) + EL = emote_lists[DM_ABSORB] + else + EL = emote_lists[DM_HOLD] + else if(digest_mode == DM_DIGEST && !M.digestable) EL = emote_lists[DM_HOLD] // Use Hold's emote list if we're indigestible var/raw_message = pick(EL) diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 3e76a34101..3783f888d7 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -9,6 +9,9 @@ var/obj/item/device/pda/P = src if(P.id) P.id = null + + for(var/mob/living/voice/V in possessed_voice) // Delete voices. + V.Destroy() //Destroy the voice. for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion M.forceMove(item_storage) for(var/obj/item/O in contents) @@ -40,6 +43,8 @@ var/obj/item/device/pda/P = src if(P.id) P.id = null + for(var/mob/living/voice/V in possessed_voice) // Delete voices. + V.Destroy() //Destroy the voice. for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion M.forceMove(item_storage) for(var/obj/item/O in contents) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 0c1ac09b5e..f3cbb2b5a3 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -45,6 +45,7 @@ var/adminbus_eat_minerals = FALSE // This creature subsists on a diet of pure adminium. var/vis_height = 32 // Sprite height used for resize features. var/show_vore_fx = TRUE // Show belly fullscreens + var/selective_preference = DM_DEFAULT // Preference for selective bellymode var/regen_sounds = list( 'sound/effects/mob_effects/xenochimera/regen_1.ogg', 'sound/effects/mob_effects/xenochimera/regen_2.ogg', @@ -55,8 +56,8 @@ var/nutrition_message_visible = TRUE var/list/nutrition_messages = list( - "They are starving! You can hear their stomach snarling from across the room!" = 1, - "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach." = 2, + "They are starving! You can hear their stomach snarling from across the room!", + "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach.", "", "They have a stuffed belly, bloated fat and round from eating too much.", "They have a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.", @@ -263,6 +264,7 @@ P.vore_smell = src.vore_smell P.permit_healbelly = src.permit_healbelly P.noisy = src.noisy + P.selective_preference = src.selective_preference P.show_vore_fx = src.show_vore_fx P.can_be_drop_prey = src.can_be_drop_prey P.can_be_drop_pred = src.can_be_drop_pred @@ -307,6 +309,7 @@ vore_taste = P.vore_taste vore_smell = P.vore_smell permit_healbelly = P.permit_healbelly + selective_preference = P.selective_preference noisy = P.noisy show_vore_fx = P.show_vore_fx can_be_drop_prey = P.can_be_drop_prey @@ -508,8 +511,23 @@ crystal.bound_mob = null crystal.bound_mob = capture_crystal = 0 log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [crystal] owned by [crystal.owner]. [ADMIN_FLW(src)]") + + //You've been turned into an item! + else if(tf_mob_holder && istype(src, /mob/living/voice) && istype(src.loc, /obj/item)) + var/obj/item/item_to_destroy = src.loc //If so, let's destroy the item they just TF'd out of. + if(istype(src.loc, /obj/item/clothing)) //Are they in clothes? Delete the item then revert them. + qdel(item_to_destroy) + log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into an object.") + revert_mob_tf() + else //Are they in any other type of object? If qdel is done first, the mob is deleted from the world. + forceMove(get_turf(src)) + qdel(item_to_destroy) + log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into an object.") + revert_mob_tf() + + //You've been turned into a mob! else if(tf_mob_holder) - log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into another mob. [ADMIN_FLW(src)]") + log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into another mob.") revert_mob_tf() //Don't appear to be in a vore situation else @@ -1013,6 +1031,7 @@ dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
" dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
" dispvoreprefs += "Healbelly permission: [permit_healbelly ? "Allowed" : "Disallowed"]
" + dispvoreprefs += "Selective Mode Pref: [src.selective_preference]
" dispvoreprefs += "Spontaneous vore prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
" dispvoreprefs += "Spontaneous vore pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
" dispvoreprefs += "Drop Vore: [drop_vore ? "Enabled" : "Disabled"]
" diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index b4d4ef8c7b..ab5ec6bd96 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -70,11 +70,13 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/vore_taste = "nothing in particular" var/vore_smell = "nothing in particular" + var/selective_preference = DM_DEFAULT + var/nutrition_message_visible = TRUE var/list/nutrition_messages = list( - "They are starving! You can hear their stomach snarling from across the room!" = 1, - "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach." = 2, + "They are starving! You can hear their stomach snarling from across the room!", + "They are extremely hungry. A deep growl occasionally rumbles from their empty stomach.", "", "They have a stuffed belly, bloated fat and round from eating too much.", "They have a rotund, thick gut. It bulges from their body obscenely, close to sagging under its own weight.", @@ -168,6 +170,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE vore_smell = json_from_file["vore_smell"] permit_healbelly = json_from_file["permit_healbelly"] noisy = json_from_file["noisy"] + selective_preference = json_from_file["selective_preference"] show_vore_fx = json_from_file["show_vore_fx"] can_be_drop_prey = json_from_file["can_be_drop_prey"] can_be_drop_pred = json_from_file["can_be_drop_pred"] @@ -201,6 +204,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE allowmobvore = TRUE if(isnull(permit_healbelly)) permit_healbelly = TRUE + if(isnull(selective_preference)) + selective_preference = DM_DEFAULT if (isnull(noisy)) noisy = FALSE if(isnull(show_vore_fx)) @@ -274,6 +279,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE "vore_smell" = vore_smell, "permit_healbelly" = permit_healbelly, "noisy" = noisy, + "selective_preference" = selective_preference, "show_vore_fx" = show_vore_fx, "can_be_drop_prey" = can_be_drop_prey, "can_be_drop_pred" = can_be_drop_pred, diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 904933c071..f39bb66e13 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -181,6 +181,7 @@ "shrink_grow_size" = selected.shrink_grow_size, "emote_time" = selected.emote_time, "emote_active" = selected.emote_active, + "selective_preference" = selected.selective_preference, "nutrition_ex" = host.nutrition_message_visible, "weight_ex" = host.weight_message_visible, "belly_fullscreen" = selected.belly_fullscreen, @@ -487,6 +488,14 @@ host.stumble_vore = !host.stumble_vore unsaved_changes = TRUE return TRUE + if("switch_selective_mode_pref") + host.selective_preference = tgui_input_list(usr, "What would you prefer happen to you with selective bellymode?","Selective Bellymode", list(DM_DEFAULT, DM_DIGEST, DM_ABSORB, DM_DRAIN)) + if(!(host.selective_preference)) + host.selective_preference = DM_DEFAULT + if(host.client.prefs_vr) + host.client.prefs_vr.selective_preference = host.selective_preference + unsaved_changes = TRUE + return TRUE if("toggle_nutrition_ex") host.nutrition_message_visible = !host.nutrition_message_visible unsaved_changes = TRUE @@ -1079,6 +1088,12 @@ if("b_emoteactive") host.vore_selected.emote_active = !host.vore_selected.emote_active . = TRUE + if("b_selective_mode_pref_toggle") + if(host.vore_selected.selective_preference == DM_DIGEST) + host.vore_selected.selective_preference = DM_ABSORB + else + host.vore_selected.selective_preference = DM_DIGEST + . = TRUE if("b_emotetime") var/new_time = tgui_input_number(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute, 600, 60) if(new_time == null) diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm index dc9e503cd1..d1d2b23a52 100644 --- a/code/modules/vore/mouseray.dm +++ b/code/modules/vore/mouseray.dm @@ -230,6 +230,7 @@ new_mob.allowmobvore = allowmobvore new_mob.permit_healbelly = permit_healbelly new_mob.noisy = noisy + new_mob.selective_preference = selective_preference new_mob.drop_vore = drop_vore new_mob.stumble_vore = stumble_vore new_mob.slip_vore = slip_vore @@ -268,6 +269,22 @@ tf_admin_pref_override = FALSE /obj/item/projectile/beam/mouselaser/reversion/on_hit(var/atom/target) + if(istype(target,/obj/item)) //Are we shooting an item? + var/obj/item/O = target + if(O.possessed_voice.len) //Does the object have a voice? AKA, if someone inhabiting it? + for(var/mob/living/M in O.possessed_voice) + if(M.tf_mob_holder) //Is this item possessed by IC methods? + if(istype(M.loc, /obj/item/clothing)) //Are they in clothes? Delete the item then revert them. + qdel(O) + M.revert_mob_tf() //Voices can't eat, so this is the least intensive way to revert them. + else + M.forceMove(get_turf(O)) //Non-clothing items require a bit extra work since they don't drop contents when qdeleted. + qdel(O) + M.revert_mob_tf() + else + continue //In case they have multiple voices through adminbus. + else + return var/mob/living/M = target if(!istype(M)) return diff --git a/code/modules/xenoarcheaology/artifacts/artifact_find.dm b/code/modules/xenoarcheaology/artifacts/artifact_find.dm index fe91bbadbc..dcbe6bea84 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact_find.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact_find.dm @@ -13,6 +13,7 @@ 25;/obj/machinery/power/supermatter/shard, 100;/obj/machinery/auto_cloner, 100;/obj/machinery/giga_drill, - 100;/obj/machinery/replicator, + 100;/obj/machinery/replicator/clothing, //VOREStation Edit: use virgo-specific subtype that allows TF into items. + 100;/obj/machinery/replicator/vore, //VOREStation Edit: use virgo-specific subtype that allows TF into mobs. 150;/obj/structure/crystal, 1000;/obj/machinery/artifact) diff --git a/code/modules/xenoarcheaology/artifacts/replicator_vr.dm b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm new file mode 100644 index 0000000000..8fc3dba9b4 --- /dev/null +++ b/code/modules/xenoarcheaology/artifacts/replicator_vr.dm @@ -0,0 +1,598 @@ + +////////////////////////////// +//////VORE-MOB REPLICATOR///// +////////////////////////////// +/obj/machinery/replicator/vore + name = "alien machine" + desc = "It's some kind of pod with strange wires and gadgets all over it. This one appears to have a humanoid shaped slot as an input. It has depictions of various creatures on the buttons." //Explain to the user that it turns people into mobs. + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "borgcharger0(old)" + var/quantity = 18 //This needs to be replaced with a GUI that lets you select the item you want. + var/list/created_mobs = list() + var/list/tgui_vore_selection = list() + var/list/viable_mobs = list( + /mob/living/simple_mob/animal/passive/fox, + /mob/living/simple_mob/animal/passive/cow, + /mob/living/simple_mob/animal/passive/chicken, + /mob/living/simple_mob/animal/passive/opossum, + /mob/living/simple_mob/animal/passive/mouse, + /mob/living/simple_mob/vore/rabbit, + /mob/living/simple_mob/animal/goat, + /mob/living/simple_mob/animal/sif/tymisian, + /mob/living/simple_mob/animal/wolf/direwolf, + /mob/living/simple_mob/otie/friendly, + /mob/living/simple_mob/vore/alienanimals/catslug, + /mob/living/simple_mob/vore/alienanimals/teppi, + /mob/living/simple_mob/vore/fennec, + /mob/living/simple_mob/vore/xeno_defanged, + /mob/living/simple_mob/vore/redpanda/fae, + /mob/living/simple_mob/vore/aggressive/rat, + /mob/living/simple_mob/vore/aggressive/panther, + /mob/living/simple_mob/vore/aggressive/frog + ) + //Mostly friendly mobs, but occasionally some dangerous ones. + //So if xenoarch isn't careful and is just shoving items willy-nilly without taking the proper precautions they can end up in a bit of trouble! + + +/obj/machinery/replicator/vore/New() //This replicator turns people into mobs! + ..() //TODO: Someone can replace the 'alien' interface with something neater sometime. It is simply out of my abilities at the current moment. + + for(var/i=0, i max_spawn_time) + src.visible_message("\icon[src][bicon(src)] [src] pings!") + + var/obj/source_material = pop(stored_materials) + var/spawn_type = pop(spawning_types) + var/mob/living/simple_mob/new_mob = new spawn_type(src.loc) //The MOB that's spawned in. + + if(source_material) + if(length(source_material.name) < MAX_MESSAGE_LEN) + new_mob.name = "[source_material] " + new_mob.name + if(length(source_material.desc) < MAX_MESSAGE_LEN * 2) + if(new_mob.desc) + new_mob.desc += " It is made of [source_material]." + else + new_mob.desc = "It is made of [source_material]." + //Did they use an item? If so, we're done here. + + //Did they put a micro in it? + if(istype(source_material,/obj/item/weapon/holder/micro)) + var/obj/item/weapon/holder/micro/micro_holder = source_material + var/mob/mob_to_be_changed = micro_holder.held_mob + var/mob/living/M = mob_to_be_changed + //Start of mob code shamelessly ripped from mouseray + new_mob.faction = M.faction + + if(new_mob && isliving(new_mob)) + for(var/obj/belly/B as anything in new_mob.vore_organs) + new_mob.vore_organs -= B + qdel(B) + new_mob.vore_organs = list() + new_mob.name = M.name + new_mob.real_name = M.real_name + for(var/lang in M.languages) + new_mob.languages |= lang + M.copy_vore_prefs_to_mob(new_mob) + new_mob.vore_selected = M.vore_selected + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(ishuman(new_mob)) + var/mob/living/carbon/human/N = new_mob + N.gender = H.gender + N.identifying_gender = H.identifying_gender + else + new_mob.gender = H.identifying_gender + else + new_mob.gender = M.gender + if(ishuman(new_mob)) + var/mob/living/carbon/human/N = new_mob + N.identifying_gender = M.gender + + for(var/obj/belly/B as anything in M.vore_organs) + B.loc = new_mob + B.forceMove(new_mob) + B.owner = new_mob + M.vore_organs -= B + new_mob.vore_organs += B + + new_mob.ckey = M.ckey + if(M.ai_holder && new_mob.ai_holder) + var/datum/ai_holder/old_AI = M.ai_holder + old_AI.set_stance(STANCE_SLEEP) + var/datum/ai_holder/new_AI = new_mob.ai_holder + new_AI.hostile = old_AI.hostile + new_AI.retaliate = old_AI.retaliate + M.loc = new_mob + M.forceMove(new_mob) + new_mob.tf_mob_holder = M + ///End of mobcode. + qdel(source_material) + M.forceMove(new_mob) + + //Did they put a person in it? + else if(istype(source_material,/mob/living)) + var/mob/living/M = source_material + //Start of mob code shamelessly ripped from mouseray + new_mob.faction = M.faction + + if(new_mob && isliving(new_mob)) + for(var/obj/belly/B as anything in new_mob.vore_organs) + new_mob.vore_organs -= B + qdel(B) + new_mob.vore_organs = list() + new_mob.name = M.name + new_mob.real_name = M.real_name + for(var/lang in M.languages) + new_mob.languages |= lang + M.copy_vore_prefs_to_mob(new_mob) + new_mob.vore_selected = M.vore_selected + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(ishuman(new_mob)) + var/mob/living/carbon/human/N = new_mob + N.gender = H.gender + N.identifying_gender = H.identifying_gender + else + new_mob.gender = H.identifying_gender + else + new_mob.gender = M.gender + if(ishuman(new_mob)) + var/mob/living/carbon/human/N = new_mob + N.identifying_gender = M.gender + + for(var/obj/belly/B as anything in M.vore_organs) + B.loc = new_mob + B.forceMove(new_mob) + B.owner = new_mob + M.vore_organs -= B + new_mob.vore_organs += B + + new_mob.ckey = M.ckey + if(M.ai_holder && new_mob.ai_holder) + var/datum/ai_holder/old_AI = M.ai_holder + old_AI.set_stance(STANCE_SLEEP) + var/datum/ai_holder/new_AI = new_mob.ai_holder + new_AI.hostile = old_AI.hostile + new_AI.retaliate = old_AI.retaliate + M.loc = new_mob + M.forceMove(new_mob) + new_mob.tf_mob_holder = M + ///End of mobcode. + + + spawn_progress_time = 0 + max_spawn_time = rand(30,100) + + if(!spawning_types.len || !stored_materials.len) + update_use_power(USE_POWER_IDLE) + icon_state = "borgcharger0(old)" + + else if(prob(5)) + src.visible_message("\icon[src][bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].") + + last_process_time = world.time + + +/obj/machinery/replicator/vore/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W,item_vore_blacklist)) //No armblades, no putting possessed items in it! + to_chat(user, "You cannot put \the [W] into the machine.") + return + if(istype(W, /obj/item/weapon/holder/micro)) //Are you putting a micro in it? + var/obj/item/weapon/holder/micro/micro_holder = W + var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob. + if(!inserted_mob.allow_spontaneous_tf) //Do they allow TF? + to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))") + return + if(inserted_mob.stat == DEAD) //Hey medical... + to_chat(user, "[W] is dead.") + return + if(inserted_mob.tf_mob_holder) + to_chat(user, "[W] must be in their original form.") + return + if(inserted_mob.client) + var/response //Let's see if they are SURE they accept the fact they will be a clothing, plushie, or something else. + response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine will turn you into one of the various types of mobs in the game.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain")) + if(response != "Certain") //If they don't agree, stop. + to_chat(user, "[W] stops you from placing them in the machine.") + return + else //If they /do/ agree, give them one last chance. + response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into a mob?", "WARNING: FINAL CHANCE!", list("No", "Certain")) + if(response != "Certain") + to_chat(user, "[W] stops you from placing them in the machine.") + return + if(istype(inserted_mob, /mob/living/voice) || W.loc == src) //Sanity. + return + log_and_message_admins("[user] has just placed [inserted_mob] into a mob transformation machine.", user) + else + to_chat(user, "You cannot put \the [W] into the machine. ((The micro must be connected to the server.))") + return + else if(istype(W,/obj/item/weapon/grab)) //Is someone being shoved into the machine? + var/obj/item/weapon/grab/the_grab = W + var/mob/living/inserted_mob = the_grab.affecting //Get the mob that is grabbed. + if(!inserted_mob.allow_spontaneous_tf) + to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))") + return + if(inserted_mob.stat == DEAD) + to_chat(user, "[W] is dead.") + return + if(inserted_mob.tf_mob_holder) + to_chat(user, "[W] must be in their original form.") + return + if(inserted_mob.client) + var/response + response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine will turn you into one of the various types of mobs in the game.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain")) + if(response != "Certain") + to_chat(user, "[W] stops you from placing them in the machine.") + return + else + response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into a mob?", "WARNING: FINAL CHANCE!", list("No", "Certain")) + if(response != "Certain") + to_chat(user, "[W] stops you from placing them in the machine.") + return + if(istype(inserted_mob, /mob/living/voice) || W.loc == src) + return + log_and_message_admins("[user] has just placed [inserted_mob] into a mob transformation machine.", user) + user.drop_item() //Dropping a grab destroys it. + //Grabs require a bit of extra work. + //We want them to drop their clothing/items as well. + if(istype(inserted_mob, /mob/living/carbon/human)) //So, this WORKS. Works very well! + var/mob/living/carbon/human/inserted_human = inserted_mob + for(var/obj/item/I in inserted_mob) + if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif)) + continue + inserted_human.drop_from_inventory(I) + inserted_mob.loc = src + stored_materials.Add(inserted_mob) + src.visible_message("\The [user] inserts \the [inserted_mob] into \the [src].") + return + else + to_chat(user, "You cannot put \the [W] into the machine. ((The micro must be connected to the server.))") + return + else if(istype(W, /obj/item/weapon/holder/mouse)) //No you can't turn your army of mice into giant rats. + to_chat(user, "You cannot put \the [W] into the machine. The machine reads 'NOT ENOUGH BIOMASS'.") + return + user.drop_item() //Put the micro on the floor (or drop the item) + if(istype(W, /obj/item/weapon/holder/micro)) //I hate this but it's the only way to get their stuff to drop. + var/obj/item/weapon/holder/micro/micro_holder = W + var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob. + if(istype(inserted_mob, /mob/living/carbon/human)) //Only humans have the drop_from_inventory proc. + var/mob/living/carbon/human/inserted_human = inserted_mob + for(var/obj/item/I in inserted_human) //Drop any remaining items! This only really seems to affect hands. + if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif)) + continue + inserted_human.drop_from_inventory(I) + //Now that we've dropped all the items they have, let's shove them back into the micro holder. + W.loc = src + stored_materials.Add(W) + src.visible_message("\The [user] inserts \the [W] into \the [src].") + +/obj/machinery/replicator/vore/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + data["tgui_construction"] = tgui_vore_selection + return data + +/obj/machinery/replicator/vore/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return TRUE + + switch(action) + if("construct") + var/key = params["key"] + if(key in created_mobs) + if(LAZYLEN(stored_materials) > LAZYLEN(spawning_types)) + if(LAZYLEN(spawning_types)) + visible_message("\icon[src][bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].") + else + visible_message("\icon[src][bicon(src)] [src]'s front compartment slides shut.") + spawning_types.Add(created_mobs[key]) + spawn_progress_time = 0 + update_use_power(USE_POWER_ACTIVE) + icon_state = "borgcharger1(old)" + else + visible_message(fail_message) + + +/obj/machinery/replicator/clothing/tgui_interact(mob/user, datum/tgui/ui) //This creates the menu. + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "XenoarchReplicator_voremob_vr", name) + ui.open() + + + + + +////////////////////////////// +//////CLOTHING REPLICATOR///// +////////////////////////////// + +/obj/machinery/replicator/clothing + name = "alien machine" + desc = "It's some kind of pod with strange wires and gadgets all over it. This one appears to have a humanoid shaped slot as an input and images of various objects on the buttons." //This hole was made for me! + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "borgcharger0(old)" + var/quantity = 35 //This needs to be replaced with a GUI that lets you select the item you want. + var/list/created_items = list() + var/list/tgui_vore_selection = list() + var/list/viable_items = list( + /obj/item/clothing/gloves/ring, + /obj/item/clothing/gloves/evening, + /obj/item/clothing/gloves/black, + /obj/item/clothing/under/swimsuit/black, + /obj/item/clothing/under/shorts/black, + /obj/item/clothing/under/wetsuit_skimpy, + /obj/item/clothing/under/dress/maid, + /obj/item/clothing/under/fluff/latexmaid, + /obj/item/clothing/suit/oversize, + /obj/item/clothing/suit/kimono/red, + /obj/item/clothing/suit/storage/fluff/loincloth, + /obj/item/toy/plushie/lizardplushie/kobold, + /obj/item/toy/plushie/borgplushie/medihound, + /obj/item/toy/plushie/marble_fox, + /obj/item/toy/plushie/lizard, + /obj/item/toy/plushie/tuxedo_cat, + /obj/item/clothing/head/pin/flower, + /obj/item/clothing/head/wizard, + /obj/item/clothing/head/wizard/marisa, + /obj/item/clothing/head/beret, + /obj/item/clothing/head/that, + /obj/item/clothing/head/bowler, + /obj/item/clothing/shoes/hitops/red, + /obj/item/clothing/shoes/boots/jackboots, + /obj/item/clothing/shoes/boots/workboots, + /obj/item/clothing/shoes/boots/workboots/toeless, + /obj/item/clothing/shoes/flipflop, + /obj/item/clothing/shoes/boots/duty, + /obj/item/clothing/shoes/footwraps, + /obj/item/weapon/storage/smolebrickcase, + /obj/item/weapon/lipstick, + /obj/item/weapon/material/fishing_rod/modern, + /obj/item/weapon/inflatable_duck, + /obj/item/toy/syndicateballoon, + /obj/item/weapon/towel, + /obj/item/weapon/bedsheet/rainbowdouble + ) // Currently: 3 gloves, 5 undersuits, 3 oversuits, 5 plushies, 5 headwear, 7 shoes, 7 misc. = 35 + //Fishing hat was going to be added, but it was simply too powerful for this world. + +/obj/machinery/replicator/clothing/New() //The specific thing about the VORE replicator is that it will only contain obj/items. Only things that can be picked up, used, and worn! + ..() //TODO: Someone can replace the 'alien' interface with something neater sometime. It is simply out of my abilities at the current moment. + + for(var/i=0, i max_spawn_time) + src.visible_message("\icon[src][bicon(src)] [src] pings!") + + var/obj/source_material = pop(stored_materials) + var/spawn_type = pop(spawning_types) + var/obj/item/spawned_obj = new spawn_type(src.loc) + var/obj/item/original_name = spawned_obj.name //Get the item's name before it's prefixed. Used for micro code. + if(source_material) + if(length(source_material.name) < MAX_MESSAGE_LEN) + spawned_obj.name = "[source_material] " + spawned_obj.name + if(length(source_material.desc) < MAX_MESSAGE_LEN * 2) + if(spawned_obj.desc) + spawned_obj.desc += " It is made of [source_material]." + else + spawned_obj.desc = "It is made of [source_material]." + if(istype(source_material,/obj/item/weapon/holder/micro)) + var/obj/item/weapon/holder/micro/micro_holder = source_material //Tells the machine that a micro is the material being used + var/mob/mob_to_be_changed = micro_holder.held_mob //Get the mob. + var/mob/living/M = mob_to_be_changed + M.release_vore_contents(TRUE, TRUE) //Release their stomach contents. Don't spam the chat, either. + spawned_obj.inhabit_item(M, original_name, M) //Take the spawned mob and call the TF proc on it. + var/mob/living/possessed_voice = spawned_obj.possessed_voice //Get the possessed voice. + qdel(source_material) //Deletes the micro holder, we don't need it anymore. + spawned_obj.trash_eatable = M.devourable //Can this item be eaten? Let's decide based on the person's prefs! + spawned_obj.unacidable = !M.digestable //Can this item be digested? + M.forceMove(possessed_voice) //Places them in the 'voice' for later recovery! Essentially: The item contains a 'possessed voice' mob, which contains their original mob. + + + else if(istype(source_material,/mob/living))//Did they shove a person in there normally? + var/mob/living/M = source_material //If so, this cuts down the work we have to do! + M.release_vore_contents(TRUE, TRUE) //Release their stomach contents. Don't spam the chat, either. + spawned_obj.inhabit_item(M, original_name, M) + var/mob/living/possessed_voice = spawned_obj.possessed_voice + spawned_obj.trash_eatable = M.devourable + spawned_obj.unacidable = !M.digestable + M.forceMove(possessed_voice) + + + spawn_progress_time = 0 + max_spawn_time = rand(30,100) + + if(!spawning_types.len || !stored_materials.len) + update_use_power(USE_POWER_IDLE) + icon_state = "borgcharger0(old)" + + else if(prob(5)) + src.visible_message("\icon[src][bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].") + + last_process_time = world.time + +/obj/machinery/replicator/clothing/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + if(!W.canremove || !user.canUnEquip(W) || W.possessed_voice || is_type_in_list(W,item_vore_blacklist)) //No armblades, no putting already possessed items in it! + to_chat(user, "You cannot put \the [W] into the machine.") + return + if(istype(W, /obj/item/weapon/holder/micro) || istype(W, /obj/item/weapon/holder/mouse)) //Are you putting a micro/mouse in it? + var/obj/item/weapon/holder/micro/micro_holder = W + var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob. + if(!inserted_mob.allow_spontaneous_tf) //Do they allow TF? + to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))") + return + if(inserted_mob.stat == DEAD) //Hey medical... + to_chat(user, "[W] is dead.") + return + if(inserted_mob.tf_mob_holder) //No recursion!!! + to_chat(user, "[W] must be in their original form.") + return + if(inserted_mob.client) + var/response //Let's see if they are SURE they accept the fact they will be a clothing, plushie, or something else. + response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine can turn you into various clothing, footwear, plushies, and other miscellaneous objects. This means that more likely than not, you will be used as whatever object is used. Make certain your preferences align with this possibility.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain")) + if(response != "Certain") //If they don't agree, stop. + to_chat(user, "[W] stops you from placing them in the machine.") + return + else //If they /do/ agree, give them one last chance. + response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into an object and have the possibility of being used as such?", "WARNING: FINAL CHANCE!", list("No", "I accept the possibilities")) + if(response != "I accept the possibilities") + to_chat(user, "[W] stops you from placing them in the machine.") + return + if(istype(inserted_mob, /mob/living/voice) || W.loc == src) //This is a sanity check to keep them from entering it multiple times. + return + log_and_message_admins("[user] has just placed [inserted_mob] into an item transformation machine.", user) + else + to_chat(user, "You cannot put \the [W] into the machine. ((The micro must be connected to the server.))") + return + else if(istype(W,/obj/item/weapon/grab)) //Is someone being shoved into the machine? + var/obj/item/weapon/grab/the_grab = W + var/mob/living/inserted_mob = the_grab.affecting //Get the mob that is grabbed. + if(!inserted_mob.allow_spontaneous_tf) + to_chat(user, "You cannot put \the [W] into the machine. ((The prefs of the micro forbid this action.))") + return + if(inserted_mob.stat == DEAD) + to_chat(user, "[W] is dead.") + return + if(inserted_mob.tf_mob_holder) + to_chat(user, "[W] must be in their original form.") + return + if(inserted_mob.client) + var/response + response = tgui_alert(inserted_mob, "Are you -sure- you want to be put in this machine?\n(This machine can turn you into various clothing, footwear, plushies, and other miscellaneous objects. This means that more likely than not, you will be used as whatever object is used. Make certain your preferences align with this possibility.)", "WARNING: Are you sure you want to be put in the machine and transformed?", list("No", "Certain")) + if(response != "Certain") + to_chat(user, "[W] stops you from placing them in the machine.") + return + else + response = tgui_alert(inserted_mob, "This is the last warning: Are you absolutely certain you want to be transformed into an object and have the possibility of being used as such?", "WARNING: FINAL CHANCE!", list("No", "I accept the possibilities")) + if(response != "I accept the possibilities") + to_chat(user, "[W] stops you from placing them in the machine.") + return + if(istype(inserted_mob, /mob/living/voice) || W.loc == src) + return + log_and_message_admins("[user] has just placed [inserted_mob] into an item transformation machine.", user) + user.drop_item() //Dropping a grab destroys it. + //Grabs require a bit of extra work. + //We want them to drop their clothing/items as well. + if(istype(inserted_mob, /mob/living/carbon/human)) //So, this WORKS. Works very well! + var/mob/living/carbon/human/inserted_human = inserted_mob + for(var/obj/item/I in inserted_mob) + if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif)) + continue + inserted_human.drop_from_inventory(I) + inserted_mob.loc = src + stored_materials.Add(inserted_mob) + src.visible_message("\The [user] inserts \the [inserted_mob] into \the [src].") + return + else + to_chat(user, "You cannot put \the [W] into the machine. ((They must be connected to the server.))") + return + + user.drop_item() //Put the micro on the floor (or drop the item) + if(istype(W, /obj/item/weapon/holder/micro)) //I hate this but it's the only way to get their stuff to drop. + var/obj/item/weapon/holder/micro/micro_holder = W + var/mob/living/inserted_mob = micro_holder.held_mob //Get the actual mob. + if(istype(inserted_mob, /mob/living/carbon/human)) //Only humans have the drop_from_inventory proc. + var/mob/living/carbon/human/inserted_human = inserted_mob + for(var/obj/item/I in inserted_human) //Drop any remaining items! This only really seems to affect hands. + if(istype(I, /obj/item/weapon/implant) || istype(I, /obj/item/device/nif)) + continue + inserted_human.drop_from_inventory(I) + //Now that we've dropped all the items they have, let's shove them back into the micro holder. + W.loc = src + stored_materials.Add(W) + src.visible_message("\The [user] inserts \the [W] into \the [src].") + + +/obj/machinery/replicator/clothing/tgui_interact(mob/user, datum/tgui/ui) //This creates the menu. + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "XenoarchReplicator_clothing_vr", name) //This is required to prevent UI contamination. + ui.open() + +/obj/machinery/replicator/clothing/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) //Gives data to the menu. + var/list/data = ..() + data["tgui_construction"] = tgui_vore_selection + return data + +/obj/machinery/replicator/clothing/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return TRUE + + switch(action) + if("construct") + var/key = params["key"] + if(key in created_items) + if(LAZYLEN(stored_materials) > LAZYLEN(spawning_types)) + if(LAZYLEN(spawning_types)) + visible_message("\icon[src][bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].") + else + visible_message("\icon[src][bicon(src)] [src]'s front compartment slides shut.") + spawning_types.Add(created_items[key]) + spawn_progress_time = 0 + update_use_power(USE_POWER_ACTIVE) + icon_state = "borgcharger1(old)" + else + visible_message(fail_message) \ No newline at end of file diff --git a/icons/mob/animal_vr.dmi b/icons/mob/animal_vr.dmi index 87b050acbc..75edbf2629 100644 Binary files a/icons/mob/animal_vr.dmi and b/icons/mob/animal_vr.dmi differ diff --git a/icons/mob/custom_synthetic_vr.dmi b/icons/mob/custom_synthetic_vr.dmi index 8c9cd318f7..4471407fa7 100644 Binary files a/icons/mob/custom_synthetic_vr.dmi and b/icons/mob/custom_synthetic_vr.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi b/icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi new file mode 100644 index 0000000000..7823146b3a Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/DSIFennec/dsi_fennec.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi b/icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi new file mode 100644 index 0000000000..c2b46c5b60 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/DSIZorren/dsi_zorren.dmi differ diff --git a/icons/obj/tools_vr.dmi b/icons/obj/tools_vr.dmi index 05de9a423a..576d69cfab 100644 Binary files a/icons/obj/tools_vr.dmi and b/icons/obj/tools_vr.dmi differ diff --git a/maps/gateway_vr/lucky_7.dmm b/maps/gateway_vr/lucky_7.dmm index c9e896b92f..a74d18d72d 100644 --- a/maps/gateway_vr/lucky_7.dmm +++ b/maps/gateway_vr/lucky_7.dmm @@ -48,6 +48,7 @@ "aV" = (/obj/machinery/light/floortube{dir = 8},/obj/structure/casino_table/roulette_chart,/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/casinofloor) "aW" = (/obj/structure/cable/green,/obj/machinery/power/fractal_reactor/fluff/smes,/turf/simulated/floor/plating,/area/awaymission/lucky7/maint2) "aX" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/yellow/border{dir = 10},/obj/machinery/telecomms/allinone/casino,/turf/simulated/floor/tiled,/area/awaymission/lucky7/workshop) +"aY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/storage/box/roulette_balls_normal,/obj/item/weapon/storage/box/roulette_balls_fancy,/obj/item/weapon/storage/box/roulette_balls_cheat,/obj/structure/table/rack/shelf,/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom) "ba" = (/obj/structure/table/borosilicate,/turf/simulated/floor/wood,/area/awaymission/lucky7/lounge) "bc" = (/obj/structure/cable/green{icon_state = "1-4"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/gateway) "be" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock1) @@ -705,7 +706,6 @@ "Gz" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom) "GA" = (/obj/effect/floor_decal/techfloor/orange{dir = 4},/obj/effect/floor_decal/techfloor/hole/right{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/awaymission/lucky7/gateway) "GE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning/cee{dir = 8},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/dock2) -"GH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/awaymission/lucky7/breakroom) "GJ" = (/turf/simulated/wall,/area/awaymission/lucky7/privategameroom/two) "GO" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/carpet/brown,/area/awaymission/lucky7/hotelhall) "GP" = (/obj/structure/table/glass,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 8},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/awaymission/lucky7/medical) @@ -1206,7 +1206,7 @@ rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmMwrf rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmDiDiDiDiDiDiDiDiDiDinAWEYkJLsTsTsTsTsTsTsTsTsTsTsTsTsTsTsTUWrAUWUWUWUWUWqFNlNlNlqFqFqFqFqFkxkxTuypypnhnhbpMdCGAGscsqGJTZnvWmxtwTfHZPQttYlLYYfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmDisHsSsZsZtdtvtHtMDiWRWEYkupsTeruyuzuIrprMsThhhhjPFNuOuvhhhhvavksTvNvTsTvUwbwewkwtqFImbXqFwGlwTuypypLEVwbpwLscQascxdGJNVxtqMxtrBfHLhlLtZlLwlfHrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOvOvOvODixqyoyHCCCCCCzazgSXzpWEYkobsTGSzqzEaWzRzYAxQKQKQKQKQKAFAFQKAXAFAxQKBeBmBEBHBTBVCiCnruCoqFmXmXTuypypvyvybprUscscscsqGJqYxtxtxtwTfHpPlLlLlLYYfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm -rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmididvOididrmvOrmDiCMCUCWCZCCCCDHYnEtXSEBYkCDsTcmECESEWFKFTsTFUFYhhFZhhFNjPGiGiGisThhWVsTSrGzKLSrGHqFGRHaqFypypTuypypypypbpRMHbHfHbRMGJfNNIoHNIfNfHFrHAHBHAFrfHvOidHFrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm +rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmididvOididrmvOrmDiCMCUCWCZCCCCDHYnEtXSEBYkCDsTcmECESEWFKFTsTFUFYhhFZhhFNjPGiGiGisThhWVsTSrGzKLSraYqFGRHaqFypypTuypypypypbpRMHbHfHbRMGJfNNIoHNIfNfHFrHAHBHAFrfHvOidHFrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmvOrmrmrmrmvOrmDixqCCCCCCCCHJCCHMSXHWJzXSJPJUKiKnbDKwKxKIkDkDkDKNKNKNKNKNKShhKYsThhGrsTqFLjqFqFqFqFqFqFqFmKmKOwmVmVmKmKbpbpbpbpbpbpGJGJGJGJGJGJfHfHfHfHfHfHfHrmrmidrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmrmvOrmrmrmrmvOrmDiaXLrLxLBLFMaMmMsDiMEMGYkMJsTMVMXMYNdNyNFkDQCNRNTOtOBOOKNPcOWPnsTjPLiKfPqPsPTPVQmQoGsQGKfmVQMOwmVmVkVmVQRmVQVRcRfmVRkmVkVRTRVmVmVmVmVkVmVmVmKrmrmvOrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm rmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmidrmrmKlKlNYNYNYKlKlKlKlKlKlKlKlKlKlKlYXYXsoSEWBsoYXYXYXYXSRTaTfkDyOyOThDhDhDhKNKNKNKNKNhhLiKfTyUbUdUfUgUgUgUgVamVVkahmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVmVVVrjrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrmrm diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm index 532017fe2f..2013b79de8 100644 --- a/maps/groundbase/gb-z1.dmm +++ b/maps/groundbase/gb-z1.dmm @@ -105,11 +105,8 @@ /turf/simulated/floor, /area/maintenance/groundbase/trashpit) "an" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/turf/simulated/wall/r_wall, +/area/groundbase/command/tcomms/chamber) "ao" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -642,8 +639,8 @@ /obj/machinery/alarm{ dir = 4 }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/turf/simulated/floor, +/area/maintenance/groundbase/substation/medcargo) "bC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, @@ -700,9 +697,26 @@ /obj/structure/closet/secure_closet/engineering_welding/double, /turf/simulated/floor/tiled, /area/groundbase/engineering/workshop) +"bI" = ( +/obj/machinery/porta_turret/stationary, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "bJ" = ( /turf/simulated/floor/outdoors/newdirt_nograss/virgo3c, /area/groundbase/level1/eastspur) +"bK" = ( +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "bL" = ( /obj/machinery/vending/loadout/accessory, /obj/item/device/radio/intercom{ @@ -731,6 +745,15 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/civilian/womensrestroom) +"bN" = ( +/obj/machinery/camera/network/command, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "bO" = ( /obj/structure/table/bench/steel, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -761,6 +784,14 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/office) +"bR" = ( +/obj/machinery/telecomms/hub/preset/groundbase, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "bS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -770,22 +801,13 @@ /turf/simulated/floor/tiled/white, /area/groundbase/medical/office) "bT" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8; - external_pressure_bound = 140; - external_pressure_bound_default = 140; - icon_state = "map_vent_out"; - pressure_checks = 0; - pressure_checks_default = 0; - use_power = 1 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; +/obj/machinery/telecomms/server/presets/common, +/turf/simulated/floor/tiled/dark{ nitrogen = 100; oxygen = 0; temperature = 80 }, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "bU" = ( /obj/machinery/light{ dir = 8 @@ -855,11 +877,13 @@ /turf/simulated/floor/tiled, /area/groundbase/engineering/engine) "cc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 +/obj/machinery/telecomms/broadcaster/preset_right/groundbase, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "cd" = ( /obj/structure/grille, /obj/machinery/door/firedoor/glass, @@ -891,14 +915,13 @@ /turf/simulated/floor/tiled, /area/groundbase/engineering/techstorage) "ch" = ( -/obj/machinery/atmospherics/binary/passive_gate/on{ - dir = 8 +/obj/machinery/pda_multicaster/prebuilt, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "ci" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/dark, @@ -934,6 +957,14 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/equipment) +"cm" = ( +/obj/machinery/telecomms/receiver/preset_right/groundbase, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "cn" = ( /obj/structure/table/reinforced, /obj/item/device/retail_scanner/security, @@ -983,6 +1014,14 @@ /obj/random/paicard, /turf/simulated/floor/tiled, /area/groundbase/civilian/toolstorage) +"cr" = ( +/obj/machinery/telecomms/server/presets/command, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "cs" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -992,9 +1031,26 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/groundbase/command/ai/robot) "ct" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + external_pressure_bound = 0; + external_pressure_bound_default = 0; + icon_state = "map_vent_in"; + initialize_directions = 1; + internal_pressure_bound = 4000; + internal_pressure_bound_default = 4000; + pressure_checks = 2; + pressure_checks_default = 2; + pump_direction = 0; + use_power = 1 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "cu" = ( /obj/item/weapon/storage/secure/briefcase/ml3m_pack_med, /obj/structure/table/reinforced, @@ -1021,14 +1077,16 @@ /turf/simulated/floor, /area/groundbase/security/armory) "cy" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/black, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, /turf/simulated/floor/bluegrid{ name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80 }, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "cz" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -1123,6 +1181,17 @@ }, /turf/simulated/floor/tiled/techmaint, /area/groundbase/engineering/atmos) +"cM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/obj/machinery/telecomms/server/presets/engineering, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "cN" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -1179,11 +1248,16 @@ /turf/simulated/floor/bluegrid, /area/groundbase/command/ai/storage) "cR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/hidden/black{ + dir = 1 }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "cS" = ( /obj/structure/bed/chair/office/light{ dir = 8 @@ -1257,20 +1331,39 @@ /turf/simulated/floor/tiled, /area/groundbase/engineering/techstorage) "cX" = ( -/obj/machinery/porta_turret/stationary, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/obj/machinery/telecomms/server/presets/medical, +/turf/simulated/floor/tiled/dark{ nitrogen = 100; oxygen = 0; temperature = 80 }, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "cY" = ( /obj/machinery/camera/network/medbay{ dir = 1 }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/or1) +"cZ" = ( +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8; + external_pressure_bound = 140; + external_pressure_bound_default = 140; + icon_state = "map_vent_out"; + pressure_checks = 0; + pressure_checks_default = 0; + use_power = 1 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "da" = ( /turf/simulated/floor/outdoors/sidewalk/slab/virgo3c, /area/groundbase/level1/northspur) @@ -1302,6 +1395,17 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/techfloor, /area/groundbase/civilian/arrivals) +"de" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "df" = ( /turf/simulated/mineral/cave/virgo3c, /area/groundbase/level1/eastspur) @@ -1317,6 +1421,14 @@ }, /turf/simulated/floor/outdoors/sidewalk/side/virgo3c, /area/groundbase/level1/centsquare) +"di" = ( +/obj/machinery/telecomms/server/presets/science, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "dj" = ( /obj/structure/table/marble, /obj/machinery/chemical_dispenser/bar_soft/full, @@ -1359,6 +1471,15 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/security/briefing) +"do" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black, +/obj/machinery/telecomms/server/presets/unused, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "dp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1378,12 +1499,31 @@ }, /turf/simulated/floor/carpet, /area/groundbase/security/detective) +"dr" = ( +/obj/machinery/telecomms/server/presets/security, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "ds" = ( /obj/structure/bed/chair/sofa/bench/right{ dir = 1 }, /turf/simulated/floor/outdoors/newdirt_nograss/virgo3c, /area/groundbase/level1/centsquare) +"dt" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "du" = ( /obj/structure/table/standard, /obj/item/stack/nanopaste, @@ -1395,6 +1535,14 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/or2) +"dv" = ( +/obj/machinery/telecomms/server/presets/service/groundbase, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "dw" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1418,16 +1566,13 @@ /turf/simulated/floor/bluegrid, /area/groundbase/command/ai/robot) "dy" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/black{ - dir = 1 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; +/obj/machinery/telecomms/processor/preset_two, +/turf/simulated/floor/tiled/dark{ nitrogen = 100; oxygen = 0; temperature = 80 }, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "dz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1636,6 +1781,14 @@ /obj/effect/map_effect/portal/line/side_a, /turf/simulated/floor/outdoors/grass/forest/virgo3c, /area/groundbase/level1/nw) +"dT" = ( +/obj/machinery/telecomms/bus/preset_two/groundbase, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "dU" = ( /obj/machinery/alarm, /turf/simulated/floor/tiled, @@ -1662,6 +1815,16 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/storage) +"dY" = ( +/obj/machinery/hologram/holopad, +/obj/machinery/atmospherics/pipe/simple/hidden/black, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "dZ" = ( /obj/structure/extinguisher_cabinet{ dir = 1; @@ -1817,11 +1980,13 @@ /turf/simulated/floor, /area/maintenance/groundbase/substation/aiciv) "eo" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 +/obj/machinery/telecomms/bus/preset_four, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "ep" = ( /obj/machinery/computer/secure_data, /turf/simulated/floor/tiled/dark, @@ -1859,6 +2024,22 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/engine) +"eu" = ( +/obj/machinery/telecomms/processor/preset_four, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) +"ev" = ( +/obj/machinery/telecomms/server/presets/supply, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "ew" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/black{ @@ -1878,6 +2059,23 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/civilian/bar) +"ez" = ( +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + external_pressure_bound = 140; + external_pressure_bound_default = 140; + icon_state = "map_vent_out"; + pressure_checks = 0; + pressure_checks_default = 0; + use_power = 1 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "eA" = ( /obj/structure/disposalpipe/segment{ dir = 2; @@ -1907,9 +2105,17 @@ /turf/simulated/floor/tiled, /area/groundbase/engineering/atmos) "eD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/obj/machinery/porta_turret/stationary, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "eE" = ( /obj/structure/flora/pottedplant, /obj/machinery/camera/network/security, @@ -1992,9 +2198,31 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/morgue) +"eQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/obj/machinery/ntnet_relay, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "eR" = ( /turf/simulated/floor/outdoors/grass/virgo3c, /area/groundbase/unexplored/outdoors) +"eS" = ( +/obj/machinery/telecomms/bus/preset_one, +/obj/machinery/atmospherics/pipe/manifold/hidden/black{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "eT" = ( /obj/structure/railing/grey{ dir = 4 @@ -2060,6 +2288,17 @@ }, /turf/simulated/floor/tiled/steel_ridged, /area/groundbase/command/ai/hall) +"fa" = ( +/obj/machinery/telecomms/processor/preset_one, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "fb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/dark, @@ -2068,6 +2307,15 @@ /obj/machinery/light, /turf/simulated/floor/tiled/dark, /area/groundbase/security/briefing) +"fd" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/black, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "fe" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/multi_tile/glass/polarized{ @@ -2109,13 +2357,16 @@ /turf/simulated/floor/tiled/white, /area/groundbase/medical/or1) "fi" = ( -/obj/machinery/telecomms/processor/preset_four, +/obj/machinery/telecomms/processor/preset_three, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, /turf/simulated/floor/tiled/dark{ nitrogen = 100; oxygen = 0; temperature = 80 }, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "fj" = ( /obj/structure/toilet{ dir = 8 @@ -2224,12 +2475,16 @@ }, /area/maintenance/groundbase/level1/nwtunnel) "fu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/machinery/telecomms/bus/preset_three, +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "fv" = ( /obj/machinery/computer/atmos_alert, /obj/machinery/requests_console/preset/engineering{ @@ -2293,6 +2548,19 @@ }, /turf/simulated/floor/bluegrid, /area/groundbase/command/ai/chamber) +"fF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black{ + dir = 4 + }, +/obj/machinery/exonet_node{ + anchored = 1 + }, +/turf/simulated/floor/tiled/dark{ + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "fG" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2314,20 +2582,26 @@ /turf/simulated/floor, /area/maintenance/groundbase/trashpit) "fJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/unary/freezer{ - dir = 1; - icon_state = "freezer_1"; - set_temperature = 73; +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8; + external_pressure_bound = 0; + external_pressure_bound_default = 0; + icon_state = "map_vent_in"; + initialize_directions = 1; + internal_pressure_bound = 4000; + internal_pressure_bound_default = 4000; + pressure_checks = 2; + pressure_checks_default = 2; + pump_direction = 0; use_power = 1 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "fK" = ( /obj/structure/table/bench/steel, /obj/structure/cable/yellow{ @@ -2344,6 +2618,15 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/storage) +"fM" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black, +/turf/simulated/floor/bluegrid{ + name = "Mainframe Base"; + nitrogen = 100; + oxygen = 0; + temperature = 80 + }, +/area/groundbase/command/tcomms/chamber) "fN" = ( /obj/structure/cable{ icon_state = "1-4" @@ -2353,6 +2636,12 @@ }, /turf/simulated/floor, /area/maintenance/groundbase/substation/secsci) +"fO" = ( +/obj/machinery/door/firedoor, +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor, +/area/groundbase/command/tcomms/chamber) "fP" = ( /obj/structure/cable{ icon_state = "2-4" @@ -2431,6 +2720,10 @@ alpha = 0 }, /area/groundbase/level1/ne) +"fW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/black, +/turf/simulated/wall/r_wall, +/area/groundbase/command/tcomms/chamber) "fX" = ( /obj/structure/table/standard, /obj/machinery/alarm/angled, @@ -2448,6 +2741,27 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/security/briefing) +"fZ" = ( +/obj/machinery/access_button{ + command = "cycle_exterior"; + dir = 1; + frequency = 1380; + master_tag = "tcommsairlock"; + pixel_x = -32; + req_one_access = list(61) + }, +/obj/effect/map_helper/airlock/door/ext_door, +/obj/machinery/door/airlock/maintenance_hatch{ + frequency = null; + icon_state = "door_locked"; + id_tag = null; + locked = 1; + name = "Telecoms Server Access"; + req_access = list(61) + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled/steel_ridged, +/area/groundbase/command/tcomms/chamber) "ga" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -2469,6 +2783,10 @@ /obj/structure/disposalpipe/trunk, /turf/simulated/floor, /area/groundbase/cargo/mining) +"gd" = ( +/obj/machinery/holoplant, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "ge" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -2624,6 +2942,9 @@ "gv" = ( /turf/simulated/wall/r_wall, /area/groundbase/security/hos) +"gw" = ( +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "gx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -2790,6 +3111,20 @@ }, /turf/simulated/floor/tiled, /area/groundbase/civilian/gateway) +"gP" = ( +/obj/machinery/airlock_sensor{ + dir = 8; + pixel_x = 25 + }, +/obj/effect/map_helper/airlock/sensor/chamber_sensor, +/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ + frequency = 1380; + id_tag = "tcommsairlock"; + pixel_y = 24; + req_one_access = list(61) + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "gQ" = ( /obj/machinery/hologram/holopad, /turf/simulated/floor/tiled/dark, @@ -2813,11 +3148,12 @@ /turf/simulated/floor/tiled/techmaint, /area/groundbase/command/tcomms/storage) "gU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden{ - dir = 1 +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -30 }, /turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "gV" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -2843,21 +3179,17 @@ /turf/simulated/floor/tiled/dark, /area/groundbase/civilian/bar) "gY" = ( -/obj/machinery/telecomms/hub/preset/groundbase, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 }, -/area/groundbase/command/tcomms) +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "gZ" = ( -/obj/machinery/telecomms/server/presets/common, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 }, -/area/groundbase/command/tcomms) +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "ha" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -2876,6 +3208,12 @@ }, /turf/simulated/floor/tiled, /area/groundbase/civilian/gateway) +"hc" = ( +/obj/machinery/camera/network/command{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "hd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/techfloor/grid, @@ -2959,6 +3297,15 @@ outdoors = 0 }, /area/maintenance/groundbase/level1/nwtunnel) +"hn" = ( +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air/airlock{ + start_pressure = 4559.63 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "ho" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3028,6 +3375,12 @@ /obj/effect/landmark/start/security, /turf/simulated/floor/tiled/dark, /area/groundbase/security/equipment) +"hy" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "hz" = ( /obj/machinery/vending/assist, /obj/machinery/light, @@ -3163,6 +3516,20 @@ /obj/machinery/light, /turf/simulated/floor/tiled, /area/groundbase/cargo/mining) +"hS" = ( +/obj/machinery/atmospherics/unary/vent_pump/high_volume{ + dir = 8; + id_tag = null + }, +/obj/effect/map_helper/airlock/atmos/chamber_pump, +/obj/machinery/firealarm{ + dir = 4 + }, +/obj/machinery/camera/network/command{ + dir = 1 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "hT" = ( /obj/machinery/hologram/holopad, /turf/simulated/floor/tiled, @@ -3196,13 +3563,11 @@ /turf/simulated/floor/tiled/dark, /area/groundbase/security/armory) "hY" = ( -/obj/machinery/telecomms/server/presets/command, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 +/obj/machinery/camera/network/command{ + dir = 4 }, -/area/groundbase/command/tcomms) +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "hZ" = ( /obj/structure/cable{ icon_state = "1-8" @@ -3218,6 +3583,12 @@ outdoors = 0 }, /area/maintenance/groundbase/level1/swtunnel) +"ia" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "ib" = ( /obj/machinery/door/airlock/mining{ name = "Trash Pit"; @@ -3373,6 +3744,18 @@ outdoors = 0 }, /area/maintenance/groundbase/level1/netunnel) +"is" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) +"it" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "iu" = ( /obj/machinery/light/small{ dir = 8 @@ -3391,6 +3774,12 @@ /obj/machinery/firealarm, /turf/simulated/floor/tiled/dark, /area/groundbase/security/warden) +"ix" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "iy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/white, @@ -3519,6 +3908,10 @@ /obj/structure/filingcabinet/chestdrawer, /turf/simulated/floor/tiled/dark, /area/groundbase/security/iaa1) +"iL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "iM" = ( /obj/structure/cable{ icon_state = "0-8" @@ -3542,12 +3935,30 @@ /turf/simulated/floor/tiled/white, /area/groundbase/medical/equipment) "iP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/machinery/access_button{ + command = "cycle_interior"; + frequency = 1380; + master_tag = "tcommsairlock"; + pixel_x = 32; + req_one_access = list(61) }, +/obj/effect/map_helper/airlock/door/int_door, +/obj/machinery/door/airlock/maintenance_hatch{ + frequency = null; + icon_state = "door_locked"; + id_tag = null; + locked = 1; + name = "Telecoms Server Access"; + req_access = list(61) + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/tiled/steel_ridged, +/area/groundbase/command/tcomms/chamber) +"iQ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "iR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -3557,6 +3968,16 @@ "iS" = ( /turf/simulated/wall/r_wall, /area/groundbase/engineering/atmos/monitoring) +"iT" = ( +/obj/machinery/computer/telecomms/monitor{ + dir = 8; + network = "tcommsat" + }, +/obj/machinery/status_display{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "iU" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -3592,6 +4013,15 @@ outdoors = 0 }, /area/groundbase/unexplored/rock) +"iX" = ( +/obj/machinery/power/apc{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "iY" = ( /turf/simulated/mineral/floor/virgo3c, /area/maintenance/groundbase/level1/netunnel) @@ -3633,6 +4063,13 @@ "jd" = ( /turf/simulated/wall, /area/maintenance/groundbase/substation/medcargo) +"je" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "jf" = ( /obj/structure/table/reinforced, /obj/fiftyspawner/steel, @@ -3696,6 +4133,27 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/lhallway) +"jk" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) +"jl" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/freezer{ + dir = 1; + icon_state = "freezer_1"; + set_temperature = 73; + use_power = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "jm" = ( /obj/structure/cable/yellow{ icon_state = "1-8" @@ -3765,6 +4223,15 @@ }, /turf/simulated/floor/tiled/techmaint, /area/groundbase/engineering/atmos) +"ju" = ( +/obj/machinery/atmospherics/binary/passive_gate/on{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "jv" = ( /obj/machinery/door_timer/cell_3{ id = "Cell C"; @@ -3815,6 +4282,13 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled/dark, /area/groundbase/security/briefing) +"jy" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "jz" = ( /turf/simulated/wall, /area/groundbase/medical/or2) @@ -3913,6 +4387,12 @@ }, /turf/simulated/floor/tiled/techmaint, /area/groundbase/engineering/atmos) +"jN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "jO" = ( /obj/structure/cable/heavyduty{ icon_state = "1-4" @@ -4050,16 +4530,12 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/groundbase/command/ai/robot) "kf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden/universal{ + dir = 8 }, -/obj/machinery/telecomms/server/presets/engineering, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) +/obj/machinery/firealarm, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "kg" = ( /obj/structure/table/reinforced, /obj/item/weapon/storage/toolbox/mechanical{ @@ -4159,6 +4635,16 @@ "kq" = ( /turf/simulated/floor/tiled, /area/groundbase/engineering/storage) +"kr" = ( +/obj/machinery/computer/telecomms/server{ + dir = 8; + network = "tcommsat" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "ks" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -4263,6 +4749,12 @@ }, /turf/simulated/floor/tiled/techfloor, /area/groundbase/civilian/arrivals) +"kD" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "kE" = ( /obj/machinery/button/remote/airlock{ desc = "A remote control switch for the medbay recovery room door."; @@ -4300,7 +4792,7 @@ "kG" = ( /obj/machinery/turretid/lethal{ ailock = 1; - control_area = /area/groundbase/command/tcomms; + control_area = /area/groundbase/command/tcomms/chamber; name = "Telecoms turret control"; pixel_y = 32; req_access = list(61) @@ -4396,6 +4888,20 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/security/equipment) +"kN" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) +"kO" = ( +/obj/machinery/hologram/holopad, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "kP" = ( /obj/structure/table/glass, /obj/random/paicard, @@ -4423,22 +4929,28 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/civilian/bar) -"kT" = ( -/obj/machinery/computer/telecomms/server{ - dir = 8; - network = "tcommsat" +"kS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 }, -/obj/machinery/light{ +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) +"kT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "kU" = ( -/obj/machinery/camera/network/command{ +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/alarm{ dir = 8 }, /turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "kV" = ( /obj/machinery/light/small{ dir = 4 @@ -4474,6 +4986,15 @@ }, /turf/simulated/floor/wood, /area/groundbase/civilian/gameroom) +"kZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "la" = ( /obj/structure/table/marble, /obj/machinery/atmospherics/unary/vent_pump/on, @@ -4515,13 +5036,15 @@ /turf/simulated/floor/tiled, /area/groundbase/engineering/lobby) "le" = ( -/obj/machinery/telecomms/broadcaster/preset_right/groundbase, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 }, -/area/groundbase/command/tcomms) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "lf" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/multi_tile/glass{ @@ -4624,6 +5147,15 @@ }, /turf/simulated/floor/tiled, /area/groundbase/civilian/apparel) +"lm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "ln" = ( /obj/machinery/vending/wardrobe/detdrobe, /turf/simulated/floor/tiled/dark, @@ -4665,6 +5197,16 @@ /obj/item/clothing/head/helmet/bulletproof, /turf/simulated/floor/tiled/dark, /area/groundbase/security/armory) +"ls" = ( +/obj/effect/floor_decal/industrial/warning/corner, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "lt" = ( /obj/effect/floor_decal/industrial/danger, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -4672,12 +5214,31 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/atmos) +"lu" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/warning, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "lv" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, /turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/area/groundbase/command/tcomms/chamber) "lw" = ( /obj/machinery/shieldgen, /turf/simulated/floor, @@ -4811,12 +5372,28 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/lhallway) +"lK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "lL" = ( /obj/machinery/computer/aiupload{ dir = 4 }, /turf/simulated/floor/bluegrid, /area/groundbase/command/ai/upload) +"lM" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "lN" = ( /obj/item/weapon/stool/baystool/padded{ dir = 4 @@ -4935,6 +5512,15 @@ }, /turf/simulated/floor/lino, /area/groundbase/civilian/cafe) +"mc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/groundbase/command/tcomms/chamber) "md" = ( /obj/structure/cable{ icon_state = "1-2" @@ -4943,11 +5529,18 @@ /turf/simulated/floor/outdoors/sidewalk/virgo3c, /area/groundbase/level1/southeastspur) "me" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/door/airlock/hatch{ + name = "Telecoms Control Room"; + req_access = list(61) }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled/steel_ridged, +/area/groundbase/command/tcomms/chamber) "mf" = ( /obj/machinery/power/apc{ dir = 8 @@ -5215,15 +5808,6 @@ outdoors = 0 }, /area/maintenance/groundbase/level1/nwtunnel) -"mQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "mR" = ( /obj/structure/bed/chair/comfy/orange{ dir = 4 @@ -5328,6 +5912,7 @@ }, /obj/item/clothing/glasses/welding/superior, /obj/item/device/flashlight/lamp, +/obj/item/weapon/stamp/ce, /turf/simulated/floor/carpet/oracarpet, /area/groundbase/engineering/ce) "nf" = ( @@ -5667,12 +6252,6 @@ }, /turf/simulated/floor/carpet/sblucarpet, /area/groundbase/security/iaa1) -"nW" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "nX" = ( /obj/machinery/atmospherics/unary/freezer{ dir = 8 @@ -5832,15 +6411,6 @@ /obj/machinery/light, /turf/simulated/floor/tiled/white, /area/groundbase/medical/morgue) -"oq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "or" = ( /obj/structure/stairs/spawner/west, /obj/structure/railing/grey{ @@ -6377,16 +6947,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/techstorage) -"pI" = ( -/obj/effect/floor_decal/industrial/warning/corner, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "pJ" = ( /obj/machinery/light{ dir = 4 @@ -6586,17 +7146,6 @@ /obj/item/device/radio/off, /turf/simulated/floor/tiled, /area/groundbase/civilian/gateway) -"qh" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "qi" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -6641,27 +7190,6 @@ "qp" = ( /turf/simulated/floor/tiled/white, /area/groundbase/medical/office) -"qq" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8; - external_pressure_bound = 0; - external_pressure_bound_default = 0; - icon_state = "map_vent_in"; - initialize_directions = 1; - internal_pressure_bound = 4000; - internal_pressure_bound_default = 4000; - pressure_checks = 2; - pressure_checks_default = 2; - pump_direction = 0; - use_power = 1 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "qr" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical{ @@ -7033,14 +7561,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/techstorage) -"rk" = ( -/obj/machinery/telecomms/receiver/preset_right/groundbase, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "rl" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -7215,17 +7735,6 @@ /obj/machinery/alarm, /turf/simulated/floor/tiled/dark, /area/groundbase/medical/autoresleeving) -"rG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/obj/machinery/telecomms/server/presets/medical, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "rH" = ( /obj/machinery/atmospherics/portables_connector{ dir = 8 @@ -7542,27 +8051,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled, /area/groundbase/engineering/storage) -"st" = ( -/obj/machinery/access_button{ - command = "cycle_exterior"; - dir = 1; - frequency = 1380; - master_tag = "tcommsairlock"; - pixel_x = -32; - req_one_access = list(61) - }, -/obj/effect/map_helper/airlock/door/ext_door, -/obj/machinery/door/airlock/maintenance_hatch{ - frequency = null; - icon_state = "door_locked"; - id_tag = null; - locked = 1; - name = "Telecoms Server Access"; - req_access = list(61) - }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled/steel_ridged, -/area/groundbase/command/tcomms) "su" = ( /obj/structure/cable{ icon_state = "4-8" @@ -7762,25 +8250,6 @@ }, /turf/simulated/floor/outdoors/grass/virgo3c, /area/groundbase/level1/southwestspur) -"sT" = ( -/obj/machinery/telecomms/server/presets/science, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) -"sU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/obj/machinery/ntnet_relay, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "sV" = ( /turf/simulated/floor/outdoors/newdirt/virgo3c{ outdoors = 0 @@ -8166,12 +8635,6 @@ }, /turf/simulated/floor/outdoors/sidewalk/side/virgo3c, /area/groundbase/level1/centsquare) -"tQ" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille, -/obj/structure/window/reinforced/full, -/turf/simulated/floor, -/area/groundbase/command/tcomms) "tS" = ( /obj/structure/table/rack/shelf/steel, /obj/item/weapon/gun/energy/laser{ @@ -8623,18 +9086,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/eva) -"uY" = ( -/obj/effect/floor_decal/industrial/warning/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "uZ" = ( /obj/machinery/photocopier, /turf/simulated/floor/tiled/dark, @@ -8908,18 +9359,6 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/civilian/bar) -"vG" = ( -/obj/machinery/porta_turret/stationary, -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "vH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass_security{ @@ -9587,16 +10026,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/civilian/foodplace) -"xl" = ( -/obj/machinery/hologram/holopad, -/obj/machinery/atmospherics/pipe/simple/hidden/black, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "xm" = ( /obj/effect/floor_decal/industrial/danger, /obj/machinery/atmospherics/pipe/simple/hidden/black, @@ -9793,17 +10222,6 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/civilian/womensrestroom) -"xG" = ( -/obj/machinery/telecomms/processor/preset_one, -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "xH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 8 @@ -9869,14 +10287,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/civilian/toolstorage) -"xQ" = ( -/obj/machinery/telecomms/server/presets/supply, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "xR" = ( /obj/item/weapon/stool/baystool/padded{ dir = 4 @@ -10088,10 +10498,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/groundbase/engineering/atmos) -"yt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black, -/turf/simulated/wall/r_wall, -/area/groundbase/command/tcomms) "yu" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -10363,14 +10769,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/white, /area/groundbase/medical/lhallway) -"za" = ( -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "zb" = ( /obj/machinery/door/airlock/multi_tile/glass/polarized{ id_tag = null; @@ -10456,15 +10854,6 @@ }, /turf/simulated/wall/r_wall, /area/groundbase/engineering/techstorage) -"zm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black, -/obj/machinery/telecomms/server/presets/unused, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "zn" = ( /obj/structure/stairs/spawner/north, /turf/simulated/floor/outdoors/sidewalk/virgo3c, @@ -10553,15 +10942,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/groundbase/engineering/atmos) -"zy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "zz" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -10574,17 +10954,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/command/tcomms/foyer) -"zA" = ( -/obj/machinery/telecomms/processor/preset_three, -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "zB" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -10675,13 +11044,6 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/security/iaa1) -"zL" = ( -/obj/machinery/hologram/holopad, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "zM" = ( /obj/machinery/power/terminal{ dir = 8 @@ -11100,13 +11462,6 @@ "AN" = ( /turf/simulated/floor/tiled/dark, /area/groundbase/security/briefing) -"AO" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "AP" = ( /obj/machinery/firealarm{ dir = 8 @@ -11134,13 +11489,6 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/medical/resleeving) -"AU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "AV" = ( /obj/machinery/light{ dir = 4 @@ -11483,12 +11831,6 @@ /obj/effect/landmark/vermin, /turf/simulated/floor/tiled, /area/groundbase/engineering/workshop) -"BI" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "BJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/blast/regular{ @@ -11583,20 +11925,6 @@ }, /turf/simulated/floor/carpet/sblucarpet, /area/groundbase/security/iaa1) -"BU" = ( -/obj/machinery/airlock_sensor{ - dir = 8; - pixel_x = 25 - }, -/obj/effect/map_helper/airlock/sensor/chamber_sensor, -/obj/machinery/embedded_controller/radio/airlock/airlock_controller{ - frequency = 1380; - id_tag = "tcommsairlock"; - pixel_y = 24; - req_one_access = list(61) - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "BV" = ( /obj/machinery/light{ dir = 8 @@ -11790,14 +12118,6 @@ /obj/machinery/atmospherics/pipe/manifold/visible/cyan, /turf/simulated/floor/tiled/techmaint, /area/groundbase/engineering/atmos) -"Cu" = ( -/obj/machinery/telecomms/bus/preset_two/groundbase, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "Cv" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/glass{ @@ -11936,12 +12256,6 @@ outdoors = 0 }, /area/groundbase/level1/northspur) -"CN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "CO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 9 @@ -11961,17 +12275,6 @@ /obj/effect/landmark/start/bartender, /turf/simulated/floor/lino, /area/groundbase/civilian/bar) -"CQ" = ( -/obj/machinery/telecomms/bus/preset_three, -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "CR" = ( /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 @@ -12037,10 +12340,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/groundbase/command/tcomms/storage) -"CZ" = ( -/obj/machinery/holoplant, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Db" = ( /turf/simulated/floor/outdoors/newdirt/virgo3c, /area/groundbase/level1/southeastspur) @@ -12508,15 +12807,6 @@ }, /turf/simulated/floor/virgo3c, /area/groundbase/unexplored/outdoors) -"Ei" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Ej" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -12655,15 +12945,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled, /area/groundbase/engineering/workshop) -"Ez" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "EA" = ( /obj/machinery/computer/secure_data, /obj/machinery/light{ @@ -12989,13 +13270,6 @@ /obj/effect/landmark/start/engineer, /turf/simulated/floor/tiled, /area/groundbase/engineering/lobby) -"Fs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 8 - }, -/obj/machinery/firealarm, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Ft" = ( /obj/structure/bed/chair/comfy/black, /obj/effect/landmark/start/hos, @@ -13102,19 +13376,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/civilian/gateway) -"FI" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecoms Control Room"; - req_access = list(61) - }, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/steel_ridged, -/area/groundbase/command/tcomms) "FJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/black{ @@ -13221,14 +13482,6 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/security/armory) -"FZ" = ( -/obj/machinery/telecomms/server/presets/security, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "Ga" = ( /obj/item/device/radio/intercom{ dir = 4; @@ -13850,27 +14103,6 @@ "Hz" = ( /turf/unsimulated/wall/planetary/virgo3c, /area/groundbase/level1/southeastspur) -"HA" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 4; - external_pressure_bound = 0; - external_pressure_bound_default = 0; - icon_state = "map_vent_in"; - initialize_directions = 1; - internal_pressure_bound = 4000; - internal_pressure_bound_default = 4000; - pressure_checks = 2; - pressure_checks_default = 2; - pump_direction = 0; - use_power = 1 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "HB" = ( /obj/structure/sign/double/barsign{ pixel_y = -32 @@ -14654,9 +14886,6 @@ /obj/machinery/clonepod/transhuman, /turf/simulated/floor/tiled/dark, /area/groundbase/medical/resleeving) -"Jw" = ( -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Jx" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -14778,23 +15007,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled/steel_ridged, /area/groundbase/medical/resleeving) -"JK" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 4; - external_pressure_bound = 140; - external_pressure_bound_default = 140; - icon_state = "map_vent_out"; - pressure_checks = 0; - pressure_checks_default = 0; - use_power = 1 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "JM" = ( /turf/simulated/wall/r_wall, /area/groundbase/engineering/storage) @@ -15100,17 +15312,6 @@ }, /turf/simulated/floor/tiled/dark, /area/groundbase/medical/autoresleeving) -"Kp" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "Kq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ @@ -15320,14 +15521,6 @@ }, /turf/simulated/floor/outdoors/sidewalk/slab/virgo3c, /area/groundbase/level1/centsquare) -"KV" = ( -/obj/machinery/telecomms/server/presets/service/groundbase, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "KW" = ( /turf/simulated/floor/lino, /area/groundbase/civilian/cafe) @@ -15384,20 +15577,6 @@ outdoors = 0 }, /area/groundbase/level1/eastspur) -"Lc" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume{ - dir = 8; - id_tag = null - }, -/obj/effect/map_helper/airlock/atmos/chamber_pump, -/obj/machinery/firealarm{ - dir = 4 - }, -/obj/machinery/camera/network/command{ - dir = 1 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Ld" = ( /obj/structure/table/steel_reinforced, /obj/structure/cable/yellow{ @@ -15459,15 +15638,6 @@ }, /turf/simulated/floor/carpet/sblucarpet, /area/groundbase/security/hos) -"Li" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/alarm{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Lj" = ( /obj/structure/bed/chair/backed_red{ dir = 4 @@ -15661,19 +15831,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/cargo/mining) -"LF" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/effect/floor_decal/industrial/warning, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "LG" = ( /obj/machinery/computer/power_monitor, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -15796,13 +15953,6 @@ /obj/machinery/light, /turf/simulated/floor/tiled, /area/groundbase/engineering/workshop) -"LW" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "LX" = ( /obj/machinery/alarm, /turf/simulated/floor/tiled/white, @@ -16166,16 +16316,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/storage) -"MN" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/light, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "MO" = ( /turf/simulated/mineral/cave/virgo3c, /area/groundbase/level1/nw) @@ -16406,19 +16546,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/atmos) -"Nu" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/obj/machinery/exonet_node{ - anchored = 1 - }, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "Nv" = ( /turf/simulated/floor/outdoors/grass/forest/virgo3c, /area/groundbase/level1/centsquare) @@ -16601,27 +16728,6 @@ /obj/effect/landmark/start/security, /turf/simulated/floor/tiled, /area/groundbase/security/processing) -"NR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden, -/obj/machinery/access_button{ - command = "cycle_interior"; - frequency = 1380; - master_tag = "tcommsairlock"; - pixel_x = 32; - req_one_access = list(61) - }, -/obj/effect/map_helper/airlock/door/int_door, -/obj/machinery/door/airlock/maintenance_hatch{ - frequency = null; - icon_state = "door_locked"; - id_tag = null; - locked = 1; - name = "Telecoms Server Access"; - req_access = list(61) - }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/tiled/steel_ridged, -/area/groundbase/command/tcomms) "NS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, @@ -16949,15 +17055,6 @@ }, /turf/simulated/floor/lino, /area/groundbase/civilian/bar) -"OL" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/air/airlock{ - start_pressure = 4559.63 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "OM" = ( /obj/machinery/transhuman/resleever, /obj/machinery/light{ @@ -17238,16 +17335,6 @@ outdoors = 0 }, /area/maintenance/groundbase/level1/swtunnel) -"PD" = ( -/obj/machinery/computer/telecomms/monitor{ - dir = 8; - network = "tcommsat" - }, -/obj/machinery/status_display{ - pixel_x = 32 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "PE" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -17287,14 +17374,6 @@ }, /turf/simulated/floor/wood, /area/groundbase/civilian/cafe) -"PI" = ( -/obj/machinery/telecomms/processor/preset_two, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "PJ" = ( /obj/structure/table/standard, /obj/item/device/healthanalyzer, @@ -17426,14 +17505,6 @@ outdoors = 0 }, /area/maintenance/groundbase/level1/nwtunnel) -"PZ" = ( -/obj/machinery/telecomms/bus/preset_four, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "Qa" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -17542,14 +17613,6 @@ "Qq" = ( /turf/simulated/wall/r_wall, /area/maintenance/groundbase/level1/swtunnel) -"Qs" = ( -/obj/machinery/pda_multicaster/prebuilt, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "Qt" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -17669,17 +17732,6 @@ }, /turf/simulated/floor/tiled/techfloor, /area/groundbase/civilian/arrivals) -"QG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/black{ - dir = 4 - }, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "QH" = ( /obj/structure/table/reinforced, /obj/item/device/sleevemate, @@ -18241,12 +18293,6 @@ }, /turf/simulated/floor/wood, /area/groundbase/civilian/gameroom) -"RZ" = ( -/obj/machinery/camera/network/command{ - dir = 4 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Sa" = ( /obj/structure/table/marble, /obj/machinery/atmospherics/unary/vent_pump/on, @@ -18359,15 +18405,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/techstorage) -"Sn" = ( -/obj/machinery/power/apc{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "So" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -19301,9 +19338,6 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/bluegrid, /area/groundbase/command/ai/robot) -"Uv" = ( -/turf/simulated/wall/r_wall, -/area/groundbase/command/tcomms) "Uw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -19456,13 +19490,6 @@ "UQ" = ( /turf/simulated/floor/tiled/white, /area/groundbase/medical/morgue) -"UR" = ( -/obj/machinery/light_switch{ - dir = 4; - pixel_x = -30 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "US" = ( /obj/structure/bed/chair/sofa/bench, /obj/effect/landmark/start/visitor, @@ -20074,17 +20101,6 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/civilian/bar) -"WA" = ( -/obj/machinery/telecomms/bus/preset_one, -/obj/machinery/atmospherics/pipe/manifold/hidden/black{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark{ - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "WB" = ( /turf/simulated/floor/outdoors/newdirt/virgo3c{ outdoors = 0 @@ -20766,12 +20782,6 @@ }, /turf/simulated/floor/tiled, /area/groundbase/engineering/atmos/monitoring) -"Ye" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/groundbase/command/tcomms) "Yf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20943,15 +20953,6 @@ "YC" = ( /turf/simulated/floor/outdoors/newdirt/virgo3c, /area/groundbase/level1/centsquare) -"YD" = ( -/obj/machinery/camera/network/command, -/turf/simulated/floor/bluegrid{ - name = "Mainframe Base"; - nitrogen = 100; - oxygen = 0; - temperature = 80 - }, -/area/groundbase/command/tcomms) "YE" = ( /obj/machinery/door/firedoor, /obj/machinery/door/window/brigdoor/southleft{ @@ -22376,22 +22377,22 @@ MO MO MO MO -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an MO MO MO @@ -22518,22 +22519,22 @@ MO MO MO MO -Uv -cX -za -HA -Kp -za -JK -cX -Uv -CZ -nW -Ye -Sn -eo -CZ -Uv +an +bI +bK +ct +de +bK +ez +bI +an +gd +gY +ix +iX +kD +gd +an Dc Dc Dc @@ -22660,22 +22661,22 @@ MO MO MO MO -Uv -za -za -QG -za -za -QG -za -tQ -Jw -CN -ct -AO -fu -mQ -Uv +an +bK +bK +cy +bK +bK +cy +bK +fO +gw +gZ +iL +je +kN +kZ +an Ij uv Hu @@ -22802,22 +22803,22 @@ MO MO MO MO -Uv -za -za -kf -sT -za -QG -za -tQ -Jw -Jw -Jw -me -Jw -MN -Uv +an +bK +bK +cM +di +bK +cy +bK +fO +gw +gw +gw +jk +gw +le +an KK Rt By @@ -22944,22 +22945,22 @@ MO MO MO MO -Uv -za -gZ -QG -za -KV -vG -za -tQ -Jw -Jw -Jw -me -Jw -oq -Uv +an +bK +bT +cy +bK +dv +eD +bK +fO +gw +gw +gw +jk +gw +lm +an Hs gT DP @@ -23086,22 +23087,22 @@ MO MO MO MO -Uv -YD -za -QG -za -za -QG -za -tQ -Jw -Jw -Jw -me -Jw -oq -Uv +an +bN +bK +cy +bK +bK +cy +bK +fO +gw +gw +gw +jk +gw +lm +an bd gT Xs @@ -23228,22 +23229,22 @@ MO MO MO MO -Uv -za -cX -QG -za -PI -sU -za -Uv -Jw -kU -Jw -me -Jw -oq -Uv +an +bK +bI +cy +bK +dy +eQ +bK +an +gw +hc +gw +jk +gw +lm +an lp cC lc @@ -23370,22 +23371,22 @@ MO MO MO MO -Uv -za -za -QG -za -Cu -WA -Ez -yt -yt -yt -yt -fJ -Jw -oq -Uv +an +bK +bK +cy +bK +dT +eS +fM +fW +fW +fW +fW +jl +gw +lm +an Dc Dc PT @@ -23512,22 +23513,22 @@ MO MO MO MO -Uv -za -le -QG -za -za -xG -za -Uv -bB -OL -Uv -ch -Jw -pI -Uv +an +bK +cc +cy +bK +bK +fa +bK +an +gw +hn +an +ju +gw +ls +an kG au zz @@ -23654,22 +23655,22 @@ MO MO MO MO -Uv -gY -Qs -dy -zm -xl -cy -za -st -Jw -gU -NR -LW -zL -LF -FI +an +bR +ch +cR +do +dY +fd +bK +fZ +gw +hy +iP +jy +kO +lu +me FC DX Bn @@ -23796,22 +23797,22 @@ MO MO MO MO -Uv -za -rk -QG -za -za -zA -za -Uv -BU -Lc -Uv -cR -Jw -uY -Uv +an +bK +cm +cy +bK +bK +fi +bK +an +gP +hS +an +jN +gw +lv +an KC Sv zz @@ -23938,22 +23939,22 @@ MO MO MO MO -Uv -za -za -QG -za -PZ -CQ -za -Uv -Uv -Uv -Uv -Fs -Jw -zy -Uv +an +bK +bK +cy +bK +eo +fu +bK +an +an +an +an +kf +gw +lK +an SS SS Hf @@ -24080,22 +24081,22 @@ MO MO MO MO -Uv -za -cX -QG -za -fi -Nu -za -Uv -UR -RZ -Jw -CN -ct -AU -Uv +an +bK +bI +cy +bK +eu +fF +bK +an +gU +hY +gw +gZ +iL +lM +an Pm zS lC @@ -24222,22 +24223,22 @@ MO MO MO MO -Uv -YD -za -QG -za -za -QG -za -tQ -Jw -Jw -Jw -Jw -Jw -oq -Uv +an +bN +bK +cy +bK +bK +cy +bK +fO +gw +gw +gw +gw +gw +lm +an PL Ne zt @@ -24364,22 +24365,22 @@ MO MO MO MO -Uv -za -hY -QG -za -xQ -vG -za -tQ -Jw -Jw -Jw -Jw -Jw -MN -Uv +an +bK +cr +cy +bK +ev +eD +bK +fO +gw +gw +gw +gw +gw +le +an Qg hN lC @@ -24506,22 +24507,22 @@ MO MO MO MO -Uv -za -za -rG -FZ -za -QG -za -tQ -Jw an -eD -eD -iP -Ei -Uv +bK +bK +cX +dr +bK +cy +bK +fO +gw +ia +iQ +iQ +kS +mc +an Rr Ui ZJ @@ -24648,22 +24649,22 @@ MO MO MO MO -Uv -za -za -QG -za -za -QG -za -tQ -Jw -cc -Jw -Jw -lv -Jw -Uv +an +bK +bK +cy +bK +bK +cy +bK +fO +gw +is +gw +gw +kT +gw +an Sy Uu SI @@ -24790,22 +24791,22 @@ MO MO MO MO -Uv -cX -za -bT -qh -za -qq -cX -Uv -CZ -BI -PD -kT -Li -CZ -Uv +an +bI +bK +cZ +dt +bK +fJ +bI +an +gd +it +iT +kr +kU +gd +an TQ YT lC @@ -24932,22 +24933,22 @@ MO MO MO MO -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv -Uv +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an +an el el Kq @@ -32914,7 +32915,7 @@ Qb Qb ub kn -pM +bB RM pM GL diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm index 8dd2800461..508002d17d 100644 --- a/maps/groundbase/gb-z3.dmm +++ b/maps/groundbase/gb-z3.dmm @@ -9,6 +9,17 @@ }, /turf/simulated/floor/tiled/white, /area/groundbase/medical/paramedic) +"ac" = ( +/obj/effect/landmark/start/pilot, +/obj/structure/closet/walllocker_double{ + dir = 8; + name = "misc equipment cabinet"; + pixel_x = -32 + }, +/obj/item/weapon/storage/box/nifsofts_pilot, +/obj/item/device/multitool/groundbase_buffered, +/turf/simulated/floor/tiled, +/area/groundbase/civilian/pilot) "ak" = ( /obj/structure/table/glass, /obj/item/weapon/paper_bin, @@ -2574,16 +2585,6 @@ }, /turf/simulated/floor/outdoors/sidewalk/slab/virgo3c, /area/groundbase/level3/nw) -"OJ" = ( -/obj/effect/landmark/start/pilot, -/obj/structure/closet/walllocker_double{ - dir = 8; - name = "NIFsoft uploader cabinet"; - pixel_x = -32 - }, -/obj/item/weapon/storage/box/nifsofts_pilot, -/turf/simulated/floor/tiled, -/area/groundbase/civilian/pilot) "OT" = ( /obj/structure/lattice, /turf/simulated/open/virgo3c, @@ -5616,7 +5617,7 @@ Qa qO fz bm -OJ +ac pd Tk bm diff --git a/maps/om_adventure/pois/darkstar.dmm b/maps/om_adventure/pois/darkstar.dmm index a41ef6cb59..809c5b7aa7 100644 --- a/maps/om_adventure/pois/darkstar.dmm +++ b/maps/om_adventure/pois/darkstar.dmm @@ -2,11 +2,13 @@ "a" = ( /turf/template_noop, /area/template_noop) -"e" = ( +"b" = ( +/mob/living/simple_mob/vore/alienanimals/space_ghost{ + faction = "spookyland" + }, /turf/simulated/floor/weird_things/dark, /area/om_adventure/poi/darkstar) -"z" = ( -/mob/living/simple_mob/vore/alienanimals/space_ghost, +"e" = ( /turf/simulated/floor/weird_things/dark, /area/om_adventure/poi/darkstar) @@ -50,7 +52,7 @@ a e e e -z +b e e e diff --git a/maps/om_adventure/pois/fleshtear1.dmm b/maps/om_adventure/pois/fleshtear1.dmm index e2a3d25f18..bfe4b8089f 100644 --- a/maps/om_adventure/pois/fleshtear1.dmm +++ b/maps/om_adventure/pois/fleshtear1.dmm @@ -3,7 +3,9 @@ /turf/template_noop, /area/template_noop) "b" = ( -/mob/living/simple_mob/creature, +/mob/living/simple_mob/creature{ + faction = "spookyland" + }, /turf/simulated/floor/flesh{ base_icon = 'icons/turf/stomach_vr.dmi' }, diff --git a/maps/om_adventure/pois/fleshtear2.dmm b/maps/om_adventure/pois/fleshtear2.dmm index 19d435ce33..970059ac12 100644 --- a/maps/om_adventure/pois/fleshtear2.dmm +++ b/maps/om_adventure/pois/fleshtear2.dmm @@ -4,15 +4,17 @@ base_icon = 'icons/turf/stomach_vr.dmi' }, /area/om_adventure/poi/fleshtear2) +"b" = ( +/mob/living/simple_mob/creature{ + faction = "spookyland" + }, +/turf/simulated/floor/flesh{ + base_icon = 'icons/turf/stomach_vr.dmi' + }, +/area/om_adventure/poi/fleshtear2) "B" = ( /turf/template_noop, /area/template_noop) -"H" = ( -/mob/living/simple_mob/creature, -/turf/simulated/floor/flesh{ - base_icon = 'icons/turf/stomach_vr.dmi' - }, -/area/om_adventure/poi/fleshtear2) (1,1,1) = {" B @@ -45,7 +47,7 @@ B B B a -H +b a a B diff --git a/maps/om_adventure/pois/fleshtear3.dmm b/maps/om_adventure/pois/fleshtear3.dmm index 1c77a34996..c23cca7ebd 100644 --- a/maps/om_adventure/pois/fleshtear3.dmm +++ b/maps/om_adventure/pois/fleshtear3.dmm @@ -2,8 +2,10 @@ "a" = ( /turf/template_noop, /area/template_noop) -"M" = ( -/mob/living/simple_mob/creature, +"b" = ( +/mob/living/simple_mob/creature{ + faction = "spookyland" + }, /turf/simulated/floor/flesh{ base_icon = 'icons/turf/stomach_vr.dmi' }, @@ -62,7 +64,7 @@ Q Q a Q -M +b Q Q a diff --git a/maps/om_adventure/pois/fleshtear4.dmm b/maps/om_adventure/pois/fleshtear4.dmm index 077d29a8b7..b41923a34c 100644 --- a/maps/om_adventure/pois/fleshtear4.dmm +++ b/maps/om_adventure/pois/fleshtear4.dmm @@ -2,13 +2,15 @@ "a" = ( /turf/template_noop, /area/template_noop) -"m" = ( +"b" = ( +/mob/living/simple_mob/creature{ + faction = "spookyland" + }, /turf/simulated/floor/flesh{ base_icon = 'icons/turf/stomach_vr.dmi' }, /area/om_adventure/poi/fleshtear4) -"n" = ( -/mob/living/simple_mob/creature, +"m" = ( /turf/simulated/floor/flesh{ base_icon = 'icons/turf/stomach_vr.dmi' }, @@ -31,7 +33,7 @@ a (3,1,1) = {" a a -n +b m a "} @@ -65,7 +67,7 @@ a "} (8,1,1) = {" a -n +b m m a diff --git a/maps/submaps/surface_submaps/plains/Thiefc.dmm b/maps/submaps/surface_submaps/plains/Thiefc.dmm index d83aa9631f..a19b8e603e 100644 --- a/maps/submaps/surface_submaps/plains/Thiefc.dmm +++ b/maps/submaps/surface_submaps/plains/Thiefc.dmm @@ -13,7 +13,7 @@ "m" = (/obj/structure/table/steel,/obj/item/weapon/paper{desc = "This is some bullshit. First chance we got to knick something that looks half decent turns out to be mostly junk. And now we're getting calls that the other stash we've got has got a spider problem. Fuck this, Between the shitty weather, The pissed of bugs, And now apparently some NT goon running around in the area there's hardly enough reason to stick around. I'm telling Carl I'm out tommorow."; name = "Note"},/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc) "n" = (/obj/vehicle/train/trolley,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc) "o" = (/obj/structure/closet/crate,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc) -"p" = (/obj/structure/closet/crate,/obj/item/ammo_magazine/ammo_box/b12g,/obj/item/weapon/storage/box/practiceshells,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc) +"p" = (/obj/structure/closet/crate,/obj/item/ammo_magazine/ammo_box/b12g,/obj/item/ammo_magazine/ammo_box/b12g/practice,/obj/random/projectile/scrapped_gun,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/Thiefc) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm b/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm index 599d352155..5528c6029c 100644 --- a/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm +++ b/maps/submaps/surface_submaps/plains/Thiefc_vr.dmm @@ -119,7 +119,7 @@ /area/submap/Thiefc) "p" = ( /obj/structure/closet/crate, -/obj/item/weapon/storage/box/practiceshells, +/obj/item/ammo_magazine/ammo_box/b12g/practice, /turf/simulated/floor/outdoors/dirt/virgo3b{ outdoors = 0 }, diff --git a/maps/tether/submaps/tether_centcom.dmm b/maps/tether/submaps/tether_centcom.dmm index aec901cfe7..83c57847b0 100644 --- a/maps/tether/submaps/tether_centcom.dmm +++ b/maps/tether/submaps/tether_centcom.dmm @@ -1895,7 +1895,7 @@ /obj/machinery/vending/cigarette{ name = "hacked cigarette machine"; prices = list(); - products = list(/obj/item/weapon/storage/fancy/cigarettes=10,/obj/item/weapon/storage/box/matches=10,/obj/item/weapon/flame/lighter/zippo=4,/obj/item/clothing/mask/smokable/cigarette/cigar/havana=2) + products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2) }, /turf/simulated/floor/wood, /area/centcom/specops) diff --git a/tgui/packages/tgui-polyfill/package.json b/tgui/packages/tgui-polyfill/package.json index 85d004bf99..a2f060fcc5 100644 --- a/tgui/packages/tgui-polyfill/package.json +++ b/tgui/packages/tgui-polyfill/package.json @@ -11,6 +11,6 @@ "unfetch": "^4.2.0" }, "devDependencies": { - "terser": "^5.13.1" + "terser": "^5.14.2" } } diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index 94c1a0410a..0235d80d80 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -13,6 +13,7 @@ const digestModeToColor = { 'Absorb': 'purple', 'Unabsorb': 'purple', 'Drain': 'orange', + 'Selective': 'orange', 'Shrink': 'teal', 'Grow': 'teal', 'Size Steal': 'teal', @@ -26,6 +27,7 @@ const digestModeToPreyMode = { 'Absorb': 'being absorbed.', 'Unabsorb': 'being unabsorbed.', 'Drain': 'being drained.', + 'Selective': 'being processed.', 'Shrink': 'being shrunken.', 'Grow': 'being grown.', 'Size Steal': 'having your size stolen.', @@ -497,6 +499,7 @@ const VoreSelectedBellyOptions = (props, context) => { contaminate_flavor, contaminate_color, egg_type, + selective_preference, save_digest_mode, } = belly; @@ -608,6 +611,12 @@ const VoreSelectedBellyOptions = (props, context) => { content={capitalize(egg_type)} /> + +