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 = 'icons/obj/structures.dmi'
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_REF(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)
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.request_turf_block_reservation(1, 1, 1)
var/turf/storage_turf = storageReservation.bottom_left_turfs[1]
storageTemp.load(storage_turf)
GLOB.hhStorageTurf = storage_turf
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))
var/turf/room_bottom_left = roomReservation.bottom_left_turfs[1]
user.forceMove(locate(
room_bottom_left.x + hotelRoomTemp.landingZoneRelativeX,
room_bottom_left.y + hotelRoomTemp.landingZoneRelativeY,
room_bottom_left.z,
))
return TRUE
return FALSE
/obj/item/hilbertshotel/proc/tryStoredRoom(roomNumber, mob/user)
if(storedRooms["[roomNumber]"])
var/datum/turf_reservation/roomReservation = SSmapping.request_turf_block_reservation(hotelRoomTemp.width, hotelRoomTemp.height, 1)
var/turf/room_turf = roomReservation.bottom_left_turfs[1]
hotelRoomTempEmpty.load(room_turf)
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(
room_turf.x + x,
room_turf.y + y,
room_turf.z,
))
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(
room_turf.x + hotelRoomTemp.landingZoneRelativeX,
room_turf.y + hotelRoomTemp.landingZoneRelativeY,
room_turf.z,
))
return TRUE
return FALSE
/obj/item/hilbertshotel/proc/sendToNewRoom(roomNumber, mob/user)
var/datum/turf_reservation/roomReservation = SSmapping.request_turf_block_reservation(hotelRoomTemp.width, hotelRoomTemp.height, 1)
var/turf/bottom_left = roomReservation.bottom_left_turfs[1]
var/datum/map_template/load_from = hotelRoomTemp
if(ruinSpawned && roomNumber == GLOB.hhMysteryRoomNumber)
load_from = hotelRoomTempLore
load_from.load(bottom_left)
activeRooms["[roomNumber]"] = roomReservation
linkTurfs(roomReservation, roomNumber)
do_sparks(3, FALSE, get_turf(user))
user.forceMove(locate(
bottom_left.x + hotelRoomTemp.landingZoneRelativeX,
bottom_left.y + hotelRoomTemp.landingZoneRelativeY,
bottom_left.z,
))
/obj/item/hilbertshotel/proc/linkTurfs(datum/turf_reservation/currentReservation, currentRoomnumber)
var/turf/room_bottom_left = currentReservation.bottom_left_turfs[1]
var/area/misc/hilbertshotel/currentArea = get_area(room_bottom_left)
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 currentReservation.reserved_turfs)
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...
\
[span_info("Alt-Click to look through the peephole.")]"
for(var/turf/open/space/bluespace/BSturf in currentReservation.reserved_turfs)
BSturf.parentSphere = src
/obj/item/hilbertshotel/proc/ejectRooms()
if(activeRooms.len)
for(var/x in activeRooms)
var/datum/turf_reservation/room = activeRooms[x]
var/turf/room_bottom_left = room.bottom_left_turfs[1]
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.x + i, room_bottom_left.y + j, room_bottom_left.z))
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 = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_HOTEL_WALLS
canSmoothWith = SMOOTH_GROUP_HOTEL_WALLS
explosive_resistance = 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_turf = 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_turf = FALSE
/turf/open/space/bluespace
name = "\proper bluespace hyperzone"
icon_state = "bluespace"
base_icon_state = "bluespace"
baseturfs = /turf/open/space/bluespace
turf_flags = NOJAUNT
explosive_resistance = 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"
explosive_resistance = INFINITY
var/obj/item/hilbertshotel/parentSphere
// BUBBER EDIT ADDITION START - Condos
var/leave_message = "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?"
// BUBBER EDIT ADDITION END
/turf/closed/indestructible/hoteldoor/Initialize(mapload)
. = ..()
register_context()
/turf/closed/indestructible/hoteldoor/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
context[SCREENTIP_CONTEXT_ALT_LMB] = "Peek through"
return CONTEXTUAL_SCREENTIP_SET
/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
/// BUBBER EDIT CHANGE START - Condos
/* Original:
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(tgui_alert(user, leave_message, "Exit", list("Leave", "Stay")) == "Leave") // BUBBER EDIT CHANGE - Moved blurb to leave_message variable
/// BUBBER EDIT CHANGE END
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, list/modifiers)
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/click_alt(mob/user)
if(user.is_blind())
to_chat(user, span_warning("Drats! Your vision is too poor to use this!"))
return CLICK_ACTION_BLOCKING
to_chat(user, span_notice("You peek 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, PROC_REF(check_eye))
return CLICK_ACTION_SUCCESS
/turf/closed/indestructible/hoteldoor/proc/check_eye(mob/user, atom/oldloc, direction)
SIGNAL_HANDLER
if(get_dist(get_turf(src), get_turf(user)) < 2)
return
for(var/datum/action/peephole_cancel/PHC in user.actions)
INVOKE_ASYNC(PHC, TYPE_PROC_REF(/datum/action/peephole_cancel, 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(mob/clicker, trigger_flags)
. = ..()
if(!.)
return
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)
// Despite using the ruins.dmi, hilbertshotel is not a ruin
/area/misc/hilbertshotel
name = "Hilbert's Hotel Room"
icon = 'icons/area/areas_ruins.dmi'
icon_state = "hilbertshotel"
requires_power = FALSE
default_gravity = STANDARD_GRAVITY
area_flags = NOTELEPORT | HIDDEN_AREA
area_flags_mapping = NONE
static_lighting = TRUE
// ambientsounds = list('sound/ambience/ruin/servicebell.ogg') // BUBBER EDIT REMOVAL
var/roomnumber = 0
var/obj/item/hilbertshotel/parentSphere
var/datum/turf_reservation/reservation
var/turf/storageTurf
/area/misc/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/misc/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.investigate_log("has been gibbed by using [H] while inside of it.", INVESTIGATE_DEATHS)
unforeseen_consequences.gib(DROP_ALL_REMAINS)
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")
log_game("[H] entered itself. Moving it to [loc_name(targetturf)].")
message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].")
H.visible_message(span_danger("[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!"))
H.forceMove(targetturf)
/area/misc/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/misc/hilbertshotel/proc/storeRoom()
var/turf/room_bottom_left = reservation.bottom_left_turfs[1]
var/turf/room_top_right = reservation.top_right_turfs[1]
var/roomSize = \
((room_top_right.x - room_bottom_left.x) + 1) * \
((room_top_right.y - room_bottom_left.y) + 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(room_bottom_left.x + x, room_bottom_left.y + y, room_bottom_left.z))
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/misc/hilbertshotelstorage
name = "Hilbert's Hotel Storage Room"
icon = 'icons/area/areas_ruins.dmi'
icon_state = "hilbertshotel"
requires_power = FALSE
area_flags = HIDDEN_AREA | NOTELEPORT
area_flags_mapping = UNIQUE_AREA
default_gravity = STANDARD_GRAVITY
/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(istype(arrived, /obj/machinery/light))
var/obj/machinery/light/entered_light = arrived
entered_light.end_processing()
. = ..()
if(ismob(arrived))
var/mob/target = arrived
ADD_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src))
/obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction)
. = ..()
if(ismob(gone))
var/mob/target = gone
REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src))
if(istype(gone, /obj/machinery/light))
var/obj/machinery/light/exited_light = gone
exited_light.begin_processing()
//Space Ruin stuff
/area/ruin/space/has_grav/powered/hilbertresearchfacility
name = "Hilbert Research Facility"
/area/ruin/space/has_grav/powered/hilbertresearchfacility/secretroom
area_flags = 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/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!istype(interacting_with, /obj/item/hilbertshotel))
return ..()
if(!interacting_with.IsReachableBy(user))
to_chat(user, span_warning("It's to far away to scan!"))
return ITEM_INTERACT_BLOCKING
var/obj/item/hilbertshotel/sphere = interacting_with
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.")
return ITEM_INTERACT_SUCCESS
/obj/effect/landmark/transport/transport_id/hilbert
specific_transport_id = HILBERT_LINE_1
/obj/effect/landmark/transport/nav_beacon/tram/nav/hilbert
name = HILBERT_LINE_1
specific_transport_id = TRAM_NAV_BEACONS
/obj/effect/landmark/transport/nav_beacon/tram/platform/hilbert/left
name = "Port"
specific_transport_id = HILBERT_LINE_1
platform_code = HILBERT_PORT
tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask")
/obj/effect/landmark/transport/nav_beacon/tram/platform/hilbert/middle
name = "Central"
specific_transport_id = HILBERT_LINE_1
platform_code = HILBERT_CENTRAL
tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw")
/obj/effect/landmark/transport/nav_beacon/tram/platform/hilbert/right
name = "Starboard"
specific_transport_id = HILBERT_LINE_1
platform_code = HILBERT_STARBOARD
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
name = "Doctor Hilbert"
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, visuals_only)
. = ..()
if(!visuals_only)
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)
default_raw_text = {"Note to the Institute
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.
We've made some powerful enemies. Very powerful. More powerful than any of you can imagine, and so we can't come back.
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.
I've left some of our effects in the Hotel. Room number [uppertext(num2hex(GLOB.hhMysteryRoomNumber, 0))]. To anyone who should know, that should make sense.
Best of luck with the research. From all of us in the Hilbert Group, it's been a pleasure working with you.
- David, Phil, Fiona and Jen"}
return ..()
/obj/item/paper/crumpled/ruins/postdocs_memo
name = "memo to the postdocs"
default_raw_text = {"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.
Instead, remember: what you can't see can't hurt you.
Take care of the lab during my vacation. See you all in June.
- David"}
/obj/item/paper/crumpled/ruins/hotel_note
name = "hotel note"
default_raw_text = {"Hotel Note
Well, you figured out the puzzle. Looks like someone's done their homework on my research.
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.
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.
What's more, the space-time continuum is in full effect here. By correctly manipulating the bluespace, one can go anywhere: 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.
They deal in "time crimes", whatever their definition of those are.
Anyway, I'm beginning to ramble. We must be going now. Make sure any posthumous Nobel prizes are made out to the department.
- David"}
/obj/item/paper/fluff/ruins/docslabnotes
name = "lab notebook page"
default_raw_text = {"Laboratory Notebook
PROPERTY OF DOCTOR D. HILBERT
May 10th, 2555
Finally, my new facility is complete, and not a moment too soon!
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.
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.
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.
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...
*Following this is a long series of pages detailing failures, grievances with the institute, and more scientific equations than anyone can reasonably chew through.*