diff --git a/_maps/map_files/LayeniaStation/LayeniaStation.dmm b/_maps/map_files/LayeniaStation/LayeniaStation.dmm
index 2e078ae6..679b485e 100644
--- a/_maps/map_files/LayeniaStation/LayeniaStation.dmm
+++ b/_maps/map_files/LayeniaStation/LayeniaStation.dmm
@@ -979,7 +979,7 @@
"cNT" = (/obj/effect/turf_decal/loading_area{dir = 4; icon_state = "drain"; name = "drain"},/obj/machinery/light{dir = 4; pixel_x = 7; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{dir = 10; name = "air supply pipe"},/turf/open/floor/plasteel/white/side{dir = 8},/area/science/research)
"cNY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/open/floor/plasteel,/area/maintenance/disposal/incinerator)
"cOu" = (/obj/effect/turf_decal/loading_area{dir = 4; icon_state = "drain"; name = "drain"},/turf/open/floor/plasteel/white/corner{dir = 1},/area/science/misc_lab)
-"cOv" = (/obj/structure/medkit_cabinet{pixel_y = 27},/obj/machinery/camera{c_tag = "Bridge West"; dir = 6},/turf/open/floor/plasteel/dark/side,/area/bridge)
+"cOv" = (/obj/machinery/camera{c_tag = "Bridge West"; dir = 6},/obj/machinery/computer/lore_terminal/command,/turf/open/floor/plasteel/dark/side,/area/bridge)
"cOH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{icon_state = "2-4"},/turf/open/floor/plasteel,/area/maintenance/disposal/incinerator)
"cOU" = (/obj/effect/turf_decal/stripes/line{dir = 1},/obj/machinery/atmospherics/pipe/simple/cyan/visible{dir = 6},/turf/open/floor/engine,/area/engine/engineering/reactor_core)
"cOZ" = (/mob/living/simple_animal/opossum/Trims,/turf/open/floor/plasteel,/area/quartermaster/storage)
@@ -1662,7 +1662,7 @@
"eMc" = (/obj/machinery/atmospherics/components/unary/outlet_injector/on{dir = 1; frequency = 1441; id = "inc_in"},/obj/structure/sign/warning/vacuum/external{pixel_x = -32},/turf/open/floor/engine/vacuum,/area/science/mixing)
"eMm" = (/turf/closed/wall/r_wall,/area/crew_quarters/toilet/restrooms)
"eMs" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/camera{c_tag = "Courtroom South"; dir = 1},/turf/open/floor/plasteel/dark,/area/security/courtroom)
-"eMv" = (/obj/effect/turf_decal/tile/blue{dir = 8},/obj/machinery/light{dir = 8; pixel_x = -7; pixel_y = 0},/obj/structure/filingcabinet/filingcabinet,/turf/open/floor/plasteel/dark/corner,/area/bridge)
+"eMv" = (/obj/effect/turf_decal/tile/blue{dir = 8},/obj/machinery/light{dir = 8; pixel_x = -7; pixel_y = 0},/obj/structure/medkit_cabinet{pixel_y = 27},/turf/open/floor/plasteel/dark/corner,/area/bridge)
"eMG" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/hydroponics)
"eMS" = (/obj/effect/turf_decal/loading_area{dir = 8; icon_state = "drain"; name = "drain"},/turf/open/floor/carpet/red,/area/crew_quarters/bar)
"eMZ" = (/obj/machinery/atmospherics/components/binary/pump{dir = 8; layer = 2.4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{dir = 9; name = "scrubbers pipe"},/obj/structure/cable{icon_state = "4-8"},/turf/open/floor/plasteel/dark,/area/security/execution/transfer)
@@ -3003,7 +3003,7 @@
"iJG" = (/obj/effect/decal/cleanable/oil{icon_state = "floor5"},/turf/open/floor/plasteel,/area/security/prison)
"iJM" = (/obj/effect/turf_decal/stripes/box,/obj/structure/railing{dir = 8},/obj/structure/railing,/turf/open/floor/plating{initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1},/area/layenia)
"iJN" = (/obj/effect/turf_decal/loading_area{icon_state = "drain"; name = "drain"},/obj/effect/turf_decal/loading_area{dir = 8; icon_state = "drain"; name = "drain"},/turf/open/floor/carpet,/area/crew_quarters/dorms)
-"iJO" = (/obj/structure/cable/yellow{icon_state = "2-4"},/turf/open/floor/plasteel/dark,/area/engine/engineering/reactor_control)
+"iJO" = (/obj/structure/cable/yellow{icon_state = "2-4"},/obj/machinery/computer/lore_terminal,/turf/open/floor/plasteel/dark,/area/engine/engineering/reactor_control)
"iJV" = (/obj/docking_port/stationary{dir = 2; dwidth = 1; height = 4; name = "escape pod loader"; roundstart_template = /datum/map_template/shuttle/escape_pod/default; width = 3},/turf/open/indestructible/concrete,/area/layenia/cloudlayer)
"iJX" = (/mob/living/simple_animal/pet/cat{name = "Stray Maintenance Cat"},/turf/open/floor/plating,/area/maintenance/port)
"iKj" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer3{name = "air supply pipe"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{dir = 4; name = "scrubbers pipe"},/turf/open/floor/plasteel{icon_state = "floor_plate"},/area/quartermaster/storage)
@@ -4250,6 +4250,7 @@
"mBF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{dir = 9},/obj/effect/turf_decal/tile/yellow{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/open/floor/plasteel,/area/engine/engineering)
"mBH" = (/obj/effect/spawner/structure/window/reinforced,/turf/open/floor/plating,/area/storage/tech)
"mCB" = (/obj/effect/turf_decal/tile/red{dir = 1},/obj/effect/turf_decal/tile/red{dir = 8},/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/red{dir = 4},/obj/machinery/door/airlock/glass{dir = 4; id_tag = "checkpointinner"; name = "inner airlock"},/obj/effect/mapping_helpers/airlock/cyclelink_helper{dir = 8},/turf/open/floor/plasteel,/area/hallway/primary/port)
+"mCD" = (/obj/effect/turf_decal/tile/neutral{dir = 8},/obj/effect/turf_decal/tile/neutral,/obj/machinery/computer/lore_terminal,/turf/open/floor/plasteel{dir = 1; icon_state = "floor_plate"},/area/engine/break_room)
"mCJ" = (/obj/machinery/atmospherics/components/unary/vent_pump/on/layer3{dir = 1; name = "air vent"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{name = "scrubbers pipe"},/turf/open/floor/plasteel/white,/area/science/research)
"mCL" = (/obj/effect/turf_decal/tile/yellow{dir = 4},/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{dir = 4; name = "air scrubber"},/obj/effect/landmark/start/station_engineer,/turf/open/floor/plasteel{icon_state = "floor_plate"},/area/engine/engineering)
"mCS" = (/obj/machinery/door/poddoor/preopen{id = "medpriv4"; name = "privacy door"},/obj/effect/spawner/structure/window,/obj/machinery/door/firedoor,/turf/open/floor/plating,/area/medical/sleeper)
@@ -7650,7 +7651,7 @@
"vNo" = (/obj/effect/turf_decal/bot,/turf/open/floor/plasteel,/area/hallway/primary/starboard)
"vNs" = (/obj/machinery/door/firedoor,/obj/effect/turf_decal/loading_area{icon_state = "drain"; name = "drain"},/obj/effect/turf_decal/tile/red{dir = 4},/turf/open/floor/plasteel/white/corner{dir = 1},/area/hallway/primary/starboard)
"vNw" = (/obj/effect/turf_decal/tile/red,/obj/effect/turf_decal/tile/neutral{dir = 8},/obj/structure/sign/warning/electricshock{pixel_y = 32},/turf/open/floor/plasteel{dir = 1; icon_state = "floor_plate"},/area/hallway/primary/fore)
-"vNz" = (/obj/effect/turf_decal/tile/blue{dir = 1},/turf/open/floor/plasteel/dark/side{dir = 4},/area/bridge)
+"vNz" = (/obj/effect/turf_decal/tile/blue{dir = 1},/obj/structure/filingcabinet/filingcabinet,/turf/open/floor/plasteel/dark/side{dir = 4},/area/bridge)
"vNJ" = (/obj/effect/turf_decal/stripes/line,/turf/open/floor/plasteel{dir = 8; icon_state = "floor_trim"},/area/quartermaster/storage)
"vNP" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer3{name = "air supply pipe"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{name = "scrubbers pipe"},/obj/structure/disposalpipe/segment{dir = 4},/turf/open/floor/plasteel{icon_plating = "floor"; icon_state = "floor_whole"},/area/security/brig)
"vNT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer1{dir = 1; name = "scrubbers pipe"},/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{dir = 6; name = "air supply pipe"},/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 6},/turf/open/floor/plasteel/white,/area/science/research)
@@ -8660,7 +8661,7 @@ gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgT
gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgfhgPqiEgorldiGpggnusgPqgPqgPqgPqgPqgPqgPqgPqtEktBctBctBctBcltjltyltNtBctBcalOxejwOpvQaosUqQOwOpxejxejxejxejxejxejxejxejxejxejxejxejxejnJFnJFnJFkgHsaaszVrmCrMcrIEsIglwHsYQrIEkgHwHEtqExBXqmDkLzepcyiagRGqfWqfWqfWqfWpomdaZnhrtpQhsNvjTrnrksylyiaPQqEMpIxrgGapkpvWcbhjArvjMjtybauluVrjZlyHlzihHVlzpoTllzRlAznJWxwylqPnDQdyjxIquHfwdefWagYWoulfZvxCxoInxKiaNNxMyylPxIDxMyoYslAPtjYvKfsXDlAUppMqYVyhesCHnrHnrHfbXxBmtHpvUrpcatEfflDhyclDkxBmxBmlHzlHPlIiklggTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWyfmyfmyfmyfmwuvldJjjNjTBaexoYSoYSgdOpGaoYSyfmyfmyfmgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWiEgrCwwyjtmAnusgTWgTWgTWgPqiFlfoHfoHfoHalOtBctBctBctBclJVlJZbgPyfmyfmtEkgTWmcCxejxejxejpPQgPqgPqgPqgPqgPqgPqgPqgPqgPqnTytBctBctBcylMtBclVzudnsaarIEufCrIErIErIEuwGrIErIEkgHwLctqEvjTvjTvjTnrjwGNlLDepcqmDqmDepctbEhiPtYcvjTvjTvjTrnrksymSwciRlLHaHEksyksyiiZaeYlLWwtgsnasnasnahqkeZGhqkhHVlMuviIlMBlNDlNMlQBlQYnDQdyjyhusnauBGgmQtQVwdetvusnaaNougvuUajAmoScoScjAmjAmlwfxJUvKfxJUeholUMqRQclKwHwakBeQPwHwxBmdfEiaBxNTdPGbQixpjdfElVClXglXKlXRlZMklggTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWyfmyfmyfmyfmyfmyfmyfmyfmyfmoYSoYSoYSoYSyfmyfmgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWmcCxejxejxejpPQgTWgTWgTWgPqiEgwOpwOpwOpmcBtBcyfmyfmmdxcfwlJZyfmyfmwcKylMgTWqITgTWgTWgTWqITgTWgTWgTWqITgTWgTWgTWtBctBctBctBcsGhtBctBcmcSlVzeVhwvTmqFmubmqFmqFjLTmdOgmBhGjuFXuTctqEmeemhdvjTjxhwSGswPmjYqmDqmDmjYvCcmSvnhrvjTtuhfGJuGRksysDlqOdqOdoexmlfksyddqcbhmlFacrhMbhCtpwZgGPmnmmnUvsnmoGmsibxfvsnmtrvsnvsnahEonRpoDpLnpLnpLnpLnpLnpLnpLnmuJlgdlgdmuJlgdlgdmuJlgdlgdmuJmvDhDllAUppMyhurOTejNmwbwyzgBUpsOiHEppEroIaskroIdbqiHEnQBkwxyfGcFHlZMklggTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWyfmyfmyfmyfmyfmyfmyfmyfmyfmyfmyfmyfmgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
-gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgPqgTWgTWgTWgTWgTWgPqiEgsRgdhjwQCwQCwQCwQCwQCwQCwQCwQCxHItccyeAyeAyeAtccyeAyeAyeAtccyeAyeAyeAtcccsUmGZmGZmGZmGZmGZmGZmGZmGZsTFsTFmGZvTTeAUeAUeAUeAUeAUudawLcwLcmAxmxIwLctqEcsNdfhgZZsTLmvdtWhbvjcqQcqQbvjprPaBFokpjRRjXIvSKgphmyLmAcsbigOQfPKwoppvimAOcbhmlFacrmAPmiRoLZvzHsXEpVJksEgWEgWEgWElfzmDAtljvuivzHdyjpSDpqZnSmuyIuyIuyIuyImEKuyIuyIuyImEKuyIuyIqLcuyIvsxkTJuyIuyIbWUppMyhuhtzuxuujhhRMaJvxBmdfEpXDnNwsLzjDLfpKoeWvRzbjlvpEitylZMklggTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
+gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgPqgTWgTWgTWgTWgTWgPqiEgsRgdhjwQCwQCwQCwQCwQCwQCwQCwQCxHItccyeAyeAyeAtccyeAyeAyeAtccyeAyeAyeAtcccsUmGZmGZmGZmGZmGZmGZmGZmGZsTFsTFmGZvTTeAUeAUeAUeAUeAUudawLcwLcmAxmxIwLctqEcsNdfhgZZsTLmvdtWhbvjcqQcqQbvjprPaBFokpjRRjXIvSKgphmyLmAcsbigOQfPKwoppvimAOcbhmlFacrmAPmiRoLZvzHsXEpVJksEgWEgWEgWElfzmDAtljvuivzHdyjpSDpqZnSmmCDuyIuyIuyImEKuyIuyIuyImEKuyIuyIqLcuyIvsxkTJuyIuyIbWUppMyhuhtzuxuujhhRMaJvxBmdfEpXDnNwsLzjDLfpKoeWvRzbjlvpEitylZMklggTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgPqgTWgTWgTWgTWgTWgPqiEgwOpwQCkXhsqknrEmHDimRnrEmHGrvOuUVwkfsksnLurfRtCKskspdmrfRtCKsksnLurfRmIBhQzxutiCCmISwhPmKceAUxuxuRMmKdklDhIFczNeAUvPxkAGcvpeAUmLjwLcmLomNFmPgmQQtqEmeeuflmQSqYMiBkmiXmjYqmDqmDmjYcSgmiXgRGvjTqPVePPuSJksyksyqOdqOdqOdnQNnYUmAOcbhmlFmQVmRabwrnZvhBnjmipAJpAJpAJpAJievpAJbgcpfEbOZpfEffmxWFjFjxWFxWFxWFxWFxWFxWFxWFxWFxWFksCxWFxWFxWFxWFxWFlRsxWFxWFxWFdIffUCliQrRPmTssfmaJvxBmdfEmuplhWhtJhQObeNrOHxBmxBmovKlHPtByklggTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgPqgTWgTWgTWgTWgTWgPqiEgwOpwQCmHDthhnrEmTDthhnrEmUbjyQuUVmUrxDBxDBxDBxDBaIpdgIaRwgekgekgekqDcuTiyeEaUQiCCossmUSpelmVWeljkSouXsuXspCWnUjmWgnGGylwfzteAUkgHwLcmWDeZcmXhmXttqEmxNmyFvjTvSAdvsepcepcqmDqmDepcepcepckWqvjTqPVqPVrnrmXLmXYqyLlIqykydBeksypvWcbhmlFmQVmZwxJomjBrjYndzuYxqMxncvuUXsVBuUXndzrJxnehnfuilSsqPvLHurhurhurhurhurhurhurhurhxYUurhurhurhurhurhurhjgwurhurhurhurhmZUiyyotGogZrYRhkBxBmcIbiUgdqFcXxegptXWsOYmBHqtzfoHfoHfoHwOpfoHxizeAAeAAgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
gTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgGFfoHfoHfoHguZgTWgTWgTWgPqiEgwOpwQCmTDmuFnrEbgothhnrEdyTiztuUVrbJxDBkMHsXBkOneqNngJwFUkOnsXBqKiaJsuTiaTJcGyiCCvYBlUcngWeAUnhlbPJnhnnilniMaDReAUeAUeAUeAUeAUewvxGaxGaxGaxGaxGavjTvjTvjTvjTvjTvjTvjTvsGnkWsLgvsGvjTvjTvjTvjTxGaxGalsxksyksyksyksyksyksyksygkrmgBnlpwtgsnabnKreWnohreWjuMjuMjuMuOOiayuOOjuMjuMjuMmjHlkWcvQfMpnoQnoQnoQnoQjuMjuMnpMnpMnpMjuMnpMnpMnpMnpMnpMjuMnpMnpMnpMjuMjuMpMyhVJcztdsvsnaxBmxBmxBmxBmxBmxBmxBmxBmxBmuXIuXIuXIuXIuXIuXIeAAnqDeAAgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTWgTW
diff --git a/hyperstation/code/game/machinery/lore_terminal.dm b/hyperstation/code/game/machinery/lore_terminal.dm
new file mode 100644
index 00000000..8fcff766
--- /dev/null
+++ b/hyperstation/code/game/machinery/lore_terminal.dm
@@ -0,0 +1,234 @@
+GLOBAL_DATUM_INIT(lore_terminal_controller, /datum/lore_controller, new)
+
+/obj/machinery/computer/lore_terminal
+ name = "Staff Seegson info-link terminal"
+ desc = "A small CRT display with an inbuilt microcomputer which is loaded with an extensive database. These terminals contain eveyrthing from information about historical events to instruction manuals for common ship appliances."
+ icon = 'nsv13/icons/obj/computers.dmi'
+ icon_state = "terminal"
+ pixel_y = 26 //So they snap to walls correctly
+ density = FALSE
+ anchored = TRUE
+ idle_power_usage = 15
+ var/access_tag = "ntcommon" //Every subtype of this type will be readable by this console. Use this for away terms as seen here \/
+ var/list/entries = list() //Every entry that we've got.
+ var/in_use = FALSE //Stops sound spam
+ var/datum/looping_sound/computer_click/soundloop
+
+/obj/machinery/computer/lore_terminal/command //Put sensitive information on this one
+ name = "Command Seegson info-link terminal"
+ access_tag = "ntcommand"
+ req_access = list(ACCESS_HEADS)
+
+/obj/machinery/computer/lore_terminal/awaymission //Example for having a terminal preloaded with only a set list of files.
+ access_tag = "awaymission_default"
+
+/obj/machinery/computer/lore_terminal/Initialize()
+ . = ..()
+ get_entries()
+ soundloop = new(list(src), FALSE)
+
+/datum/looping_sound/computer_click
+ mid_sounds = list('nsv13/sound/effects/computer/scroll1.ogg','nsv13/sound/effects/computer/scroll2.ogg','nsv13/sound/effects/computer/scroll3.ogg','nsv13/sound/effects/computer/scroll5.ogg')
+ mid_length = 0.8 SECONDS
+ volume = 30
+
+/obj/machinery/computer/lore_terminal/proc/get_entries()
+ for(var/X in GLOB.lore_terminal_controller.entries)
+ var/datum/lore_entry/instance = X
+ if(instance.access_tag == access_tag)
+ entries += instance
+
+/obj/machinery/computer/lore_terminal/attack_hand(mob/user)
+ . = ..()
+ if(!allowed(user))
+ var/sound = pick('nsv13/sound/effects/computer/error.ogg','nsv13/sound/effects/computer/error2.ogg','nsv13/sound/effects/computer/error3.ogg')
+ playsound(src, sound, 100, 1)
+ to_chat(user, "Access denied")
+ return
+ playsound(src, 'nsv13/sound/effects/computer/scroll_start.ogg', 100, 1)
+ user.set_machine(src)
+ var/dat
+ if(!entries.len)
+ get_entries()
+ for(var/X in entries) //Allows you to remove things individually
+ var/datum/lore_entry/content = X
+ dat += "[content.name]
"
+ var/datum/browser/popup = new(user, "cd C:/entries/local", name, 300, 500)
+ popup.set_content(dat)
+ popup.open()
+
+
+/obj/machinery/computer/lore_terminal/Topic(href, href_list)
+ if(!in_range(src, usr))
+ return
+ if(in_use)
+ var/sound = 'nsv13/sound/effects/computer/buzz2.ogg'
+ playsound(src, sound, 100, 1)
+ to_chat(usr, "ERROR: I/O function busy. A file is still loading...")
+ return
+ var/datum/lore_entry/content = locate(href_list["selectitem"])
+ if(!content || !content?.content)
+ return
+ var/clicks = length(content.content) //Split the content into characters. 1 character = 1 click
+ var/dat = "\
+ \
+