mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-19 12:05:59 +01:00
[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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user