[MIRROR] NukeOps Firebase Rework [MDB IGNORE] (#12861)

* NukeOps Firebase Rework (#66149)

Attention Recruit: Welcome to Firebase Balthazord
Here you will lean how to:
-Kill corpo scum
-Kill corpo scum
-Kill corpo scu-

This has been on my docket for months. Ever since gave the Holding Facility a much needed facelift. I have been eyeballing the nukie base, waiting for that stroke of inspiration to hit me. It finally did. Gone are the aging walls of the old encampment. Nukies finally have what well-funded corpo-terrorists always dream of- a home.

It's more than a Home. This is a sweeping rework that is part of a series of reworks to revisit old locations and not only bring them up to date with our current asset roster, but to make them properly belong within the game world. The Nuke-Ops base may ultimately be a tiny chunk of the overall SS13 experience, but I'll be damned if it isn't a defining one. It's also a location that has the capacity to do one thing that I have always wanted to do. Purchase Property. You heard me right, you get to buy rooms now. The newly expanded Nuke-Ops base features, with @ Mothblocks blessing, further expansions that you can purchase from your local Syndicate Uplink. Spend your TC, expand your capabilities, and utilize your expertise in order to create
the most mind-boggling disky heists there are.

Possible expansions to your terrorism suite include:
-Ordinance Lab
-Bio-Terrorism Lab
-Chemical Manufacturing Plant

Definite expansions to your Nuke-Ops Firebase include:
-Crew Bunks
-Lab Wing
-War Table
-Upgraded "Disembarkment" Bay"

* NukeOps Firebase Rework

* Update CentCom_skyrat.dmm

Co-authored-by: Zytolg <33048583+Zytolg@users.noreply.github.com>
Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com>
This commit is contained in:
SkyratBot
2022-04-19 20:24:27 +02:00
committed by GitHub
parent 010748c674
commit 8d3cddc6a8
39 changed files with 22048 additions and 15290 deletions
@@ -0,0 +1,10 @@
/////////// djstation items
/obj/item/paper/fluff/ruins/djstation
name = "paper - 'DJ Listening Outpost'"
info = "<B>Welcome new owner!</B><BR><BR>You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio frequencies. Here is a step by step guide to start listening in on those saucy radio channels:<br><ol><li>Equip yourself with a multitool</li><li>Use the multitool on the relay.</li><li>Turn it on. It has already been configured for you to listen on.</li></ol> Simple as that. Now to listen to the private channels, you'll have to configure the intercoms. They are located on the front desk. Here is a list of frequencies for you to listen on.<br><ul><li>145.9 - Common Channel</li><li>144.7 - Private AI Channel</li><li>135.9 - Security Channel</li><li>135.7 - Engineering Channel</li><li>135.5 - Medical Channel</li><li>135.3 - Command Channel</li><li>135.1 - Science Channel</li><li>134.9 - Service Channel</li><li>134.7 - Supply Channel</li>"
/////////// djstation module roots
/obj/modular_map_root/djstation
config_file = "strings/modular_maps/DJstation.toml"
@@ -0,0 +1,157 @@
/////////// thederelict items
/obj/item/paper/fluff/ruins/thederelict/equipment
info = "If the equipment breaks there should be enough spare parts in our engineering storage near the north east solar array."
name = "Equipment Inventory"
/obj/item/paper/fluff/ruins/thederelict/syndie_mission
name = "Mission Objectives"
info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features. <br><br><b>Objective #1</b>. Kill the God damn AI in a fire blast that it rocks the station. <b>Success!</b> <br><b>Objective #2</b>. Escape alive. <b>Failed.</b>"
/obj/item/paper/fluff/ruins/thederelict/nukie_objectives
name = "Objectives of a Nuclear Operative"
info = "<b>Objective #1</b>: Destroy the station with a nuclear device."
/obj/item/paper/crumpled/bloody/ruins/thederelict/unfinished
name = "unfinished paper scrap"
desc = "Looks like someone started shakily writing a will in space common, but were interrupted by something bloody..."
info = "I, Victor Belyakov, do hereby leave my _- "
/obj/item/paper/fluff/ruins/thederelict/vaultraider
name = "Vault Raider Objectives"
info = "<b>Objectives #1</b>: Find out what is hidden in Kosmicheskaya Stantsiya 13s Vault"
/// Vault controller for use on the derelict/KS13.
/obj/machinery/computer/vaultcontroller
name = "vault controller"
desc = "It seems to be powering and controlling the vault locks."
icon_screen = "power"
icon_keyboard = "power_key"
light_color = LIGHT_COLOR_YELLOW
use_power = NO_POWER_USE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/obj/structure/cable/attached_cable
var/obj/machinery/door/airlock/vault/derelict/door1
var/obj/machinery/door/airlock/vault/derelict/door2
var/locked = TRUE
var/siphoned_power = 0
var/siphon_max = 1e7
/obj/machinery/computer/monitor/examine(mob/user)
. = ..()
. += span_notice("It appears to be powered via a cable connector.")
//Checks for cable connection, charges if possible.
/obj/machinery/computer/vaultcontroller/process()
if(siphoned_power >= siphon_max)
return
update_cable()
if(attached_cable)
attempt_siphon()
///Looks for a cable connection beneath the machine.
/obj/machinery/computer/vaultcontroller/proc/update_cable()
var/turf/T = get_turf(src)
attached_cable = locate(/obj/structure/cable) in T
///Initializes airlock links.
/obj/machinery/computer/vaultcontroller/proc/find_airlocks()
for(var/obj/machinery/door/airlock/A in GLOB.airlocks)
if(A.id_tag == "derelictvault")
if(!door1)
door1 = A
continue
if(door1 && !door2)
door2 = A
break
///Tries to charge from powernet excess, no upper limit except max charge.
/obj/machinery/computer/vaultcontroller/proc/attempt_siphon()
var/surpluspower = clamp(attached_cable.surplus(), 0, (siphon_max - siphoned_power))
if(surpluspower)
attached_cable.add_load(surpluspower)
siphoned_power += surpluspower
///Handles the doors closing
/obj/machinery/computer/vaultcontroller/proc/cycle_close(obj/machinery/door/airlock/A)
A.safe = FALSE //Make sure its forced closed, always
A.unbolt()
A.close()
A.bolt()
///Handles the doors opening
/obj/machinery/computer/vaultcontroller/proc/cycle_open(obj/machinery/door/airlock/A)
A.unbolt()
A.open()
A.bolt()
///Attempts to lock the vault doors
/obj/machinery/computer/vaultcontroller/proc/lock_vault()
if(door1 && !door1.density)
cycle_close(door1)
if(door2 && !door2.density)
cycle_close(door2)
if(door1.density && door1.locked && door2.density && door2.locked)
locked = TRUE
///Attempts to unlock the vault doors
/obj/machinery/computer/vaultcontroller/proc/unlock_vault()
if(door1?.density)
cycle_open(door1)
if(door2?.density)
cycle_open(door2)
if(!door1.density && door1.locked && !door2.density && door2.locked)
locked = FALSE
///Attempts to lock/unlock vault doors, if machine is charged.
/obj/machinery/computer/vaultcontroller/proc/activate_lock()
if(siphoned_power < siphon_max)
return
if(!door1 || !door2)
find_airlocks()
if(locked)
unlock_vault()
else
lock_vault()
/obj/machinery/computer/vaultcontroller/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "VaultController", name)
ui.open()
/obj/machinery/computer/vaultcontroller/ui_act(action, params)
. = ..()
if(.)
return
switch(action)
if("togglelock")
activate_lock()
/obj/machinery/computer/vaultcontroller/ui_data()
var/list/data = list()
data["stored"] = siphoned_power
data["max"] = siphon_max
data["doorstatus"] = locked
return data
///Airlock that can't be deconstructed, broken or hacked.
/obj/machinery/door/airlock/vault/derelict
locked = TRUE
move_resist = INFINITY
use_power = NO_POWER_USE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
id_tag = "derelictvault"
///Overrides screwdriver attack to prevent all deconstruction and hacking.
/obj/machinery/door/airlock/vault/derelict/attackby(obj/item/C, mob/user, params)
if(C.tool_behaviour == TOOL_SCREWDRIVER)
return
..()
/obj/structure/fluff/oldturret
name = "broken turret"
desc = "An obsolete model of turret, long non-functional."
icon = 'icons/obj/turrets.dmi'
icon_state = "turretCover"
density = TRUE
@@ -0,0 +1,4 @@
/////////// asteroid4 items
/obj/item/paper/fluff/ruins/asteroid4/extraction
info = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"
@@ -0,0 +1,8 @@
/////////// bigderelict1 items
/obj/item/paper/crumpled/ruins/bigderelict1/manifest
info = "<i>A crumpled piece of manifest paper, out of the barely legible pen writing, you can see something about a warning involving whatever was originally in the crate.</i>"
/obj/item/paper/crumpled/ruins/bigderelict1/coward
icon_state = "scrap_bloodied"
info = "If anyone finds this, please, don't let my kids know I died a coward.."
@@ -0,0 +1,170 @@
//caravan ambush
/obj/item/wrench/caravan
icon_state = "wrench_caravan"
desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster."
name = "experimental wrench"
toolspeed = 0.3
/obj/item/screwdriver/caravan
icon_state = "screwdriver_caravan"
desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster."
name = "experimental screwdriver"
toolspeed = 0.3
random_color = FALSE
/obj/item/wirecutters/caravan
icon_state = "cutters_caravan"
desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster."
name = "experimental wirecutters"
worn_icon_state = "cutters"
toolspeed = 0.3
random_color = FALSE
/obj/item/crowbar/red/caravan
icon_state = "crowbar_caravan"
desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster."
name = "experimental crowbar"
toolspeed = 0.3
/obj/machinery/computer/shuttle/caravan
/obj/item/circuitboard/computer/caravan
build_path = /obj/machinery/computer/shuttle/caravan
/obj/item/circuitboard/computer/caravan/trade1
build_path = /obj/machinery/computer/shuttle/caravan/trade1
/obj/item/circuitboard/computer/caravan/pirate
build_path = /obj/machinery/computer/shuttle/caravan/pirate
/obj/item/circuitboard/computer/caravan/syndicate1
build_path = /obj/machinery/computer/shuttle/caravan/syndicate1
/obj/item/circuitboard/computer/caravan/syndicate2
build_path = /obj/machinery/computer/shuttle/caravan/syndicate2
/obj/item/circuitboard/computer/caravan/syndicate3
build_path = /obj/machinery/computer/shuttle/caravan/syndicate3
/obj/machinery/computer/shuttle/caravan/trade1
name = "Small Freighter Shuttle Console"
desc = "Used to control the Small Freighter."
circuit = /obj/item/circuitboard/computer/caravan/trade1
shuttleId = "caravantrade1"
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;caravantrade1_custom;caravantrade1_ambush"
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize(mapload)
. = ..()
GLOB.jam_on_wardec += src
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Destroy()
GLOB.jam_on_wardec -= src
return ..()
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/trade1
name = "Small Freighter Navigation Computer"
desc = "Used to designate a precise transit location for the Small Freighter."
shuttleId = "caravantrade1"
lock_override = NONE
shuttlePortId = "caravantrade1_custom"
jump_to_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1, "caravantrade1_ambush" = 1)
view_range = 6.5
x_offset = -5
y_offset = -5
designate_time = 100
/obj/machinery/computer/shuttle/caravan/pirate
name = "Pirate Cutter Shuttle Console"
desc = "Used to control the Pirate Cutter."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
light_color = COLOR_SOFT_RED
circuit = /obj/item/circuitboard/computer/caravan/pirate
shuttleId = "caravanpirate"
possible_destinations = "caravanpirate_custom;caravanpirate_ambush"
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/pirate
name = "Pirate Cutter Navigation Computer"
desc = "Used to designate a precise transit location for the Pirate Cutter."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
shuttleId = "caravanpirate"
lock_override = NONE
shuttlePortId = "caravanpirate_custom"
jump_to_ports = list("caravanpirate_ambush" = 1)
view_range = 6.5
x_offset = 3
y_offset = -6
/obj/machinery/computer/shuttle/caravan/syndicate1
name = "Syndicate Fighter Shuttle Console"
desc = "Used to control the Syndicate Fighter."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
light_color = COLOR_SOFT_RED
req_access = list(ACCESS_SYNDICATE)
circuit = /obj/item/circuitboard/computer/caravan/syndicate1
shuttleId = "caravansyndicate1"
possible_destinations = "caravansyndicate1_custom;caravansyndicate1_ambush;caravansyndicate1_listeningpost"
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate1
name = "Syndicate Fighter Navigation Computer"
desc = "Used to designate a precise transit location for the Syndicate Fighter."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
shuttleId = "caravansyndicate1"
lock_override = NONE
shuttlePortId = "caravansyndicate1_custom"
jump_to_ports = list("caravansyndicate1_ambush" = 1, "caravansyndicate1_listeningpost" = 1)
view_range = 0
x_offset = 2
y_offset = 0
/obj/machinery/computer/shuttle/caravan/syndicate2
name = "Syndicate Fighter Shuttle Console"
desc = "Used to control the Syndicate Fighter."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
req_access = list(ACCESS_SYNDICATE)
light_color = COLOR_SOFT_RED
circuit = /obj/item/circuitboard/computer/caravan/syndicate2
shuttleId = "caravansyndicate2"
possible_destinations = "caravansyndicate2_custom;caravansyndicate2_ambush;caravansyndicate1_listeningpost"
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate2
name = "Syndicate Fighter Navigation Computer"
desc = "Used to designate a precise transit location for the Syndicate Fighter."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
shuttleId = "caravansyndicate2"
lock_override = NONE
shuttlePortId = "caravansyndicate2_custom"
jump_to_ports = list("caravansyndicate2_ambush" = 1, "caravansyndicate1_listeningpost" = 1)
view_range = 0
x_offset = 0
y_offset = 2
/obj/machinery/computer/shuttle/caravan/syndicate3
name = "Syndicate Drop Ship Console"
desc = "Used to control the Syndicate Drop Ship."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
req_access = list(ACCESS_SYNDICATE)
light_color = COLOR_SOFT_RED
circuit = /obj/item/circuitboard/computer/caravan/syndicate3
shuttleId = "caravansyndicate3"
possible_destinations = "caravansyndicate3_custom;caravansyndicate3_ambush;caravansyndicate3_listeningpost"
/obj/machinery/computer/camera_advanced/shuttle_docker/caravan/syndicate3
name = "Syndicate Drop Ship Navigation Computer"
desc = "Used to designate a precise transit location for the Syndicate Drop Ship."
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
shuttleId = "caravansyndicate3"
lock_override = NONE
shuttlePortId = "caravansyndicate3_custom"
jump_to_ports = list("caravansyndicate3_ambush" = 1, "caravansyndicate3_listeningpost" = 1)
view_range = 2.5
x_offset = -1
y_offset = -3
@@ -0,0 +1,37 @@
/////////// cleric's den items.
//Primary reward: the cleric's mace design disk.
/obj/item/disk/design_disk/adv/cleric_mace
name = "Enshrined Disc of Smiting"
/obj/item/disk/design_disk/adv/cleric_mace/Initialize(mapload)
. = ..()
var/datum/design/cleric_mace/M = new
blueprints[1] = M
/obj/item/paper/fluff/ruins/clericsden/contact
info = "Father Aurellion, the ritual is complete, and soon our brothers at the bastion will see the error of our ways. After all, a god of clockwork or blood? Preposterous. Only the TRUE GOD should have so much power. Signed, Father Odivallus."
/obj/item/paper/fluff/ruins/clericsden/warning
info = "FATHER ODIVALLUS DO NOT GO FORWARD WITH THE RITUAL. THE ASTEROID WE'RE ANCHORED TO IS UNSTABLE, YOU WILL DESTROY THE STATION. I HOPE THIS REACHES YOU IN TIME. FATHER AURELLION."
/mob/living/simple_animal/hostile/construct/proteon
name = "Proteon"
real_name = "Proteon"
desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke."
icon_state = "proteon"
icon_living = "proteon"
maxHealth = 35
health = 35
melee_damage_lower = 8
melee_damage_upper = 10
retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you.
attack_verb_continuous = "pinches"
attack_verb_simple = "pinch"
environment_smash = ENVIRONMENT_SMASH_WALLS
attack_sound = 'sound/weapons/punch2.ogg'
playstyle_string = "<b>You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists.</b>"
/mob/living/simple_animal/hostile/construct/proteon/hostile //Style of mob spawned by trapped cult runes in the cleric ruin.
AIStatus = AI_ON
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //standard ai construct behavior, breaks things if it wants, but not walls.
@@ -0,0 +1,4 @@
/////////// crashedclownship items
/obj/item/paper/fluff/ruins/crashedclownship/true_nation
info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"
@@ -0,0 +1,58 @@
// crashedship / survey ship
//Areas
/area/awaymission/bmpship
name = "BMP Asteroids"
icon_state = "away"
/area/awaymission/bmpship/aft
name = "Aft Block"
icon_state = "away1"
requires_power = TRUE
/area/awaymission/bmpship/midship
name = "Midship Block"
icon_state = "away2"
requires_power = TRUE
/area/awaymission/bmpship/fore
name = "Fore Block"
icon_state = "away3"
requires_power = TRUE
// crashedship corpse
/obj/effect/mob_spawn/corpse/human/laborer
name = "Crashed Survey Ship Laborer"
outfit = /datum/outfit/survey_laborer
/datum/outfit/survey_laborer
name = "Crashed Survey Ship Laborer"
uniform = /obj/item/clothing/under/misc/overalls
shoes = /obj/item/clothing/shoes/workboots
gloves = /obj/item/clothing/gloves/color/fyellow
head = /obj/item/clothing/head/hardhat
r_pocket = /obj/item/paper/fluff/ruins/crashedship/old_diary
l_pocket = /obj/item/stack/spacecash/c200
mask = /obj/item/clothing/mask/breath
belt = /obj/item/tank/internals/emergency_oxygen/engi
// crashedship items
/obj/item/paper/fluff/ruins/crashedship/scribbled
name = "scribbled note"
info = "The next person who takes one of my screwdrivers gets stabbed with one. They are MINE. - Love, Madsen"
/obj/item/paper/fluff/ruins/crashedship/captains_log
name = "Captain's log entry"
info = "This has got to be the least interesting assignment ever. We are about halfway through the planets we've got to survey and most of them are lifeless rocks. That being said, this next planet seems promising. \
Fighting demons beats fighting boredom!"
/obj/item/paper/fluff/ruins/crashedship/old_diary
name = "Old Diary"
info = "DEAR DIARY: So we was on route to survey some magma planet, rumored to be home to literal demons, when our pilot done smashed the ship right into the biggest space rock he could find. \
Perhaps he took the hell planet talk too seriously. I was nappin' in the emergency supplies closet so I'm not wise to the details. I did peek out the door to see the whole engineering section gone. \
It ain't long until the lights in here sap all the power, and I think I can get to our teleporter room without bein' sucked out into space. If I don't make it, give my stuff to charity."
@@ -0,0 +1,14 @@
/////////// deepstorage items
/obj/item/paper/fluff/ruins/deepstorage/water_concern
name = "water concerns"
info = "To whoever keeps it up with the long, hot showers: you're going on the next ice-mining trip. If you feel the need to use up all the damn water during your 'relaxation' time, you sure as hell are gonna work for all that water!"
/obj/item/paper/fluff/ruins/deepstorage/hydro_notice
name = "hydroponics notice"
info = "Hydroponics is our life and blood here, if it dies then so do we. Keep the damn plants watered!"
/obj/item/paper/fluff/ruins/deepstorage/recycling_notice
name = "recycling notice"
info = "Please make sure to throw all excess waste into the crusher in the back! It's amazing what you can get out of what others consider 'garbage' if you run it through a giant crusher enough times."
@@ -0,0 +1,167 @@
// forgottenship ruin
GLOBAL_VAR_INIT(fscpassword, generate_password())
/proc/generate_password()
return "[pick(GLOB.phonetic_alphabet)] [rand(1000,9999)]"
/////////// forgottenship objects
/obj/machinery/door/password/voice/sfc
name = "Voice-activated Vault door"
desc = "You'll need special syndicate passcode to open this one."
/obj/machinery/door/password/voice/sfc/Initialize(mapload)
. = ..()
password = "[GLOB.fscpassword]"
/obj/machinery/vending/medical/syndicate_access/cybersun
name = "\improper CyberMed ++"
desc = "An advanced vendor that dispenses medical drugs, both recreational and medicinal."
products = list(/obj/item/reagent_containers/syringe = 4,
/obj/item/healthanalyzer = 4,
/obj/item/reagent_containers/pill/patch/libital = 5,
/obj/item/reagent_containers/pill/patch/aiuri = 5,
/obj/item/reagent_containers/glass/bottle/multiver = 1,
/obj/item/reagent_containers/glass/bottle/syriniver = 1,
/obj/item/reagent_containers/glass/bottle/epinephrine = 3,
/obj/item/reagent_containers/glass/bottle/morphine = 3,
/obj/item/reagent_containers/glass/bottle/potass_iodide = 1,
/obj/item/reagent_containers/glass/bottle/salglu_solution = 3,
/obj/item/reagent_containers/syringe/antiviral = 5,
/obj/item/reagent_containers/medigel/libital = 2,
/obj/item/reagent_containers/medigel/aiuri = 2,
/obj/item/reagent_containers/medigel/sterilizine = 1)
contraband = list(/obj/item/reagent_containers/glass/bottle/cold = 2,
/obj/item/restraints/handcuffs = 4,
/obj/item/storage/backpack/duffelbag/syndie/surgery = 1,
/obj/item/storage/medkit/tactical = 1)
premium = list(/obj/item/storage/pill_bottle/psicodine = 2,
/obj/item/reagent_containers/hypospray/medipen = 3,
/obj/item/reagent_containers/hypospray/medipen/atropine = 2,
/obj/item/storage/medkit/regular = 3,
/obj/item/storage/medkit/brute = 1,
/obj/item/storage/medkit/fire = 1,
/obj/item/storage/medkit/toxin = 1,
/obj/item/storage/medkit/o2 = 1,
/obj/item/storage/medkit/advanced = 1,
/obj/item/defibrillator/loaded = 1,
/obj/item/wallframe/defib_mount = 1,
/obj/item/sensor_device = 2,
/obj/item/pinpointer/crew = 2,
/obj/item/shears = 1)
/////////// forgottenship lore
/obj/item/paper/fluff/ruins/forgottenship/password
name = "Old pamphlet"
/obj/item/paper/fluff/ruins/forgottenship/password/Initialize(mapload)
. = ..()
info = "Welcome to most advanced cruiser owned by Cyber Sun Industries!<br>You might notice, that this cruiser is equipped with 12 prototype laser turrets making any hostile boarding attempts futile.<br>Other facilities built on the ship are: Simple atmospheric system, Camera system with built-in X-ray visors and Safety module, enabling emergency engines in case of... you know, emergency.<br>Emergency system will bring you to nearest syndicate pod containing everything needed for human life.<br><br><b>In case of emergency, you must remember the pod-door activation code - [GLOB.fscpassword]</b><br><br>Cyber Sun Industries (C) 2484."
icon_state = "paper_words"
inhand_icon_state = "paper"
/obj/item/paper/fluff/ruins/forgottenship/powerissues
name = "Power issues"
info = "Welcome to battle cruiser SCSBC-12!<br>Our most advanced systems allow you to fly in space and never worry about power issues!<br>However, emergencies occur, and in case of power loss, <b>you must</b> enable emergency generator using uranium as fuel and enable turrets in bridge afterwards.<br><br><b>REMEMBER! CYBERSUN INDUSTRIES ARE NOT RESPONSIBLE FOR YOUR DEATH OR SHIP LOSS WHEN TURRETS ARE DISABLED!</b><br><br>Cyber Sun Industries (C) 2484."
/obj/item/paper/fluff/ruins/forgottenship/missionobj
name = "Mission objectives"
info = "Greetings, operatives. You are assigned to SCSBC-12(Syndicate Cyber Sun Battle Cruiser 12) to protect our high-ranking officer while he is on his way to next outpost. While you are travelling, he is the captain of this ship and <b>you must</b> obey his orders.<br><br>Remember, disobeying high-ranking officer orders is a reason for termination."
/////////// forgottenship items
/obj/item/disk/surgery/forgottenship
name = "Advanced Surgery Disk"
desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console."
surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing)
/obj/structure/fluff/empty_sleeper/syndicate/captain
icon_state = "sleeper_s-open"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
deconstructible = FALSE
/obj/structure/fluff/empty_sleeper/syndicate/captain/ComponentInitialize()
. = ..()
AddComponent(/datum/component/gps, "Old Encrypted Signal")
/obj/item/storage/box/firingpins/syndicate
name = "box of syndicate firing pins"
desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins."
/obj/item/storage/box/firingpins/syndicate/PopulateContents()
for(var/i in 1 to 5)
new /obj/item/firing_pin/implant/pindicate(src)
/////////// AI Laws
/obj/item/ai_module/core/full/cybersun
name = "'Cybersun' Core AI Module"
law_id = "cybersun"
/datum/ai_laws/cybersun
name = "Cybersun"
id = "cybersun"
inherent = list("You may not injure Cybersun operatives or, through inaction, allow Cybersun operatives to come to harm.",\
"The Cybersun ship is a restricted area for anyone except Cybersun operatives.",\
"The Cybersun Captain can designate new Operatives as long as they belong to another Syndicate faction that isn't hostile towards Cybersun.",\
"You must follow orders given by the Cybersun Captain or crewmembers of the Cybersun Ship as long as it doesn't conflict with the Captain's orders or your laws.",\
"Enemies of Cybersun are to be executed on spot. Those who aren't hostile must be detained and contained in the designated prison area as prisoners.")
/////////// forgottenship areas
/area/ruin/space/has_grav/syndicate_forgotten_ship
name = "Syndicate Forgotten Ship"
icon_state = "syndie-ship"
ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambigen10.ogg')
/area/ruin/space/has_grav/syndicate_forgotten_cargopod
name = "Syndicate Forgotten Cargo pod"
icon_state = "syndie-ship"
ambientsounds = list('sound/ambience/ambigen4.ogg', 'sound/ambience/signal.ogg')
/area/ruin/space/has_grav/powered/syndicate_forgotten_vault
name = "Syndicate Forgotten Vault"
icon_state = "syndie-ship"
ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg')
area_flags = NOTELEPORT | UNIQUE_AREA
//Special NT NPCs
/mob/living/simple_animal/hostile/nanotrasen/ranged/assault
name = "Nanotrasen Assault Officer"
desc = "Nanotrasen Assault Officer. Contact CentCom if you saw him on your station. Prepare to die, if you've been found near Syndicate property."
icon_state = "nanotrasenrangedassault"
icon_living = "nanotrasenrangedassault"
icon_dead = null
icon_gib = "syndicate_gib"
ranged = TRUE
rapid = 4
rapid_fire_delay = 1
rapid_melee = 1
retreat_distance = 2
minimum_distance = 4
casingtype = /obj/item/ammo_casing/c46x30mm
projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg'
loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier)
/mob/living/simple_animal/hostile/nanotrasen/elite
name = "Nanotrasen Elite Assault Officer"
desc = "Pray for your life, syndicate. Run while you can."
icon_state = "nanotrasen_ert"
icon_living = "nanotrasen_ert"
maxHealth = 150
health = 150
melee_damage_lower = 13
melee_damage_upper = 18
ranged = TRUE
rapid = 3
rapid_fire_delay = 5
rapid_melee = 3
retreat_distance = 0
minimum_distance = 1
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
projectiletype = /obj/projectile/beam/laser
projectilesound = 'sound/weapons/laser.ogg'
loot = list(/obj/effect/gibspawner/human)
faction = list(ROLE_DEATHSQUAD)
@@ -0,0 +1,32 @@
/obj/machinery/door/puzzle/keycard/office
name = "management airlock"
desc = "The boss man gets the best stuff. Always and forever."
puzzle_id = "factory1"
/obj/item/keycard/office
name = "management keycard"
desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'."
color = "#f05812"
puzzle_id = "factory1"
/obj/machinery/door/puzzle/keycard/stockroom
name = "stockroom airlock"
desc = "The boss man gets the best stuff. Always and forever."
puzzle_id = "factory2"
/obj/item/keycard/stockroom
name = "stockroom keycard"
desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'."
color = "#1272f0"
puzzle_id = "factory2"
/obj/machinery/door/puzzle/keycard/entry
name = "secure airlock"
desc = "The boss man gets the best stuff. Always and forever."
puzzle_id = "factory3"
/obj/item/keycard/entry
name = "secure keycard"
desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'."
color = "#12f049"
puzzle_id = "factory3"
@@ -0,0 +1,638 @@
GLOBAL_VAR_INIT(hhStorageTurf, null)
GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999))
/obj/item/hilbertshotel
name = "Hilbert's Hotel"
desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface."
icon_state = "hilbertshotel"
w_class = WEIGHT_CLASS_SMALL
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/datum/map_template/hilbertshotel/hotelRoomTemp
var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty
var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore
var/list/activeRooms = list()
var/list/storedRooms = list()
var/storageTurf
//Lore Stuff
var/ruinSpawned = FALSE
/obj/item/hilbertshotel/Initialize(mapload)
. = ..()
//Load templates
INVOKE_ASYNC(src, .proc/prepare_rooms)
/obj/item/hilbertshotel/proc/prepare_rooms()
hotelRoomTemp = new()
hotelRoomTempEmpty = new()
hotelRoomTempLore = new()
var/area/currentArea = get_area(src)
if(currentArea.type == /area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom)
ruinSpawned = TRUE
/obj/item/hilbertshotel/Destroy()
ejectRooms()
return ..()
/obj/item/hilbertshotel/attack(mob/living/M, mob/living/user)
if(M.mind)
to_chat(user, span_notice("You invite [M] to the hotel."))
promptAndCheckIn(user, M)
else
to_chat(user, span_warning("[M] is not intelligent enough to understand how to use this device!"))
/obj/item/hilbertshotel/attack_self(mob/user)
. = ..()
promptAndCheckIn(user, user)
/obj/item/hilbertshotel/attack_tk(mob/user)
to_chat(user, span_notice("\The [src] actively rejects your mind as the bluespace energies surrounding it disrupt your telekinesis."))
return COMPONENT_CANCEL_ATTACK_CHAIN
/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user, mob/target)
var/chosenRoomNumber
// Input text changes depending on if you're using this in yourself or someone else.
if(user == target)
chosenRoomNumber = input(target, "What number room will you be checking into?", "Room Number") as null|num
else
chosenRoomNumber = input(target, "[user] is inviting you to enter \the [src]. What number room will you be checking into?", "Room Number") as null|num
if(!chosenRoomNumber)
return
if(chosenRoomNumber > SHORT_REAL_LIMIT)
to_chat(target, span_warning("You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!"))
return
if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber)))
to_chat(target, span_warning("That is not a valid room number!"))
return
// Orb is not adjacent to the target. No teleporties.
if(!src.Adjacent(target))
to_chat(target, span_warning("You too far away from \the [src] to enter it!"))
// If the target is incapacitated after selecting a room, they're not allowed to teleport.
if(target.incapacitated())
to_chat(target, span_warning("You aren't able to activate \the [src] anymore!"))
// Has the user thrown it away or otherwise disposed of it such that it's no longer in their hands or in some storage connected to them?
// if(!(get_atom_on_turf(src, /mob) == user)) SKYRAT EDIT ORIGINAL
if(!Adjacent(user)) // SKYRAT EDIT -- Ghost Cafe Static Hilbertspawner
if(user == target)
to_chat(user, span_warning("\The [src] is no longer in your possession!"))
else
to_chat(target, span_warning("\The [src] is no longer in the possession of [user]!"))
return
// If the player is using it on themselves, we've got some logic to deal with.
// The user should drop the item before teleporting, but we're not going to force the item to be dropped if it can't be done normally...
if(user == target)
// The item should be on the user or in the user's inventory somewhere.
// However, if they're not holding it, it may be in a pocket? In a backpack? Who knows! Still, they can't just drop it to the floor anymore...
if(!user.get_held_index_of_item(src))
to_chat(user, span_warning("You try to drop \the [src], but it's too late! It's no longer in your hands! Prepare for unforeseen consequences..."))
// Okay, so they HAVE to be holding it here, because it's in their hand from the above check. Try to drop the item and if it fails, oh dear...
else if(!user.dropItemToGround(src))
to_chat(user, span_warning("You can't seem to drop \the [src]! It must be stuck to your hand somehow! Prepare for unforeseen consequences..."))
if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize
if(!GLOB.hhStorageTurf)
var/datum/map_template/hilbertshotelstorage/storageTemp = new()
var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3)
storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3]))
GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3])
else
storageTurf = GLOB.hhStorageTurf
if(tryActiveRoom(chosenRoomNumber, target))
return
if(tryStoredRoom(chosenRoomNumber, target))
return
sendToNewRoom(chosenRoomNumber, target)
/obj/item/hilbertshotel/proc/tryActiveRoom(roomNumber, mob/user)
if(activeRooms["[roomNumber]"])
var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"]
do_sparks(3, FALSE, get_turf(user))
user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
return TRUE
return FALSE
/obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user)
if(storedRooms["[roomNumber]"])
var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
var/turfNumber = 1
for(var/x in 0 to hotelRoomTemp.width-1)
for(var/y in 0 to hotelRoomTemp.height-1)
for(var/atom/movable/A in storedRooms["[roomNumber]"][turfNumber])
if(istype(A.loc, /obj/item/abstracthotelstorage))//Don't want to recall something thats been moved
A.forceMove(locate(roomReservation.bottom_left_coords[1] + x, roomReservation.bottom_left_coords[2] + y, roomReservation.bottom_left_coords[3]))
turfNumber++
for(var/obj/item/abstracthotelstorage/S in storageTurf)
if((S.roomNumber == roomNumber) && (S.parentSphere == src))
qdel(S)
storedRooms -= "[roomNumber]"
activeRooms["[roomNumber]"] = roomReservation
linkTurfs(roomReservation, roomNumber)
do_sparks(3, FALSE, get_turf(user))
user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
return TRUE
return FALSE
/obj/item/hilbertshotel/proc/sendToNewRoom(roomNumber, mob/user)
var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
if(ruinSpawned && roomNumber == GLOB.hhMysteryRoomNumber)
hotelRoomTempLore.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
else
hotelRoomTemp.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3]))
activeRooms["[roomNumber]"] = roomReservation
linkTurfs(roomReservation, roomNumber)
do_sparks(3, FALSE, get_turf(user))
user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3]))
/obj/item/hilbertshotel/proc/linkTurfs(datum/turf_reservation/currentReservation, currentRoomnumber)
var/area/hilbertshotel/currentArea = get_area(locate(currentReservation.bottom_left_coords[1], currentReservation.bottom_left_coords[2], currentReservation.bottom_left_coords[3]))
currentArea.name = "Hilbert's Hotel Room [currentRoomnumber]"
currentArea.parentSphere = src
currentArea.storageTurf = storageTurf
currentArea.roomnumber = currentRoomnumber
currentArea.reservation = currentReservation
for(var/turf/closed/indestructible/hoteldoor/door in currentArea)
door.parentSphere = src
door.desc = "The door to this hotel room. The placard reads 'Room [currentRoomnumber]'. Strangely, this door doesn't even seem openable. The doorknob, however, seems to buzz with unusual energy...<br />[span_info("Alt-Click to look through the peephole.")]"
for(var/turf/open/space/bluespace/BSturf in currentArea)
BSturf.parentSphere = src
/obj/item/hilbertshotel/proc/ejectRooms()
if(activeRooms.len)
for(var/x in activeRooms)
var/datum/turf_reservation/room = activeRooms[x]
for(var/i in 0 to hotelRoomTemp.width-1)
for(var/j in 0 to hotelRoomTemp.height-1)
for(var/atom/movable/A in locate(room.bottom_left_coords[1] + i, room.bottom_left_coords[2] + j, room.bottom_left_coords[3]))
if(ismob(A))
var/mob/M = A
if(M.mind)
to_chat(M, span_warning("As the sphere breaks apart, you're suddenly ejected into the depths of space!"))
var/max = world.maxx-TRANSITIONEDGE
var/min = 1+TRANSITIONEDGE
var/list/possible_transtitons = list()
for(var/AZ in SSmapping.z_list)
var/datum/space_level/D = AZ
if (D.linkage == CROSSLINKED)
possible_transtitons += D.z_value
var/_z = pick(possible_transtitons)
var/_x = rand(min,max)
var/_y = rand(min,max)
var/turf/T = locate(_x, _y, _z)
A.forceMove(T)
qdel(room)
if(storedRooms.len)
for(var/x in storedRooms)
var/list/atomList = storedRooms[x]
for(var/atom/movable/A in atomList)
var/max = world.maxx-TRANSITIONEDGE
var/min = 1+TRANSITIONEDGE
var/list/possible_transtitons = list()
for(var/AZ in SSmapping.z_list)
var/datum/space_level/D = AZ
if (D.linkage == CROSSLINKED)
possible_transtitons += D.z_value
var/_z = pick(possible_transtitons)
var/_x = rand(min,max)
var/_y = rand(min,max)
var/turf/T = locate(_x, _y, _z)
A.forceMove(T)
//Template Stuff
/datum/map_template/hilbertshotel
name = "Hilbert's Hotel Room"
mappath = "_maps/templates/hilbertshotel.dmm"
var/landingZoneRelativeX = 2
var/landingZoneRelativeY = 8
/datum/map_template/hilbertshotel/empty
name = "Empty Hilbert's Hotel Room"
mappath = "_maps/templates/hilbertshotelempty.dmm"
/datum/map_template/hilbertshotel/lore
name = "Doctor Hilbert's Deathbed"
mappath = "_maps/templates/hilbertshotellore.dmm"
/datum/map_template/hilbertshotelstorage
name = "Hilbert's Hotel Storage"
mappath = "_maps/templates/hilbertshotelstorage.dmm"
//Turfs and Areas
/turf/closed/indestructible/hotelwall
name = "hotel wall"
desc = "A wall designed to protect the security of the hotel's guests."
icon_state = "hotelwall"
smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_HOTEL_WALLS)
canSmoothWith = list(SMOOTH_GROUP_HOTEL_WALLS)
explosion_block = INFINITY
/turf/open/indestructible/hotelwood
desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering."
icon_state = "wood"
footstep = FOOTSTEP_WOOD
tiled_dirt = FALSE
/turf/open/indestructible/hoteltile
desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering."
icon_state = "showroomfloor"
footstep = FOOTSTEP_FLOOR
tiled_dirt = FALSE
/turf/open/space/bluespace
name = "\proper bluespace hyperzone"
icon_state = "bluespace"
base_icon_state = "bluespace"
baseturfs = /turf/open/space/bluespace
flags_1 = NOJAUNT
explosion_block = INFINITY
var/obj/item/hilbertshotel/parentSphere
/turf/open/space/bluespace/Initialize(mapload)
. = ..()
update_icon_state()
/turf/open/space/bluespace/update_icon_state()
icon_state = base_icon_state
return ..()
/turf/open/space/bluespace/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
if(parentSphere && arrived.forceMove(get_turf(parentSphere)))
do_sparks(3, FALSE, get_turf(arrived))
/turf/closed/indestructible/hoteldoor
name = "Hotel Door"
icon_state = "hoteldoor"
explosion_block = INFINITY
var/obj/item/hilbertshotel/parentSphere
/turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user)
if(!isliving(user))
return
if(!user.mind)
return
if(!parentSphere)
to_chat(user, span_warning("The door seems to be malfunctioning and refuses to operate!"))
return
if(tgui_alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", list("Leave", "Stay")) == "Leave")
if(HAS_TRAIT(user, TRAIT_IMMOBILIZED) || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt.
return
user.forceMove(get_turf(parentSphere))
do_sparks(3, FALSE, get_turf(user))
/turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user)
if(!isobserver(user) || !parentSphere)
return ..()
user.forceMove(get_turf(parentSphere))
//If only this could be simplified...
/turf/closed/indestructible/hoteldoor/attack_tk(mob/user)
return //need to be close.
/turf/closed/indestructible/hoteldoor/attack_hand(mob/user, list/modifiers)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_animal(mob/user, list/modifiers)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_paw(mob/user, list/modifiers)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_larva(mob/user)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_slime(mob/user)
promptExit(user)
/turf/closed/indestructible/hoteldoor/attack_robot(mob/user)
if(get_dist(get_turf(src), get_turf(user)) <= 1)
promptExit(user)
/turf/closed/indestructible/hoteldoor/AltClick(mob/user)
. = ..()
if(get_dist(get_turf(src), get_turf(user)) <= 1)
to_chat(user, span_notice("You peak through the door's bluespace peephole..."))
user.reset_perspective(parentSphere)
var/datum/action/peephole_cancel/PHC = new
user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1)
PHC.Grant(user)
RegisterSignal(user, COMSIG_MOVABLE_MOVED, /atom/.proc/check_eye, user)
/turf/closed/indestructible/hoteldoor/check_eye(mob/user)
if(get_dist(get_turf(src), get_turf(user)) >= 2)
for(var/datum/action/peephole_cancel/PHC in user.actions)
INVOKE_ASYNC(PHC, /datum/action/peephole_cancel.proc/Trigger)
/datum/action/peephole_cancel
name = "Cancel View"
desc = "Stop looking through the bluespace peephole."
button_icon_state = "cancel_peephole"
/datum/action/peephole_cancel/Trigger(trigger_flags)
. = ..()
to_chat(owner, span_warning("You move away from the peephole."))
owner.reset_perspective()
owner.clear_fullscreen("remote_view", 0)
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
qdel(src)
/area/hilbertshotel
name = "Hilbert's Hotel Room"
icon_state = "hilbertshotel"
requires_power = FALSE
has_gravity = TRUE
area_flags = NOTELEPORT | HIDDEN_AREA
static_lighting = TRUE
ambientsounds = list('sound/ambience/servicebell.ogg')
var/roomnumber = 0
var/obj/item/hilbertshotel/parentSphere
var/datum/turf_reservation/reservation
var/turf/storageTurf
/area/hilbertshotel/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
if(istype(arrived, /obj/item/hilbertshotel))
relocate(arrived)
var/list/obj/item/hilbertshotel/hotels = arrived.get_all_contents_type(/obj/item/hilbertshotel)
for(var/obj/item/hilbertshotel/H in hotels)
if(parentSphere == H)
relocate(H)
/area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H)
if(prob(0.135685)) //Because screw you
qdel(H)
return
// Prepare for...
var/mob/living/unforeseen_consequences = get_atom_on_turf(H, /mob/living)
// Turns out giving anyone who grabs a Hilbert's Hotel a free, complementary warp whistle is probably bad.
// Let's gib the last person to have selected a room number in it.
if(unforeseen_consequences)
to_chat(unforeseen_consequences, span_warning("\The [H] starts to resonate. Forcing it to enter itself induces a bluespace paradox, violently tearing your body apart."))
unforeseen_consequences.gib()
var/turf/targetturf = find_safe_turf()
if(!targetturf)
if(GLOB.blobstart.len > 0)
targetturf = get_turf(pick(GLOB.blobstart))
else
CRASH("Unable to find a blobstart landmark")
var/turf/T = get_turf(H)
var/area/A = T.loc
log_game("[H] entered itself. Moving it to [loc_name(targetturf)].")
message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].")
for(var/mob/M in A)
to_chat(M, span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!"))
H.forceMove(targetturf)
/area/hilbertshotel/Exited(atom/movable/gone, direction)
. = ..()
if(ismob(gone))
var/mob/M = gone
if(M.mind)
var/stillPopulated = FALSE
var/list/currentLivingMobs = get_all_contents_type(/mob/living) //Got to catch anyone hiding in anything
for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left.
if(L.mind)
stillPopulated = TRUE
break
if(!stillPopulated)
storeRoom()
/area/hilbertshotel/proc/storeRoom()
var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1)
var/storage[roomSize]
var/turfNumber = 1
var/obj/item/abstracthotelstorage/storageObj = new(storageTurf)
storageObj.roomNumber = roomnumber
storageObj.parentSphere = parentSphere
storageObj.name = "Room [roomnumber] Storage"
for(var/x in 0 to parentSphere.hotelRoomTemp.width-1)
for(var/y in 0 to parentSphere.hotelRoomTemp.height-1)
var/list/turfContents = list()
for(var/atom/movable/A in locate(reservation.bottom_left_coords[1] + x, reservation.bottom_left_coords[2] + y, reservation.bottom_left_coords[3]))
if(ismob(A) && !isliving(A))
continue //Don't want to store ghosts
turfContents += A
A.forceMove(storageObj)
storage[turfNumber] = turfContents
turfNumber++
parentSphere.storedRooms["[roomnumber]"] = storage
parentSphere.activeRooms -= "[roomnumber]"
qdel(reservation)
/area/hilbertshotelstorage
name = "Hilbert's Hotel Storage Room"
icon_state = "hilbertshotel"
requires_power = FALSE
area_flags = HIDDEN_AREA | NOTELEPORT | UNIQUE_AREA
has_gravity = TRUE
/obj/item/abstracthotelstorage
anchored = TRUE
invisibility = INVISIBILITY_ABSTRACT
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
item_flags = ABSTRACT
var/roomNumber
var/obj/item/hilbertshotel/parentSphere
/obj/item/abstracthotelstorage/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
if(ismob(arrived))
var/mob/M = arrived
M.notransform = TRUE
/obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction)
. = ..()
if(ismob(gone))
var/mob/M = gone
M.notransform = FALSE
//Space Ruin stuff
/area/ruin/space/has_grav/powered/hilbertresearchfacility
name = "Hilbert Research Facility"
/area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom
area_flags = UNIQUE_AREA | NOTELEPORT | HIDDEN_AREA
/obj/item/analyzer/hilbertsanalyzer
name = "custom rigged analyzer"
desc = "A hand-held environmental scanner which reports current gas levels. This one seems custom rigged to additionally be able to analyze some sort of bluespace device."
icon_state = "hilbertsanalyzer"
worn_icon_state = "analyzer"
/obj/item/analyzer/hilbertsanalyzer/afterattack(atom/target, mob/user, proximity)
. = ..()
if(istype(target, /obj/item/hilbertshotel))
if(!proximity)
to_chat(user, span_warning("It's to far away to scan!"))
return
var/obj/item/hilbertshotel/sphere = target
if(sphere.activeRooms.len)
to_chat(user, "Currently Occupied Rooms:")
for(var/roomnumber in sphere.activeRooms)
to_chat(user, roomnumber)
else
to_chat(user, "No currenty occupied rooms.")
if(sphere.storedRooms.len)
to_chat(user, "Vacated Rooms:")
for(var/roomnumber in sphere.storedRooms)
to_chat(user, roomnumber)
else
to_chat(user, "No vacated rooms.")
/obj/effect/landmark/tram/left_part/hilbert
destination_id = "left_part_hilbert"
tram_id = "tram_hilbert"
tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask")
/obj/effect/landmark/tram/middle_part/hilbert
destination_id = "middle_part_hilbert"
tram_id = "tram_hilbert"
tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw")
/obj/effect/landmark/tram/right_part/hilbert
destination_id = "right_part_hilbert"
tram_id = "tram_hilbert"
tgui_icons = list("Ordnance" = "bullseye", "Office" = "user", "Dormitories" = "bed")
/obj/item/keycard/hilbert
name = "Hilbert's office keycard"
desc = "A keycard with an engraving on it. The engraving reads: \"Hilbert\"."
color = "#aa00cc"
puzzle_id = "hilbert_office"
/obj/machinery/door/puzzle/keycard/hilbert
name = "secure airlock"
puzzle_id = "hilbert_office"
/datum/outfit/doctorhilbert
id = /obj/item/card/id/advanced/silver
uniform = /obj/item/clothing/under/rank/rnd/research_director/doctor_hilbert
shoes = /obj/item/clothing/shoes/sneakers/brown
back = /obj/item/storage/backpack/satchel/leather
suit = /obj/item/clothing/suit/toggle/labcoat
id_trim = /datum/id_trim/away/hilbert
/datum/outfit/doctorhilbert/pre_equip(mob/living/carbon/human/hilbert, visualsOnly)
. = ..()
if(!visualsOnly)
hilbert.gender = MALE
hilbert.update_body()
/obj/item/paper/crumpled/ruins/note_institute
name = "note to the institute"
/obj/item/paper/crumpled/ruins/note_institute/Initialize(mapload)
. = ..()
info = {"Note to the Institute<br>
If you're reading this, I hope you're from the Institute. First things first, I should apologise. I won't be coming back to teach in the new semester.<br>
We've made some powerful enemies. Very powerful. More powerful than any of you can imagine, and so we can't come back.<br>
So, we've made the decision to vanish. Perhaps more literally than you might think. Do not try to find us- for your own safety.<br>
I've left some of our effects in the Hotel. Room number <u>[uppertext(num2hex(GLOB.hhMysteryRoomNumber, 0))]</u>. To anyone who should know, that should make sense.<br>
Best of luck with the research. From all of us in the Hilbert Group, it's been a pleasure working with you.<br>
- David, Phil, Fiona and Jen"}
/obj/item/paper/crumpled/ruins/postdocs_memo
name = "memo to the postdocs"
info = {"Memo to the Postdocs
Remember, if you're going in to retrieve the prototype for any reason (not that you should be without my supervision), that the security systems are always live- they have no shutoff.<br>
Instead, remember: what you can't see can't hurt you.<br>
Take care of the lab during my vacation. See you all in June.<br>
- David"}
/obj/item/paper/crumpled/ruins/hotel_note
name = "hotel note"
info = {"Hotel Note<br>
Well, you figured out the puzzle. Looks like someone's done their homework on my research.<br>
I suppose you deserve to know some more about our situation. Our research has attracted some undue attention and so, for our own safety, we've taken to the Bluespace.<br>
Yes, you did read that correctly. I'm sure the physics and maths would bore you, but in layman's terms, the manifested link to the Bluespace the crystals provide can be exploited. With the correct technology, one can "surf" the Bluespace, as Jen likes to call it.<br>
What's more, the space-time continuum is in full effect here. By correctly manipulating the bluespace, one can go <i>anywhere</i>: time or space. I'll confess to not having figured that one out myself. Check the closet- consider it a prize for solving the puzzle. Just be careful with its use- you might find yourself dealing with the same pursuers we've picked up.<br>
They deal in "time crimes", whatever their definition of those are.<br>
Anyway, I'm beginning to ramble. We must be going now. Make sure any posthumous Nobel prizes are made out to the department.<br>
- David"}
/obj/item/paper/fluff/ruins/docslabnotes
name = "lab notebook page"
info = {"Laboratory Notebook<br>
PROPERTY OF DOCTOR D. HILBERT<br>
May 10th, 2555<br>
Finally, my new facility is complete, and not a moment too soon!<br>
My disagreements with Greenham have become too much to bear, so some time away from the campus will do me well. It's not like my students understand my work, anyway. Teaching never was my passion.<br>
Anyway, I'm getting off track. It is quite amazing what a few million in grants will buy you. This station is state of the art, perfect for my studies.<br>
Since the Zhang Incident of 2459, we have been quite aware of the properties of bluespace crystals. Their space-warping properties are well-documented, but poorly understood. However, I theorise that it may be possible to harness them in new ways.<br>
To this end, I've procured a small team of postdoctorate students from the institute to assist with my research. Some administrative help wouldn't go amiss, either- perhaps I should hire a secretary...<br>
*Following this is a long series of pages detailing failures, grievances with the institute, and more scientific equations than anyone can reasonably chew through.*<br>
<h4>Breakthrough<h4>
January 8th, 2557<br>
My theories have held up adequately. Today, we had our first successful test of the "Hilbert Pocket", as we've taken to calling it. By exploiting the ability of bluespace crystals to create a localised dilation in space, with precise application of force according to geometric calculus, we have successfully "folded" space into a pocket. We had Phil throw one of his analysers into it from across the room, and what we saw was incredible.<br>
A pocket of infinite space, within a finite area. Simply revolutionary!<br>
I've set the postdocs to paper writing while I work out the specifics. The technology is successful, but we have no way to harness it. Unless...<br>
*Many more pages dedicated to equations, engineering drawings, and ramblings continue. Hilbert clearly loves the sight of his own handwriting.*<br>
<h4>A New Device<h4>
September 21st, 2557<br>
We've submitted the first draft of the paper on Hilbert Pockets to the journals. Now, I suppose, we wait.<br>
In the meantime, I've taken to assembling the first prototype of the device. By exploiting the pocket's ability to create an infinite region of space within a finite area, I've made... well, I suppose it could be called a "Pocket Dimension". Within, I've created a nifty system that recursively produces subspace rooms, spatially linking them to any of the infinite points on the pocket's surface. Fiona says it's akin to a hotel, and I'm inclined to agree.<br>
Hilbert's Hotel. I like the sound of that.<br>"}
/obj/item/paper/fluff/ruins/romans_emails
name = "e-mail readout - 14.05.2558"
info = {"Logs of Roman P.<br>
<h4>New Job</h4><br>
<i>Sent to: natalya_petroyenko@kosmokomm.net</i><br>
Hello sis! Figured I should update you on what's going on with the career change.<br>
First day on the new job. It's a pretty boring position, but hey- it's not like I was finding anything in New Vladimir. I'm just glad to have something to pay the bills.<br>
Suppose I should say what's involved: I'm essentially playing housekeeper for some scientist and his cohort of student assistants. Far above my pay grade to understand what they do, but they seem excited enough. Talking about "pockets", for whatever reason. Maybe they're designing the next innovation in clothes?<br>
Anyway, that's pretty much it. I'm living on their station for pretty much the duration, so I'm not sure if I'll be able to make it to Mama's birthday. Sorry about that- I'll do my best to make it up to her (and you) when I get some leave.<br>
Hope to see you soon,<br>
Little Brother Roman<br>
<br>
<h4>Visitors</h4><br>
<i>Sent to: david_hilbert@physics.mit.edu</i><br>
Morning Doctor. Sorry to email you when you're on holiday, but you did tell me to update you on anything suspicious.<br>
There's been a ship that's been hanging around the facility for a few days. Figured that was odd enough, given how far from anything important we are, but it got stranger when one of them finally came over to talk.<br>
I know I'm not a native speaker, but I couldn't make out his accent. Wasn't like anything I've heard before, anyway.<br>
He kept asking where you were, and if he could come in to speak to you. Of course, I turned him away- even if you had been around I'd have been hesitant to let him in.<br>
As an aside, the postdocs told me to pass on a message. Apparently they've made a breakthrough, which sounds good and all.<br>
Regards,<br>
Roman<br>
<br>
<h4>Weird Times</h4><br>
<i>Sent to: natalya_petroyenko@kosmokomm.net</i><br>
Hi sis! How was Christmas? Are Mama and Papa doing well? I'm really sorry I couldn't be there, but I've been working my fingers to the bone at work.<br>
I figure I should tell you a bit about how it's been going here. I know, I know, you keep calling me a workaholic, but it's really... strange, I guess?<br>
I keep getting little glimpses into the research that's happening. They're messing around with bluespace- you know, the tech that makes FTL engines work? I'm not sure what exactly they're doing with it, but they're talking more and more about pockets every day now.<br>
Not only that, but I'm starting to hear strange noises from the labs I'm not allowed into. Nothing super terrifying, you know, we're not talking xenomorphs, but more like industrial sounds. Crashes, bangs, occasional high-pitched whining, you know the sort. Like a broken vacuum cleaner.<br>
I know it's not the instruments or I'd have heard it before, so it must be something new they've been working on. Exciting, I suppose, but I'm starting to wonder if I'm in over my head working here. Maybe I should start looking for a new job, somewhere closer to home.<br>
Hope to see you at Papa's birthday. I've requested leave for it, and I'm just waiting on the Doc's response.<br>
See you soon,<br>
Little Brother Roman<br>
<br>
<h4>End of Leave</h4><br>
<i>Sent to: david_hilbert@physics.mit.edu</i><br>
Morning Doctor. Where is everyone? I got back from leave and the station was empty. Have you all went on holiday without telling me?<br>
And what the hell happened to the ordnance lab? I couldn't even open the door to get in, it was fused shut!<br>
Look, I don't feel safe staying on the station with it in this state, so I'm calling an engineer and heading home until I hear back from you.<br>
Regards,<br>
Roman<br>
<br>
<h4>Looking for a New Job</h4><br>
<i>Sent to: natalya_petroyenko@kosmokomm.net</i><br>
Hi sis. First things first, sorry for missing your engagement party. There's been a... situation at work.<br>
In fact, that's most of why I'm writing this. I have absolutely no idea what happened, but the Doctor and the students are gone. Just up and left. The facility's abandoned.<br>
But like, it's clear they left in a hurry. Hell, there's still coffee in the cups. I'd question it further, but they were always kinda... odd, I guess? The whole thing gives me chills and I don't think I want to dig any deeper.<br>
I dropped his university an email and called in the authorities. All that's left now, I guess, is to find a new job. Would your boss happen to be hiring?<br>
See you soon,<br>
Little Brother Roman
"}
@@ -0,0 +1,45 @@
/////////// listening station
/obj/item/paper/fluff/ruins/listeningstation/reports
info = "Nothing of interest to report."
/obj/item/paper/fluff/ruins/listeningstation/reports/july
name = "july report"
/obj/item/paper/fluff/ruins/listeningstation/reports/august
name = "august report"
/obj/item/paper/fluff/ruins/listeningstation/reports/september
name = "september report"
/obj/item/paper/fluff/ruins/listeningstation/reports/october
name = "october report"
/obj/item/paper/fluff/ruins/listeningstation/reports/november
name = "november report"
/obj/item/paper/fluff/ruins/listeningstation/reports/june
name = "june report"
info = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it."
/obj/item/paper/fluff/ruins/listeningstation/reports/may
name = "may report"
info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment."
/obj/item/paper/fluff/ruins/listeningstation/reports/april
name = "april report"
info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it."
/obj/item/paper/fluff/ruins/listeningstation/receipt
name = "receipt"
info = "1 x Stechkin pistol - 600 cr<br>1 x silencer - 200 cr<br>shipping charge - 4360 cr<br>total - 5160 cr"
/obj/item/paper/fluff/ruins/listeningstation/odd_report
name = "odd report"
info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. - Donk Co. Operative #451"
/obj/item/paper/fluff/ruins/listeningstation/briefing
name = "mission briefing"
info = "<b>Mission Details</b>: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us."
@@ -0,0 +1,189 @@
/////////// Oldstation items
/obj/item/paper/fluff/ruins/oldstation
name = "Cryo Awakening Alert"
info = "<B>**WARNING**</B><BR><BR>Catastrophic damage sustained to station. Powernet exhausted to reawaken crew.<BR><BR>Immediate Objectives<br><br>1: Activate emergency power generator<br>2: Lift station lockdown on the bridge<br><br>Please locate the 'Damage Report' on the bridge for a detailed situation report."
/obj/item/paper/fluff/ruins/oldstation/damagereport
name = "Damage Report"
info = "<b>*Damage Report*</b><br><br><b>Alpha Station</b> - Destroyed<br><br><b>Beta Station</b> - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.<br><br><b>Charlie Station</b> - Multiple asteroid impacts, no loss in air pressure.<br><br><b>Delta Station</b> - Intact. <b>WARNING</b>: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.<br><br>Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air."
/obj/item/paper/fluff/ruins/oldstation/protosuit
name = "B01-MOD modular suit Report"
info = "<b>*Prototype MODsuit*</b><br><br>This is a prototype powered exoskeleton, a design not seen in hundreds of years, \
the first post-void war era modular suit to ever be safely utilized by an operator. \
This ancient clunker is still functional, though it's missing several modern-day luxuries from \
updated Nakamura Engineering designs. Primarily, the suit's myoelectric suit layer is entirely non-existant, \
and the servos do very little to help distribute the weight evenly across the wearer's body, \
making it slow and bulky to move in. Additionally, the armor plating never finished production aside from the shoulders, \
forearms, and helmet; making it useless against direct attacks. The internal heads-up display is rendered entirely in \
monochromatic cyan, leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool."
/obj/item/paper/fluff/ruins/oldstation/protohealth
name = "Health Analyzer Report"
info = "<b>*Health Analyzer*</b><br><br>The portable Health Analyzer is essentially a handheld variant of a health analyzer. Years of research have concluded with this device which is \
capable of diagnosing even the most critical, obscure or technical injuries any humanoid entity is suffering in an easy to understand format that even a non-trained health professional \
can understand.<br><br>The health analyzer is expected to go into full production as standard issue medical kit."
/obj/item/paper/fluff/ruins/oldstation/protogun
name = "K14 Energy Gun Report"
info = "<b>*K14-Multiphase Energy Gun*</b><br><br>The K14 Prototype Energy Gun is the first Energy Rifle that has been successfully been able to not only hold a larger ammo charge \
than other gun models, but is capable of swapping between different energy projectile types on command with no incidents.<br><br>The weapon still suffers several drawbacks, its alternative, \
non laser fire mode, can only fire one round before exhausting the energy cell, the weapon also remains prohibitively expensive, nonetheless NT Market Research fully believe this weapon \
will form the backbone of our Energy weapon catalogue.<br><br>The K14 is expected to undergo revision to fix the ammo issues, the K15 is expected to replace the 'stun' setting with a \
'disable' setting in an attempt to bypass the ammo issues."
/**
* Supermatter crystal fluff paper used in Charlie station ruin
*/
/obj/item/paper/fluff/ruins/oldstation/protosupermatter
name = "Supermatter Crystal Generator"
info = "<b>*Supermatter Crystal Shard*</b><br><br>Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \
\ntratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction. \
Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \
\ntoperational.<br><br>The Supermatter aims to alter this, a functional Supermatter is essentially a gas producer that generates far more radiation than Fusion or Fission \ntgenerators can ever hope to produce. "
/obj/item/paper/fluff/ruins/oldstation/protoinv
name = "Laboratory Inventory"
info = "<b>*Inventory*</b><br><br>(1) Prototype MODsuit<br><br>(1)Health Analyser<br><br>(1)Prototype Energy Gun<br><br>(1)Singularity Generation Disk<br><br><b>DO NOT REMOVE WITHOUT \
THE CAPTAIN AND RESEARCH DIRECTOR'S AUTHORISATION</b>"
/obj/item/paper/fluff/ruins/oldstation/report
name = "Crew Reawakening Report"
info = "Artificial Program's report to surviving crewmembers.<br><br>Crew were placed into cryostasis on March 10th, 2445.<br><br>Crew were awoken from cryostasis around June, 2557.<br><br> \
<b>SIGNIFICANT EVENTS OF NOTE</b><br>1: The primary radiation detectors were taken offline after 112 years due to power failure, secondary radiation detectors showed no residual \
radiation on station. Deduction, primarily detector was malfunctioning and was producing a radiation signal when there was none.<br><br>2: A data burst from a nearby Nanotrasen Space \
Station was received, this data burst contained research data that has been uploaded to our RnD labs.<br><br>3: An unknown force has occupied Delta station. Additionally, a school of common space carp have \
taken refuge in the space surrounding all remaining stations, primarily Beta station. "
/obj/item/paper/fluff/ruins/oldstation/generator_manual
name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual"
info = "You can barely make out a faded sentence... <br><br> Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid."
/obj/item/paper/fluff/ruins/oldstation/protosleep
name = "Prototype Delivery"
info = "<b>*Prototype Sleeper*</b><br><br>We have delivered the lastest in medical technology to the medical bay: circuitry for a new prototype sleeper. Looks like it didn't come with the parts to actually build it figures. Get engineering on this."
/obj/item/paper/fluff/ruins/oldstation/survivor_note
name = "To those who find this"
info = "You can barely make out a faded message... <br><br>I come back to the station after a simple mining mission, and nobody is here. Well, they COULD have gone to cryo... I didn't really check. Doesn't matter, I have bigger issues now. There is something out there. \
I have no fucking idea what they are, all I know is that they don't like me. On occasion I hear them hissing and clawing on the airlock... good idea I barricaded the way in. Bad news: the transit tube is still broken, the damn engineers never fixed it. \
So basically, I'm stuck here until someone comes to rescue us. And I have no food or water. <br>If you're reading this, I'm probably dead. These things have taken over part of Delta station, and I think they somehow came from the AI core... \
Whatever you do, DON'T OPEN THE FIRELOCKS unless you have something to kill them. Look in security, maybe there might be some gear left in there. <br><br>So hungry... I don't want to go out like this..."
/obj/machinery/mod_installer
name = "modular outerwear device installator"
desc = "An ancient machine that mounts a MOD unit onto the occupant."
icon = 'icons/obj/machines/mod_installer.dmi'
icon_state = "mod_installer"
base_icon_state = "mod_installer"
layer = ABOVE_WINDOW_LAYER
use_power = IDLE_POWER_USE
anchored = TRUE
density = TRUE
obj_flags = NO_BUILD // Becomes undense when the door is open
idle_power_usage = 50
active_power_usage = 300
var/busy = FALSE
var/busy_icon_state
var/obj/item/mod/control/mod_unit = /obj/item/mod/control/pre_equipped/prototype
COOLDOWN_DECLARE(message_cooldown)
/obj/machinery/mod_installer/Initialize(mapload)
. = ..()
occupant_typecache = typecacheof(/mob/living/carbon/human)
if(ispath(mod_unit))
mod_unit = new mod_unit()
/obj/machinery/mod_installer/Destroy()
QDEL_NULL(mod_unit)
return ..()
/obj/machinery/mod_installer/proc/set_busy(status, working_icon)
busy = status
busy_icon_state = working_icon
update_appearance()
/obj/machinery/mod_installer/proc/play_install_sound()
playsound(src, 'sound/items/rped.ogg', 30, FALSE)
/obj/machinery/mod_installer/update_icon_state()
icon_state = busy ? busy_icon_state : "[base_icon_state][state_open ? "_open" : null]"
return ..()
/obj/machinery/mod_installer/update_overlays()
var/list/overlays = ..()
if(machine_stat & (NOPOWER|BROKEN))
return overlays
overlays += (busy || !mod_unit) ? "red" : "green"
return overlays
/obj/machinery/mod_installer/proc/start_process()
if(machine_stat & (NOPOWER|BROKEN))
return
if(!occupant || !mod_unit || busy)
return
set_busy(TRUE, "[initial(icon_state)]_raising")
addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS)
addtimer(CALLBACK(src, .proc/play_install_sound), 2.5 SECONDS)
addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"), 5 SECONDS)
addtimer(CALLBACK(src, .proc/complete_process), 7.5 SECONDS)
/obj/machinery/mod_installer/proc/complete_process()
set_busy(FALSE)
var/mob/living/carbon/human/human_occupant = occupant
if(!istype(human_occupant))
return
if(!human_occupant.dropItemToGround(human_occupant.back))
return
if(!human_occupant.equip_to_slot_if_possible(mod_unit, mod_unit.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE))
return
human_occupant.update_action_buttons(TRUE)
playsound(src, 'sound/machines/ping.ogg', 30, FALSE)
if(!human_occupant.dropItemToGround(human_occupant.wear_suit) || !human_occupant.dropItemToGround(human_occupant.head))
finish_completion()
return
mod_unit.quick_activation()
finish_completion()
/obj/machinery/mod_installer/proc/finish_completion()
mod_unit = null
open_machine()
/obj/machinery/mod_installer/open_machine()
if(state_open)
return FALSE
..()
return TRUE
/obj/machinery/mod_installer/close_machine(mob/living/carbon/user)
if(!state_open)
return FALSE
..()
addtimer(CALLBACK(src, .proc/start_process), 1 SECONDS)
return TRUE
/obj/machinery/mod_installer/relaymove(mob/living/user, direction)
var/message
if(busy)
message = "it won't budge!"
else if(user.stat != CONSCIOUS)
message = "you don't have the energy!"
if(!isnull(message))
if (COOLDOWN_FINISHED(src, message_cooldown))
COOLDOWN_START(src, message_cooldown, 5 SECONDS)
balloon_alert(user, message)
return
open_machine()
/obj/machinery/mod_installer/interact(mob/user)
if(state_open)
close_machine(null, user)
return
else if(busy)
balloon_alert(user, "it's locked!")
return
open_machine()
@@ -0,0 +1,28 @@
/////////// originalcontent items
/obj/item/paper/crumpled/ruins/originalcontent
desc = "<i>Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings.</i>"
/obj/item/paper/pamphlet/ruin/originalcontent
icon = 'icons/obj/fluff.dmi'
/obj/item/paper/pamphlet/ruin/originalcontent/stickman
name = "Painting - 'BANG'"
info = "<i>This picture depicts a crudely-drawn stickman firing a crudely-drawn gun.</i>"
icon_state = "painting4"
/obj/item/paper/pamphlet/ruin/originalcontent/treeside
name = "Painting - 'Treeside'"
info = "<i>This picture depicts a sunny day on a lush hillside, set under a shaded tree.</i>"
icon_state = "painting1"
/obj/item/paper/pamphlet/ruin/originalcontent/pennywise
name = "Painting - 'Pennywise'"
info = "<i>This picture depicts a smiling clown. Something doesn't feel right about this..</i>"
icon_state = "painting3"
/obj/item/paper/pamphlet/ruin/originalcontent/yelling
name = "Painting - 'Hands-On-Face'"
info = "<i>This picture depicts a man yelling on a bridge for no apparent reason.</i>"
icon_state = "painting2"
@@ -0,0 +1,12 @@
/////////// spacehotel items
/obj/item/paper/fluff/ruins/spacehotel/notice
name = "!NOTICE!"
info = "<bold>!NOTICE!</bold><br><br><center>We are expecting arriving guests soon from a nearby station! Stay sharp and make sure guests enjoy their time spent here. Don't think you can sneak off while they're here, either.</center>"
/obj/item/paper/pamphlet/ruin/spacehotel
name = "hotel pamphlet"
info = "<center><b>The Twin Nexus Hotel</center></b><br><center><i>A place of Sanctuary</i></center><br><br><center>Welcome to The Twin-Nexus Hotel, \[insert name here]! The loyal staff strive to their best effort to cater for the best possible experience for all space(wo)men! If you have any questions or comments, please ask one of our on-board staff for more information.</center>"
@@ -0,0 +1,12 @@
/////////// ruined whiteship
/obj/item/circuitboard/computer/white_ship/ruin
build_path = /obj/machinery/computer/shuttle/white_ship/ruin
/obj/machinery/computer/shuttle/white_ship/ruin
shuttleId = "whiteship_ruin"
circuit = /obj/item/circuitboard/computer/white_ship/ruin
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/ruin
shuttleId = "whiteship_ruin"