diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index dd54aea2e92..ec34b6632f3 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -249,7 +249,7 @@ CREATE TABLE `player` ( `volume` smallint(4) DEFAULT '100', `nanoui_fancy` smallint(4) DEFAULT '1', `show_ghostitem_attack` smallint(4) DEFAULT '1', - `lastchangelog` varchar(32) NOT NULL, + `lastchangelog` varchar(32) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 453554f5c69..b5115a93caf 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -249,7 +249,7 @@ CREATE TABLE `SS13_player` ( `volume` smallint(4) DEFAULT '100', `nanoui_fancy` smallint(4) DEFAULT '1', `show_ghostitem_attack` smallint(4) DEFAULT '1', - `lastchangelog` varchar(32) NOT NULL, + `lastchangelog` varchar(32) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ckey` (`ckey`) ) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1; diff --git a/_maps/__MAP_DEFINES.dm b/_maps/__MAP_DEFINES.dm new file mode 100644 index 00000000000..be9889b91e7 --- /dev/null +++ b/_maps/__MAP_DEFINES.dm @@ -0,0 +1,13 @@ + #define CROSSLINKED 2 + #define SELFLOOPING 1 + #define UNAFFECTED 0 + #define MAIN_STATION "Main Station" + #define CENTCOMM "CentComm" + #define TELECOMMS "Telecomms Satellite" + #define DERELICT "Derelicted Station" + #define MINING "Mining Asteroid" + #define CONSTRUCTION "Construction Area" + #define EMPTY_AREA "Empty Area" + #define EMPTY_AREA_2 "Empty Area 2" + #define AWAY_MISSION "Away Mission" + #define AWAY_MISSION_LIST list(AWAY_MISSION = UNAFFECTED) diff --git a/_maps/cyberiad.dm b/_maps/cyberiad.dm index 98ba7cf21f2..a2f78f9d26c 100644 --- a/_maps/cyberiad.dm +++ b/_maps/cyberiad.dm @@ -24,9 +24,10 @@ z7 = empty #define MAP_FILE "cyberiad.dmm" #define MAP_NAME "NSS Cyberiad" + #define MAP_TRANSITION_CONFIG list(MAIN_STATION = CROSSLINKED, CENTCOMM = SELFLOOPING, TELECOMMS = CROSSLINKED, CONSTRUCTION = CROSSLINKED, MINING = CROSSLINKED, DERELICT = CROSSLINKED, EMPTY_AREA = CROSSLINKED) #elif !defined(MAP_OVERRIDE) #warn a map has already been included, ignoring Cyberiad. -#endif \ No newline at end of file +#endif diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index f435d880508..1b383723584 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -6307,6 +6307,7 @@ "cro" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"}) "crp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"}) "crq" = (/obj/machinery/door_control{id = "telelab"; name = "Test Chamber Blast Doors"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = 2},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/dropper,/obj/item/stack/medical/bruise_pack/advanced,/obj/item/stack/medical/ointment/advanced,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/explab) +"crr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "crs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"}) "crt" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"}) "cru" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"}) @@ -7902,7 +7903,6 @@ "cVZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cWb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) -"cWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/beacon,/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access_txt = "13"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cWd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cWe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=9.5-Escape2"; location = "9-Escape"},/mob/living/simple_animal/bot/secbot{auto_patrol = 1; health = 35; maxHealth = 35; name = "Inspector Johnson"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) "cWf" = (/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Aft"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"}) @@ -8650,7 +8650,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeabqabqabqaaaaaaaaaabqabqabqaaaaaaaaaabqaaaaaaaaacRhcUgcUhcUicUjcUkcUlcUmcRhcUncRhcUocUpcUqcUrcUscTHcTHcUtcUucUvcUwcUxcUycSYcUzcTacRtcSocUAcUBcUCcUDcUEcUFcUGbZUcTjbZUabqabqcTXcUHcTXabqaaacTZcUIbZUchychychycUJcUKcctcULbZUcqXcQWcUecUMcUeabqaaaabqaaaaaaabqabqabqabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaacRhcTycUNcRhcUOcUPcUQcURcUScUTcRhcUUcUVcUWcUXcUYcUZcVacVbcSWcTacRtcVccVdcVecVfcVgcUwcVhcVicVjcVkcVkcVlcVmcVkbZUaefabqaaaaaacTXcVncTXaaaaaacTZcSvbZUcVocVpcVqbZUcVrcVscVqbZUaaaabqcUecUfcUeabqaaaabqaaaaaaabqabqaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabeaaaaaaabqabeabfabeabqabeabeabeabqcSOcSOcSOcRhcRhcRhcRhcVtcVucRhcRhcRhcVvcVwcVxcUXcVycVzcVAcSOcSOcTacRtcRtcRtcSYcSZcTacRtcVBcVCcVDcVEabqabqaaaaaaabqaefabqaaacVFcVGcVHcVGcVIaaacTZcSvbZUbZUbZUbZUbZUbZUbZUbZUbZUaaaabqaaacVJaaaabqabqabqabqabqabqaaaaaaabqarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacVKcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcWccWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacTZcWjcWkcWkcWkcWlcWmcTZaaaabqaaaaaaabqaaacVJaaaabqabqaaaaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacVKcVLcVMcSOcVNcVOcVPcVQcVRcVScSOcVTcVUcVVcVWcUXcUYcUZcVacVXcSOcVYcRtcVZcWacWbcrrcWdcWacWecRtcWfcVkaaaabqabqabqabqabqabqabqcVGcWgcWhcWicVGaaacTZcWjcWkcWkcWkcWlcWmcTZaaaabqaaaaaaabqaaacVJaaaabqabqaaaaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacVKcWncVMcWocWpcWpcWpcWqcWrcWscWtcWucWvcWucWwcWpcWxcWwcWycWzcSVcWAcWBcWCcWBcWBcWBcWBcWBcWCcWBcWDcVEaaaabqaaaaaaabqaaaaaaaaacVGcWEcWFdezdeAcyncTZcTZcTZcTZcTZciccSvcTZabqabqaaaaaaaaaaaacWJcWKcWKcWKcWKcWKcWKcWKcWKcWKcWLaaaaaaaaaaaaaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaacVKcWncWMcVRcWNcWOcWNcWPcWQcWRcWScWTcWUcWVcWVcWWcWVcWVcWXcWYcSOcWZcXacXbcXacXacXccXacXacXdcXecXfcVkabqabqaaacVGcVGcVGcVGcVGcVGcXgcXhcXicVGcVGcVGcVGcVGcVGcTZciccSvcTZabqabqabqabqabqabqabqabqabqaaaabqaaaaaaaaaaaaaaacVJaaaaaaabqaaaaaaaaaaupaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqaaacVKcXjcVMcVRcWNcWNcWNcXkcSOcSOcSOcSOcXlcXmcUXcXncUXcXmcXocSOcSOcVEcXpcVEcXpcVEcVEcVEcXpcXpcVEcVEcVkaaaabqabqcVGcXqcXrcXscXtcVGcXucXvcVGcVGcXwcXxcXycXzcVGcTZciccSvcTZabqcXAcXBcXCcXBcXCcXBcXDabqauparBaupabqabqabqabqcVJabqabqabqabqabqabearBarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/metastation.dm b/_maps/metastation.dm index 3cbc8cdc16d..2010b25d501 100644 --- a/_maps/metastation.dm +++ b/_maps/metastation.dm @@ -25,9 +25,10 @@ z7 = empty space #define MAP_FILE "MetaStation.v41A.II.dmm" #define MAP_NAME "MetaStation" + #define MAP_TRANSITION_CONFIG list(MAIN_STATION = CROSSLINKED, CENTCOMM = SELFLOOPING, TELECOMMS = CROSSLINKED, DERELICT = CROSSLINKED, MINING = CROSSLINKED, EMPTY_AREA = CROSSLINKED, EMPTY_AREA_2 = CROSSLINKED) #elif !defined(MAP_OVERRIDE) #warn a map has already been included, ignoring MetaStation. -#endif \ No newline at end of file +#endif diff --git a/_maps/test_away_missions.dm b/_maps/test_away_missions.dm index 59ca6167d68..e5c1f0d192e 100644 --- a/_maps/test_away_missions.dm +++ b/_maps/test_away_missions.dm @@ -10,12 +10,13 @@ #include "map_files\RandomZLevels\spacehotel.dmm" #include "map_files\RandomZLevels\stationCollision.dmm" #include "map_files\RandomZLevels\wildwest.dmm" - + #include "map_files\RandomZLevels\evil_santa.dmm" #define MAP_FILE "beach.dmm" #define MAP_NAME "Away Missions Test" + #define MAP_TRANSITION_CONFIG list(AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED, AWAY_MISSION = UNAFFECTED) #elif !defined(MAP_OVERRIDE) #warn a map has already been included. -#endif \ No newline at end of file +#endif diff --git a/code/__DEFINES/zlevel.dm b/code/__DEFINES/zlevel.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index e1965cf701e..889a0824f35 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -270,4 +270,75 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul . = 0 break if(progress) - qdel(progbar) \ No newline at end of file + qdel(progbar) + +/proc/admin_mob_info(mob/M, mob/user = usr) + if(!ismob(M)) + to_chat(user, "This can only be used on instances of type /mob") + return + + var/location_description = "" + var/special_role_description = "" + var/health_description = "" + var/gender_description = "" + var/turf/T = get_turf(M) + + //Location + if(isturf(T)) + if(isarea(T.loc)) + location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z] in area [T.loc])" + else + location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z])" + + //Job + antagonist + if(M.mind) + special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]" + else + special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;" + + //Health + if(isliving(M)) + var/mob/living/L = M + var/status + switch(M.stat) + if(CONSCIOUS) + status = "Alive" + if(UNCONSCIOUS) + status = "Unconscious" + if(DEAD) + status = "Dead" + health_description = "Status = [status]" + health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]" + else + health_description = "This mob type has no health to speak of." + + //Gener + switch(M.gender) + if(MALE, FEMALE) + gender_description = "[M.gender]" + else + gender_description = "[M.gender]" + + to_chat(user, "Info about [M.name]: ") + to_chat(user, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]") + to_chat(user, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") + to_chat(user, "Location = [location_description];") + to_chat(user, "[special_role_description]") + to_chat(user, "(PM) (PP) (VV) (SM) (FLW) (CA)") + +// Gets the first mob contained in an atom, and warns the user if there's not exactly one +/proc/get_mob_in_atom_with_warning(atom/A, mob/user = usr) + if(!istype(A)) + return null + if(ismob(A)) + return A + + . = null + for(var/mob/M in A) + if(!.) + . = M + else + to_chat(user, "Multiple mobs in [A], using first mob found...") + break + if(!.) + to_chat(user, "No mob located in [A].") diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm index 891dbc05b24..2324bf85077 100644 --- a/code/_globalvars/mapping.dm +++ b/code/_globalvars/mapping.dm @@ -12,7 +12,8 @@ var/list/diagonals = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) //Was list("3" = 30, "4" = 70). //Spacing should be a reliable method of getting rid of a body -- Urist. //Go away Urist, I'm restoring this to the longer list. ~Errorage -var/list/accessable_z_levels = list(1,3,4,5,6,7) //Keep this to six maps, repeating z-levels is okay if needed +// TODO: Tie into space manager +var/list/accessable_z_levels = list(ZLEVEL_STATION,ZLEVEL_TELECOMMS,ZLEVEL_ENGI,ZLEVEL_ASTEROID,ZLEVEL_DERELICT,ZLEVEL_EMPTY) //Keep this to six maps, repeating z-levels is okay if needed var/global/list/global_map = null //list/global_map = list(list(1,5),list(4,3))//an array of map Z levels. @@ -25,7 +26,8 @@ var/global/list/global_map = null //3 - AI satellite //5 - empty space -var/shuttle_z = 2 //default +// TODO: Tie into space manager +var/shuttle_z = ZLEVEL_CENTCOMM //default var/list/monkeystart = list() var/list/wizardstart = list() diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 869ee83ff9c..d04abfe5a87 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -25,6 +25,21 @@ return var/list/modifiers = params2list(params) + if(check_rights(R_ADMIN, 0)) // Admin click shortcuts + var/mob/M + if(modifiers["shift"] && modifiers["ctrl"]) + client.debug_variables(A) + return + if(modifiers["ctrl"]) + M = get_mob_in_atom_with_warning(A) + if(M) + client.holder.show_player_panel(M) + return + if(modifiers["shift"] && modifiers["middle"]) + M = get_mob_in_atom_with_warning(A) + if(M) + admin_mob_info(M) + return if(modifiers["shift"]) ShiftClickOn(A) return diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index e92def92224..9c20d612247 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -164,6 +164,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 continue var/turf/T = get_turf(thing) + // TODO: Tie into space manager if(T && T.z == ZLEVEL_STATION) callShuttle = 0 break @@ -209,6 +210,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if(!M.roundstart_move) continue for(var/obj/docking_port/stationary/S in stationary) + // TODO: Tie into space manager if(S.z != ZLEVEL_STATION && findtext(S.id, M.id)) S.width = M.width S.height = M.height diff --git a/code/controllers/Processes/weather.dm b/code/controllers/Processes/weather.dm index 999c6c51dc5..df9ee95369b 100644 --- a/code/controllers/Processes/weather.dm +++ b/code/controllers/Processes/weather.dm @@ -1,3 +1,4 @@ +// TODO: Tie into space manager //Used for all kinds of weather, ex. lavaland ash storms. var/global/datum/controller/process/weather/weather_master diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index c3c0ea77ddb..6ebb4d36340 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -41,13 +41,25 @@ var/global/pipe_processing_killed = 0 /datum/controller/game_controller/proc/setup() world.tick_lag = config.Ticklag - zlevels.initialize() - preloadTemplates() if(!config.disable_away_missions) createRandomZlevel() + // Create 6 extra space levels to put space ruins on if(!config.disable_space_ruins) - seedRuins(7, rand(0, 3), /area/space, space_ruins_templates) + var/timer = start_watch() + log_startup_progress("Creating random space levels...") + seedRuins(ZLEVEL_EMPTY, rand(0, 3), /area/space, space_ruins_templates) + log_startup_progress("Loaded random space levels in [stop_watch(timer)]s.") + + // We'll keep this around for the time when we finally expunge all + // code that checks on hard-defined z positions + + // var/num_extra_space = 6 + // for(var/i = 1, i <= num_extra_space, i++) + // var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED) + // seedRuins(zlev, rand(0, 3), /area/space, space_ruins_templates) + + space_manager.do_transition_setup() setup_objects() setupgenetics() diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index 83b2e8246e5..67de7f95f21 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -2,7 +2,7 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() /datum/repository/air_alarm/proc/air_alarm_data(var/list/monitored_alarms, var/refresh = 0, var/obj/machinery/alarm/passed_alarm) var/alarms[0] - + var/datum/cache_entry/cache_entry = cache_data if(!cache_entry) cache_entry = new/datum/cache_entry @@ -15,13 +15,14 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new() alarms[++alarms.len] = passed_alarm.get_nano_data_console() else for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : air_alarms)) + // TODO: Tie into space manager if(!monitored_alarms && alarm.z != ZLEVEL_STATION && alarm.z != ZLEVEL_ASTEROID) continue alarms[++alarms.len] = alarm.get_nano_data_console() - + cache_entry.timestamp = world.time //+ 10 SECONDS - cache_entry.data = alarms + cache_entry.data = alarms return alarms /datum/repository/air_alarm/proc/update_cache(var/obj/machinery/alarm/alarm) - return air_alarm_data(refresh = 1, passed_alarm = alarm) \ No newline at end of file + return air_alarm_data(refresh = 1, passed_alarm = alarm) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 586cf8af512..0a71929d155 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -161,7 +161,7 @@ body += "
" if(sprite) - body += "
[bicon(D)]" + body += "
[bicon(D, use_class=0)]" else body += "
" @@ -350,14 +350,14 @@ body else if(isicon(value)) #ifdef VARSICON - html += "[name] = /icon ([value]) [bicon(value)]" + html += "[name] = /icon ([value]) [bicon(value, use_class=0)]" #else html += "[name] = /icon ([value])" #endif else if(istype(value, /image)) #ifdef VARSICON - html += "[name] \ref[value] = /image ([value]) [bicon(value)]" + html += "[name] \ref[value] = /image ([value]) [bicon(value, use_class=0)]" #else html += "[name] \ref[value] = /image ([value])" #endif diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 4bef4896cc8..b97ce1f5c7f 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -406,7 +406,8 @@ var/list/advance_cures = list( AD.Refresh() for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) - if(H.z != 1) + // TODO: Tie into space manager + if(H.z != ZLEVEL_STATION) continue if(!H.HasDisease(D)) H.ForceContractDisease(D) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 83b3a4a226a..172c4b63757 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -43,11 +43,11 @@ Bonus return /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()) M.adjustOxyLoss(get_damage) return 1 /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5) M.adjustOxyLoss(get_damage) return 1 \ No newline at end of file diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm index eb7afcaf6be..cba4d4a4cd0 100644 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -45,9 +45,11 @@ Bonus if(!parts.len) return - M.heal_overall_damage(get_damage, get_damage) + for(var/obj/item/organ/external/E in parts) + E.heal_damage(get_damage, get_damage, 0, 0) M.adjustToxLoss(get_damage*parts.len) + else if(M.getFireLoss() > 0 || M.getBruteLoss() > 0) M.adjustFireLoss(-get_damage) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 3ec0f16358a..9234b54b088 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -21,7 +21,7 @@ Bonus resistance = -4 stage_speed = -4 transmittable = -3 - level = 6 + level = 5 severity = 0 /datum/symptom/sensory_restoration/Activate(var/datum/disease/advance/A) @@ -38,12 +38,12 @@ Bonus M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10)) to_chat(M, "You feel sober.") if(4) - if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10) - M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaptizine"=5)) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10) + M.reagents.add_reagent_list(list("antihol"=10, "oculine"=10, "synaphydramine"=5)) to_chat(M, "You feel focused.") if(5) - if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaptizine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) - M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaptizine"=10)) + if(M.reagents.get_reagent_amount("antihol") < 10 && M.reagents.get_reagent_amount("oculine") < 10 && M.reagents.get_reagent_amount("synaphydramine") < 10 && M.reagents.get_reagent_amount("mannitol") < 10) + M.reagents.add_reagent_list(list("mannitol"=10, "antihol"=10, "oculine"=10, "synaphydramine"=10)) to_chat(M, "Your mind feels relaxed.") return diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 03fe8602281..8b61be7d12b 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -48,7 +48,7 @@ // This system will metaphorically snap in half (not postpone init everywhere) // if given a multi-z template // it might need to be adapted for that when that time comes - zlevels.add_dirt(placement.z) + space_manager.add_dirt(placement.z) var/list/bounds = maploader.load_map(get_file(), min_x, min_y, placement.z, cropMap = 1) if(!bounds) return 0 @@ -65,7 +65,7 @@ late_setup_level( block(bot_left, top_right), block(ST_bot_left, ST_top_right)) - zlevels.remove_dirt(placement.z) + space_manager.remove_dirt(placement.z) log_game("[name] loaded at [min_x],[min_y],[placement.z]") return 1 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index c7aa3dfd9a0..63b9405f73e 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -67,6 +67,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin caster.reset_view(0) return 0 + // TODO: Tie into space manager if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel return 0 if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages") @@ -363,6 +364,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(((!user.mind) || !(src in user.mind.spell_list)) && !(src in user.mob_spell_list)) return 0 + // TODO: Tie into space manager if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel return 0 if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages") @@ -400,4 +402,4 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return 0 if(isbrain(user) || ispAI(user)) return 0 - return 1 \ No newline at end of file + return 1 diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index cafbb579f34..022d2dc128b 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -309,6 +309,14 @@ var/list/uplink_items = list() item = /obj/item/clothing/under/contortionist cost = 6 job = list("Life Support Specialist") + +/datum/uplink_item/dangerous/energizedfireaxe + name = "Energized Fire Axe" + desc = "A fire axe with a massive electrical charge built into it. It can release this charge on its first victim and will be rather plain after that." + reference = "EFA" + item = /obj/item/weapon/twohanded/energizedfireaxe + cost = 10 + job = list("Life Support Specialist") //Stimulants diff --git a/code/datums/weather/weather_types.dm b/code/datums/weather/weather_types.dm index 07735e85968..bf942b7ceba 100644 --- a/code/datums/weather/weather_types.dm +++ b/code/datums/weather/weather_types.dm @@ -1,4 +1,5 @@ //Different types of weather. +// TODO: Tie into space manager /datum/weather/floor_is_lava //The Floor is Lava: Makes all turfs damage anyone on them unless they're standing on a solid object. name = "the floor is lava" diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm index b13cfe9ca05..b78345b0638 100644 --- a/code/defines/procs/radio.dm +++ b/code/defines/procs/radio.dm @@ -47,6 +47,7 @@ /proc/get_receiver_reception(var/receiver, var/datum/signal/signal) if(receiver && check_signal(signal)) var/turf/pos = get_turf(receiver) + // Maybe should get tie-in to the space manager? if(pos && (pos.z in signal.data["level"])) return TELECOMMS_RECEPTION_RECEIVER return TELECOMMS_RECEPTION_NONE diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 3992f97fd0b..07ad5956002 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -67,6 +67,7 @@ var/list/teleportlocs = list() if(AR.no_teleportlocs) continue if(teleportlocs.Find(AR.name)) continue var/turf/picked = safepick(get_area_turfs(AR.type)) + // TODO: Tie into space manager if(picked && (picked.z == ZLEVEL_STATION)) teleportlocs += AR.name teleportlocs[AR.name] = AR @@ -2632,4 +2633,3 @@ var/list/the_station_areas = list ( /area/turret_protected/ai_upload_foyer, /area/turret_protected/ai, ) - diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 43540f347de..5963d461daf 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -376,6 +376,7 @@ return 1 else // There's a gravity generator on our z level + // This would do well when integrated with the z level manager if(T && gravity_generators["[T.z]"] && length(gravity_generators["[T.z]"])) return 1 return 0 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7e5c26b52e5..e4332ac78c0 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -41,6 +41,7 @@ if(!T) return 0 + // TODO: Tie into space manager if(T.z != ZLEVEL_CENTCOMM)//if not, don't bother return 0 @@ -58,6 +59,7 @@ if(!T) return 0 + // TODO: Tie into space manager if(T.z != ZLEVEL_CENTCOMM)//if not, don't bother return 0 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index cb612eec455..a903e4ea8ed 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -44,8 +44,8 @@ // at which point object creations are a fair toss more seldom /atom/movable/proc/attempt_init() var/turf/T = get_turf(src) - if(T && zlevels.is_zlevel_dirty(T.z)) - zlevels.postpone_init(T.z, src) + if(T && space_manager.is_zlevel_dirty(T.z)) + space_manager.postpone_init(T.z, src) else if(auto_init) initialize() diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 1dc7985d648..7d9aed3d442 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -80,6 +80,7 @@ var/mob/living/demon_type = /mob/living/simple_animal/slaughter /obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user as mob) + // TODO: Tie into space manager if(user.z == ZLEVEL_CENTCOMM)//this is to make sure the wizard does NOT summon a demon from the Den.. to_chat(user, "You should probably wait until you reach the station.") return @@ -135,4 +136,4 @@ veil_msg = "You sense an adorable presence \ lurking just beyond the veil..." objective_verb = "Hug and Tickle" - demon_type = /mob/living/simple_animal/slaughter/laughter \ No newline at end of file + demon_type = /mob/living/simple_animal/slaughter/laughter diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 35b469258ef..ebab12dc0f2 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -118,6 +118,7 @@ var/list/blob_nodes = list() if(directory[ckey(blob.key)]) blob_client = directory[ckey(blob.key)] location = get_turf(C) + // TODO: Tie into space manager if(location.z != ZLEVEL_STATION || istype(location, /turf/space)) if(!warned) to_chat(C, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!") diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index c6d3bd13e0f..e74a0677942 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -23,6 +23,7 @@ var/nukecode = rand(10000, 99999) for(var/obj/machinery/nuclearbomb/bomb in world) if(bomb && bomb.r_code) + // TODO: Tie into space manager if(bomb.z == ZLEVEL_STATION) bomb.r_code = nukecode diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index e2f4fc50c12..5b0884788b9 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -36,7 +36,6 @@ melee_damage_upper = 4 attacktext = "hits" attack_sound = 'sound/weapons/genhit1.ogg' - del_on_death = 1 speak_emote = list("pulses") var/obj/effect/blob/factory/factory = null var/list/human_overlays = list() @@ -92,6 +91,7 @@ loc.visible_message("The corpse of [H.name] suddenly rises!") /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) + ..() // On death, create a small smoke of harmful gas (s-Acid) var/datum/effect/system/chem_smoke_spread/S = new var/turf/location = get_turf(src) @@ -108,7 +108,7 @@ S.attach(location) S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud S.start() - ..() + qdel(src) /mob/living/simple_animal/hostile/blob/blobspore/Destroy() if(factory) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 7ad1e33b747..dc12c64fbed 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -14,7 +14,8 @@ var/list/sacrificed = list() for(var/obj/effect/rune/R in world) if(R == src) continue - if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != 2) + // TODO: Tie into space manager + if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != ZLEVEL_CENTCOMM) index++ allrunesloc.len = index allrunesloc[index] = R.loc diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index fd384e61d1f..123ca75a78a 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -2,6 +2,7 @@ //command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) + // TODO: Tie into space manager if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded) if(temp_vent.parent.other_atmosmch.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology vents += temp_vent diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7d2ae88fe2a..77f503a1db2 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -427,6 +427,7 @@ proc/get_nt_opposed() /proc/get_nuke_code() var/nukecode = "ERROR" for(var/obj/machinery/nuclearbomb/bomb in world) + // TODO: Tie into space manager if(bomb && bomb.r_code && bomb.z == ZLEVEL_STATION) nukecode = bomb.r_code return nukecode @@ -452,6 +453,7 @@ proc/get_nt_opposed() else text += " survived" if(fleecheck && ply.current.z > ZLEVEL_STATION) + // TODO: Tie into space manager text += " while fleeing the station" if(ply.current.real_name != ply.name) text += " as [ply.current.real_name]" @@ -468,4 +470,4 @@ proc/get_nt_opposed() else text += "
Objective #[count]: [objective.explanation_text] Fail." count++ - return text \ No newline at end of file + return text diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 7d6ea9b4e7d..4fd8c5a452b 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -266,7 +266,8 @@ var/round_start_time = 0 M.client.screen += cinematic if(M.stat != DEAD) var/turf/T = get_turf(M) - if(T && T.z == 1) + // TODO: Tie into space manager + if(T && T.z == ZLEVEL_STATION) M.death(0) //no mercy //Now animate the cinematic diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index c6b65472c2e..40d78c131ae 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -69,6 +69,7 @@ rcd light flash thingy on matter drain src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets for(var/obj/machinery/porta_turret/turret in machines) var/turf/T = get_turf(turret) + // TODO: Tie into space manager if(T.z in config.station_levels) // Increase health by 37.5% of original max, decrease delays between shots to 66% turret.health += initial(turret.health) * 3 / 8 diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 77c45956eb4..fb85a0a1606 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -141,6 +141,7 @@ /datum/game_mode/proc/check_ai_loc() for(var/datum/mind/AI_mind in malf_ai) var/turf/ai_location = get_turf(AI_mind.current) + // TODO: Tie into space manager if(ai_location && (ai_location.z == ZLEVEL_STATION)) return 1 return 0 @@ -343,4 +344,4 @@ text += module_text_temp to_chat(world, text) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 2f7af290229..a2ff0f4e1d8 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -36,7 +36,8 @@ var/Me = pickweight(meteortypes) var/obj/effect/meteor/M = new Me(pickedstart) M.dest = pickedgoal - M.z_original = 1 + // TODO: Tie into space manager + M.z_original = ZLEVEL_STATION spawn(0) walk_towards(M, M.dest, 1) return @@ -102,6 +103,7 @@ var/dropamt = 2 /obj/effect/meteor/Move() + // TODO: Tie into space manager if(z != z_original || loc == dest) qdel(src) return @@ -309,5 +311,3 @@ /obj/effect/meteor/goreops/Bump(atom/A) A.ex_act(hitpwr) get_hit() - - diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm index ed096526d10..28a0282487d 100644 --- a/code/game/gamemodes/miniantags/borer/borer_event.dm +++ b/code/game/gamemodes/miniantags/borer/borer_event.dm @@ -17,6 +17,7 @@ /datum/event/borer_infestation/start() var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world) + // TODO: Tie into space manager if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded) //Stops cortical borers getting stuck in small networks. See: Security, Virology if(temp_vent.parent.other_atmosmch.len > 50) @@ -33,4 +34,3 @@ spawncount-- successSpawn = 1 - diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index d5541f70e0d..ed84f211e53 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -290,6 +290,7 @@ /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) if(target != src) to_chat(src, "Attempting to remove this being from our presence.") + // TODO: Tie into space manager if(src.z != ZLEVEL_STATION) to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") return @@ -512,4 +513,3 @@ for(var/mob/M in mob_list) if(isswarmer(M) || (M in dead_mob_list)) to_chat(M, "Swarm communication - [src] states: [message]") - diff --git a/code/game/gamemodes/nations/nations.dm b/code/game/gamemodes/nations/nations.dm index ca867028585..5f729e4484e 100644 --- a/code/game/gamemodes/nations/nations.dm +++ b/code/game/gamemodes/nations/nations.dm @@ -142,6 +142,7 @@ datum/game_mode/nations /datum/game_mode/nations/proc/remove_access() for(var/obj/machinery/door/airlock/W in airlocks) + // TODO: Tie into space manager if(W.z in config.station_levels) W.req_access = list() @@ -253,4 +254,4 @@ datum/game_mode/nations /datum/game_mode/proc/update_nations_icons_removed(datum/mind/nations_mind) var/datum/atom_hud/antag/nations_hud = huds[GAME_HUD_NATIONS] nations_hud.leave_hud(nations_mind) - set_nations_hud(nations_mind, null) \ No newline at end of file + set_nations_hud(nations_mind, null) diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index a70074a919e..ef0edffd5f8 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -651,7 +651,7 @@ datum return 10 else return 20 - + /*burger steal_target = /obj/item/weapon/reagent_containers/food/snacks/human/burger @@ -1358,6 +1358,7 @@ datum var/turf/T = get_turf(target.current) if(target.current.stat == 2) return 1 + // TODO: Tie into space manager else if((T) && !(T.z in config.station_levels))//If they leave the station they count as dead for this return 2 else @@ -1413,4 +1414,4 @@ datum/objective/silence #undef LENIENT #undef NORMAL #undef HARD -#undef IMPOSSIBLE \ No newline at end of file +#undef IMPOSSIBLE diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index c11b43f81ec..15a4c8ec246 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -19,6 +19,7 @@ if(player_list.len < MIN_CHALLENGE_PLAYERS) to_chat(user, "The enemy crew is too small to be worth declaring war on.") return + // TODO: Tie into space manager if(user.z != ZLEVEL_CENTCOMM) to_chat(user, "You have to be at your base to use this.") return diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 18791cd15f0..ae22e0ec458 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -353,6 +353,7 @@ var/bomb_set var/off_station = 0 var/turf/bomb_location = get_turf(src) + // TODO: Tie into space manager if( bomb_location && (bomb_location.z in config.station_levels) ) if( (bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)) ) off_station = 1 @@ -363,7 +364,8 @@ var/bomb_set if(ticker.mode && ticker.mode.name == "nuclear emergency") var/obj/docking_port/mobile/syndie_shuttle = shuttle_master.getShuttle("syndicate") if(syndie_shuttle) - ticker.mode:syndies_didnt_escape = (syndie_shuttle.z > 1 ? 0 : 1) //muskets will make me change this, but it will do for now + // TODO: Tie into space manager + ticker.mode:syndies_didnt_escape = (syndie_shuttle.z > ZLEVEL_STATION ? 0 : 1) //muskets will make me change this, but it will do for now ticker.mode:nuke_off_station = off_station ticker.station_explosion_cinematic(off_station,null) if(ticker.mode) @@ -401,6 +403,7 @@ var/bomb_set /obj/item/weapon/disk/nuclear/process() var/turf/disk_loc = get_turf(src) + // TODO: Tie into space manager if(disk_loc.z != ZLEVEL_STATION && disk_loc.z != ZLEVEL_CENTCOMM) var/holder = get(src, /mob) if(holder) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 825e1183529..b6b1094b103 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -77,7 +77,8 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ check_completion() if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + // TODO: Tie into space manager + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > ZLEVEL_DERELICT || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite return 1 return 0 return 1 @@ -109,6 +110,7 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client) return 1 var/turf/T = get_turf(target.current) + // TODO: Tie into space manager if(T && !(T.z in config.station_levels)) //If they leave the station they count as dead for this return 2 return 0 @@ -144,6 +146,7 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ if(target in ticker.mode:head_revolutionaries) return 1 var/turf/T = get_turf(target.current) + // TODO: Tie into space manager if(T && !(T.z in config.station_levels)) //If they leave the station they count as dead for this rval = 2 return 0 @@ -170,8 +173,10 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ check_completion() if(target && target.current) - if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite + // TODO: Tie into space manager + if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > ZLEVEL_DERELICT || !target.current.ckey) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite return 1 + // TODO: Tie into space manager if((target.current.z in config.admin_levels)) return 0 return 1 @@ -572,7 +577,8 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ check_completion() if(target && target.current) - if(target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey) + // TODO: Tie into space manager + if(target.current.stat == DEAD || target.current.z > ZLEVEL_DERELICT || !target.current.ckey) return 1 return 0 return 1 @@ -861,4 +867,4 @@ var/list/potential_theft_objectives=subtypesof(/datum/theft_objective) \ /datum/objective/wizchaos explanation_text = "Wreak havoc upon the station as much you can. Send those wandless Nanotrasen scum a message!" - completed = 1 \ No newline at end of file + completed = 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index b3f889377c8..9e74459dadd 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -314,6 +314,7 @@ /datum/game_mode/revolution/proc/check_heads_victory() for(var/datum/mind/rev_mind in head_revolutionaries) var/turf/T = get_turf(rev_mind.current) + // TODO: Tie into space manager if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != 2) && rev_mind.current.client && T && (T.z == ZLEVEL_STATION)) if(ishuman(rev_mind.current)) return 0 @@ -448,4 +449,4 @@ dat += "Revolution Successful: [score_traitorswon ? "Yes" : "No"] (-[score_traitorswon * 10000] Points)
" dat += "
" - return dat \ No newline at end of file + return dat diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 298f71bc991..8ee145e8759 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -21,11 +21,13 @@ // Who is alive/dead, who escaped for(var/mob/living/silicon/ai/I in mob_list) + // TODO: Tie into space manager if(I.stat == DEAD && (I.z in config.station_levels)) score_deadaipenalty++ score_deadcrew++ for(var/mob/living/carbon/human/I in mob_list) + // TODO: Tie into space manager if(I.stat == DEAD && (I.z in config.station_levels)) score_deadcrew++ @@ -79,6 +81,7 @@ // Check station's power levels for(var/obj/machinery/power/apc/A in machines) + // TODO: Tie into space manager if(!(A.z in config.station_levels)) continue for(var/obj/item/weapon/stock_parts/cell/C in A.contents) @@ -88,6 +91,7 @@ // Check how much uncleaned mess is on the station for(var/obj/effect/decal/cleanable/M in world) + // TODO: Tie into space manager if(!(M.z in config.station_levels)) continue if(istype(M, /obj/effect/decal/cleanable/blood/gibs)) score_mess += 3 @@ -244,4 +248,4 @@ if(50000 to INFINITY) score_rating = "Nanotrasen's Finest" dat += "RATING: [score_rating]" - src << browse(dat, "window=roundstats;size=500x600") \ No newline at end of file + src << browse(dat, "window=roundstats;size=500x600") diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index 9c6989cb1b9..fd3ad379fe0 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -19,9 +19,6 @@ var/list/all_items = owner.current.get_contents() for(var/obj/I in all_items) //Check for items if(istype(I, typepath) && check_special_completion(I)) - //Stealing the cheap autoinjector doesn't count - if(istype(I, /obj/item/weapon/reagent_containers/hypospray/autoinjector)) - continue return 1 return 0 @@ -111,7 +108,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/device/aicard/C) /datum/theft_objective/hypospray name = "a hypospray" - typepath = /obj/item/weapon/reagent_containers/hypospray + typepath = /obj/item/weapon/reagent_containers/hypospray/CMO protected_jobs = list("Chief Medical Officer") /datum/theft_objective/ablative diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 37e9b39ce11..4d3fc5bfae8 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -122,6 +122,7 @@ command_announcement.Announce("The aliens have nearly succeeded in capturing the station and exterminating the crew. Activate the nuclear failsafe to stop the alien threat once and for all. The Nuclear Authentication Code is [get_nuke_code()] ", "Alien Lifeform Alert") set_security_level("gamma") var/obj/machinery/door/airlock/vault/V = locate(/obj/machinery/door/airlock/vault) in world + // TODO: Tie into space manager if(V && (V.z in config.station_levels)) V.locked = 0 V.update_icon() @@ -142,6 +143,7 @@ var/list/livingplayers = list() for(var/mob/M in player_list) var/turf/T = get_turf(M) + // TODO: Tie into space manager if((M) && (M.stat != 2) && M.client && T && ((T.z in config.station_levels) || shuttle_master.emergency.mode >= SHUTTLE_ESCAPE && ((T.z in config.station_levels) || (T.z in config.admin_levels)))) if(ishuman(M)) livingplayers += 1 @@ -182,4 +184,4 @@ to_chat(world, text) ..() - return 1 \ No newline at end of file + return 1 diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 1de4ecef264..982d2be445f 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -339,7 +339,8 @@ equip(var/mob/living/carbon/human/H) - if(!H) return 0 + if(!H) + return 0 switch(H.backbag) if(2) H.equip_or_collect(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) @@ -348,12 +349,10 @@ H.equip_or_collect(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform) H.equip_or_collect(new /obj/item/device/pda/librarian(H), slot_wear_pda) H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes) - H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_l_hand) + H.equip_or_collect(new /obj/item/weapon/storage/bag/books(H), slot_l_hand) + H.equip_or_collect(new /obj/item/weapon/barcodescanner(H), slot_r_store) H.equip_or_collect(new /obj/item/device/laser_pointer(H), slot_l_store) - if(H.backbag == 1) - H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand) - else - H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) + H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 /datum/job/barber diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 3ea08ee842c..ac95e1b2a05 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -769,6 +769,7 @@ var/turf/pos = get_turf(src) data["x"] = pos.x data["y"] = pos.y + // TODO: Tie into space manager data["z"] = pos.z return data diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm index 89cf4cd3610..a75c3afac88 100644 --- a/code/game/machinery/atmoalter/area_atmos_computer.dm +++ b/code/game/machinery/atmoalter/area_atmos_computer.dm @@ -113,6 +113,7 @@ scrubber.update_icon() proc/validscrubber( var/obj/machinery/portable_atmospherics/scrubber/huge/scrubber as obj ) + // TODO: Tie into space manager if(!isobj(scrubber) || get_dist(scrubber.loc, src.loc) > src.range || scrubber.loc.z != src.loc.z) return 0 @@ -176,4 +177,4 @@ if(!found) status = "ERROR: No scrubber found!" - src.updateUsrDialog() \ No newline at end of file + src.updateUsrDialog() diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index aa32db20688..cccc7e52f91 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -1,6 +1,7 @@ /mob/living/silicon/ai/proc/InvalidTurf(turf/T as turf) if(!T) return 1 + // TODO: Tie into space manager if((T.z in config.admin_levels)) return 1 if(T.z > MAX_Z) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 81b2c6b86a4..a9b1e3ff31c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -75,6 +75,7 @@ var/list/cameras = list() for(var/obj/machinery/camera/C in cameranet.cameras) + // TODO: Tie into space manager if((z > MAX_Z || C.z > MAX_Z) && (C.z != z)) //can only recieve away mission cameras on away missions continue if(!can_access_camera(C)) @@ -313,4 +314,4 @@ icon_keyboard = "power_key" icon_screen = "engie_cams" light_color = "#FAC54B" - network = list("Power Alarms","Atmosphere Alarms","Fire Alarms") \ No newline at end of file + network = list("Power Alarms","Atmosphere Alarms","Fire Alarms") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index e87802f728c..790c516fc95 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -54,6 +54,7 @@ if(..(href, href_list)) return 1 + // TODO: Tie into space manager if((!(src.z in config.station_levels) && !(src.z in config.admin_levels))) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return 1 @@ -303,6 +304,7 @@ if(stat & (NOPOWER|BROKEN)) return + // TODO: Tie into space manager if(!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM))) to_chat(user, "Unable to establish a connection: You're too far away from the station!") return diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm index 2f26663395e..75880d41975 100644 --- a/code/game/machinery/computer/honkputer.dm +++ b/code/game/machinery/computer/honkputer.dm @@ -20,6 +20,7 @@ /obj/machinery/computer/HONKputer/Topic(href, href_list) if(..()) return 1 + // TODO: Tie into space manager if(!(src.z in config.station_levels)) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return @@ -68,7 +69,8 @@ /obj/machinery/computer/HONKputer/attack_hand(var/mob/user as mob) if(..()) return - if(src.z > 6) + // TODO: Tie into space manager + if(src.z > ZLEVEL_DERELICT) to_chat(user, "Unable to establish a connection: You're too far away from the station!") return diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm index d50edbfd0cb..a6f1a0e6c26 100644 --- a/code/game/machinery/computer/law.dm +++ b/code/game/machinery/computer/law.dm @@ -29,7 +29,8 @@ attackby(obj/item/weapon/O as obj, mob/user as mob, params) - if(user.z > 6) + // TODO: Tie into space manager + if(user.z > ZLEVEL_DERELICT) to_chat(user, "Unable to establish a connection: You're too far away from the station!") return if(istype(O, /obj/item/weapon/aiModule)) diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index ebc0db47c32..e3683361ef2 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -65,6 +65,7 @@ health_display = "DEAD" else if(total_loss) health_display = "HURT ([total_loss])" + // TODO: Tie into space manager if((M.z in config.station_levels) && !istype(M.loc, /turf/space)) loc_display = "[get_area(M)]" dat += "ID: [T.id]
Subject: [M]
Location: [loc_display]
Health: [health_display]
" diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 7ab400823b1..c7c23dbc724 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -41,11 +41,12 @@ /obj/machinery/computer/secure_data/attack_hand(mob/user as mob) if(..()) return - if(src.z > 6) + // TODO: Tie into space manager + if(src.z > ZLEVEL_DERELICT) to_chat(user, "Unable to establish a connection: You're too far away from the station!") return var/dat - + // search javascript var/head_content = {" @@ -89,7 +90,7 @@ //body tag start + onload and onkeypress (onkeyup) javascript event calls dat += "" - + dat += {"

"} dat += text("New Record
", src) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 2f039841cc3..7c0680f26d3 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -40,7 +40,9 @@ /obj/machinery/computer/skills/attack_hand(mob/user as mob) if(..()) return - if(src.z > 6) + + // TODO: Tie into space manager + if(src.z > ZLEVEL_DERELICT) to_chat(user, "Unable to establish a connection: You're too far away from the station!") return var/dat diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 257c583814b..3732c68d623 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -335,7 +335,7 @@ job_master.FreeRole(job) if(occupant.mind.objectives.len) - qdel(occupant.mind.objectives) + occupant.mind.objectives.Cut() occupant.mind.special_role = null else if(ticker.mode.name == "AutoTraitor") @@ -458,7 +458,7 @@ // Book keeping! log_admin("[key_name(M)] has entered a stasis pod.") - message_admins("[key_name_admin(user)] has entered a stasis pod. (JMP)") + message_admins("[key_name_admin(M)] has entered a stasis pod. (JMP)") //Despawning occurs when process() is called with an occupant without a client. src.add_fingerprint(M) diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm deleted file mode 100644 index e94a975b91f..00000000000 --- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm +++ /dev/null @@ -1,180 +0,0 @@ -//a docking port based on an airlock -/obj/machinery/embedded_controller/radio/airlock/docking_port - name = "docking port controller" - var/datum/computer/file/embedded_program/airlock/docking/airlock_program - var/datum/computer/file/embedded_program/docking/airlock/docking_program - tag_secure = 1 - -/obj/machinery/embedded_controller/radio/airlock/docking_port/initialize() - ..() - airlock_program = new/datum/computer/file/embedded_program/airlock/docking(src) - docking_program = new/datum/computer/file/embedded_program/docking/airlock(src, airlock_program) - program = docking_program - -/obj/machinery/embedded_controller/radio/airlock/docking_port/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - - data = list( - "chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]), - "exterior_status" = airlock_program.memory["exterior_status"], - "interior_status" = airlock_program.memory["interior_status"], - "processing" = airlock_program.memory["processing"], - "docking_status" = docking_program.get_docking_status(), - "airlock_disabled" = !(docking_program.undocked() || docking_program.override_enabled), - "override_enabled" = docking_program.override_enabled, - ) - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - - if(!ui) - ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/embedded_controller/radio/airlock/docking_port/Topic(href, href_list) - if(..()) - return - - usr.set_machine(src) - src.add_fingerprint(usr) - - var/clean = 0 - switch(href_list["command"]) //anti-HTML-hacking checks - if("cycle_ext") - clean = 1 - if("cycle_int") - clean = 1 - if("force_ext") - clean = 1 - if("force_int") - clean = 1 - if("abort") - clean = 1 - if("toggle_override") - clean = 1 - - if(clean) - program.receive_user_command(href_list["command"]) - - return 1 - - - -//A docking controller for an airlock based docking port -/datum/computer/file/embedded_program/docking/airlock - var/datum/computer/file/embedded_program/airlock/docking/airlock_program - -/datum/computer/file/embedded_program/docking/airlock/New(var/obj/machinery/embedded_controller/M, var/datum/computer/file/embedded_program/airlock/docking/A) - ..(M) - airlock_program = A - airlock_program.master_prog = src - -/datum/computer/file/embedded_program/docking/airlock/receive_user_command(command) - if(command == "toggle_override") - if(override_enabled) - disable_override() - else - enable_override() - return - - ..(command) - airlock_program.receive_user_command(command) //pass along to subprograms - -/datum/computer/file/embedded_program/docking/airlock/process() - airlock_program.process() - ..() - -/datum/computer/file/embedded_program/docking/airlock/receive_signal(datum/signal/signal, receive_method, receive_param) - airlock_program.receive_signal(signal, receive_method, receive_param) //pass along to subprograms - ..(signal, receive_method, receive_param) - -//tell the docking port to start getting ready for docking - e.g. pressurize -/datum/computer/file/embedded_program/docking/airlock/prepare_for_docking() - airlock_program.begin_cycle_in() - -//are we ready for docking? -/datum/computer/file/embedded_program/docking/airlock/ready_for_docking() - return airlock_program.done_cycling() - -//we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/airlock/finish_docking() - airlock_program.enable_mech_regulators() - airlock_program.open_doors() - -//tell the docking port to start getting ready for undocking - e.g. close those doors. -/datum/computer/file/embedded_program/docking/airlock/prepare_for_undocking() - airlock_program.stop_cycling() - airlock_program.close_doors() - airlock_program.disable_mech_regulators() - -//are we ready for undocking? -/datum/computer/file/embedded_program/docking/airlock/ready_for_undocking() - var/ext_closed = airlock_program.check_exterior_door_secured() - var/int_closed = airlock_program.check_interior_door_secured() - return (ext_closed || int_closed) - -//An airlock controller to be used by the airlock-based docking port controller. -//Same as a regular airlock controller but allows disabling of the regular airlock functions when docking -/datum/computer/file/embedded_program/airlock/docking - var/datum/computer/file/embedded_program/docking/airlock/master_prog - -/datum/computer/file/embedded_program/airlock/docking/receive_user_command(command) - if(master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled - ..(command) - -/datum/computer/file/embedded_program/airlock/docking/proc/enable_mech_regulators() - enable_mech_regulation() - -/datum/computer/file/embedded_program/airlock/docking/proc/disable_mech_regulators() - disable_mech_regulation() - -/datum/computer/file/embedded_program/airlock/docking/proc/open_doors() - toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open") - toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open") - -/datum/computer/file/embedded_program/airlock/docking/cycleDoors(var/target) - if(master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled - ..(target) - -/*** DEBUG VERBS *** - -/datum/computer/file/embedded_program/docking/proc/print_state() - to_chat(world, "id_tag: [id_tag]") - to_chat(world, "dock_state: [dock_state]") - to_chat(world, "control_mode: [control_mode]") - to_chat(world, "tag_target: [tag_target]") - to_chat(world, "response_sent: [response_sent]") - -/datum/computer/file/embedded_program/docking/post_signal(datum/signal/signal, comm_line) - to_chat(world, "Program [id_tag] sent a message!") - print_state() - to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") - ..(signal) - -/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/view_state() - set category = "Debug" - set src in view(1) - src.program:print_state() - -/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/spoof_signal(var/command as text, var/sender as text) - set category = "Debug" - set src in view(1) - var/datum/signal/signal = new - signal.data["tag"] = sender - signal.data["command"] = command - signal.data["recipient"] = id_tag - - src.program:receive_signal(signal) - -/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/debug_init_dock(var/target as text) - set category = "Debug" - set src in view(1) - src.program:initiate_docking(target) - -/obj/machinery/embedded_controller/radio/airlock/docking_port/verb/debug_init_undock() - set category = "Debug" - set src in view(1) - src.program:initiate_undocking() - -*/ \ No newline at end of file diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm deleted file mode 100644 index 8eeb93b8a8e..00000000000 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ /dev/null @@ -1,153 +0,0 @@ -//a controller for a docking port with multiple independent airlocks -//this is the master controller, that things will try to dock with. -/obj/machinery/embedded_controller/radio/docking_port_multi - name = "docking port controller" - - var/child_tags_txt - var/child_names_txt - var/list/child_names = list() - - var/datum/computer/file/embedded_program/docking/multi/docking_program - -/obj/machinery/embedded_controller/radio/docking_port_multi/initialize() - ..() - docking_program = new/datum/computer/file/embedded_program/docking/multi(src) - program = docking_program - - var/list/names = splittext(child_names_txt, ";") - var/list/tags = splittext(child_tags_txt, ";") - - if(names.len == tags.len) - for(var/i = 1; i <= tags.len; i++) - child_names[tags[i]] = names[i] - - -/obj/machinery/embedded_controller/radio/docking_port_multi/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - - var/list/airlocks[child_names.len] - var/i = 1 - for(var/child_tag in child_names) - airlocks[i++] = list("name"=child_names[child_tag], "override_enabled"=(docking_program.children_override[child_tag] == "enabled")) - - data = list( - "docking_status" = docking_program.get_docking_status(), - "airlocks" = airlocks, - ) - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - - if(!ui) - ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/embedded_controller/radio/docking_port_multi/Topic(href, href_list) - return - - - -//a docking port based on an airlock -/obj/machinery/embedded_controller/radio/airlock/docking_port_multi - name = "docking port controller" - var/master_tag //for mapping - var/datum/computer/file/embedded_program/airlock/multi_docking/airlock_program - tag_secure = 1 - -/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/initialize() - ..() - airlock_program = new/datum/computer/file/embedded_program/airlock/multi_docking(src) - program = airlock_program - -/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - - data = list( - "chamber_pressure" = round(airlock_program.memory["chamber_sensor_pressure"]), - "exterior_status" = airlock_program.memory["exterior_status"], - "interior_status" = airlock_program.memory["interior_status"], - "processing" = airlock_program.memory["processing"], - "docking_status" = airlock_program.master_status, - "airlock_disabled" = (airlock_program.docking_enabled && !airlock_program.override_enabled), - "override_enabled" = airlock_program.override_enabled, - ) - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - - if(!ui) - ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/Topic(href, href_list) - if(..()) - return - - usr.set_machine(src) - src.add_fingerprint(usr) - - var/clean = 0 - switch(href_list["command"]) //anti-HTML-hacking checks - if("cycle_ext") - clean = 1 - if("cycle_int") - clean = 1 - if("force_ext") - clean = 1 - if("force_int") - clean = 1 - if("abort") - clean = 1 - if("toggle_override") - clean = 1 - - if(clean) - program.receive_user_command(href_list["command"]) - - return 1 - - - -/*** DEBUG VERBS *** - -/datum/computer/file/embedded_program/docking/multi/proc/print_state() - to_chat(world, "id_tag: [id_tag]") - to_chat(world, "dock_state: [dock_state]") - to_chat(world, "control_mode: [control_mode]") - to_chat(world, "tag_target: [tag_target]") - to_chat(world, "response_sent: [response_sent]") - -/datum/computer/file/embedded_program/docking/multi/post_signal(datum/signal/signal, comm_line) - to_chat(world, "Program [id_tag] sent a message!") - print_state() - to_chat(world, "[id_tag] sent command \"[signal.data["command"]]\" to \"[signal.data["recipient"]]\"") - ..(signal) - -/obj/machinery/embedded_controller/radio/docking_port_multi/verb/view_state() - set category = "Debug" - set src in view(1) - src.program:print_state() - -/obj/machinery/embedded_controller/radio/docking_port_multi/verb/spoof_signal(var/command as text, var/sender as text) - set category = "Debug" - set src in view(1) - var/datum/signal/signal = new - signal.data["tag"] = sender - signal.data["command"] = command - signal.data["recipient"] = id_tag - - src.program:receive_signal(signal) - -/obj/machinery/embedded_controller/radio/docking_port_multi/verb/debug_init_dock(var/target as text) - set category = "Debug" - set src in view(1) - src.program:initiate_docking(target) - -/obj/machinery/embedded_controller/radio/docking_port_multi/verb/debug_init_undock() - set category = "Debug" - set src in view(1) - src.program:initiate_undocking() - -*/ diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm deleted file mode 100644 index 725ec6a337b..00000000000 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ /dev/null @@ -1,286 +0,0 @@ - -#define STATE_UNDOCKED 0 -#define STATE_DOCKING 1 -#define STATE_UNDOCKING 2 -#define STATE_DOCKED 3 - -#define MODE_NONE 0 -#define MODE_SERVER 1 -#define MODE_CLIENT 2 //The one who initiated the docking, and who can initiate the undocking. The server cannot initiate undocking, and is the one responsible for deciding to accept a docking request and signals when docking and undocking is complete. (Think server == station, client == shuttle) - -#define MESSAGE_RESEND_TIME 5 //how long (in seconds) do we wait before resending a message - -/* - *** STATE TABLE *** - - MODE_CLIENT|STATE_UNDOCKED sent a request for docking and now waiting for a reply. - MODE_CLIENT|STATE_DOCKING server told us they are OK to dock, waiting for our docking port to be ready. - MODE_CLIENT|STATE_DOCKED idle - docked as client. - MODE_CLIENT|STATE_UNDOCKING we are either waiting for our docking port to be ready or for the server to give us the OK to finish undocking. - - MODE_SERVER|STATE_UNDOCKED should never happen. - MODE_SERVER|STATE_DOCKING someone requested docking, we are waiting for our docking port to be ready. - MODE_SERVER|STATE_DOCKED idle - docked as server - MODE_SERVER|STATE_UNDOCKING client requested undocking, we are waiting for our docking port to be ready. - - MODE_NONE|STATE_UNDOCKED idle - not docked. - MODE_NONE|anything else should never happen. - - *** Docking Signals *** - - Docking - Client sends request_dock - - Server sends confirm_dock to say that yes, we will serve your request - When client is ready, sends confirm_dock - Server sends confirm_dock back to indicate that docking is complete - - Undocking - Client sends request_undock - When client is ready, sends confirm_undock - Server sends confirm_undock back to indicate that docking is complete - - Note that in both cases each side exchanges confirm_dock before the docking operation is considered done. - The client first sends a confirm message to indicate it is ready, and then finally the server will send it's - confirm message to indicate that the operation is complete. - - Note also that when docking, the server sends an additional confirm message. This is because before docking, - the server and client do not have a defined relationship. Before undocking, the server and client are already - related to each other, thus the extra confirm message is not needed. - - *** Override, what is it? *** - - The purpose of enabling the override is to prevent the docking program from automatically doing things with the docking port when docking or undocking. - Maybe the shuttle is full of plasma for some reason, and you don't want the door to automatically open, or the airlock to cycle. - This means that the prepare_for_docking/undocking and finish_docking/undocking procs don't get called. - - The docking controller will still check the state of the docking port, and thus prevent the shuttle from launching unless they force the launch (handling forced - launches is not the docking controller's responsibility). In this case it is up to the players to manually get the docking port into a good state to undock - (which usually just means closing and locking the doors). - - In line with this, docking controllers should prevent players from manually doing things when the override is NOT enabled. -*/ - - -/datum/computer/file/embedded_program/docking - var/tag_target //the tag of the docking controller that we are trying to dock with - var/dock_state = STATE_UNDOCKED - var/control_mode = MODE_NONE - var/response_sent = 0 //so we don't spam confirmation messages - var/resend_counter = 0 //for periodically resending confirmation messages in case they are missed - - var/override_enabled = 0 //when enabled, do not open/close doors or cycle airlocks and wait for the player to do it manually - var/received_confirm = 0 //for undocking, whether the server has recieved a confirmation from the client - -/datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param) - var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id - var/command = signal.data["command"] - var/recipient = signal.data["recipient"] //the intended recipient of the docking signal - - if(recipient != id_tag) - return //this signal is not for us - - switch(command) - if("confirm_dock") - if(control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKED && receive_tag == tag_target) - dock_state = STATE_DOCKING - broadcast_docking_status() - if(!override_enabled) - prepare_for_docking() - - else if(control_mode == MODE_CLIENT && dock_state == STATE_DOCKING && receive_tag == tag_target) - dock_state = STATE_DOCKED - broadcast_docking_status() - if(!override_enabled) - finish_docking() //client done docking! - response_sent = 0 - else if(control_mode == MODE_SERVER && dock_state == STATE_DOCKING && receive_tag == tag_target) //client just sent us the confirmation back, we're done with the docking process - received_confirm = 1 - - if("request_dock") - if(control_mode == MODE_NONE && dock_state == STATE_UNDOCKED) - control_mode = MODE_SERVER - - dock_state = STATE_DOCKING - broadcast_docking_status() - - tag_target = receive_tag - if(!override_enabled) - prepare_for_docking() - send_docking_command(tag_target, "confirm_dock") //acknowledge the request - - if("confirm_undock") - if(control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKING && receive_tag == tag_target) - if(!override_enabled) - finish_undocking() - reset() //client is done undocking! - else if(control_mode == MODE_SERVER && dock_state == STATE_UNDOCKING && receive_tag == tag_target) - received_confirm = 1 - - if("request_undock") - if(control_mode == MODE_SERVER && dock_state == STATE_DOCKED && receive_tag == tag_target) - dock_state = STATE_UNDOCKING - broadcast_docking_status() - - if(!override_enabled) - prepare_for_undocking() - - if("dock_error") - if(receive_tag == tag_target) - reset() - -/datum/computer/file/embedded_program/docking/process() - switch(dock_state) - if(STATE_DOCKING) //waiting for our docking port to be ready for docking - if(ready_for_docking()) - if(control_mode == MODE_CLIENT) - if(!response_sent) - send_docking_command(tag_target, "confirm_dock") //tell the server we're ready - response_sent = 1 - - else if(control_mode == MODE_SERVER && received_confirm) - send_docking_command(tag_target, "confirm_dock") //tell the client we are done docking. - - dock_state = STATE_DOCKED - broadcast_docking_status() - - if(!override_enabled) - finish_docking() //server done docking! - response_sent = 0 - received_confirm = 0 - - if(STATE_UNDOCKING) - if(ready_for_undocking()) - if(control_mode == MODE_CLIENT) - if(!response_sent) - send_docking_command(tag_target, "confirm_undock") //tell the server we are OK to undock. - response_sent = 1 - - else if(control_mode == MODE_SERVER && received_confirm) - send_docking_command(tag_target, "confirm_undock") //tell the client we are done undocking. - if(!override_enabled) - finish_undocking() - reset() //server is done undocking! - - if(response_sent || resend_counter > 0) - resend_counter++ - - if(resend_counter >= MESSAGE_RESEND_TIME || (dock_state != STATE_DOCKING && dock_state != STATE_UNDOCKING)) - response_sent = 0 - resend_counter = 0 - - //handle invalid states - if(control_mode == MODE_NONE && dock_state != STATE_UNDOCKED) - if(tag_target) - send_docking_command(tag_target, "dock_error") - reset() - if(control_mode == MODE_SERVER && dock_state == STATE_UNDOCKED) - control_mode = MODE_NONE - - -/datum/computer/file/embedded_program/docking/proc/initiate_docking(var/target) - if(dock_state != STATE_UNDOCKED || control_mode == MODE_SERVER) //must be undocked and not serving another request to begin a new docking handshake - return - - tag_target = target - control_mode = MODE_CLIENT - - send_docking_command(tag_target, "request_dock") - -/datum/computer/file/embedded_program/docking/proc/initiate_undocking() - if(dock_state != STATE_DOCKED || control_mode != MODE_CLIENT) //must be docked and must be client to start undocking - return - - dock_state = STATE_UNDOCKING - broadcast_docking_status() - - if(!override_enabled) - prepare_for_undocking() - - send_docking_command(tag_target, "request_undock") - -//tell the docking port to start getting ready for docking - e.g. pressurize -/datum/computer/file/embedded_program/docking/proc/prepare_for_docking() - return - -//are we ready for docking? -/datum/computer/file/embedded_program/docking/proc/ready_for_docking() - return 1 - -//we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/proc/finish_docking() - return - -//tell the docking port to start getting ready for undocking - e.g. close those doors. -/datum/computer/file/embedded_program/docking/proc/prepare_for_undocking() - return - -//we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/proc/finish_undocking() - return - -//are we ready for undocking? -/datum/computer/file/embedded_program/docking/proc/ready_for_undocking() - return 1 - -/datum/computer/file/embedded_program/docking/proc/enable_override() - override_enabled = 1 - -/datum/computer/file/embedded_program/docking/proc/disable_override() - override_enabled = 0 - -/datum/computer/file/embedded_program/docking/proc/reset() - dock_state = STATE_UNDOCKED - broadcast_docking_status() - - control_mode = MODE_NONE - tag_target = null - response_sent = 0 - received_confirm = 0 - -/datum/computer/file/embedded_program/docking/proc/force_undock() -// to_chat(world, "[id_tag]: forcing undock") - if(tag_target) - send_docking_command(tag_target, "dock_error") - reset() - -/datum/computer/file/embedded_program/docking/proc/docked() - return (dock_state == STATE_DOCKED) - -/datum/computer/file/embedded_program/docking/proc/undocked() - return (dock_state == STATE_UNDOCKED) - -//returns 1 if we are saftely undocked (and the shuttle can leave) -/datum/computer/file/embedded_program/docking/proc/can_launch() - return undocked() - -/datum/computer/file/embedded_program/docking/proc/send_docking_command(var/recipient, var/command) - var/datum/signal/signal = new - signal.data["tag"] = id_tag - signal.data["command"] = command - signal.data["recipient"] = recipient - post_signal(signal) - -/datum/computer/file/embedded_program/docking/proc/broadcast_docking_status() - var/datum/signal/signal = new - signal.data["tag"] = id_tag - signal.data["dock_status"] = get_docking_status() - post_signal(signal) - -//this is mostly for NanoUI -/datum/computer/file/embedded_program/docking/proc/get_docking_status() - switch(dock_state) - if(STATE_UNDOCKED) return "undocked" - if(STATE_DOCKING) return "docking" - if(STATE_UNDOCKING) return "undocking" - if(STATE_DOCKED) return "docked" - - -#undef STATE_UNDOCKED -#undef STATE_DOCKING -#undef STATE_UNDOCKING -#undef STATE_DOCKED - -#undef MODE_NONE -#undef MODE_SERVER -#undef MODE_CLIENT \ No newline at end of file diff --git a/code/game/machinery/embedded_controller/docking_program_multi.dm b/code/game/machinery/embedded_controller/docking_program_multi.dm deleted file mode 100644 index 0a3d9228435..00000000000 --- a/code/game/machinery/embedded_controller/docking_program_multi.dm +++ /dev/null @@ -1,223 +0,0 @@ -/* - These programs are for docking controllers that consist of multiple independent airlocks - Each airlock has an airlock controller running the child program, and there is one docking controller running the master program -*/ - -/* - the master program -*/ -/datum/computer/file/embedded_program/docking/multi - var/list/children_tags - var/list/children_ready - var/list/children_override - -/datum/computer/file/embedded_program/docking/multi/New(var/obj/machinery/embedded_controller/M) - ..(M) - - if(istype(M,/obj/machinery/embedded_controller/radio/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction - var/obj/machinery/embedded_controller/radio/docking_port_multi/controller = M - //parse child_tags_txt and create child tags - children_tags = splittext(controller.child_tags_txt, ";") - - children_ready = list() - children_override = list() - for(var/child_tag in children_tags) - children_ready[child_tag] = 0 - children_override[child_tag] = "disabled" - -/datum/computer/file/embedded_program/docking/multi/proc/clear_children_ready_status() - for(var/child_tag in children_tags) - children_ready[child_tag] = 0 - -/datum/computer/file/embedded_program/docking/multi/receive_signal(datum/signal/signal, receive_method, receive_param) - var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id - var/command = signal.data["command"] - var/recipient = signal.data["recipient"] //the intended recipient of the docking signal - - if(receive_tag in children_tags) - - //track children status - if(signal.data["override_status"]) - children_override[receive_tag] = signal.data["override_status"] - - if(recipient == id_tag) - switch(command) - if("ready_for_docking") - children_ready[receive_tag] = 1 - if("ready_for_undocking") - children_ready[receive_tag] = 1 - if("status_override_enabled") - children_override[receive_tag] = 1 - if("status_override_disabled") - children_override[receive_tag] = 0 - - ..(signal, receive_method, receive_param) - -/datum/computer/file/embedded_program/docking/multi/prepare_for_docking() - //clear children ready status - clear_children_ready_status() - - //tell children to prepare for docking - for(var/child_tag in children_tags) - send_docking_command(child_tag, "prepare_for_docking") - -/datum/computer/file/embedded_program/docking/multi/ready_for_docking() - //check children ready status - for(var/child_tag in children_tags) - if(!children_ready[child_tag]) - return 0 - return 1 - -/datum/computer/file/embedded_program/docking/multi/finish_docking() - //tell children to finish docking - for(var/child_tag in children_tags) - send_docking_command(child_tag, "finish_docking") - - //clear ready flags - clear_children_ready_status() - -/datum/computer/file/embedded_program/docking/multi/prepare_for_undocking() - //clear children ready status - clear_children_ready_status() - - //tell children to prepare for undocking - for(var/child_tag in children_tags) - send_docking_command(child_tag, "prepare_for_undocking") - -/datum/computer/file/embedded_program/docking/multi/ready_for_undocking() - //check children ready status - for(var/child_tag in children_tags) - if(!children_ready[child_tag]) - return 0 - return 1 - -/datum/computer/file/embedded_program/docking/multi/finish_undocking() - //tell children to finish undocking - for(var/child_tag in children_tags) - send_docking_command(child_tag, "finish_undocking") - - //clear ready flags - clear_children_ready_status() - - - - -/* - the child program - technically should be "slave" but eh... I'm too politically correct. -*/ -/datum/computer/file/embedded_program/airlock/multi_docking - var/master_tag - - var/master_status = "undocked" - var/override_enabled = 0 - var/docking_enabled = 0 - var/docking_mode = 0 //0 = docking, 1 = undocking - var/response_sent = 0 - -/datum/computer/file/embedded_program/airlock/multi_docking/New(var/obj/machinery/embedded_controller/M) - ..(M) - - if(istype(M, /obj/machinery/embedded_controller/radio/airlock/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction - var/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/controller = M - src.master_tag = controller.master_tag - -/datum/computer/file/embedded_program/airlock/multi_docking/receive_user_command(command) - if(command == "toggle_override") - if(override_enabled) - override_enabled = 0 - broadcast_override_status() - else - override_enabled = 1 - broadcast_override_status() - return - - if(!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled - ..(command) - -/datum/computer/file/embedded_program/airlock/multi_docking/receive_signal(datum/signal/signal, receive_method, receive_param) - ..() - - var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id - var/command = signal.data["command"] - var/recipient = signal.data["recipient"] //the intended recipient of the docking signal - - if(receive_tag != master_tag) - return //only respond to master - - //track master's status - if(signal.data["dock_status"]) - master_status = signal.data["dock_status"] - - if(recipient != id_tag) - return //this signal is not for us - - switch(command) - if("prepare_for_docking") - docking_enabled = 1 - docking_mode = 0 - response_sent = 0 - - if(!override_enabled) - begin_cycle_in() - - if("prepare_for_undocking") - docking_mode = 1 - response_sent = 0 - - if(!override_enabled) - stop_cycling() - close_doors() - disable_mech_regulation() - - if("finish_docking") - if(!override_enabled) - enable_mech_regulation() - open_doors() - - if("finish_undocking") - docking_enabled = 0 - -/datum/computer/file/embedded_program/airlock/multi_docking/process() - ..() - - if(docking_enabled && !response_sent) - - switch(docking_mode) - if(0) //docking - if(ready_for_docking()) - send_signal_to_master("ready_for_docking") - response_sent = 1 - if(1) //undocking - if(ready_for_undocking()) - send_signal_to_master("ready_for_undocking") - response_sent = 1 - -//checks if we are ready for docking -/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_docking() - return done_cycling() - -//checks if we are ready for undocking -/datum/computer/file/embedded_program/airlock/multi_docking/proc/ready_for_undocking() - return check_doors_secured() - -/datum/computer/file/embedded_program/airlock/multi_docking/proc/open_doors() - toggleDoor(memory["interior_status"], tag_interior_door, memory["secure"], "open") - toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open") - -/datum/computer/file/embedded_program/airlock/multi_docking/cycleDoors(var/target) - if(!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled - ..(target) - -/datum/computer/file/embedded_program/airlock/multi_docking/proc/send_signal_to_master(var/command) - var/datum/signal/signal = new - signal.data["tag"] = id_tag - signal.data["command"] = command - signal.data["recipient"] = master_tag - post_signal(signal) - -/datum/computer/file/embedded_program/airlock/multi_docking/proc/broadcast_override_status() - var/datum/signal/signal = new - signal.data["tag"] = id_tag - signal.data["override_status"] = override_enabled? "enabled" : "disabled" - post_signal(signal) diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm deleted file mode 100644 index 996a56b92ac..00000000000 --- a/code/game/machinery/embedded_controller/simple_docking_controller.dm +++ /dev/null @@ -1,158 +0,0 @@ -//a docking port that uses a single door -/obj/machinery/embedded_controller/radio/simple_docking_controller - name = "docking hatch controller" - var/tag_door - var/datum/computer/file/embedded_program/docking/simple/docking_program - -/obj/machinery/embedded_controller/radio/simple_docking_controller/initialize() - ..() - docking_program = new/datum/computer/file/embedded_program/docking/simple(src) - program = docking_program - -/obj/machinery/embedded_controller/radio/simple_docking_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - var/data[0] - - data = list( - "docking_status" = docking_program.get_docking_status(), - "override_enabled" = docking_program.override_enabled, - "door_state" = docking_program.memory["door_status"]["state"], - "door_lock" = docking_program.memory["door_status"]["lock"], - ) - - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - - if(!ui) - ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290) - ui.set_initial_data(data) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/embedded_controller/radio/simple_docking_controller/Topic(href, href_list) - if(..()) - return 1 - - usr.set_machine(src) - src.add_fingerprint(usr) - - var/clean = 0 - switch(href_list["command"]) //anti-HTML-hacking checks - if("force_door") - clean = 1 - if("toggle_override") - clean = 1 - - if(clean) - program.receive_user_command(href_list["command"]) - - return 0 - - -//A docking controller program for a simple door based docking port -/datum/computer/file/embedded_program/docking/simple - var/tag_door - -/datum/computer/file/embedded_program/docking/simple/New(var/obj/machinery/embedded_controller/M) - ..(M) - memory["door_status"] = list(state = "closed", lock = "locked") //assume closed and locked in case the doors dont report in - - if(istype(M, /obj/machinery/embedded_controller/radio/simple_docking_controller)) - var/obj/machinery/embedded_controller/radio/simple_docking_controller/controller = M - - tag_door = controller.tag_door? controller.tag_door : "[id_tag]_hatch" - - spawn(10) - signal_door("update") //signals connected doors to update their status - - -/datum/computer/file/embedded_program/docking/simple/receive_signal(datum/signal/signal, receive_method, receive_param) - var/receive_tag = signal.data["tag"] - - if(!receive_tag) return - - if(receive_tag==tag_door) - memory["door_status"]["state"] = signal.data["door_status"] - memory["door_status"]["lock"] = signal.data["lock_status"] - - ..(signal, receive_method, receive_param) - -/datum/computer/file/embedded_program/docking/simple/receive_user_command(command) - switch(command) - if("force_door") - if(override_enabled) - if(memory["door_status"]["state"] == "open") - close_door() - else - open_door() - if("toggle_override") - if(override_enabled) - disable_override() - else - enable_override() - - -/datum/computer/file/embedded_program/docking/simple/proc/signal_door(var/command) - var/datum/signal/signal = new - signal.data["tag"] = tag_door - signal.data["command"] = command - post_signal(signal) - -/datum/computer/file/embedded_program/docking/simple/proc/open_door() - if(memory["door_status"]["state"] == "closed") - signal_door("secure_open") - else if(memory["door_status"]["lock"] == "unlocked") - signal_door("lock") - -/datum/computer/file/embedded_program/docking/simple/proc/close_door() - if(memory["door_status"]["state"] == "open") - signal_door("secure_close") - else if(memory["door_status"]["lock"] == "unlocked") - signal_door("lock") - -//tell the docking port to start getting ready for docking - e.g. pressurize -/datum/computer/file/embedded_program/docking/simple/prepare_for_docking() - return //don't need to do anything - -//are we ready for docking? -/datum/computer/file/embedded_program/docking/simple/ready_for_docking() - return 1 //don't need to do anything - -//we are docked, open the doors or whatever. -/datum/computer/file/embedded_program/docking/simple/finish_docking() - open_door() - -//tell the docking port to start getting ready for undocking - e.g. close those doors. -/datum/computer/file/embedded_program/docking/simple/prepare_for_undocking() - close_door() - -//are we ready for undocking? -/datum/computer/file/embedded_program/docking/simple/ready_for_undocking() - return (memory["door_status"]["state"] == "closed" && memory["door_status"]["lock"] == "locked") - -/*** DEBUG VERBS *** - -/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/view_state() - set category = "Debug" - set src in view(1) - src.program:print_state() - -/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/spoof_signal(var/command as text, var/sender as text) - set category = "Debug" - set src in view(1) - var/datum/signal/signal = new - signal.data["tag"] = sender - signal.data["command"] = command - signal.data["recipient"] = id_tag - - src.program:receive_signal(signal) - -/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/debug_init_dock(var/target as text) - set category = "Debug" - set src in view(1) - src.program:initiate_docking(target) - -/obj/machinery/embedded_controller/radio/simple_docking_controller/verb/debug_init_undock() - set category = "Debug" - set src in view(1) - src.program:initiate_undocking() - -*/ diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 45b515734f7..9b2e0bdf957 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -293,6 +293,8 @@ FIRE ALARM pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 + // TODO: Tie into space manager + // also hwat if(z == ZLEVEL_STATION || ZLEVEL_ASTEROID == 5) if(security_level) src.overlays += image('icons/obj/monitors.dmi', "overlay_[get_security_level()]") diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm index 3b55d8423f7..caf0c9c67d9 100644 --- a/code/game/machinery/supply_display.dm +++ b/code/game/machinery/supply_display.dm @@ -5,6 +5,7 @@ /obj/machinery/status_display/supply_display/update() if(!..() && mode == STATUS_DISPLAY_CUSTOM) if(shuttle_master.supply.mode == SHUTTLE_IDLE) + // TODO: Tie into space manager if(shuttle_master.supply.z == ZLEVEL_STATION) message1 = "CARGO" message2 = "Docked" diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 4d90971f003..7ddb0f4b963 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -439,6 +439,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(data == 1) for(var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"]) var/turf/position = get_turf(R) + // TODO: Tie into space manager if(position && position.z == level) receive |= R.send_hear(display_freq, level) @@ -451,6 +452,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if(istype(R, /obj/item/device/radio/headset)) continue var/turf/position = get_turf(R) + // TODO: Tie into space manager if(position && position.z == level) receive |= R.send_hear(display_freq) @@ -462,6 +464,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq) for(var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"]) var/turf/position = get_turf(R) + // TODO: Tie into space manager if(position && position.z == level) receive |= R.send_hear(freq) @@ -471,6 +474,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept else for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) var/turf/position = get_turf(R) + // TODO: Tie into space manager if(position && position.z == level) receive |= R.send_hear(display_freq) @@ -597,6 +601,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /atom/proc/test_telecomms() var/datum/signal/signal = src.telecomms_process() var/turf/position = get_turf(src) + // TODO: Tie into space manager return (position.z in signal.data["level"]) && signal.data["done"] /atom/proc/telecomms_process(var/do_sleep = 1) @@ -615,6 +620,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept "type" = 4, // determines what type of radio input it is: test broadcast "reject" = 0, "done" = 0, + // TODO: Tie into space manager "level" = pos.z // The level it is being broadcasted at. ) signal.frequency = PUB_FREQ// Common channel @@ -630,4 +636,3 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept //log_to_dd("Level: [signal.data["level"]] - Done: [signal.data["done"]]") return signal - diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index da9fe5a046e..0c0dfd178fe 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -180,6 +180,7 @@ var/turf/position = get_turf(src) // Toggle on/off getting signals from the station or the current Z level + // TODO: Tie into space manager if(src.listening_level == ZLEVEL_STATION) // equals the station src.listening_level = position.z return 1 @@ -393,4 +394,3 @@ if(issilicon(user) || in_range(user, src)) return 1 return 0 - diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 787483ac45d..f4c2d973f7d 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -56,6 +56,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() continue if(amount && send_count >= amount) break + // TODO: Tie into space manager if(machine.loc.z != listening_level) if(long_range_link == 0 && machine.long_range_link == 0) continue @@ -142,6 +143,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() if(!listening_level) //Defaults to our Z level! var/turf/position = get_turf(src) + // TODO: Tie into space manager listening_level = position.z /obj/machinery/telecomms/initialize() @@ -167,6 +169,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/proc/add_link(var/obj/machinery/telecomms/T) var/turf/position = get_turf(src) var/turf/T_position = get_turf(T) + // TODO: Tie into space manager if((position.z == T_position.z) || (src.long_range_link && T.long_range_link)) for(var/x in autolinkers) if(T.autolinkers.Find(x)) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 63aeb4e25ee..6ecc675fdef 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -182,7 +182,8 @@ var/turf/T = get_turf(R) if(!T) continue - if((T.z in config.admin_levels) || T.z > 7) + // TODO: Tie into space manager + if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY) continue if(R.syndicate == 1 && emagged == 0) continue @@ -203,6 +204,7 @@ continue var/turf/T = get_turf(M) if(!T) continue + // TODO: Tie into space manager if((T.z in config.admin_levels)) continue var/tmpname = M.real_name if(areaindex[tmpname]) @@ -225,7 +227,8 @@ var/turf/T = get_turf(R) if(!T || !R.teleporter_hub || !R.teleporter_console) continue - if((T.z in config.admin_levels) || T.z > 7) + // TODO: Tie into space manager + if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY) continue var/tmpname = T.loc.name if(areaindex[tmpname]) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index bef015cb7fa..cb55c783005 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -382,6 +382,7 @@ range = RANGED action(atom/target) + // TODO: Tie into space manager if(!action_checks(target) || (src.loc.z in config.admin_levels)) return var/turf/T = get_turf(target) if(T) @@ -403,6 +404,7 @@ action(atom/target) + // TODO: Tie into space manager if(!action_checks(target) || (src.loc.z in config.admin_levels)) return var/list/theareas = list() for(var/area/AR in orange(100, chassis)) @@ -1144,4 +1146,4 @@ if(do_after_cooldown(target)) new /obj/structure/barricade/mime/mrcd(target) chassis.spark_system.start() - chassis.use_power(energy_drain*2) \ No newline at end of file + chassis.use_power(energy_drain*2) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 974835b6a2d..dec4f4c75fb 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -61,6 +61,7 @@ return null var/turf/T = get_turf(user.loc) + // TODO: Tie into space manager if(T.z != current.z || !current.can_use()) to_chat(user, "[src] has lost the signal.") current = null @@ -225,6 +226,7 @@ to_chat(usr, "Something's wrong with that camera. You can't get a feed.") return var/turf/T = get_turf(loc) + // TODO: Tie into space manager if(!T || C.z != T.z) to_chat(usr, "You can't get a signal.") return @@ -284,4 +286,4 @@ #undef BUGMODE_LIST #undef BUGMODE_MONITOR -#undef BUGMODE_TRACK \ No newline at end of file +#undef BUGMODE_TRACK diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 455a0f7098c..a8623b17f56 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -124,6 +124,7 @@ return -1 if(!(0 in level)) var/turf/position = get_turf(src) + // TODO: Tie into space manager if(isnull(position) || !(position.z in level)) return -1 if(!src.listening) diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm index 665ad549bd2..98f3fc1709b 100644 --- a/code/game/objects/items/weapons/bee_briefcase.dm +++ b/code/game/objects/items/weapons/bee_briefcase.dm @@ -64,6 +64,7 @@ //Play sound through the station intercomms, so everyone knows the doom you have wrought. for(var/O in global_intercoms) var/obj/item/device/radio/intercom/I = O + // TODO: Tie into space manager if(I.z != ZLEVEL_STATION) //Only broadcast to the station intercoms continue if(!I.on) //Only broadcast to active intercoms (powered, switched on) @@ -75,4 +76,4 @@ var/mob/living/simple_animal/hostile/poison/bees/syndi/B = new /mob/living/simple_animal/hostile/poison/bees/syndi(null) B.master_and_friends = blood_list //Doesn't automatically add the person who opens the case, so the bees will attack the user unless they gave their blood B.forceMove(get_turf(user)) //RELEASE THE BEES! - bees_left -= 5 \ No newline at end of file + bees_left -= 5 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index fa8de4f51bf..323131845d2 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -22,7 +22,7 @@ /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params) playsound(src.loc, "rustle", 50, 1, -5) - ..() + return ..() /* * Backpack Types diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 66cb11a9dd6..af4d9aa6008 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -375,7 +375,7 @@ max_combined_w_class = 21 max_w_class = 3 w_class = 4 //Bigger than a book because physics - can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/spellbook") //No bibles, consistent with bookcase + can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook") /* * Trays - Agouri diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 4728e8c730e..decfa424872 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -48,6 +48,7 @@ Frequency: return 1 var/turf/current_location = get_turf(usr)//What turf is the user on? + // TODO: Tie into space manager if(!current_location ||( current_location.z in config.admin_levels))//If turf was not found or they're on z level 2. to_chat(usr, "\The [src] is malfunctioning.") return 1 @@ -61,6 +62,7 @@ Frequency: for(var/obj/item/device/radio/beacon/W in beacons) if(W.frequency == frequency && !W.syndicate) + // TODO: Tie into space manager if(W && W.z == z) var/turf/TB = get_turf(W) temp += "[W.code]: [TB.x], [TB.y], [TB.z]
" @@ -107,7 +109,8 @@ Frequency: /obj/item/weapon/hand_tele/attack_self(mob/user as mob) var/turf/current_location = get_turf(user)//What turf is the user on? - if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=7)//If turf was not found or they're on z level 2 or >7 which does not currently exist. + // TODO: Tie into space manager + if(!current_location||(current_location.z in config.admin_levels)||current_location.z>=ZLEVEL_EMPTY)//If turf was not found or they're on z level 2 or >7 which does not currently exist. to_chat(user, "\The [src] is malfunctioning.") return var/list/L = list( ) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 88138657270..3b9974130e4 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -693,3 +693,55 @@ Z.ex_act(2) charged = 3 playsound(user, 'sound/weapons/marauder.ogg', 50, 1) + +// Energized Fire axe +/obj/item/weapon/twohanded/energizedfireaxe + name = "energized fire axe" + desc = "Someone with a love for fire axes decided to turn one into a single-charge energy weapon. Seems excessive." + icon_state = "fireaxe0" + force = 5 + throwforce = 15 + sharp = 1 + edge = 1 + w_class = 5 + armour_penetration = 20 + slot_flags = SLOT_BACK + force_unwielded = 5 + force_wielded = 30 + attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + var/charged = 1 + +/obj/item/weapon/twohanded/energizedfireaxe/update_icon() + if(wielded) + icon_state = "fireaxe2" + else + icon_state = "fireaxe0" + +/obj/item/weapon/twohanded/energizedfireaxe/afterattack(atom/A, mob/user, proximity) + if(!proximity) + return + if(wielded) + if(istype(A, /mob/living)) + var/mob/living/Z = A + if(charged) + charged-- + Z.take_organ_damage(0,30) + user.visible_message("[user] slams the charged axe into [Z.name] with all their might!") + playsound(loc, 'sound/magic/lightningbolt.ogg', 5, 1) + var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + + if(A && wielded && (istype(A, /obj/structure/window) || istype(A, /obj/structure/grille))) + if(istype(A, /obj/structure/window)) + var/obj/structure/window/W = A + W.destroy() + if(prob(4)) + charged++ + user.visible_message("The axe starts to emit an electric buzz!") + else + qdel(A) + if(prob(4)) + charged++ + user.visible_message("The axe starts to emit an electric buzz!") diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index de0ef28d255..4fe639160d4 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -192,6 +192,7 @@ return var/obj/item/weapon/rcs/E = W if(E.rcell && (E.rcell.charge >= E.chargecost)) + // TODO: Tie into space manager if(!(src.z in config.contact_levels)) to_chat(user, "The rapid-crate-sender can't locate any telepads!") return diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index c4178baec15..f9b32b071f7 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -84,6 +84,7 @@ if(istype(W, /obj/item/weapon/rcs) && !src.opened) var/obj/item/weapon/rcs/E = W if(E.rcell && (E.rcell.charge >= E.chargecost)) + // TODO: Tie into space manager if(!(src.z in config.player_levels)) to_chat(user, "The rapid-crate-sender can't locate any telepads!") return diff --git a/code/game/response_team.dm b/code/game/response_team.dm index abd4f0fcffa..5f8543ca934 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -422,7 +422,7 @@ var/ert_request_answered = 0 switch(officer_type) if("Engineer") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/engi(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses) @@ -442,7 +442,7 @@ var/ert_request_answered = 0 if("Security") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/security(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) @@ -460,7 +460,7 @@ var/ert_request_answered = 0 if("Medic") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex/nitrile(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses) @@ -479,7 +479,7 @@ var/ert_request_answered = 0 if("Commander") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) @@ -507,7 +507,7 @@ var/ert_request_answered = 0 switch(officer_type) if("Engineer") M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_s_store) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/night(M), slot_glasses) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index a7fc809aa88..8a9e8dea103 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1565,53 +1565,7 @@ else if(href_list["adminmoreinfo"]) var/mob/M = locate(href_list["adminmoreinfo"]) - if(!ismob(M)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - var/location_description = "" - var/special_role_description = "" - var/health_description = "" - var/gender_description = "" - var/turf/T = get_turf(M) - - //Location - if(isturf(T)) - if(isarea(T.loc)) - location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z] in area [T.loc])" - else - location_description = "([M.loc == T ? "at coordinates " : "in [M.loc] at coordinates "] [T.x], [T.y], [T.z])" - - //Job + antagonist - if(M.mind) - special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]" - else - special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;" - - //Health - if(isliving(M)) - var/mob/living/L = M - var/status - switch(M.stat) - if(0) status = "Alive" - if(1) status = "Unconscious" - if(2) status = "Dead" - health_description = "Status = [status]" - health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]" - else - health_description = "This mob type has no health to speak of." - - //Gener - switch(M.gender) - if(MALE,FEMALE) gender_description = "[M.gender]" - else gender_description = "[M.gender]" - - to_chat(src.owner, "Info about [M.name]: ") - to_chat(src.owner, "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]") - to_chat(src.owner, "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];") - to_chat(src.owner, "Location = [location_description];") - to_chat(src.owner, "[special_role_description]") - to_chat(src.owner, "(PM) (PP) (VV) (SM) (FLW) (CA)") + admin_mob_info(M) else if(href_list["adminspawncookie"]) if(!check_rights(R_ADMIN|R_EVENT)) return @@ -2025,6 +1979,7 @@ return else for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) + // TODO: Tie into space manager if((F.z in config.station_levels)) spawn(0) if(!F.receivefax(P)) @@ -2372,6 +2327,7 @@ for(var/mob/living/carbon/human/H in mob_list) var/turf/loc = find_loc(H) var/security = 0 + // TODO: Tie into space manager if(!(loc.z in config.station_levels) || prisonwarped.Find(H)) //don't warp them if they aren't ready or are already there @@ -2609,6 +2565,7 @@ feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","EgL") for(var/obj/machinery/door/airlock/W in world) + // TODO: Tie into space manager if((W.z in config.station_levels) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() message_admins("[key_name_admin(usr)] activated Egalitarian Station mode") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 1cc723ab903..dd685a37a0b 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -373,6 +373,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/I in singularities) var/obj/singularity/S = I + // TODO: Tie into space manager if(S.z == ZLEVEL_CENTCOMM || S.z >= MAX_Z) continue qdel(S) @@ -593,17 +594,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that "tournament janitor", "pirate", "space pirate", + "soviet tourist", + "soviet soldier", "soviet admiral", "tunnel clown", + "mime assassin", "survivor", + "greytide", + "greytide leader", + "greytide xeno", "masked killer", "singuloth knight", "dark lord", "assassin", "spy", + "vox", "death commando", "syndicate agent", "syndicate operative", + "syndicate bomber", "syndicate strike team", "syndicate officer", "chrono legionnaire", @@ -746,30 +755,29 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if("pirate") M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) - equip_special_id(M,get_all_accesses(), "Pirate", /obj/item/weapon/card/id) + equip_special_id(M,list(access_maint_tunnels), "Pirate", /obj/item/weapon/card/id) - if("space pirate") + if("space pirate") // not spaceworthy, just has fancier coat. M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand) - equip_special_id(M,get_all_accesses(), "Space Pirate", /obj/item/weapon/card/id) - - if("soviet soldier") - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) - equip_special_id(M,get_all_accesses(), "Soviet Soldier", /obj/item/weapon/card/id) + equip_special_id(M,list(access_maint_tunnels), "Space Pirate", /obj/item/weapon/card/id) if("tunnel clown") M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) @@ -780,25 +788,106 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store) - equip_special_id(M,get_all_accesses(), "Tunnel Clown", /obj/item/weapon/card/id) + equip_special_id(M,list(access_clown, access_theatre, access_maint_tunnels), "Tunnel Clown", /obj/item/weapon/card/id) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) M.equip_to_slot_or_del(fire_axe, slot_r_hand) + + if("mime assassin") + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/mime(M), slot_back) + if(M.gender == FEMALE) + M.equip_or_collect(new /obj/item/clothing/under/sexymime(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/mask/gas/sexymime(M), slot_wear_mask) + else + M.equip_or_collect(new /obj/item/clothing/under/mime(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/mask/gas/mime(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/syndie_kit/caneshotgun, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/toy/crayon/mime, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + var/obj/item/device/pda/mime/pda = new(M) + pda.owner = M.real_name + pda.ownjob = "Mime" + pda.name = "PDA-[M.real_name] ([pda.ownjob])" + M.equip_to_slot_or_del(pda, slot_wear_pda) + equip_special_id(M,list(access_mime, access_theatre, access_maint_tunnels), "Mime", /obj/item/weapon/card/id/syndicate) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + if("survivor") M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - equip_special_id(M,get_all_accesses(), "Survivor", /obj/item/weapon/card/id) + equip_special_id(M,list(access_maint_tunnels), "Survivor", /obj/item/weapon/card/id) for(var/obj/item/carried_item in M.contents) if(!istype(carried_item, /obj/item/weapon/implant)) carried_item.add_blood(M) + if("greytide") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Greytide", /obj/item/weapon/card/id) + + if("greytide leader") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand) + M.equip_to_slot_or_del(new /obj/item/flag/grey(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Greytide Leader", /obj/item/weapon/card/id) + + if("greytide xeno") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/xenos(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/xenos(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/toy/toy_xeno(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Legit Xenomorph", /obj/item/weapon/card/id) + if("masked killer") M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask) @@ -809,7 +898,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) - equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie") + equip_special_id(M,list(access_maint_tunnels), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie") var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M) M.equip_to_slot_or_del(fire_axe, slot_r_hand) for(var/obj/item/carried_item in M.contents) @@ -821,6 +910,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand) @@ -841,6 +931,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M) for(var/obj/item/briefcase_item in sec_briefcase) @@ -880,14 +971,39 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store) var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M) DUST.implant(M) - var/obj/item/weapon/implant/dust/STOR = new /obj/item/weapon/implant/storage(M) - STOR.implant(M) + M.equip_to_slot_or_del(new /obj/item/weapon/implanter/storage(M), slot_in_backpack) var/obj/item/device/pda/heads/pda = new(M) pda.owner = M.real_name pda.ownjob = "Spy" pda.name = "PDA-[M.real_name] ([pda.ownjob])" M.equip_to_slot_or_del(pda, slot_belt) - equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate, "syndie") + equip_special_id(M,list(access_maint_tunnels), "Spy", /obj/item/weapon/card/id/syndicate, "syndie") + + + if("vox") + if(istype(M, /mob/living/carbon/human/voxarmalis)) // have to do this, they cannot wear normal vox gear! + M.equip_to_slot_or_del(new /obj/item/clothing/under/vox_grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes (M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate/vox(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate, slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox, slot_gloves) + M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic, slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/vox, slot_r_store) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle, slot_glasses) + M.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs/cable/zipties, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flash, slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/noisecannon, slot_in_backpack) + equip_special_id(M,get_all_accesses(), "Vox Armalis", /obj/item/weapon/card/id/syndicate/vox, "syndie") + else + M.equip_vox_raider() + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_l_hand) + M.regenerate_icons() if("death commando") M.equip_death_commando() @@ -909,15 +1025,31 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that U.hidden_uplink.uses = 20 M.equip_to_slot_or_del(U, slot_r_store) + if("syndicate bomber") + M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/radio/beacon/syndicate/bomb(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/syndicatedetonator(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) + equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Bomber", /obj/item/weapon/card/id/syndicate, "syndie") + if("syndicate operative") M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack) M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack) - M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack) M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt) @@ -948,8 +1080,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves) M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack) M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store) @@ -974,6 +1106,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes) M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head) M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear) M.equip_or_collect(new /obj/item/device/pda/(M), slot_wear_pda) @@ -989,6 +1122,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) @@ -1007,6 +1141,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack) var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) @@ -1051,6 +1186,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack) @@ -1078,6 +1214,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt) M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store) M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack) @@ -1117,7 +1254,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id) if("red wizard") @@ -1130,7 +1267,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id) if("marisa wizard") @@ -1143,20 +1280,53 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id) + if("soviet tourist") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Soviet Tourist", /obj/item/weapon/card/id) + + if("soviet soldier") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + equip_special_id(M,list(access_maint_tunnels), "Soviet Soldier", /obj/item/weapon/card/id) + if("soviet admiral") + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head) M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt) - M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) - equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id, "commander") + M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack) + equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Soviet Admiral", /obj/item/weapon/card/id, "commander") //W.icon_state = "commander" if("chrono legionnaire") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 6578898a0bd..d58e51971dd 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -139,7 +139,9 @@ var/list/admin_verbs_show_debug_verbs = list( /client/proc/print_jobban_old_filter, /client/proc/forceEvent, /client/proc/nanomapgen_DumpImage, - /client/proc/reload_nanoui_resources + /client/proc/reload_nanoui_resources, + /client/proc/admin_redo_space_transitions, + /client/proc/make_turf_space_map ) /client/proc/enable_debug_verbs() diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 47c7da15724..660a1c8f199 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -81,6 +81,7 @@ var/list/sounds_cache = list() for(var/O in global_intercoms) var/obj/item/device/radio/intercom/I = O + // TODO: Tie into space manager if(I.z != ZLEVEL_STATION && !ignore_z) continue if(!I.on && !ignore_power) diff --git a/code/modules/admin/verbs/space_transitions.dm b/code/modules/admin/verbs/space_transitions.dm new file mode 100644 index 00000000000..eda17996c65 --- /dev/null +++ b/code/modules/admin/verbs/space_transitions.dm @@ -0,0 +1,41 @@ +/client/proc/admin_redo_space_transitions() + set name = "Remake Space Transitions" + set desc = "Re-assigns all space transitions" + set category = "Debug" + + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/choice = alert("Do you want to rebuild space transitions?",,"Yes", "No") + + if(choice == "No") + return + + + message_admins("[key_name_admin(usr)] re-assigned all space transitions") + space_manager.do_transition_setup() + log_admin("[key_name(usr)] re-assigned all space transitions") + + feedback_add_details("admin_verb","SPCRST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + + + +/client/proc/make_turf_space_map() + set name = "Make Space Map" + set desc = "Create a map of the space levels as turfs at your feet" + set category = "Debug" + + if(!check_rights(R_ADMIN|R_DEBUG)) + return + + var/choice = alert("Are you sure you want to make a space map out of turfs?",,"Yes","No") + + if(choice == "No") + return + + message_admins("[key_name_admin(usr)] made a space map") + + + space_manager.map_as_turfs(get_turf(usr)) + log_admin("[key_name(usr)] made a space map") diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm index fcfd8d2e600..ea59dd1d518 100644 --- a/code/modules/awaymissions/maploader/reader.dm +++ b/code/modules/awaymissions/maploader/reader.dm @@ -96,7 +96,7 @@ var/global/dmm_suite/preloader/_preloader = new if(cropMap) continue else - zlevels.increase_max_zlevel_to(zcrd) //create a new z_level if needed + space_manager.increase_max_zlevel_to(zcrd) //create a new z_level if needed bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrdStart) bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd) diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm index 7115cfcbf13..fab504b150d 100644 --- a/code/modules/awaymissions/maploader/swapmaps.dm +++ b/code/modules/awaymissions/maploader/swapmaps.dm @@ -326,7 +326,7 @@ swapmap x2+=x1-1 y2+=y1-1 z2+=z1-1 - zlevels.increase_max_zlevel_to(z2) // stretch z if necessary + space_manager.increase_max_zlevel_to(z2) // stretch z if necessary if(!ischunk) swapmaps_loaded[src]=null swapmaps_byname[id]=src @@ -373,7 +373,7 @@ swapmap mz=max(mz,M.z2) world.maxx=mx world.maxy=my - zlevels.cut_levels_downto(mz) + space_manager.cut_levels_downto(mz) // save and delete proc/Unload() diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 7fff68cf031..da6515a591d 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -59,15 +59,13 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/map = pick(potentialRandomZlevels) var/file = file(map) if(isfile(file)) - var/zlev = zlevels.add_new_zlevel() - zlevels.add_dirt(zlev) + var/zlev = space_manager.add_new_zlevel(AWAY_MISSION, linkage = UNAFFECTED) + space_manager.add_dirt(zlev) maploader.load_map(file, z_offset = zlev) late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev))) - zlevels.remove_dirt(zlev) + space_manager.remove_dirt(zlev) log_to_dd(" Away mission loaded: [map]") - //map_transition_config.Add(AWAY_MISSION_LIST) - for(var/obj/effect/landmark/L in landmarks_list) if(L.name != "awaystart") continue @@ -91,11 +89,11 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/file = file(map) if(isfile(file)) log_startup_progress("Loading away mission: [map]") - var/zlev = zlevels.add_new_zlevel() - zlevels.add_dirt(zlev) + var/zlev = space_manager.add_new_zlevel() + space_manager.add_dirt(zlev) maploader.load_map(file, z_offset = zlev) late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev))) - zlevels.remove_dirt(zlev) + space_manager.remove_dirt(zlev) log_to_dd(" Away mission loaded: [map]") //map_transition_config.Add(AWAY_MISSION_LIST) @@ -151,8 +149,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/initialbudget = budget var/watch = start_watch() - log_startup_progress("Loading ruins...") - while(budget > 0 && overall_sanity > 0) // Pick a ruin var/datum/map_template/ruin/ruin = ruins[pick(ruins)] @@ -187,7 +183,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away ruins -= ruin.name break - to_chat(world, " Loaded ruins. Or not.") //So the players don't know if we loaded ruins, but we do have a message if(initialbudget == budget) //Kill me log_to_dd(" No ruins loaded.") diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 40e64add719..c50e9b1c6d3 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -115,6 +115,7 @@ to_chat(H, "You cannot teleport into solid walls.") return 0*///Who the fuck cares? Ninjas in walls are cool. + // TODO: Tie into space manager if(T.z in config.admin_levels) to_chat(H, "You cannot use your teleporter on this Z-level.") return 0 diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm index cb31379a59f..070015f4dc4 100644 --- a/code/modules/computer3/computers/camera.dm +++ b/code/modules/computer3/computers/camera.dm @@ -181,7 +181,8 @@ //proc/camera_list(var/datum/file/camnet_key/key) get_machines(var/datum/file/camnet_key/key) - if(!computer || computer.z > 6) + // TODO: Tie into space manager + if(!computer || computer.z > ZLEVEL_DERELICT) return null var/list/L = list() diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm index 2f02bdcfdb3..d6575d3c143 100644 --- a/code/modules/computer3/computers/communications.dm +++ b/code/modules/computer3/computers/communications.dm @@ -59,6 +59,7 @@ Topic(var/href, var/list/href_list) if(!interactable() || !computer.radio || ..(href,href_list) ) return + // TODO: Tie into space manager if(!(computer.z in config.station_levels)) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm index d75a016f680..7534aa65932 100644 --- a/code/modules/computer3/computers/law.dm +++ b/code/modules/computer3/computers/law.dm @@ -24,7 +24,8 @@ attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params) - if(user.z > 6) + // TODO: Tie into space manager + if(user.z > ZLEVEL_DERELICT) to_chat(user, "Unable to establish a connection: You're too far away from the station!") return if(istype(module, /obj/item/weapon/aiModule)) diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm index 27002c264c2..6e96b6728e7 100644 --- a/code/modules/computer3/computers/medical.dm +++ b/code/modules/computer3/computers/medical.dm @@ -49,7 +49,8 @@ scan = computer.cardslot.reader if(!interactable()) return - if(computer.z > 6) + // TODO: Tie into space manager + if(computer.z > ZLEVEL_DERELICT) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return var/dat diff --git a/code/modules/computer3/computers/prisoner.dm b/code/modules/computer3/computers/prisoner.dm index b38b376abf5..75b2302991f 100644 --- a/code/modules/computer3/computers/prisoner.dm +++ b/code/modules/computer3/computers/prisoner.dm @@ -43,6 +43,7 @@ if(!T.implanted) continue var/loc_display = "Unknown" var/mob/living/carbon/M = T.imp_in + // TODO: Tie into space manager if(M.z == ZLEVEL_STATION && !istype(M.loc, /turf/space)) var/turf/mob_loc = get_turf(M) loc_display = mob_loc.loc @@ -98,5 +99,3 @@ interact() return - - diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm index 9e9e4b29fac..a728c8993bf 100644 --- a/code/modules/computer3/computers/robot.dm +++ b/code/modules/computer3/computers/robot.dm @@ -31,7 +31,8 @@ interact() - if(!interactable() || computer.z > 6) + // TODO: Tie into space manager + if(!interactable() || computer.z > ZLEVEL_DERELICT) return var/dat if(src.temp) @@ -206,6 +207,3 @@ interact() return - - - diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm index ce6184178bf..d974101b33f 100644 --- a/code/modules/computer3/computers/security.dm +++ b/code/modules/computer3/computers/security.dm @@ -57,7 +57,8 @@ if(!interactable()) return - if(computer.z > 6) + // TODO: Tie into space manager + if(computer.z > ZLEVEL_DERELICT) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return var/dat diff --git a/code/modules/computer3/networking.dm b/code/modules/computer3/networking.dm index f31f4516c2c..0fc1c966d1c 100644 --- a/code/modules/computer3/networking.dm +++ b/code/modules/computer3/networking.dm @@ -105,6 +105,7 @@ for(var/obj/O in radio_connection.devices) if(istype(O,typekey)) T = get_turf(O) + // TODO: Tie into space manager if(istype(O) && (subspace || (O.z == z_level))) // radio does not work across z-levels result |= O return result @@ -232,4 +233,3 @@ if(C.d1 == 0 && (C.powernet == P)) return 1 return 0 - diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 5ea69f25c55..cc07dd248b4 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -125,6 +125,7 @@ log transactions if(get_dist(src,user) <= 1) //check to see if the user has low security enabled scan_user(user) + add_fingerprint(user) //js replicated from obj/machinery/computer/card var/dat = {"

Nanotrasen Automatic Teller Machine

diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 927db3c3668..b6313a77a40 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -17,6 +17,7 @@ /datum/event/alien_infestation/start() var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world) + // TODO: Tie into space manager if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded) if(temp_vent.parent.other_atmosmch.len > 50) //Stops Aliens getting stuck in small networks. See: Security, Virology vents += temp_vent @@ -34,4 +35,3 @@ spawncount-- successSpawn = 1 - diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 13d7478aab3..f7db50694d6 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -19,6 +19,7 @@ var/obj/item/device/radio/beacon/chosen var/list/possible = list() for(var/obj/item/device/radio/beacon/W in world) + // TODO: Tie into space manager if(!(W.z in config.station_levels)) continue possible += W diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 05110a7f0ce..e51ad46f61a 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -18,7 +18,8 @@ /datum/event/brand_intelligence/start() for(var/obj/machinery/vending/V in machines) - if(V.z != 1) continue + // TODO: Tie into space manager + if(V.z != ZLEVEL_STATION) continue vendingMachines.Add(V) if(!vendingMachines.len) @@ -62,4 +63,4 @@ rebel.shoot_inventory = 1 if(IsMultiple(activeFor, 8)) - originMachine.speak(pick(rampant_speeches)) \ No newline at end of file + originMachine.speak(pick(rampant_speeches)) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index ce6e214053d..0f44bf586ee 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -21,7 +21,8 @@ var/turf/T = get_turf(H) if(!T) continue - if(T.z != 1) + // TODO: Tie into space manager + if(T.z != ZLEVEL_STATION) continue var/foundAlready = 0 // don't infect someone that already has the virus for(var/datum/disease/D in H.viruses) @@ -34,4 +35,4 @@ D = new virus_type() D.carrier = 1 H.AddDisease(D) - break \ No newline at end of file + break diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 20f7f9955eb..17b529f9bda 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -62,7 +62,7 @@ goal = locate(endx, endy, 1) src.x = startx src.y = starty - src.z = 1 + src.z = ZLEVEL_STATION spawn(0) walk_towards(src, goal, 1) return diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 5955d60cbec..deaa1b85aa8 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -149,7 +149,7 @@ var/list/event_last_fired = list() new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)), //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)), //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)), - //new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1), diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index ca675306ffa..282c8daab9e 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -22,6 +22,7 @@ for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) + // TODO: Tie into space manager if(current_area.type in skipped_areas || !(S.z in config.station_levels)) continue S.last_charge = S.charge @@ -35,6 +36,7 @@ for(var/obj/machinery/power/apc/C in world) var/area/current_area = get_area(C) + // TODO: Tie into space manager if(current_area.type in skipped_areas_apc || !(C.z in config.station_levels)) continue if(C.cell) @@ -48,12 +50,14 @@ command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') for(var/obj/machinery/power/apc/C in machines) var/area/current_area = get_area(C) + // TODO: Tie into space manager if(current_area.type in skipped_areas_apc || !(C.z in config.station_levels)) continue if(C.cell) C.cell.charge = C.cell.maxcharge for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) + // TODO: Tie into space manager if(current_area.type in skipped_areas || !(S.z in config.station_levels)) continue S.charge = S.last_charge @@ -66,7 +70,8 @@ if(announce) command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') for(var/obj/machinery/power/smes/S in machines) - if(S.z != 1) + // TODO: Tie into space manager + if(S.z != ZLEVEL_STATION) continue S.charge = S.capacity S.output_level = S.output_level_max @@ -74,4 +79,3 @@ S.input_attempt = 1 S.update_icon() S.power_change() - \ No newline at end of file diff --git a/code/modules/events/holidays/Christmas.dm b/code/modules/events/holidays/Christmas.dm index 10a46b0cf51..b9e23d406ef 100644 --- a/code/modules/events/holidays/Christmas.dm +++ b/code/modules/events/holidays/Christmas.dm @@ -1,5 +1,6 @@ /proc/Christmas_Game_Start() for(var/obj/structure/flora/tree/pine/xmas in world) + // TODO: Tie into space manager if(!(xmas.z in config.station_levels)) continue for(var/turf/simulated/floor/T in orange(1,xmas)) for(var/i=1,i<=rand(1,5),i++) @@ -40,7 +41,7 @@ "What do you get from eating tree decorations?\n\nTinsilitis!", "What do snowmen wear on their heads?\n\nIce caps!", "Why is Christmas just like life on ss13?\n\nYou do all the work and the fat guy gets all the credit.", - "Why doesn’t Santa have any children?\n\nBecause he only comes down the chimney.") + "Why doesn�t Santa have any children?\n\nBecause he only comes down the chimney.") new /obj/item/clothing/head/festive(target.loc) user.update_icons() cracked = 1 @@ -59,4 +60,3 @@ desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 5afddd49d23..54a2bb41bb9 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -24,6 +24,7 @@ command_announcement.Announce("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert", new_sound = 'sound/AI/radiation.ogg') for(var/area/A in world) + // TODO: Tie into space manager if(!(A.z in config.station_levels) || is_safe_zone(A)) continue A.radiation_alert() @@ -42,6 +43,7 @@ var/turf/T = get_turf(H) if(!T) continue + // TODO: Tie into space manager if(!(T.z in config.station_levels) || is_safe_zone(T.loc)) continue @@ -61,6 +63,7 @@ command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") for(var/area/A in world) + // TODO: Tie into space manager if(!(A.z in config.station_levels) || is_safe_zone(A)) continue A.reset_radiation_alert() diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index 7837bd61d7c..455312baa99 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -41,7 +41,7 @@ var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread() sparks.set_up(3, 0, D.loc) sparks.start() - D.z = 2 + D.z = ZLEVEL_CENTCOMM D.has_loot = 0 qdel(D) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index a628e3130ed..2c46fc8dffa 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -16,6 +16,7 @@ var/list/vents = list() for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world) + // TODO: Tie into space manager if((temp_vent.loc.z in config.station_levels) && !temp_vent.welded) if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent @@ -26,4 +27,4 @@ if(prob(66)) S.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/nurse vents -= vent - spawncount-- \ No newline at end of file + spawncount-- diff --git a/code/modules/events/undead.dm b/code/modules/events/undead.dm index 2ff8d05c20a..3399c69c979 100644 --- a/code/modules/events/undead.dm +++ b/code/modules/events/undead.dm @@ -2,13 +2,14 @@ var/spawn_prob = 10 startWhen = 2 announceWhen = 3 - + /datum/event/undead/start() var/datum/event/electrical_storm/RS = new RS.lightsoutAmount = pick(2,2,3) RS.start() RS.kill() for(var/area/A) + // TODO: Tie into space manager if(!(A.z in config.station_levels)) continue //Spook on main station only. if(A.luminosity) continue // if(A.lighting_space) continue @@ -34,7 +35,7 @@ 80;/mob/living/simple_animal/hostile/retaliate/zombie, 60;/mob/living/simple_animal/hostile/retaliate/ghost) new undeadtype(T) - + /datum/event/undead/announce() for(var/mob/living/M in player_list) to_chat(M, "You feel [pick("a chill","a deathly chill","the undead","dirty", "creeped out","afraid","fear")]!") diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index fae640a73cb..de4e62215a8 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -11,6 +11,7 @@ /datum/event/vent_clog/setup() endWhen = rand(25, 100) for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines) + // TODO: Tie into space manager if((temp_vent.loc.z in config.station_levels)) if(temp_vent.parent.other_atmosmch.len > 50) vents += temp_vent diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 16daa8fe7c9..b022527094d 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -13,6 +13,7 @@ /datum/event/wormholes/start() for(var/turf/simulated/floor/T in world) + // TODO: Tie into space manager if((T.z in config.station_levels)) pick_turfs += T @@ -62,4 +63,4 @@ if(P && isturf(P.loc)) target = P.loc if(!target) return - do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon \ No newline at end of file + do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm index 7dccff585d8..c90e97d60c1 100644 --- a/code/modules/holiday/christmas.dm +++ b/code/modules/holiday/christmas.dm @@ -1,5 +1,6 @@ /datum/holiday/xmas/celebrate() for(var/obj/structure/flora/tree/pine/xmas in world) + // TODO: Tie into space manager if(!(xmas.z in config.station_levels)) continue for(var/turf/simulated/floor/T in orange(1,xmas)) for(var/i=1,i<=rand(1,5),i++) @@ -43,7 +44,7 @@ "What do you get from eating tree decorations?\n\nTinsilitis!", "What do snowmen wear on their heads?\n\nIce caps!", "Why is Christmas just like life on ss13?\n\nYou do all the work and the fat guy gets all the credit.", - "Why doesn’t Santa have any children?\n\nBecause he only comes down the chimney.") + "Why doesn�t Santa have any children?\n\nBecause he only comes down the chimney.") new /obj/item/clothing/head/festive(target.loc) user.update_icons() cracked = 1 @@ -62,4 +63,3 @@ desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 57ad87ecbbe..ec7a5aca25f 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -376,6 +376,7 @@ // Bluespace tomato code copied over from grown.dm. if(get_trait(TRAIT_TELEPORTING)) + // TODO: Tie into space manager if(target.z in config.admin_levels) return 1 @@ -828,4 +829,4 @@ display_name = "modified [base_name]" if(2) //Enhanced seed_name = "enhanced [base_name]" - display_name = "enhanced [base_name]" \ No newline at end of file + display_name = "enhanced [base_name]" diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 4d58fee8e11..aa7d9ea4607 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -20,26 +20,32 @@ opacity = 1 var/health = 50 var/tmp/busy = 0 - var/list/valid_types = list(/obj/item/weapon/book, \ - /obj/item/weapon/tome, \ - /obj/item/weapon/spellbook, \ - /obj/item/weapon/storage/bible) + var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/bible, /obj/item/weapon/tome) //Things allowed in the bookcase /obj/structure/bookcase/initialize() ..() for(var/obj/item/I in loc) - if(is_type_in_list(I, valid_types)) + if(is_type_in_list(I, allowed_books)) I.forceMove(src) update_icon() /obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params) if(busy) //So that you can't mess with it while deconstructing return 1 - if(is_type_in_list(O, valid_types)) - user.drop_item() + if(is_type_in_list(O, allowed_books)) + if(!user.drop_item()) + return O.forceMove(src) update_icon() return 1 + else if(istype(O, /obj/item/weapon/storage/bag/books)) + var/obj/item/weapon/storage/bag/books/B = O + for(var/obj/item/T in B.contents) + if(istype(T, /obj/item/weapon/book) || istype(T, /obj/item/weapon/spellbook) || istype(T, /obj/item/weapon/tome) || istype(T, /obj/item/weapon/storage/bible)) + B.remove_from_storage(T, src) + to_chat(user, "You empty [O] into [src].") + update_icon() + return 1 else if(istype(O, /obj/item/weapon/wrench)) user.visible_message("[user] starts disassembling \the [src].", \ "You start disassembling \the [src].") @@ -51,8 +57,6 @@ user.visible_message("[user] disassembles \the [src].", \ "You disassemble \the [src].") busy = 0 - for(var/i = 1 to 5) - new /obj/item/stack/sheet/wood(get_turf(src)) density = 0 qdel(src) else @@ -72,9 +76,6 @@ else if(health <= 0) visible_message("The bookcase is smashed apart!") - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) - new /obj/item/stack/sheet/wood(get_turf(src)) qdel(src) return ..() @@ -110,10 +111,10 @@ return /obj/structure/bookcase/Destroy() - for(var/i = 1 to 3) + for(var/i in 1 to 5) new /obj/item/stack/sheet/wood(get_turf(src)) for(var/obj/item/I in contents) - if(is_type_in_list(I, valid_types)) + if(is_type_in_list(I, allowed_books)) I.forceMove(get_turf(src)) return ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index d3a65e3c0bf..211914afcbb 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -528,7 +528,8 @@ /obj/item/device/wormhole_jaunter/attack_self(mob/user as mob) var/turf/device_turf = get_turf(user) - if(!device_turf||device_turf.z==2||device_turf.z>=7) + // TODO: Tie into space manager + if(!device_turf||device_turf.z==ZLEVEL_CENTCOMM||device_turf.z>=ZLEVEL_EMPTY) to_chat(user, "You're having difficulties getting the [src.name] to work.") return else @@ -536,6 +537,7 @@ var/list/L = list() for(var/obj/item/device/radio/beacon/B in world) var/turf/T = get_turf(B) + // TODO: Tie into space manager if(T.z == ZLEVEL_STATION) L += B if(!L.len) diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index f5e0f2349be..2a6f5555555 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -240,6 +240,7 @@ /obj/item/weapon/ore/New() pixel_x = rand(0,16)-8 pixel_y = rand(0,8)-8 + // TODO: Tie into space manager if(src.z == ZLEVEL_ASTEROID) score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 69a32f2c285..c67879f0457 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -18,6 +18,7 @@ var/turf/T = get_turf(src) if(!T) return 0 + // TODO: Tie into space manager if(T.z == ZLEVEL_CENTCOMM) //dont detect mobs on centcomm return 0 if(T.z >= MAX_Z) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 842b03c4bbd..7870e3a91fc 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -640,13 +640,14 @@ var/list/ai_verbs_default = list( if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO)) return - var/ai_allowed_Zlevel = list(1,3,5) + var/ai_allowed_Zlevel = list(ZLEVEL_STATION,ZLEVEL_TELECOMMS,ZLEVEL_ASTEROID) var/d var/area/bot_area d += "Query network status
" d += "" for(var/mob/living/simple_animal/bot/Bot in simple_animal_list) + // TODO: Tie into space manager if((Bot.z in ai_allowed_Zlevel) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected! bot_area = get_area(Bot) d += "" diff --git a/code/modules/mob/living/silicon/ai/latejoin.dm b/code/modules/mob/living/silicon/ai/latejoin.dm index 585c484a73a..0859acc1cb2 100644 --- a/code/modules/mob/living/silicon/ai/latejoin.dm +++ b/code/modules/mob/living/silicon/ai/latejoin.dm @@ -34,7 +34,7 @@ var/global/list/empty_playable_ai_cores = list() job_master.FreeRole(job) if(mind.objectives.len) - qdel(mind.objectives) + mind.objectives.Cut() mind.special_role = null else if(ticker.mode.name == "AutoTraitor") diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 3e15e7118d9..6d4c3a45150 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -499,6 +499,7 @@ /mob/living/silicon/pai/proc/hackloop() var/turf/T = get_turf_or_move(src.loc) for(var/mob/living/silicon/ai/AI in player_list) + // TODO: Tie into space manager if(!T || !(T.z in config.contact_levels)) break if(T.loc) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 383f75b757f..682abdb383d 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -402,7 +402,7 @@ global_announcer.autosay("A new[rank ? " [rank]" : " visitor" ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer") /mob/new_player/proc/LateChoices() - var/mills = world.time // 1/10 of a second, not real milliseconds but whatever + var/mills = ROUND_TIME // 1/10 of a second, not real milliseconds but whatever //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something var/mins = (mills % 36000) / 600 var/hours = mills / 36000 diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index a97c693ec94..50c2bd79143 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -41,6 +41,7 @@ // Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras) // unless it's on the same level as the object it's interacting with. var/turf/T = get_turf(src_object) + // TODO: Tie into space manager if(!T || !(z == T.z || (T.z in config.player_levels))) return STATUS_CLOSE @@ -102,4 +103,4 @@ . = shared_nano_interaction(src_object) if(. != STATUS_CLOSE) if(!(src_object in contents)) - . = STATUS_CLOSE \ No newline at end of file + . = STATUS_CLOSE diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index a587295b582..65f5a9299ee 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -2,9 +2,10 @@ name = "Crew monitor" /datum/nano_module/crew_monitor/Topic(href, href_list) - if(..()) + if(..()) return 1 var/turf/T = get_turf(nano_host()) + // TODO: Tie into space manager if(!T || !(T.z in config.player_levels)) to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return 0 @@ -38,4 +39,3 @@ // should make the UI auto-update; doesn't seem to? ui.set_auto_update(1) - \ No newline at end of file diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm index 55acf9b70eb..1c407bd223c 100644 --- a/code/modules/pda/cart_apps.dm +++ b/code/modules/pda/cart_apps.dm @@ -316,6 +316,7 @@ if(shuttle_master.supply.mode == SHUTTLE_CALL) supplyData["shuttle_moving"] = 1 + // TODO: Tie into space manager if(shuttle_master.supply.z != ZLEVEL_STATION) supplyData["shuttle_loc"] = "station" else @@ -418,4 +419,4 @@ JaniData["buckets"] = BucketData JaniData["cleanbots"] = CbotData JaniData["carts"] = CartData - data["janitor"] = JaniData \ No newline at end of file + data["janitor"] = JaniData diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index 88d6024ba1b..2a8ca83b218 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -158,6 +158,7 @@ if(signal.data["done"]) useTC = 1 var/turf/pos = get_turf(P) + // TODO: Tie into space manager if(pos.z in signal.data["level"]) useTC = 2 //Let's make this barely readable @@ -211,4 +212,4 @@ return plist /datum/data/pda/app/messenger/proc/can_receive() - return pda.owner && !toff && !hidden \ No newline at end of file + return pda.owner && !toff && !hidden diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 87ce338afd1..5cbb8837c68 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -170,6 +170,7 @@ apcs -= src if(malfai && operating) if(ticker.mode.config_tag == "malfunction") + // TODO: Tie into space manager if(src.z == ZLEVEL_STATION) ticker.mode:apcs-- area.power_light = 0 @@ -995,6 +996,7 @@ malfai.malfhacking = 0 locked = 1 if(ticker.mode.config_tag == "malfunction") + // TODO: Tie into space manager if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas)) ticker.mode:apcs++ if(usr:parent) @@ -1027,6 +1029,7 @@ if(malfai) if(ticker.mode.config_tag == "malfunction") + // TODO: Tie into space manager if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas)) operating ? ticker.mode:apcs++ : ticker.mode:apcs-- @@ -1042,6 +1045,7 @@ if(!malf.can_shunt) to_chat(malf, "You cannot shunt.") return + // TODO: Tie into space manager if(!(src.z in config.station_levels)) return src.occupier = new /mob/living/silicon/ai(src,malf.laws,null,1) @@ -1091,6 +1095,7 @@ /obj/machinery/power/apc/proc/ion_act() //intended to be exactly the same as an AI malf attack + // TODO: Tie into space manager if(!src.malfhack && (src.z in config.station_levels)) if(prob(3)) src.locked = 1 @@ -1366,6 +1371,7 @@ /obj/machinery/power/apc/proc/set_broken() if(malfai && operating) if(ticker.mode.config_tag == "malfunction") + // TODO: Tie into space manager if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas)) ticker.mode:apcs-- stat |= BROKEN diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 8833e047a7e..ea633c7e78f 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -124,6 +124,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 O.main_part = null qdel(O) for(var/area/A in world) + // TODO: Tie into space manager if(!(A.z in config.station_levels)) continue A.gravitychange(0,A) shake_everyone() @@ -301,6 +302,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 investigate_log("was brought online and is now producing gravity for this level.", "gravity") message_admins("The gravity generator was brought online. ([area.name])") for(var/area/A in world) + // TODO: Tie into space manager if(!(A.z in config.station_levels)) continue A.gravitychange(1,A) else @@ -309,6 +311,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 investigate_log("was brought offline and there is now no gravity for this level.", "gravity") message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") for(var/area/A in world) + // TODO: Tie into space manager if(!(A.z in config.station_levels)) continue A.gravitychange(0,A) @@ -377,6 +380,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 shake_camera(M, 15, 1) M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) +// TODO: Tie into space manager /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) if(!T) @@ -385,6 +389,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 return length(gravity_generators["[T.z]"]) return 0 +// TODO: Tie into space manager /obj/machinery/gravity_generator/main/proc/update_list() var/turf/T = get_turf(src.loc) if(T) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 66e2e5d68b4..75f88f9b751 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -433,6 +433,7 @@ return 1 /obj/machinery/power/smes/proc/ion_act() + // TODO: Tie into space manager if(src.z in config.station_levels) if(prob(1)) //explosion for(var/mob/M in viewers(src)) diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm index 2155a1cf0a1..c280fe59903 100644 --- a/code/modules/projectiles/guns/energy/telegun.dm +++ b/code/modules/projectiles/guns/energy/telegun.dm @@ -23,7 +23,8 @@ var/turf/T = get_turf(R) if(!T) continue - if((T.z in config.admin_levels) || T.z > 7) + // TODO: Tie into space manager + if((T.z in config.admin_levels) || T.z > ZLEVEL_EMPTY) continue if(R.syndicate == 1) continue diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm index 6f8e7fd6308..def94ba9a2c 100644 --- a/code/modules/reagents/newchem/disease.dm +++ b/code/modules/reagents/newchem/disease.dm @@ -122,6 +122,25 @@ qdel(ate_heart) ..() +//virus-specific symptom reagents + +/datum/reagent/synaphydramine + name = "Diphen-Synaptizine" + id = "synaphydramine" + description = "Reduces drowsiness and hallucinations while also purging histamine from the body." + color = "#EC536D" // rgb: 236, 83, 109 + +/datum/reagent/synaphydramine/on_mob_life(mob/living/M) + M.drowsyness = max(M.drowsyness-5, 0) + if(holder.has_reagent("lsd")) + holder.remove_reagent("lsd", 5) + if(holder.has_reagent("histamine")) + holder.remove_reagent("histamine", 5) + M.hallucination = max(0, M.hallucination - 10) + if(prob(30)) + M.adjustToxLoss(1) + ..() + //virus food /datum/reagent/virus_food name = "Virus Food" diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security levels.dm index 61b0d3ce0dc..b340e14d356 100644 --- a/code/modules/security_levels/security levels.dm +++ b/code/modules/security_levels/security levels.dm @@ -37,6 +37,7 @@ CC.post_status("alert", "outline") for(var/obj/machinery/firealarm/FA in world) + // TODO: Tie into space manager if((FA.z in config.contact_levels)) FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") @@ -53,6 +54,7 @@ CC.post_status("alert", "outline") for(var/obj/machinery/firealarm/FA in world) + // TODO: Tie into space manager if((FA.z in config.contact_levels)) FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") @@ -65,6 +67,7 @@ security_level = SEC_LEVEL_RED var/obj/machinery/door/airlock/highsecurity/red/R = locate(/obj/machinery/door/airlock/highsecurity/red) in world + // TODO: Tie into space manager if(R && (R.z in config.station_levels)) R.locked = 0 R.update_icon() @@ -74,6 +77,7 @@ CC.post_status("alert", "redalert") for(var/obj/machinery/firealarm/FA in world) + // TODO: Tie into space manager if((FA.z in config.contact_levels)) FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") @@ -86,11 +90,13 @@ if(security_level < SEC_LEVEL_RED) for(var/obj/machinery/door/airlock/highsecurity/red/R in world) + // TODO: Tie into space manager if((R.z in config.station_levels)) R.locked = 0 R.update_icon() for(var/obj/machinery/door/airlock/hatch/gamma/H in world) + // TODO: Tie into space manager if((H.z in config.station_levels)) H.locked = 0 H.update_icon() @@ -100,6 +106,7 @@ CC.post_status("alert", "gammaalert") for(var/obj/machinery/firealarm/FA in world) + // TODO: Tie into space manager if((FA.z in config.contact_levels)) FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_gamma") @@ -114,6 +121,7 @@ CC.post_status("alert", "epsilonalert") for(var/obj/machinery/firealarm/FA in world) + // TODO: Tie into space manager if((FA.z in config.contact_levels)) FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_epsilon") @@ -127,6 +135,7 @@ CC.post_status("alert", "deltaalert") for(var/obj/machinery/firealarm/FA in world) + // TODO: Tie into space manager if((FA.z in config.contact_levels)) FA.overlays = list() FA.overlays += image('icons/obj/monitors.dmi', "overlay_delta") @@ -189,4 +198,4 @@ set_security_level(2) /mob/verb/set_thing3() set_security_level(3) -*/ \ No newline at end of file +*/ diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index fe3d059a08a..40e7aa05aa0 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -6,6 +6,7 @@ height = 7 /obj/docking_port/mobile/assault_pod/request() + // TODO: Tie into space manager if(z == initial(src.z)) //No launching pods that have already launched return ..() diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 8516d3e1dec..1224f5719b9 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -202,6 +202,7 @@ if(time_left <= 0 && !shuttle_master.emergencyNoEscape) //move each escape pod to its corresponding transit dock for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile) + // TODO: Tie into space manager if(M.z == ZLEVEL_STATION) //Will not launch from the mine/planet M.enterTransit() //now move the actual emergency shuttle to its transit dock diff --git a/code/modules/space_management/heap_space_level.dm b/code/modules/space_management/heap_space_level.dm new file mode 100644 index 00000000000..8d5a3971ba1 --- /dev/null +++ b/code/modules/space_management/heap_space_level.dm @@ -0,0 +1,15 @@ +// This represents a level we can carve up as we please, and hand out +// chunks of to whatever requests it +/datum/space_level/heap + var/datum/space_chunk/top + linkage = UNAFFECTED + +/datum/space_level/heap/New() + ..() + top = new + +/datum/space_level/heap/proc/request(width, height) + return 1 // All are welcome! At least until I add code for this + +/datum/zlevel/heap/proc/allocate(width, height) + return diff --git a/code/modules/space_management/space_chunk.dm b/code/modules/space_management/space_chunk.dm new file mode 100644 index 00000000000..b7764e5673e --- /dev/null +++ b/code/modules/space_management/space_chunk.dm @@ -0,0 +1,24 @@ +/datum/space_chunk + var/x + var/y + var/width + var/height + var/zpos + +/datum/space_chunk/New(w, h, z, new_x, new_y) + x = new_x + y = new_y + zpos = z + width = w + height = h + +/datum/space_chunk/proc/check_sanity() + var/i_am_sane = 1 + i_am_sane |= (x > 0) + i_am_sane |= (y > 0) + i_am_sane |= (x <= world.maxx) + i_am_sane |= (y <= world.maxy) + return i_am_sane + +/datum/space_chunk/proc/return_turfs() + return diff --git a/code/modules/space_management/space_level.dm b/code/modules/space_management/space_level.dm new file mode 100644 index 00000000000..6b7654cd504 --- /dev/null +++ b/code/modules/space_management/space_level.dm @@ -0,0 +1,125 @@ +/datum/space_level + var/name = "Your config settings failed, you need to fix this for the datum space levels to work" + var/zpos = 1 + var/flags = 0 // We'll use this to keep track of whether you can teleport/etc + + // Map transition stuff + var/list/neighbors = list() + // # How this level connects with others. See __MAP_DEFINES.dm for defines + var/linkage = SELFLOOPING + // # imaginary placements on the grid - these reflect the point it is linked to + var/xi + var/yi + var/list/transit_north = list() + var/list/transit_south = list() + var/list/transit_east = list() + var/list/transit_west = list() + + // Init deferral stuff + var/dirt_count = 0 + var/list/init_list = list() + +/datum/space_level/New(z, name, transition_type = SELFLOOPING) + zpos = z + set_linkage(transition_type) + build_space_destination_arrays() + +/datum/space_level/proc/build_space_destination_arrays() + var/timer = start_watch() + log_debug("Starting to build space destination arrays for z level '[zpos]'...") + for(var/turf/space/S in get_turfs()) + + // Bottom border + if(S.y <= TRANSITIONEDGE) + transit_south |= S + continue + + // Top border + if(S.y >= (world.maxy - TRANSITIONEDGE - 1)) + transit_north |= S + continue + + // Left border + if(S.x <= TRANSITIONEDGE) + transit_west |= S + continue + + // Right border + if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) + transit_east |= S + continue + log_debug("Building space destination arrays complete, took [stop_watch(timer)]s.") + +/datum/space_level/proc/get_turfs() + return block(locate(1, 1, zpos), locate(world.maxx, world.maxy, zpos)) + +/datum/space_level/proc/set_linkage(transition_type) + linkage = transition_type + if(transition_type == SELFLOOPING) + link_to_self() // `link_to_self` is defined in space_transitions.dm + + +/datum/space_level/proc/resume_init() + if(dirt_count > 0) + throw EXCEPTION("Init told to resume when z-level still dirty. Z level: '[zpos]'") + log_debug("Releasing freeze on z-level '[zpos]'!") + log_debug("Beginning initialization!") + var/list/our_atoms = init_list // OURS NOW!!! (Keeping this list to ourselves will prevent hijack) + init_list = list() + var/list/late_maps = list() + var/list/pipes = list() + var/list/cables = list() + var/watch = start_watch() + for(var/schmoo in our_atoms) + var/atom/movable/AM = schmoo + if(AM) // to catch stuff like the nuke disk that no longer exists + + // This can mess with our state - we leave these for last + if(istype(AM, /obj/effect/landmark/map_loader)) + late_maps.Add(AM) + continue + AM.initialize() + if(istype(AM, /obj/machinery/atmospherics)) + pipes.Add(AM) + else if(istype(AM, /obj/structure/cable)) + cables.Add(AM) + log_debug("Primary initialization finished in [stop_watch(watch)]s.") + our_atoms.Cut() + if(pipes.len) + do_pipes(pipes) + if(cables.len) + do_cables(cables) + if(late_maps.len) + do_late_maps(late_maps) + +/datum/space_level/proc/do_pipes(list/pipes) + var/watch = start_watch() + log_debug("Building pipenets on z-level '[zpos]'!") + for(var/schmoo in pipes) + var/obj/machinery/atmospherics/machine = schmoo + if(machine) + machine.build_network() + pipes.Cut() + log_debug("Took [stop_watch(watch)]s") + +/datum/space_level/proc/do_cables(list/cables) + var/watch = start_watch() + log_debug("Building powernets on z-level '[zpos]'!") + for(var/schmoo in cables) + var/obj/structure/cable/C = schmoo + if(C) + makepowernet_for(C) + cables.Cut() + log_debug("Took [stop_watch(watch)]s") + +/datum/space_level/proc/do_late_maps(list/late_maps) + var/watch = start_watch() + log_debug("Loading map templates on z-level '[zpos]'!") + space_manager.add_dirt(zpos) // Let's not repeatedly resume init for each template + for(var/schmoo in late_maps) + var/obj/effect/landmark/map_loader/ML = schmoo + if(ML) + ML.initialize() + late_maps.Cut() + space_manager.remove_dirt(zpos) + log_debug("Took [stop_watch(watch)]s") diff --git a/code/modules/space_management/space_transition.dm b/code/modules/space_management/space_transition.dm new file mode 100644 index 00000000000..469365e4023 --- /dev/null +++ b/code/modules/space_management/space_transition.dm @@ -0,0 +1,412 @@ +//This is realisation of the working torus-looping randomized-per-round space map, this kills the cube + +#define Z_LEVEL_NORTH "1" +#define Z_LEVEL_SOUTH "2" +#define Z_LEVEL_EAST "4" +#define Z_LEVEL_WEST "8" + +/proc/get_opposite_direction(direction) + switch(direction) + if(Z_LEVEL_NORTH) + return Z_LEVEL_SOUTH + if(Z_LEVEL_SOUTH) + return Z_LEVEL_NORTH + if(Z_LEVEL_EAST) + return Z_LEVEL_WEST + if(Z_LEVEL_WEST) + return Z_LEVEL_EAST + +/datum/space_level + var/list/direction_cache = list() + +/datum/space_level/proc/link_to_self() + neighbors = list() + var/list/L = list(Z_LEVEL_NORTH,Z_LEVEL_SOUTH,Z_LEVEL_EAST,Z_LEVEL_WEST) + for(var/A in L) + neighbors[A] = src + +// This proc takes another space level, and establishes a connection between the +// two depending on how the `xi` and the `yi` values compare +/datum/space_level/proc/link_levels(datum/space_level/S) + if(S.xi == xi) + if(S.yi == yi+1) + add_connection(S, Z_LEVEL_NORTH) + else if(S.yi == yi-1) + add_connection(S, Z_LEVEL_SOUTH) + else if(S.yi == yi) + if(S.xi == xi+1) + add_connection(S, Z_LEVEL_EAST) + else if(S.xi == xi-1) + add_connection(S, Z_LEVEL_WEST) + else // yell about evil wizards, this shouldn't happen + log_debug("Two z levels attempted to link, but were not adjacent! Our z:([xi],[yi]). Other z:([S.xi],[S.yi])") + +// Do this before setting up new connections, or the old ones will haunt you +/datum/space_level/proc/reset_connections() + neighbors.Cut() + direction_cache.Cut() + +// `direction` here is the direction from `src` to `S` +/datum/space_level/proc/add_connection(datum/space_level/S, direction) + var/oppose = get_opposite_direction(direction) + neighbors[direction] = S + S.neighbors[oppose] = src + + +// The "direction cache" will need updating if a +/datum/space_level/proc/get_connection(direction) + if(direction in neighbors) + return neighbors[direction] + var/use_direction_cache = 0 + if(use_direction_cache) + if(direction in direction_cache) + return direction_cache[direction] + + // It's in a direction that loops - so we step as far in the opposite direction to get where to wrap to + var/datum/space_level/S = src + var/oppose = get_opposite_direction(direction) + // Loop all the way in the other direction that we can + while(S.neighbors[oppose]) + if(S.neighbors[oppose] == src) // we've got a tesseract, boys + CRASH("Tesseract formed when routing connections between z levels. Culprit: z level '[S.zpos]' to '[src.zpos]', direction [oppose]") + S = S.neighbors[oppose] + + if(use_direction_cache) + direction_cache[direction] = S + return S + + +/datum/point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else + var/list/neighbors = list() + var/x + var/y + var/datum/space_level/spl + +/datum/point/New(nx, ny) + x = nx + y = ny + +/datum/point/proc/hash() + return "([x],[y])" + +// This is called only on `filled_nodes` - meaning we have a guarantee that +// it is already surrounded on all sides +/datum/point/proc/set_neighbors(datum/spacewalk_grid/SW) + neighbors.Cut() + neighbors |= SW.get(x+1, y, allow_empty = 1) + neighbors |= SW.get(x-1, y, allow_empty = 1) + neighbors |= SW.get(x, y+1, allow_empty = 1) + neighbors |= SW.get(x, y-1, allow_empty = 1) + +// Updates variables of the space level +/datum/point/proc/set_space_level(datum/space_level/S) + spl = S + S.xi = x + S.yi = y + for(var/datum/point/P in neighbors) + if(istype(P.spl)) + // Since each time this proc is called, it is the first time + // that the z level is added to the grid, we know for certain + // that no other z level has this as its neighbor + spl.link_levels(P.spl) + +// Returns a list of all neighbors that don't have a space level yet +// If a node doesn't exist yet, it will create it +// This is only called for nodes within the `available_nodes` list +/datum/point/proc/get_empty_neighbors(datum/spacewalk_grid/SW) + var/list/result + var/datum/point/up = SW.get(x, y+1, allow_empty = 1) + var/datum/point/down = SW.get(x, y-1, allow_empty = 1) + var/datum/point/left = SW.get(x-1, y, allow_empty = 1) + var/datum/point/right = SW.get(x+1, y, allow_empty = 1) + if(isnull(up)) + up = new(x, y+1) + SW.add_available_node(up) + + if(isnull(down)) + down = new(x, y-1) + SW.add_available_node(down) + + if(isnull(left)) + left = new(x-1, y) + SW.add_available_node(left) + + if(isnull(right)) + right = new(x+1, y) + SW.add_available_node(right) + + // Nodes with a space datum are not empty + result = list(up, down, left, right) + for(var/datum/point/thing in result) + if(!isnull(thing.spl)) + result -= thing + return result + +// This looks around itself to see if it has any active nodes within the cardinal directions +/datum/point/proc/has_no_neighbors(datum/spacewalk_grid/SW) + var/result = 1 + if(spl) + return 1 + if(!isnull(SW.get(x+1,y))) + result = 0 + if(!isnull(SW.get(x-1,y))) + result = 0 + if(!isnull(SW.get(x,y+1))) + result = 0 + if(!isnull(SW.get(x,y-1))) + result = 0 + return result + + +/datum/point/proc/deactivate() + if(!spl) + throw EXCEPTION("Attempted to deactivate inactive point") + for(var/direction in spl.neighbors) + var/datum/space_level/S = spl.neighbors[direction] + var/oppose = get_opposite_direction(direction) + S.neighbors.Remove(oppose) + spl.reset_connections() + spl = initial(spl) + +// This is like the old algorithm, except this one +// can expand indefinitely and add new points on the fly + +// The algorithm is: Start in the center, and add all adjacent points to a list of things to select +// Then repeatedly do the cycle of choosing a node next to any previously-selected node, then +// add all points next to your chosen node to the list of things to select +/datum/spacewalk_grid + // This is a list of fully initialized nodes - these have their neighbors + // assigned, and are surrounded + var/list/filled_nodes = list() + // These nodes are not fully initialized - their neighbors field is empty, + // and they do not correspond to a space level + var/list/available_nodes = list() + var/list/all_nodes = list() // filled_nodes | available_nodes + var/min_x = 0 + var/min_y = 0 + var/max_x = 0 + var/max_y = 0 + +/datum/spacewalk_grid/New() + var/datum/point/P = new(0,0) + add_available_node(P) + +/datum/spacewalk_grid/proc/add_available_node(datum/point/P) + var/hash = P.hash() + if(hash in all_nodes) + log_debug("Hash overlap! [hash]") + all_nodes[P.hash()] = P + available_nodes |= P + +// We call this to flag a node as in use - all required variables will be +// ready after this is called +/datum/spacewalk_grid/proc/consume_node(datum/point/P) + filled_nodes |= P + available_nodes -= P + // This proc adds any new neighbors to the list of available nodes + P.get_empty_neighbors(src) + if(min_x > P.x) + min_x = P.x + else if(max_x < P.x) + max_x = P.x + if(min_y > P.y) + min_y = P.y + else if(max_y < P.y) + max_y = P.y + P.set_neighbors(src) + +// You can call this with an active point, to remove it from the grid - +// this is important if you want to separate a z level from the network +/datum/spacewalk_grid/proc/release_node(datum/point/P) + filled_nodes -= P + available_nodes |= P + // Go through each neighbor node, and delete it if it's not + // next to any other active nodes + for(var/datum/point/P2 in P.neighbors) + var/isolated = P2.has_no_neighbors(src) + if(isolated) + available_nodes -= P2 + all_nodes -= P2.hash() + qdel(P) + P.deactivate() + P.neighbors.Cut() + + // Now that we've cleaned out inactive nodes, we will update the bounds + var/datum/point/outer_bound + if(P.x == max_x) + for(var/i = min_y, i <= max_y, i++) + outer_bound = get(P.x, i) + if(!isnull(outer_bound)) // There is still an active node in this column + break + if(isnull(outer_bound)) + max_x-- + + if(P.x == min_x) + for(var/i = min_y, i <= max_y, i++) + outer_bound = get(P.x, i) + if(!isnull(outer_bound)) // There is still an active node in this column + break + if(isnull(outer_bound)) + min_x++ + + if(P.y == max_y) + for(var/i = min_x, i <= max_x, i++) + outer_bound = get(i, P.y) + if(!isnull(outer_bound)) // There is still an active node in this column + break + if(isnull(outer_bound)) + max_y-- + + if(P.y == min_y) + for(var/i = min_x, i <= max_x, i++) + outer_bound = get(i, P.y) + if(!isnull(outer_bound)) // There is still an active node in this column + break + if(isnull(outer_bound)) + min_y++ + + +// If the node isn't in the grid, this will return null +/datum/spacewalk_grid/proc/get(x,y, allow_empty = 0) + var/datum/point/P = all_nodes["([x],[y])"] + if(!allow_empty && !(P in filled_nodes)) + P = null // active nodes only + return P + +/datum/spacewalk_grid/proc/get_width() + return 1 + max_x - min_x + +/datum/spacewalk_grid/proc/get_height() + return 1 + max_y - min_y + +// This function is called repeatedly to build the map +/datum/spacewalk_grid/proc/get_empty_node() + var/datum/point/P = pick(available_nodes) + if(isnull(P)) + throw EXCEPTION("The `available_nodes` list was either empty or contained a null entry") + consume_node(P) + return P + +// This proc substantiates the grid of points used to determine routes between levels +// Separating this from initialization gives us time in which we can add more crosslink z levels +// before we bake in all our connections +/datum/zlev_manager/proc/route_linkage() + var/list/crosslinks = list() + var/datum/space_level/D + for(var/A in z_list) + D = z_list[A] + if(D.linkage == CROSSLINKED) + crosslinks.Add(D) + D.reset_connections() + + // We create an imaginary, square, grid, with dimensions that are + // twice the number of z levels, plus one, per side + + // This is big enough to hold a straight line from the center to any side + // `point_grid` is indexed as a 2 way matrix of these points + // `grid` is a flat list of these same above points + + // Each point represents a possible z level position + var/datum/spacewalk_grid/point_grid = new + // We do this so we can display the way the levels connect later + linkage_map = point_grid + var/datum/point/P + + // Now, we pop entries in a random order from our list of space levels + // and assign its connections based on the grid + while(crosslinks.len) + D = pick(crosslinks) + crosslinks.Remove(D) + // We now choose a point in our imaginary grid adjacent to our current location + P = point_grid.get_empty_node() + // Let our z level know where in the imaginary grid it is + // This will also handle establishing neighborship with other z levels + P.set_space_level(D) + +// A heavy proc - loops through all space turfs and sets its destination +// based on its space level's linkage +// Takes 0.6 seconds per call on my machine - could have each z level +// have its own space turf cache, but I don't want to complicate this more +// than is necessary +/datum/zlev_manager/proc/setup_space_destinations() + var/timer = start_watch() + log_debug("Assigning space turf destinations...") + var/datum/space_level/D + var/datum/space_level/E + var/turf/space/S + for(var/A in z_list) //Define the transistions of the z levels + D = z_list[A] + if(!D.neighbors.len) + continue + // Left border + for(var/B in D.transit_west) + S = B + E = D.get_connection(Z_LEVEL_WEST) + S.destination_z = E.zpos + S.destination_x = world.maxx - TRANSITIONEDGE - 2 + S.destination_y = S.y + + // Right border + for(var/B in D.transit_east) + S = B + E = D.get_connection(Z_LEVEL_EAST) + S.destination_x = TRANSITIONEDGE + 2 + S.destination_y = S.y + S.destination_z = E.zpos + + // Bottom border + for(var/B in D.transit_south) + S = B + E = D.get_connection(Z_LEVEL_SOUTH) + S.destination_x = S.x + S.destination_y = world.maxy - TRANSITIONEDGE - 2 + S.destination_z = E.zpos + + // Top border + for(var/B in D.transit_north) + S = B + E = D.get_connection(Z_LEVEL_NORTH) + S.destination_x = S.x + S.destination_y = TRANSITIONEDGE + 2 + S.destination_z = E.zpos + + log_debug("Assigning space turf destinations complete. Took [stop_watch(timer)]s.") + +// Nothing fancy, just does it all at once +/datum/zlev_manager/proc/do_transition_setup() + route_linkage() + setup_space_destinations() + +// A debugging proc that expresses the map's shape as a bunch of turfs +/datum/zlev_manager/proc/map_as_turfs(turf/center) + // size is odd + // -1, /2 to get distance from the center + // center - radius = bottom left coordinate + var/datum/point/P + var/turf/our_spot + var/grid_desc = "" + for(var/i = linkage_map.min_x, i <= linkage_map.max_x, i++) + for(var/j = linkage_map.min_y, j <= linkage_map.max_y, j++) + P = linkage_map.get(i, j) + our_spot = locate(center.x + i, center.y + j, center.z) + grid_desc = "([i],[j])" + if(!isnull(P)) + our_spot = our_spot.ChangeTurf(/turf/simulated/floor/plating/snow) + grid_desc += ": Z level [P.spl.zpos]. " + var/datum/space_level/up = P.spl.get_connection(Z_LEVEL_NORTH) + var/datum/space_level/down = P.spl.get_connection(Z_LEVEL_SOUTH) + var/datum/space_level/right = P.spl.get_connection(Z_LEVEL_EAST) + var/datum/space_level/left = P.spl.get_connection(Z_LEVEL_WEST) + grid_desc += "Up: [up.zpos], " + grid_desc += "Down: [down.zpos], " + grid_desc += "Right: [right.zpos], " + grid_desc += "Left: [left.zpos]" + else + our_spot = our_spot.ChangeTurf(/turf/simulated/floor/fakespace) + our_spot.desc = grid_desc + + +#undef Z_LEVEL_NORTH +#undef Z_LEVEL_SOUTH +#undef Z_LEVEL_EAST +#undef Z_LEVEL_WEST diff --git a/code/modules/space_management/zlevel_manager.dm b/code/modules/space_management/zlevel_manager.dm new file mode 100644 index 00000000000..8f83c0ab5e4 --- /dev/null +++ b/code/modules/space_management/zlevel_manager.dm @@ -0,0 +1,131 @@ +var/global/datum/zlev_manager/space_manager = new + +/datum/zlev_manager + // A list of z-levels + var/list/z_list = list() + var/list/heaps = list() + + var/datum/spacewalk_grid/linkage_map + +// Populate our space level list +// and prepare space transitions +/datum/zlev_manager/proc/initialize() + var/num_official_z_levels = map_transition_config.len + var/k = 1 + + // First take care of "Official" z levels, without visiting levels outside of the list + for(var/A in map_transition_config) + // `A` is the name + // `map_transition_config[A]` is the transition type + z_list["[k]"] = new /datum/space_level(k, A, transition_type = map_transition_config[A]) + if(k > world.maxz) + CRASH("More map transitions defined than existent z levels - [num_official_z_levels]") + k++ + + // Then, we take care of unmanaged z levels + // They get the default linkage of SELFLOOPING + for(var/i = k, i <= world.maxz, i++) + z_list["[i]"] = new /datum/space_level(i) + + +/datum/zlev_manager/proc/get_zlev(z) + if(!("[z]" in z_list)) + throw EXCEPTION("Unmanaged z level: '[z]'") + else + return z_list["[z]"] + +/* +* "Dirt" management +* "Dirt" is used to keep track of whether a z level should automatically have +* stuff on it initialize or not - If you're loading a map, place +* a freeze on the z levels it touches so as to prevent atmos from exploding, +* among other things +*/ + + +// Returns whether the given z level has a freeze on initialization +/datum/zlev_manager/proc/is_zlevel_dirty(z) + var/datum/space_level/our_z = get_zlev(z) + return (our_z.dirt_count > 0) + + +// Increases the dirt count on a z level +/datum/zlev_manager/proc/add_dirt(z) + var/datum/space_level/our_z = get_zlev(z) + if(our_z.dirt_count == 0) + log_debug("Placing an init freeze on z-level '[our_z.zpos]'!") + our_z.dirt_count++ + + +// Decreases the dirt count on a z level +/datum/zlev_manager/proc/remove_dirt(z) + var/datum/space_level/our_z = get_zlev(z) + our_z.dirt_count-- + if(our_z.dirt_count == 0) + our_z.resume_init() + if(our_z.dirt_count < 0) + log_debug("WARNING: Imbalanced dirt removal") + our_z.dirt_count = 0 + +/datum/zlev_manager/proc/postpone_init(z, thing) + var/datum/space_level/our_z = get_zlev(z) + our_z.init_list.Add(thing) + + +/** +* +* SPACE ALLOCATION +* +*/ + + +// For when you need the z-level to be at a certain point +/datum/zlev_manager/proc/increase_max_zlevel_to(new_maxz) + if(world.maxz>=new_maxz) + return + while(world.maxznew_maxz) + kill_topmost_zlevel() + +// Decrements the max z-level by one +// not normally used, but hey the swapmap loader wanted it +/datum/zlev_manager/proc/kill_topmost_zlevel() + var/our_z = world.maxz + var/datum/space_level/S = get_zlev(our_z) + z_list.Remove(S) + qdel(S) + world.maxz-- + + +// An internally-used proc used for heap-zlevel management +/datum/zlev_manager/proc/add_new_heap() + world.maxz++ + var/our_z = world.maxz + var/datum/space_level/yup = new /datum/space_level/heap(our_z) + z_list["[our_z]"] = yup + return yup + +// This is what you can call to allocate a section of space +// Later, I'll add an argument to let you define the flags on the region +/datum/zlev_manager/proc/allocate_space(width, height) + if(!heaps.len) + heaps.len++ + heaps[heaps.len] = add_new_heap() + var/datum/space_level/heap/our_heap + for(our_heap in heaps) + var/weve_got_vacancy = our_heap.request(width, height) + if(weve_got_vacancy) + break // We're sticking with the present value of `our_heap` - it's got room diff --git a/code/modules/space_transition/space_transition.dm b/code/modules/space_transition/space_transition.dm deleted file mode 100644 index fe63154b017..00000000000 --- a/code/modules/space_transition/space_transition.dm +++ /dev/null @@ -1,187 +0,0 @@ -//This is realisation of the working torus-looping randomized-per-round space map, this kills the cube - -#define Z_LEVEL_NORTH "1" -#define Z_LEVEL_SOUTH "2" -#define Z_LEVEL_EAST "4" -#define Z_LEVEL_WEST "8" - - -var/list/z_levels_list = list() - -/datum/space_level - var/name = "Your config settings failed, you need to fix this for the datum space levels to work" - var/list/neigbours - var/z_value = 1 //actual z placement - var/linked = 1 - var/xi - var/yi //imaginary placements on the grid - -/datum/space_level/New() - neigbours = list() - var/list/L = list(Z_LEVEL_NORTH,Z_LEVEL_SOUTH,Z_LEVEL_EAST,Z_LEVEL_WEST) - for(var/A in L) - neigbours[A] = src - -/datum/space_level/proc/set_neigbours(list/L) - for(var/datum/point/P in L) - if(P.x == xi) - if(P.y == yi+1) - neigbours[Z_LEVEL_NORTH] = P.spl - P.spl.neigbours[Z_LEVEL_SOUTH] = src - else if(P.y == yi-1) - neigbours[Z_LEVEL_SOUTH] = P.spl - P.spl.neigbours[Z_LEVEL_NORTH] = src - else if(P.y == yi) - if(P.x == xi+1) - neigbours[Z_LEVEL_EAST] = P.spl - P.spl.neigbours[Z_LEVEL_WEST] = src - else if(P.x == xi-1) - neigbours[Z_LEVEL_WEST] = P.spl - P.spl.neigbours[Z_LEVEL_EAST] = src - -/datum/point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else - var/list/neigbours = list() - var/x - var/y - var/datum/space_level/spl - -/datum/point/New(nx, ny, list/point_grid) - if(!point_grid) - qdel(src) - return - var/list/L = point_grid[1] - if(nx > point_grid.len || ny > L.len) - qdel(src) - return - x = nx - y = ny - if(point_grid[x][y]) - return - point_grid[x][y] = src - -/datum/point/proc/set_neigbours(list/grid) - var/max_X = grid.len - var/list/max_Y = grid[1] - max_Y = max_Y.len - neigbours.Cut() - if(x+1 <= max_X) - neigbours |= grid[x+1][y] - if(x-1 >= 1) - neigbours |= grid[x-1][y] - if(y+1 <= max_Y) - neigbours |= grid[x][y+1] - if(y-1 >= 1) - neigbours |= grid[x][y-1] - - -//config/space_levels.txt is where you define your zlevel datum names, their connection to actual z levels and if you want them connected to one another or not -//Grammar: Name;z value;linked/unlinked -//Name is the name of the datum, just for the sake of it -//z value is to what actual map z level this datum is pointing -//linked/unlinked decide if you want the z level in the general map or not, for example centcomm is not reachable -//Each entry must be separated with a single empty line, no spaces outside the name -//No comments in the file allowed - -/proc/setup_map_transitions() //listamania - var/list/SLS = file2list("config/space_levels.txt", "\n\n") - var/datum/space_level/D - var/list/config_settings[SLS.len][] - for(var/A in SLS) - config_settings[SLS.Find(A)] = splittext(A, ";") - var/conf_set_len = SLS.len - SLS.Cut() - for(var/A in config_settings) - D = new() - D.name = A[1] - D.z_value = text2num(A[2]) - if(A[3] != "linked") - D.linked = 0 - z_levels_list["[D.z_value]"] = D - else - SLS.Add(D) - var/list/point_grid[conf_set_len*2+1][conf_set_len*2+1] - var/list/grid = list() - var/datum/point/P - for(var/i = 1, i<=conf_set_len*2+1, i++) - for(var/j = 1, j<=conf_set_len*2+1, j++) - P = new/datum/point(i,j, point_grid) - point_grid[i][j] = P - grid.Add(P) - for(var/datum/point/pnt in grid) - pnt.set_neigbours(point_grid) - P = point_grid[conf_set_len][conf_set_len] - var/list/possible_points = list() - var/list/used_points = list() - grid.Cut() - while(SLS.len) - D = pick(SLS) - SLS.Remove(D) - D.xi = P.x - D.yi = P.y - P.spl = D - possible_points |= P.neigbours - used_points |= P - possible_points.Remove(used_points) - D.set_neigbours(used_points) - P = pick(possible_points) - grid["[D.z_value]"] = D - - for(var/A in z_levels_list) - grid[A] = z_levels_list[A] - - for(var/turf/space/S in world) //Define the transistions of the z levels - if(S.x <= TRANSITIONEDGE) - D = grid["[S.z]"] - if(D.neigbours[Z_LEVEL_WEST] != D) - D = D.neigbours[Z_LEVEL_WEST] - S.destination_z = D.z_value - else - while(D.neigbours[Z_LEVEL_EAST] != D) - D = D.neigbours[Z_LEVEL_EAST] - S.destination_z = D.z_value - S.destination_x = world.maxx - TRANSITIONEDGE - 2 - S.destination_y = S.y - - if(S.x >= (world.maxx - TRANSITIONEDGE - 1)) - D = grid["[S.z]"] - if(D.neigbours[Z_LEVEL_EAST] != D) - D = D.neigbours[Z_LEVEL_EAST] - S.destination_z = D.z_value - else - while(D.neigbours[Z_LEVEL_WEST] != D) - D = D.neigbours[Z_LEVEL_WEST] - S.destination_z = D.z_value - S.destination_x = TRANSITIONEDGE + 2 - S.destination_y = S.y - - if(S.y <= TRANSITIONEDGE) - D = grid["[S.z]"] - if(D.neigbours[Z_LEVEL_SOUTH] != D) - D = D.neigbours[Z_LEVEL_SOUTH] - S.destination_z = D.z_value - else - while(D.neigbours[Z_LEVEL_NORTH] != D) - D = D.neigbours[Z_LEVEL_NORTH] - S.destination_z = D.z_value - S.destination_x = S.x - S.destination_y = world.maxy - TRANSITIONEDGE - 2 - - if(S.y >= (world.maxy - TRANSITIONEDGE - 1)) - D = grid["[S.z]"] - if(D.neigbours[Z_LEVEL_NORTH] != D) - D = D.neigbours[Z_LEVEL_NORTH] - S.destination_z = D.z_value - else - while(D.neigbours[Z_LEVEL_SOUTH] != D) - D = D.neigbours[Z_LEVEL_SOUTH] - S.destination_z = D.z_value - S.destination_x = S.x - S.destination_y = TRANSITIONEDGE + 2 - - for(var/A in grid) - z_levels_list[A] = grid[A] - -#undef Z_LEVEL_NORTH -#undef Z_LEVEL_SOUTH -#undef Z_LEVEL_EAST -#undef Z_LEVEL_WEST diff --git a/code/modules/spacial_allocator/zlevel.dm b/code/modules/spacial_allocator/zlevel.dm deleted file mode 100644 index 8b8bec70b87..00000000000 --- a/code/modules/spacial_allocator/zlevel.dm +++ /dev/null @@ -1,73 +0,0 @@ -/datum/zlevel - var/flags = 0 - var/dirt_count = 0 - var/zpos - var/list/init_list = list() - -/datum/zlevel/New(z) - zpos = z - -/datum/zlevel/proc/resume_init() - if(dirt_count > 0) - throw EXCEPTION("Init told to resume when z-level still dirty. Z level: '[zpos]'") - log_debug("Releasing freeze on z-level '[zpos]'!") - log_debug("Beginning initialization!") - var/list/our_atoms = init_list // OURS NOW!!! (Keeping this list to ourselves will prevent hijack) - init_list = list() - var/list/late_maps = list() - var/list/pipes = list() - var/list/cables = list() - var/watch = start_watch() - for(var/schmoo in our_atoms) - var/atom/movable/AM = schmoo - if(AM) // to catch stuff like the nuke disk that no longer exists - - // This can mess with our state - we leave these for last - if(istype(AM, /obj/effect/landmark/map_loader)) - late_maps.Add(AM) - continue - AM.initialize() - if(istype(AM, /obj/machinery/atmospherics)) - pipes.Add(AM) - else if(istype(AM, /obj/structure/cable)) - cables.Add(AM) - log_debug("Primary initialization finished in [stop_watch(watch)]s.") - our_atoms.Cut() - if(pipes.len) - do_pipes(pipes) - if(cables.len) - do_cables(cables) - if(late_maps.len) - do_late_maps(late_maps) - -/datum/zlevel/proc/do_pipes(list/pipes) - var/watch = start_watch() - log_debug("Building pipenets on z-level '[zpos]'!") - for(var/schmoo in pipes) - var/obj/machinery/atmospherics/machine = schmoo - if(machine) - machine.build_network() - pipes.Cut() - log_debug("Took [stop_watch(watch)]s") - -/datum/zlevel/proc/do_cables(list/cables) - var/watch = start_watch() - log_debug("Building powernets on z-level '[zpos]'!") - for(var/schmoo in cables) - var/obj/structure/cable/C = schmoo - if(C) - makepowernet_for(C) - cables.Cut() - log_debug("Took [stop_watch(watch)]s") - -/datum/zlevel/proc/do_late_maps(list/late_maps) - var/watch = start_watch() - log_debug("Loading map templates on z-level '[zpos]'!") - zlevels.add_dirt(zpos) // Let's not repeatedly resume init for each template - for(var/schmoo in late_maps) - var/obj/effect/landmark/map_loader/ML = schmoo - if(ML) - ML.initialize() - late_maps.Cut() - zlevels.remove_dirt(zpos) - log_debug("Took [stop_watch(watch)]s") diff --git a/code/modules/spacial_allocator/zlevel_manager.dm b/code/modules/spacial_allocator/zlevel_manager.dm deleted file mode 100644 index 3c6fb0a0048..00000000000 --- a/code/modules/spacial_allocator/zlevel_manager.dm +++ /dev/null @@ -1,89 +0,0 @@ -var/global/datum/zlev_manager/zlevels = new - -/datum/zlev_manager - // A list of z-levels - var/list/z_list = list() - - -// Populate our z level list -/datum/zlev_manager/proc/initialize() - z_list.len = world.maxz - for(var/i = 1, i <= world.maxz, i++) - z_list[i] = new /datum/zlevel(i) - - - -/datum/zlev_manager/proc/get_zlev(z) - if(z < 1) - throw EXCEPTION("Non-positive z level given!") - else if(z > z_list.len) - throw EXCEPTION("Untracked z level: '[z]'") - else - return z_list[z] - -// For when you need the z-level to be at a certain point -/datum/zlev_manager/proc/increase_max_zlevel_to(new_maxz) - if(world.maxz>=new_maxz) - return - while(world.maxznew_maxz) - kill_topmost_zlevel() - -// Decrements the max z-level by one -// not normally used, but hey the swapmap loader wanted it -/datum/zlev_manager/proc/kill_topmost_zlevel() - var/our_z = world.maxz - qdel(z_list[our_z]) - z_list.len-- - world.maxz-- - -/* -* "Dirt" management -* "Dirt" is used to keep track of whether a z level should automatically have -* stuff on it initialize or not - the map loaders, when set to defer init, place -* a freeze on the z levels they touch so as to prevent atmos from exploding, -* among other things -*/ - - -// Returns whether the given z level has a freeze on initialization -/datum/zlev_manager/proc/is_zlevel_dirty(z) - var/datum/zlevel/our_z = get_zlev(z) - return (our_z.dirt_count > 0) - - -// Increases the dirt count on a z level -/datum/zlev_manager/proc/add_dirt(z) - var/datum/zlevel/our_z = get_zlev(z) - if(our_z.dirt_count == 0) - log_debug("Placing an init freeze on z-level '[our_z.zpos]'!") - our_z.dirt_count++ - - -// Decreases the dirt count on a z level -/datum/zlev_manager/proc/remove_dirt(z) - var/datum/zlevel/our_z = get_zlev(z) - our_z.dirt_count-- - if(our_z.dirt_count == 0) - our_z.resume_init() - if(our_z.dirt_count < 0) - log_debug("WARNING: Imbalanced dirt removal") - our_z.dirt_count = 0 - -/datum/zlev_manager/proc/postpone_init(z, thing) - var/datum/zlevel/our_z = get_zlev(z) - our_z.init_list.Add(thing) diff --git a/code/modules/store/store.dm b/code/modules/store/store.dm index f0199089704..7d5fc1e527d 100644 --- a/code/modules/store/store.dm +++ b/code/modules/store/store.dm @@ -48,6 +48,7 @@ var/global/datum/store/centcomm_store=new /datum/store/proc/reconnect_database() for(var/obj/machinery/computer/account_database/DB in world) + // TODO: Tie into space manager if((DB.z in config.station_levels)) linked_db = DB break @@ -62,4 +63,4 @@ var/global/datum/store/centcomm_store=new return 0 // Give them the item. item.deliver(usr) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index f226edc08eb..431d9e2958e 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -22,6 +22,7 @@ qdel(src) /obj/item/weapon/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L) + // TODO: Tie into space manager if(L.z in config.admin_levels) src.visible_message("[src]'s fragments begin rapidly vibrating and blink out of existence.") qdel(src) @@ -59,4 +60,4 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st ..() recipes = bluespace_crystal_recipes pixel_x = rand(0,4)-4 - pixel_y = rand(0,4)-4 \ No newline at end of file + pixel_y = rand(0,4)-4 diff --git a/code/world.dm b/code/world.dm index c82b00b8e9a..508591604f0 100644 --- a/code/world.dm +++ b/code/world.dm @@ -20,6 +20,8 @@ var/global/datum/global_init/init = new () #define RECOMMENDED_VERSION 510 +var/global/list/map_transition_config = MAP_TRANSITION_CONFIG + /world/New() //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") @@ -51,7 +53,7 @@ var/global/datum/global_init/init = new () // Create robolimbs for chargen. populate_robolimb_list() - setup_map_transitions() //Before the MC starts up + space_manager.initialize() //Before the MC starts up processScheduler = new master_controller = new /datum/controller/game_controller() diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index b0aad73286d..66bbc5fad86 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -171,7 +171,8 @@ var/list/chatResources = list( var/list/partial = splittext(iconData, "{") return replacetext(copytext(partial[2], 3, -5), "\n", "") -/proc/bicon(var/obj) +/proc/bicon(var/obj, var/use_class = 1) + var/class = use_class ? "class='icon misc'" : null if (!obj) return @@ -179,7 +180,7 @@ var/list/chatResources = list( if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it. bicon_cache["\ref[obj]"] = icon2base64(obj) - return "" + return "" // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. var/atom/A = obj @@ -191,12 +192,10 @@ var/list/chatResources = list( I = icon() I.Insert(temp, dir = SOUTH) bicon_cache[key] = icon2base64(I, key) + if(use_class) + class = "class='icon [A.icon_state]'" - return "" - -//Aliases for bicon -/proc/bi(obj) - bicon(obj) + return "" var/to_chat_filename var/to_chat_line diff --git a/html/changelog.html b/html/changelog.html index 27fe9b5f57f..674ceedea5f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,128 @@ -->
+

28 July 2016

+

A Giant-Ass Mountain of Salt updated:

+
    +
  • Re-adds PDA slot.
  • +
+

Crazylemon64 updated:

+
    +
  • Adds an explosion buildmode
  • +
  • "Drop Everything" in VV no longer causes limbs to fall to the ground.
  • +
+

FlattestGuitar updated:

+
    +
  • IAAs can now select the classic secHUD in loadouts
  • +
  • adds bananas and suit jackets to the loadout system
  • +
  • adds dress shoes and fancy sandals to the loadout system
  • +
  • Miners can now get the mining coat from loadouts
  • +
+

Fox McCloud updated:

+
    +
  • Fixes organ repair surgery saying an organ wasn't damaged when it actually was
  • +
  • Removes the 1 burn heal from regular ointment
  • +
  • Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)
  • +
  • Fixes a few crafting recipes not having the proper category
  • +
  • Fixes laser slugs not firing lasers
  • +
  • Adjusts the damage/consistency of improvised slugs
  • +
  • Adds in craftable bolas; throw them at someone to slow them down
  • +
  • Secvend starts off with e-bolas
  • +
  • Can make spears with personal crafting now
  • +
  • Fixes teacups and some other drinks having no sprite, in-hand, or object
  • +
  • adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies
  • +
  • Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand
  • +
  • Fixes cablecuffs not having a unique in-hand icon
  • +
  • Fixes cable coils not having a unique in-hand icon
  • +
  • All cablecuffs will be red, regardless of what they're produced from
  • +
  • Fixes an unlimited metal exploit
  • +
  • IV Drip sprites updated; has visual feedback for if it's injecting or taking blood
  • +
  • IV Drip injection rate dramatically increased
  • +
  • Warning ping for when someone is low on blood
  • +
  • Support for species with exotic blood type
  • +
  • Alt-Click to toggle between modes
  • +
  • Sensory restoration virology symptom no longer has anti-stun properties nor heals brain damage, but has a lower acquisition level
  • +
  • Damage convert heals individual limbs instead of healing overall damage (actual impact is low)
  • +
  • Librarian now starts off with a bookbag
  • +
  • Bookbag can now hold Bibles, cult tomes, books, and spellbooks
  • +
  • Can empty a bookbag into a bookshelf
  • +
  • Fixes an exploit where you could generate wood out of thin air
  • +
  • Fixes blobspores doing more damage than intended
  • +
+

Fox-McCloud updated:

+
    +
  • Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws
  • +
  • Fixes some personal crafting behaving as other than intended
  • +
+

FreeStylaLT updated:

+
    +
  • Fixed brig cell block APCs not getting power
  • +
  • Fixed space buggery Kyet made :angry:
  • +
  • Fixed missing light near labor shuttle dock
  • +
  • Fixed wrongly placed cobweb in solitary
  • +
  • Fixed basketball court not having a basketball
  • +
  • Added windows to brig processing entrance
  • +
  • Re-added the missing EOD and biohazard lockers in Armory
  • +
  • 6 gas masks from Armory
  • +
  • Added grid check into random events.
  • +
+

Krausus updated:

+
    +
  • The voting panel now uses the browser datum, which means it looks nicer.
  • +
  • The voting panel now updates while a vote is in progress.
  • +
  • When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in "vote".
  • +
  • Custom votes will now show full voting results upon completion.
  • +
  • Admins should no longer lose the "cancel vote" link in the voting panel.
  • +
  • View Variables should probably stop crashing admins.
  • +
  • The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen.
  • +
  • Admins now have click shortcuts for opening a player panel, showing mob info, and viewing variables. Specifics are in Hotkey Help.
  • +
+

Kyep updated:

+
    +
  • Admins can now see attacks against SSD players more easily.
  • +
  • Clarified the text you get when examining a SSD player.
  • +
  • It is now possible for admins to remove a person's vamp thrall status.
  • +
  • Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb.
  • +
  • Fixes an issue with spy loadouts, and excessive access on loadouts in general
  • +
+

Spacemanspark updated:

+
    +
  • Cardboard boxes now have their own specific name in the cardboard sheets menu.
  • +
+

TheDZD updated:

+
    +
  • Fixes tempgun not recharging.
  • +
  • Fixes tempgun beams costing one tenth of what they are supposed to.
  • +
  • Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should.
  • +
  • Mentors should no longer get spammed by the library checkout computer on occasion.
  • +
  • Mentors should no longer get spammed by mirrors due to body accessories.
  • +
+

TullyBurnalot updated:

+
    +
  • AI Integrity Restorers now destroy any AIs inside if they get EMP'd
  • +
  • AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside
  • +
+

Twinmold updated:

+
    +
  • Can no longer destroy pods with anything other than brute and burn weapons.
  • +
  • Can no longer pull someone out of a pod when no one is actually in the pod.
  • +
  • Can now melee attack pods with weapons when harm intent is on.
  • +
  • Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete.
  • +
+

Ty-Omaha updated:

+
    +
  • Gives Combat Gloves to Code Red ERT agents.
  • +
  • Gives Code Gamma Engineering ERT agents Combat Gloves.
  • +
+

monster860, clusterfack, and DeityLink updated:

+
    +
  • Adds space parallax
  • +
+

tigercat2000 updated:

+
    +
  • Removes space parallax, due to server overhead, input lag & bugs
  • +
+

21 July 2016

Alffd updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 1309d5211dd..ff1c0d89d1e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2433,3 +2433,112 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. and Xenomorph Larva Whack-A-Mole monster860: - bugfix: Brig timer UI reopening after being closed fixed. +2016-07-28: + A Giant-Ass Mountain of Salt: + - rscadd: Re-adds PDA slot. + Crazylemon64: + - rscadd: Adds an explosion buildmode + - bugfix: '"Drop Everything" in VV no longer causes limbs to fall to the ground.' + FlattestGuitar: + - tweak: IAAs can now select the classic secHUD in loadouts + - rscadd: adds bananas and suit jackets to the loadout system + - rscadd: adds dress shoes and fancy sandals to the loadout system + - bugfix: Miners can now get the mining coat from loadouts + Fox McCloud: + - bugfix: Fixes organ repair surgery saying an organ wasn't damaged when it actually + was + - tweak: Removes the 1 burn heal from regular ointment + - tweak: Regular bandages will now disinfect (in addition to stopping bleeding as + they previously did) + - bugfix: Fixes a few crafting recipes not having the proper category + - bugfix: Fixes laser slugs not firing lasers + - tweak: Adjusts the damage/consistency of improvised slugs + - rscadd: Adds in craftable bolas; throw them at someone to slow them down + - rscadd: Secvend starts off with e-bolas + - rscadd: Can make spears with personal crafting now + - bugfix: Fixes teacups and some other drinks having no sprite, in-hand, or object + - rscadd: adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, + and windoor assemblies + - tweak: Cablecuffs are now made by opening the cable stack's crafting menu by using + it in your hand + - bugfix: Fixes cablecuffs not having a unique in-hand icon + - bugfix: Fixes cable coils not having a unique in-hand icon + - tweak: All cablecuffs will be red, regardless of what they're produced from + - bugfix: Fixes an unlimited metal exploit + - rscadd: IV Drip sprites updated; has visual feedback for if it's injecting or + taking blood + - tweak: IV Drip injection rate dramatically increased + - rscadd: Warning ping for when someone is low on blood + - rscadd: Support for species with exotic blood type + - rscadd: Alt-Click to toggle between modes + - tweak: Sensory restoration virology symptom no longer has anti-stun properties + nor heals brain damage, but has a lower acquisition level + - tweak: Damage convert heals individual limbs instead of healing overall damage + (actual impact is low) + - rscadd: Librarian now starts off with a bookbag + - tweak: Bookbag can now hold Bibles, cult tomes, books, and spellbooks + - rscadd: Can empty a bookbag into a bookshelf + - bugfix: Fixes an exploit where you could generate wood out of thin air + - bugfix: Fixes blobspores doing more damage than intended + Fox-McCloud: + - rscadd: 'Adds in a few makeshift items/weapons: molotovs, grenade lances, golden + bikehorn, paper bags, and DIY chainsaws' + - bugfix: Fixes some personal crafting behaving as other than intended + FreeStylaLT: + - bugfix: Fixed brig cell block APCs not getting power + - bugfix: 'Fixed space buggery Kyet made :angry:' + - bugfix: Fixed missing light near labor shuttle dock + - bugfix: Fixed wrongly placed cobweb in solitary + - bugfix: Fixed basketball court not having a basketball + - rscadd: Added windows to brig processing entrance + - rscadd: Re-added the missing EOD and biohazard lockers in Armory + - rscdel: 6 gas masks from Armory + - rscadd: Added grid check into random events. + Krausus: + - tweak: The voting panel now uses the browser datum, which means it looks nicer. + - tweak: The voting panel now updates while a vote is in progress. + - tweak: When a vote is started, it will now include a link to open the vote panel, + as an alternative to typing in "vote". + - tweak: Custom votes will now show full voting results upon completion. + - bugfix: Admins should no longer lose the "cancel vote" link in the voting panel. + - bugfix: View Variables should probably stop crashing admins. + - tweak: The RnD console now shows an overlay while you're waiting for it to do + work, rather than using a separate wait screen. + - rscadd: Admins now have click shortcuts for opening a player panel, showing mob + info, and viewing variables. Specifics are in Hotkey Help. + Kyep: + - rscadd: Admins can now see attacks against SSD players more easily. + - tweak: Clarified the text you get when examining a SSD player. + - bugfix: It is now possible for admins to remove a person's vamp thrall status. + - rscadd: Adds Vox, Greytide & Soviet loadouts to admin Select Equipment verb. + - bugfix: Fixes an issue with spy loadouts, and excessive access on loadouts in + general + Spacemanspark: + - bugfix: Cardboard boxes now have their own specific name in the cardboard sheets + menu. + TheDZD: + - bugfix: Fixes tempgun not recharging. + - bugfix: Fixes tempgun beams costing one tenth of what they are supposed to. + - bugfix: Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related + tools should. + - bugfix: Mentors should no longer get spammed by the library checkout computer + on occasion. + - bugfix: Mentors should no longer get spammed by mirrors due to body accessories. + TullyBurnalot: + - tweak: AI Integrity Restorers now destroy any AIs inside if they get EMP'd + - tweak: AI Integrity Restorers can be deconstructed if broken via explosions. This + kills the AI inside + Twinmold: + - bugfix: Can no longer destroy pods with anything other than brute and burn weapons. + - bugfix: Can no longer pull someone out of a pod when no one is actually in the + pod. + - tweak: Can now melee attack pods with weapons when harm intent is on. + - tweak: Vox Objective 4 now calculates the kills vox raiders actually have, instead + of always complete. + Ty-Omaha: + - tweak: Gives Combat Gloves to Code Red ERT agents. + - tweak: Gives Code Gamma Engineering ERT agents Combat Gloves. + monster860, clusterfack, and DeityLink: + - rscadd: Adds space parallax + tigercat2000: + - rscdel: Removes space parallax, due to server overhead, input lag & bugs diff --git a/html/changelogs/AutoChangeLog-pr-4996.yml b/html/changelogs/AutoChangeLog-pr-4996.yml deleted file mode 100644 index c6079f72ff3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-4996.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TullyBurnalot -delete-after: True -changes: - - tweak: "AI Integrity Restorers now destroy any AIs inside if they get EMP'd" - - tweak: "AI Integrity Restorers can be deconstructed if broken via explosions. This kills the AI inside" diff --git a/html/changelogs/AutoChangeLog-pr-5100.yml b/html/changelogs/AutoChangeLog-pr-5100.yml deleted file mode 100644 index 4da76e20694..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5100.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: A Giant-Ass Mountain of Salt -delete-after: True -changes: - - rscadd: "Re-adds PDA slot." diff --git a/html/changelogs/AutoChangeLog-pr-5108.yml b/html/changelogs/AutoChangeLog-pr-5108.yml deleted file mode 100644 index 91ad159673c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5108.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Twinmold -delete-after: True -changes: - - bugfix: "Can no longer destroy pods with anything other than brute and burn weapons." - - bugfix: "Can no longer pull someone out of a pod when no one is actually in the pod." - - tweak: "Can now melee attack pods with weapons when harm intent is on." diff --git a/html/changelogs/AutoChangeLog-pr-5137.yml b/html/changelogs/AutoChangeLog-pr-5137.yml deleted file mode 100644 index ec2f850e681..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5137.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Kyep -delete-after: True -changes: - - rscadd: "Admins can now see attacks against SSD players more easily." - - tweak: "Clarified the text you get when examining a SSD player." diff --git a/html/changelogs/AutoChangeLog-pr-5138.yml b/html/changelogs/AutoChangeLog-pr-5138.yml deleted file mode 100644 index c6c227bb522..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5138.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: FreeStylaLT -delete-after: True -changes: - - bugfix: "Fixed brig cell block APCs not getting power" - - bugfix: "Fixed space buggery Kyet made :angry:" - - bugfix: "Fixed missing light near labor shuttle dock" - - bugfix: "Fixed wrongly placed cobweb in solitary" - - bugfix: "Fixed basketball court not having a basketball" - - rscadd: "Added windows to brig processing entrance" - - rscadd: "Re-added the missing EOD and biohazard lockers in Armory" - - rscdel: "6 gas masks from Armory" diff --git a/html/changelogs/AutoChangeLog-pr-5144.yml b/html/changelogs/AutoChangeLog-pr-5144.yml deleted file mode 100644 index e0805cd23d4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5144.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes organ repair surgery saying an organ wasn't damaged when it actually was" - - tweak: "Removes the 1 burn heal from regular ointment" - - tweak: "Regular bandages will now disinfect (in addition to stopping bleeding as they previously did)" diff --git a/html/changelogs/AutoChangeLog-pr-5155.yml b/html/changelogs/AutoChangeLog-pr-5155.yml deleted file mode 100644 index 2d79019ec97..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5155.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Twinmold -delete-after: True -changes: - - tweak: "Vox Objective 4 now calculates the kills vox raiders actually have, instead of always complete." diff --git a/html/changelogs/AutoChangeLog-pr-5159.yml b/html/changelogs/AutoChangeLog-pr-5159.yml deleted file mode 100644 index f61ea6e1943..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5159.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes a few crafting recipes not having the proper category" - - bugfix: "Fixes laser slugs not firing lasers" - - tweak: "Adjusts the damage/consistency of improvised slugs" - - rscadd: "Adds in craftable bolas; throw them at someone to slow them down" - - rscadd: "Secvend starts off with e-bolas" - - rscadd: "Can make spears with personal crafting now" diff --git a/html/changelogs/AutoChangeLog-pr-5161.yml b/html/changelogs/AutoChangeLog-pr-5161.yml deleted file mode 100644 index a40bea35861..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5161.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes teacups and some other drinks having no sprite, in-hand, or object" diff --git a/html/changelogs/AutoChangeLog-pr-5162.yml b/html/changelogs/AutoChangeLog-pr-5162.yml deleted file mode 100644 index ea046aab6ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5162.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - rscadd: "Adds an explosion buildmode" diff --git a/html/changelogs/AutoChangeLog-pr-5164.yml b/html/changelogs/AutoChangeLog-pr-5164.yml deleted file mode 100644 index a8255aa162d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5164.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: TheDZD -delete-after: True -changes: - - bugfix: "Fixes tempgun not recharging." - - bugfix: "Fixes tempgun beams costing one tenth of what they are supposed to." diff --git a/html/changelogs/AutoChangeLog-pr-5165.yml b/html/changelogs/AutoChangeLog-pr-5165.yml deleted file mode 100644 index 1ed519978b6..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "adds alt-click rotating of chairs, disposal pipes, windows, the PA, emitters, and windoor assemblies" diff --git a/html/changelogs/AutoChangeLog-pr-5170.yml b/html/changelogs/AutoChangeLog-pr-5170.yml deleted file mode 100644 index bf144623d0a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5170.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "\"Drop Everything\" in VV no longer causes limbs to fall to the ground." diff --git a/html/changelogs/AutoChangeLog-pr-5172.yml b/html/changelogs/AutoChangeLog-pr-5172.yml deleted file mode 100644 index d147308871a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5172.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - tweak: "Cablecuffs are now made by opening the cable stack's crafting menu by using it in your hand" - - bugfix: "Fixes cablecuffs not having a unique in-hand icon" - - bugfix: "Fixes cable coils not having a unique in-hand icon" - - tweak: "All cablecuffs will be red, regardless of what they're produced from" - - bugfix: "Fixes an unlimited metal exploit" diff --git a/html/changelogs/AutoChangeLog-pr-5173.yml b/html/changelogs/AutoChangeLog-pr-5173.yml deleted file mode 100644 index 2fd77d57ab3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5173.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Krausus -delete-after: True -changes: - - tweak: "The voting panel now uses the browser datum, which means it looks nicer." - - tweak: "The voting panel now updates while a vote is in progress." - - tweak: "When a vote is started, it will now include a link to open the vote panel, as an alternative to typing in \"vote\"." - - tweak: "Custom votes will now show full voting results upon completion." - - bugfix: "Admins should no longer lose the \"cancel vote\" link in the voting panel." diff --git a/html/changelogs/AutoChangeLog-pr-5178.yml b/html/changelogs/AutoChangeLog-pr-5178.yml deleted file mode 100644 index 78b2f4f927e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5178.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "View Variables should probably stop crashing admins." diff --git a/html/changelogs/AutoChangeLog-pr-5182.yml b/html/changelogs/AutoChangeLog-pr-5182.yml deleted file mode 100644 index 35fee785997..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5182.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: FlattestGuitar -delete-after: True -changes: - - tweak: "IAAs can now select the classic secHUD in loadouts" - - rscadd: "adds bananas and suit jackets to the loadout system" - - rscadd: "adds dress shoes and fancy sandals to the loadout system" - - bugfix: "Miners can now get the mining coat from loadouts" diff --git a/html/changelogs/AutoChangeLog-pr-5184.yml b/html/changelogs/AutoChangeLog-pr-5184.yml deleted file mode 100644 index 53372963d89..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5184.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "IV Drip sprites updated; has visual feedback for if it's injecting or taking blood" - - tweak: "IV Drip injection rate dramatically increased" - - rscadd: "Warning ping for when someone is low on blood" - - rscadd: "Support for species with exotic blood type" - - rscadd: "Alt-Click to toggle between modes" diff --git a/html/changelogs/AutoChangeLog-pr-5190.yml b/html/changelogs/AutoChangeLog-pr-5190.yml deleted file mode 100644 index 232f6bb3f51..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5190.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kyep -delete-after: True -changes: - - bugfix: "It is now possible for admins to remove a person's vamp thrall status." diff --git a/html/changelogs/AutoChangeLog-pr-5191.yml b/html/changelogs/AutoChangeLog-pr-5191.yml deleted file mode 100644 index ffa6d33de26..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5191.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - tweak: "The RnD console now shows an overlay while you're waiting for it to do work, rather than using a separate wait screen." diff --git a/html/changelogs/AutoChangeLog-pr-5192.yml b/html/changelogs/AutoChangeLog-pr-5192.yml deleted file mode 100644 index 9798dd041f0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5192.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox-McCloud -delete-after: True -changes: - - rscadd: "Adds in a few makeshift items/weapons: molotovs, grenade lances, golden bikehorn, paper bags, and DIY chainsaws" - - bugfix: "Fixes some personal crafting behaving as other than intended" diff --git a/html/changelogs/AutoChangeLog-pr-5198.yml b/html/changelogs/AutoChangeLog-pr-5198.yml deleted file mode 100644 index ab88cd6b449..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5198.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Spacemanspark -delete-after: True -changes: - - bugfix: "Cardboard boxes now have their own specific name in the cardboard sheets menu." diff --git a/html/changelogs/AutoChangeLog-pr-5200.yml b/html/changelogs/AutoChangeLog-pr-5200.yml deleted file mode 100644 index dad0ed52822..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5200.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: TheDZD -delete-after: True -changes: - - bugfix: "Admin-only jobs check for R_EVENT now, instead of R_ADMIN, as event-related tools should." - - bugfix: "Mentors should no longer get spammed by the library checkout computer on occasion." - - bugfix: "Mentors should no longer get spammed by mirrors due to body accessories." diff --git a/html/changelogs/AutoChangeLog-pr-5244.yml b/html/changelogs/AutoChangeLog-pr-5244.yml new file mode 100644 index 00000000000..483ac6cced4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5244.yml @@ -0,0 +1,4 @@ +author: TullyBurnalot +delete-after: True +changes: + - bugfix: "Using ATMs leaves fingerprints behind" diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml new file mode 100644 index 00000000000..9c999facb5a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5250.yml @@ -0,0 +1,4 @@ +author: Krausus +delete-after: True +changes: + - bugfix: "Probably fixed some very specific items messing up View Variables for no adequately explicable reason." diff --git a/html/changelogs/AutoChangeLog-pr-5254.yml b/html/changelogs/AutoChangeLog-pr-5254.yml new file mode 100644 index 00000000000..abffb02bb8c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5254.yml @@ -0,0 +1,5 @@ +author: Crazylemon64 +delete-after: True +changes: + - rscadd: "Admins are now able to print a map of the z levels." + - rscadd: "Admins are now capable of scrambling the z levels' transitions." diff --git a/html/changelogs/AutoChangeLog-pr-5255.yml b/html/changelogs/AutoChangeLog-pr-5255.yml new file mode 100644 index 00000000000..11accc1db1a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5255.yml @@ -0,0 +1,4 @@ +author: IcyV +delete-after: True +changes: + - rscadd: "Adds a unique axe for Atmos-traitors" diff --git a/html/changelogs/AutoChangeLog-pr-5257.yml b/html/changelogs/AutoChangeLog-pr-5257.yml new file mode 100644 index 00000000000..3fdf6046082 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5257.yml @@ -0,0 +1,4 @@ +author: Krausus +delete-after: True +changes: + - bugfix: "Fixed round-end antagonist report failing to print due to null objectives." diff --git a/html/changelogs/AutoChangeLog-pr-5263.yml b/html/changelogs/AutoChangeLog-pr-5263.yml new file mode 100644 index 00000000000..d4e92a34c5f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5263.yml @@ -0,0 +1,4 @@ +author: Kyep +delete-after: True +changes: + - bugfix: "Fixed bug with adv pinpointers and CMO hypospray theft objectives. Fixes #5232" diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index bdc47e32599..2e73e0e955a 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 20ff8795432..c576412d5b9 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 745f976c1ca..3cdea651719 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index f144b225160..cf3419cc1a7 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -89,6 +89,11 @@ Admin: \tF7 = Player Panel \tF8 = Admin PM \tF9 = Invisimin + +Admin ghost: +\tCtrl+Click = Player Panel +\tCtrl+Shift+Click = View Variables +\tShift+Middle Click = Mob Info "} mob.hotkey_help() diff --git a/paradise.dme b/paradise.dme index 5c184d781ea..1b802213c2c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -10,6 +10,7 @@ #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "_maps\__MAP_DEFINES.dm" #include "_maps\cyberiad.dm" #include "code\_compile_options.dm" #include "code\hub.dm" @@ -44,6 +45,7 @@ #include "code\__DEFINES\snpc.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\tick.dm" +#include "code\__DEFINES\zlevel.dm" #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\AnimationLibrary.dm" #include "code\__HELPERS\constants.dm" @@ -616,14 +618,9 @@ #include "code\game\machinery\doors\unpowered.dm" #include "code\game\machinery\doors\windowdoor.dm" #include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" #include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\docking_program.dm" -#include "code\game\machinery\embedded_controller\docking_program_multi.dm" #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" #include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipe_dispenser.dm" #include "code\game\machinery\telecomms\broadcaster.dm" @@ -1044,6 +1041,7 @@ #include "code\modules\admin\verbs\pray.dm" #include "code\modules\admin\verbs\randomverbs.dm" #include "code\modules\admin\verbs\serialization.dm" +#include "code\modules\admin\verbs\space_transitions.dm" #include "code\modules\admin\verbs\striketeam.dm" #include "code\modules\admin\verbs\striketeam_syndicate.dm" #include "code\modules\admin\verbs\ticklag.dm" @@ -1998,15 +1996,17 @@ #include "code\modules\shuttle\shuttle.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" -#include "code\modules\space_transition\space_transition.dm" +#include "code\modules\space_management\heap_space_level.dm" +#include "code\modules\space_management\space_chunk.dm" +#include "code\modules\space_management\space_level.dm" +#include "code\modules\space_management\space_transition.dm" +#include "code\modules\space_management\zlevel_manager.dm" #include "code\modules\spacepods\construction.dm" #include "code\modules\spacepods\equipment.dm" #include "code\modules\spacepods\lock_buster.dm" #include "code\modules\spacepods\parts.dm" #include "code\modules\spacepods\pod_fabricator.dm" #include "code\modules\spacepods\spacepod.dm" -#include "code\modules\spacial_allocator\zlevel.dm" -#include "code\modules\spacial_allocator\zlevel_manager.dm" #include "code\modules\store\items.dm" #include "code\modules\store\store.dm" #include "code\modules\surgery\bones.dm"

Name

Status

Location

Control

[Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])